线性预测中的自相关系数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
线性预测中的自相关系数
1.原理
线性预测是语音编码中的基本算法,其基本原理如下:
设语音信号的样值序列{}()12,,,k k k X X x x x ==,第k 时刻的取样值x k 可以用之前的P 个样值的线性组合来预测。
1ˆP
k i k i i x
a x -==∑ 实际样值与预测值之间的误差为:
1ˆP
k k k k i k i i e x x
x a x -==-=-∑ 因此预测系统的传递函数为:
()()()()
11
11P i
i i X Z H Z E Z A Z a z -====-∑ 其中H(Z)是一个全极点滤波器,称为综合滤波器。A(Z)是H(Z)的逆滤波器,称为分析滤波器。在语音线性预测编码中,A(Z)的系数反映了声道特性。
为了使预测误差最小,采用最小均方误差准则,即使误差的均方值
[]{}22
21211ˆP
k
k k k k P P k i k i k i E x x E e E x a x σ=-===-=⎛⎫=- ⎪⎝⎭∑∑∑
最小。在预测阶数P 给定后,2k σ就是所有预测系数{}i a 的函数,因此:
[]2ˆˆ20k k k k i i e x E x x a a ⎧⎫∂∂=--=⎨⎬∂∂⎩
⎭ []{}ˆ0k k k i E x x
x -⇒-= 可见,要使k e 的预测误差最小,则k e 必须与所有数据k i x -正交,称为正
交性原理。将上式展开,可得:
{}{}1P
k k i j k j k i j E x x a E x x ---==∑
其中{}(),k j k i E x x R k j k i --=--,即信号的自相关系数。对平稳信号(语音信号一般不是平稳信号,但对单独处理的每帧来说,可以近似认为是短时平稳信号)来说,
()()
()(),R k i k j R i j R i R i --=--=
因此,可以得到:
()()()()()()()
()()()()()1210112122120P R R R R P a R R R R P a R P R P R P R a -⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥-⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎣⎦
⎣⎦⎣⎦ 解此线性方程组,即可得到各预测系数。一般采用Levison-Durbin 算法递推求解。在已知输入信号的情况下,必须先求各阶自相关系数。
2.G .729中的线性预测
ITU-T G .729语音编码标准采用CS-ACELP 混合编码方法,输出码率为8kbps ,每帧语音长度10ms ,在8kHz 采样条件下,具有80个样点。在线性预测时一般采用连续3帧进行加窗处理后进行,因此计算
自相关系数的数组具有240个样点值。
下面是G.729参考代码中的相关程序部分,并附加说明。
void Autocorr(
Word16 x[], /* (i) : Input signal */
Word16 m, /* (i) : LPC order */ Word16 r_h[], /* (o) : Autocorrelations (msb) */
Word16 r_l[] /* (o) : Autocorrelations (lsb) */
)
{
Word16 i, j, norm;
Word16 y[L_WINDOW];
Word32 sum;
extern Flag Overflow;
/* Windowing of signal */
for(i=0; i { y[i] = mult_r(x[i], hamwindow[i]); } /* Compute r[0] and test for overflow */ do { Overflow = 0; sum = 1; /* Avoid case of all zeros */ for(i=0; i sum = L_mac(sum, y[i], y[i]); /* If overflow divide y[] by 4 */ if(Overflow != 0) { for(i=0; i { y[i] = shr(y[i], 2); } } }while (Overflow != 0); /* Normalization of r[0] */ norm = norm_l(sum); sum = L_shl(sum, norm); L_Extract(sum, &r_h[0], &r_l[0]); /* Put in DPF format (see oper_32b) */ /* r[1] to r[m] */ for (i = 1; i <= m; i++) { sum = 0; for(j=0; j sum = L_mac(sum, y[j], y[j+i]); sum = L_shl(sum, norm); L_Extract(sum, &r_h[i], &r_l[i]); } return; } /*___________________________________________________________________________ | | | Function Name : mult_r | | | | Purpose : | | | | Same as mult with rounding, i.e.: | | mult_r(var1,var2) = shr(((var1*var2) + 16384),15) and | | mult_r(-32768,-32768) = 32767. | | | | Complexity weight : 2 | | | | Inputs : | | | | var1 | | 16 bit short signed integer (Word16) whose value falls in the | | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | | | | var2 | | 16 bit short signed integer (Word16) whose value falls in the | | range : 0xffff 8000 <= var1 <= 0x0000 7fff. | | | | Outputs : | | | | none | | | | Return Value : | | | | var_out |