线性预测中的自相关系数

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 |

相关文档
最新文档