完成了lpc 分析,并转成lsp之后,
接下来就是要对lsp进行量化 lsp_quant_nb
speex lsp的量化是采用欧式距离最短的方法,在码本表里搜索
分成三级
首先扣减直流分量
for (i=0;i<order;i++)
qlsp[i]=SUB16(qlsp[i],LSP_LINEAR(i));//lsc 做一个类似扣减速直流分量的操作,(lsp的取值范围大约是在-3.14 ~ 3.14之类) 让各个lsp系数落同一个取值区间,减少量化的阶数
第一级搜索
id = lsp_quant(qlsp, cdbk_nb, NB_CDBK_SIZE, order);//lsc 这个算法很简单,取欧式距离最小的
qlsp将被更新成误差
然后是第二级搜索,第二级搜索是有一个加权的,加权的依据是:
compute_quant_weights(qlsp, quant_weight, order);//lsc 得出每个lsp系数的权值,权值为该根与其相邻根距离(单位圆上,角度值)的倒数
第二,三级搜索被拆成,lsp系数被分成两组,每组5个,
分别在cdbk_nb_low1 cdbk_nb_low2 cdbk_nb_high1 cdbk_nb_high2
这几个码本表里搜索(根据欧式距离最短的原则,搜索最佳码字)
每级搜索,都是搜索上一级的误差(误差会被放大两倍),
最后得到的误差,做一个减法,就得到了量化后的lsp值,存在qlsp数组里
下一节被分析speex窄带激励
未完待续...
林绍川 2012-10-30 于杭州