线性预测编码(LPC)笔记

概念:一个语音的抽样能够用过去若干个语音抽样(模板)的线性组合来逼近。通过使实际语音抽样和线性预测抽样之间差值的平方和达到最小,能够决定唯一的一组预测系数。用于语音分析与合成,可估计许多语音基本参数:基音、共振峰、频谱、声道截面积等。

语音信号是由一个激励信号e(k)经过一个时变的全极点滤波器产生的。生成语音信号s(k)表示为:
s ( n ) = ∑ i = 1 p a i s ( n − i ) + e ( n ) s(n)=\sum_{i=1}^pa_is(n-i)+e(n) s(n)=i=1pais(ni)+e(n)
其中,激励信号e(n)要么是浊音语音的脉冲序列,要么是无声声音的随机噪声。P是滤波器的阶数, a i a_i ai是滤波器的系数。LPC就是在已知s(n)的情况下获取 a i a_i ai
s ~ ( n ) = ∑ i = 1 p a i s ( n − i ) \widetilde{s}(n)=\sum_{i=1}^pa_is(n-i) s (n)=i=1pais(ni)

e ( n ) = s ( n ) − s ~ ( n ) = s ( n ) − ∑ i = 1 p a i s ( n − i ) e(n)=s(n)-\widetilde{s}(n)=s(n)-\sum_{i=1}^pa_is(n-i) e(n)=s(n)s (n)=s(n)i=1pais(ni)

求取 a i a_i ai最常用的一个方法就是最小化真实信号与预测信号之间的均方误差(MSE):
E = ∑ n e 2 ( n ) = ∑ n [ s ( n ) − s ~ ( n ) ] 2 = ∑ n [ s ( n ) − ∑ i = 1 p a i s ( n − i ) ] 2 E=\sum_ne^2(n)=\sum_n[s(n)-\widetilde{s}(n)]^2=\sum_n[s(n)-\sum_{i=1}^pa_is(n-i)]^2 E=ne2(n)=n[s(n)s (n)]2=n[s(n)i=1pais(ni)]2
a i a_i ai为多少的情况下,E可取最小值,对 a i a_i ai求偏导:
∂ E ∂ a j = 0 , j = 1 , 2 , . . . , p \frac{\partial E}{\partial a_j}=0,\quad j=1,2,...,p ajE=0,j=1,2,...,p
可得出:
∑ n s ( n ) s ( n − j ) = ∑ i = 1 p a i ∑ n s ( n − i ) s ( n − j ) \sum_ns(n)s(n-j)=\sum_{i=1}^pa_i\sum_n s(n-i)s(n-j) ns(n)s(nj)=i=1pains(ni)s(nj)
根据自相关函数定义Φ:
ϕ n ( i , j ) = ∑ m s ( n − i ) s ( n − j ) \phi_n(i,j)=\sum_ms(n-i)s(n-j) ϕn(i,j)=ms(ni)s(nj)
所以式子可写成:
ϕ ( 0 , j ) = ∑ i = 1 p a i ϕ ( i , j ) j = 1 , 2 , . . . , p \phi(0,j)=\sum_{i=1}^pa_i\phi(i,j)\quad\quad j=1,2,...,p ϕ(0,j)=i=1paiϕ(i,j)j=1,2,...,p
该式表示p个方程构成的方程组,未知数为p个。求解该方程组,就可以得到系统的线性预测系数。

系统的最小均方误差就可以表示为:(sjb,求大佬教这步是怎么推出来的)
E = ∑ n [ s ( n ) ] 2 − ∑ i = 1 p a i ∑ n s ( n ) s ( n − i ) = ϕ n ( 0 , 0 ) − ∑ i = 1 p a i ϕ n ( 0 , i ) E=\sum_n[s(n)]^2-\sum_{i=1}^pa_i\sum_n s(n)s(n-i)=\phi_n(0,0)-\sum_{i=1}^pa_i\phi_n(0,i) E=n[s(n)]2i=1pains(n)s(ni)=ϕn(0,0)i=1paiϕn(0,i)

线性预测之Levinson-Durbin算法

求解这个方程组则用durbin算法进行求解。

拓普利兹矩阵

把Φ变成拓普利兹矩阵R,即第(i,j)个元素为R[i-j]:
∑ i = 1 p a i R [ ∣ i − j ∣ ] = R [ j ] , 1 ≤ j ≤ p \sum_{i=1}^pa_iR[|i-j|]=R[j],\quad 1\leq j\leq p i=1paiR[ij]=R[j],1jp
方程的矩阵形式为:
R a = r Ra=r Ra=r
a和r分别是元素为 a i a_i ai和r[i]=R[i]的列向量。

上式中方程组可做如下变换:
R [ j ] − ∑ i = 1 p a i R [ ∣ i − j ∣ ] = 0 , j = 1 , 2 , . . . , p R[j]-\sum_{i=1}^p a_i R[|i-j|]=0,j=1,2,...,p R[j]i=1paiR[ij]=0,j=1,2,...,p

写成矩阵形式为:

[ R [ 1 ] R [ 0 ] R [ 1 ] ⋯ R [ p − 1 ] R [ 2 ] R [ 1 ] R [ 0 ] ⋯ R [ p − 2 ] ⋮ ⋮ ⋮ ⋯ ⋮ R [ p ] R [ p − 1 ] R [ p − 2 ] ⋯ R [ 0 ] ] [ 1 − α 1 ( p ) − α 2 ( p ) ⋮ − α p ( p ) ] = [ 0 0 ⋮ 0 ] \begin{bmatrix} R[1] & R[0] & R[1] & \cdots & R[p-1]\\ R[2] & R[1] & R[0] & \cdots & R[p-2]\\ \vdots & \vdots & \vdots & \cdots & \vdots\\ R[p] & R[p-1] & R[p-2] &\cdots & R[0] \end{bmatrix} \begin{bmatrix} 1\\ -\alpha_1^{(p)}\\ -\alpha_2^{(p)}\\ \vdots\\ -\alpha_p^{(p)}\\ \end{bmatrix}= \begin{bmatrix} 0\\ 0\\ \vdots\\ 0 \end{bmatrix} R[1]R[2]R[p]R[0]R[1]R[p1]R[1]R[0]R[p2]R[p1]R[p2]R[0]1α1(p)α2(p)αp(p)=000

而根据最小均方误差公式,对于一个p阶最佳预测器,其最小均方预测误差为:

R [ 0 ] − ∑ i = 1 p a i R [ i ] = ε ( p ) R[0]-\sum_{i=1}^pa_iR[i]=\varepsilon^{(p)} R[0]i=1paiR[i]=ε(p)

写成矩阵的形式为:

[ R [ 0 ] R [ 1 ] R [ 2 ] ⋯ R [ p ] ] [ 1 − α 1 ( p ) − α 2 ( p ) ⋮ − α p ( p ) ] = [ ε ( p ) ] \begin{bmatrix} R[0] & R[1] & R[2] & \cdots & R[p]\\ \end{bmatrix} \begin{bmatrix} 1\\ -\alpha_1^{(p)}\\ -\alpha_2^{(p)}\\ \vdots\\ -\alpha_p^{(p)}\\ \end{bmatrix}= \begin{bmatrix} \varepsilon^{(p)}\\ \end{bmatrix} [R[0]R[1]R[2]R[p]]1α1(p)α2(p)αp(p)=[ε(p)]

再把上面两个矩阵合在一起,写成一个p+1个方程方程组满足p各未知预测器系数和对应的未知均方预测误差 ε p ε^p εp,新的矩阵方程为

[ R [ 0 ] R [ 1 ] R [ 2 ] ⋯ R [ p ] R [ 1 ] R [ 0 ] R [ 1 ] ⋯ R [ p − 1 ] R [ 2 ] R [ 1 ] R [ 0 ] ⋯ R [ p − 2 ] ⋮ ⋮ ⋮ ⋯ ⋮ R [ p ] R [ p − 1 ] R [ p − 2 ] ⋯ R [ 0 ] ] [ 1 − α 1 ( p ) − α 2 ( p ) ⋮ − α p ( p ) ] = [ ε ( p ) 0 0 ⋮ 0 ] \begin{bmatrix} R[0] & R[1] & R[2] & \cdots & R[p] \\ R[1] & R[0] & R[1] & \cdots & R[p-1]\\ R[2] & R[1] & R[0] & \cdots & R[p-2]\\ \vdots & \vdots & \vdots & \cdots & \vdots\\ R[p] & R[p-1] & R[p-2] &\cdots & R[0] \end{bmatrix} \begin{bmatrix} 1\\ -\alpha_1^{(p)}\\ -\alpha_2^{(p)}\\ \vdots\\ -\alpha_p^{(p)}\\ \end{bmatrix}= \begin{bmatrix} \varepsilon^{(p)}\\ 0\\ 0\\ \vdots\\ 0 \end{bmatrix} R[0]R[1]R[2]R[p]R[1]R[0]R[1]R[p1]R[2]R[1]R[0]R[p2]R[p]R[p1]R[p2]R[0]1α1(p)α2(p)αp(p)=ε(p)000

上式中构造出的(p+1)x(p+1)阶矩阵也是拓普利兹矩阵。该方程组用Levinson-Durbin算法递归求解。该算法通过在每次迭代中顺序地结合一个新的相关值来实现,并且根据新的相关值和已获得的预测器就能解出下一个高一阶的预测器。

对于任意阶数i,上式中的方程组都可以以矩阵形式表示:
R i α i = e i R^i\alpha^i=e^i Riαi=ei
我们希望第i阶的解是如何由第i-1阶的解导出的。换而言之是给定 α ( i − 1 ) α^{(i-1)} α(i1),即 R ( i − 1 ) α ( i − 1 ) = e ( i − 1 ) R^{(i-1)}α^{(i-1)}=e^{(i-1)} R(i1)α(i1)=e(i1)的解,求出 R ( i ) α ( i ) = e ( i ) R^{(i)}α^{(i)}=e^{(i)} R(i)α(i)=e(i)的解。

durbin算法

步骤:

1、先将矩阵方程 R ( i − 1 ) α ( i − 1 ) = e ( i − 1 ) R^{(i-1)}α^{(i-1)}=e^{(i-1)} R(i1)α(i1)=e(i1)的扩展形式写为:

[ R [ 0 ] R [ 1 ] R [ 2 ] ⋯ R [ i − 1 ] R [ 1 ] R [ 0 ] R [ 1 ] ⋯ R [ i − 2 ] R [ 2 ] R [ 1 ] R [ 0 ] ⋯ R [ i − 3 ] ⋮ ⋮ ⋮ ⋯ ⋮ R [ i − 1 ] R [ i − 2 ] R [ i − 3 ] ⋯ R [ 0 ] ] [ 1 − α 1 ( i − 1 ) − α 2 ( i − 1 ) ⋮ − α i − 1 ( i − 1 ) ] = [ ε ( i − 1 ) 0 0 ⋮ 0 ] \begin{bmatrix} R[0] & R[1] & R[2] & \cdots & R[i-1] \\ R[1] & R[0] & R[1] & \cdots & R[i-2]\\ R[2] & R[1] & R[0] & \cdots & R[i-3]\\ \vdots & \vdots & \vdots & \cdots & \vdots\\ R[i-1] & R[i-2] & R[i-3] &\cdots & R[0] \end{bmatrix} \begin{bmatrix} 1\\ -\alpha_1^{(i-1)}\\ -\alpha_2^{(i-1)}\\ \vdots\\ -\alpha_{i-1}^{(i-1)}\\ \end{bmatrix}= \begin{bmatrix} \varepsilon^{(i-1)}\\ 0\\ 0\\ \vdots\\ 0\\ \end{bmatrix} R[0]R[1]R[2]R[i1]R[1]R[0]R[1]R[i2]R[2]R[1]R[0]R[i3]R[i1]R[i2]R[i3]R[0]1α1(i1)α2(i1)αi1(i1)=ε(i1)000
2、将数0附加到向量 a ( i − 1 ) a^{(i-1)} a(i1)中,并与矩阵 R ( i ) R^{(i)} R(i)相乘,这时得到新的一组i+1个方程:
[ R [ 0 ] R [ 1 ] R [ 2 ] ⋯ R [ i ] R [ 1 ] R [ 0 ] R [ 1 ] ⋯ R [ i − 1 ] R [ 2 ] R [ 1 ] R [ 0 ] ⋯ R [ i − 2 ] ⋮ ⋮ ⋮ ⋯ ⋮ R [ i − 1 ] R [ i − 2 ] R [ i − 3 ] ⋯ R [ 1 ] R [ i ] R [ i − 1 ] R [ i − 2 ] ⋯ R [ 0 ] ] [ 1 − α 1 ( i − 1 ) − α 2 ( i − 1 ) ⋮ − α i − 1 ( i − 1 ) 0 ] = [ ε ( i − 1 ) 0 0 ⋮ 0 γ ( i − 1 ) ] \begin{bmatrix} R[0] & R[1] & R[2] & \cdots & R[i] \\ R[1] & R[0] & R[1] & \cdots & R[i-1]\\ R[2] & R[1] & R[0] & \cdots & R[i-2]\\ \vdots & \vdots & \vdots & \cdots & \vdots\\ R[i-1] & R[i-2] & R[i-3] &\cdots & R[1]\\ R[i] & R[i-1] & R[i-2] &\cdots & R[0] \end{bmatrix} \begin{bmatrix} 1\\ -\alpha_1^{(i-1)}\\ -\alpha_2^{(i-1)}\\ \vdots\\ -\alpha_{i-1}^{(i-1)}\\ 0 \end{bmatrix}= \begin{bmatrix} \varepsilon^{(i-1)}\\ 0\\ 0\\ \vdots\\ 0\\ \gamma^{(i-1)} \end{bmatrix} R[0]R[1]R[2]R[i1]R[i]R[1]R[0]R[1]R[i2]R[i1]R[2]R[1]R[0]R[i3]R[i2]R[i]R[i1]R[i2]R[1]R[0]1α1(i1)α2(i1)αi1(i1)0=ε(i1)000γ(i1)
上式成立的条件是:
γ ( i − 1 ) = R [ i ] − ∑ j = 1 i − 1 α j ( i − 1 ) R [ i − j ] \gamma^{(i-1)}=R[i]-\sum_{j=1}^{i-1}\alpha_j^{(i-1)}R[i-j] γ(i1)=R[i]j=1i1αj(i1)R[ij]
3、根据拓普利兹矩阵 R ( i ) R^{(i)} R(i)的对称性,方程组可以以相反顺序写出(第一个方程写在最后面,最后一个方程写在最前面,以此类推),可得:
[ R [ 0 ] R [ 1 ] R [ 2 ] ⋯ R [ i ] R [ 1 ] R [ 0 ] R [ 1 ] ⋯ R [ i − 1 ] R [ 2 ] R [ 1 ] R [ 0 ] ⋯ R [ i − 2 ] ⋮ ⋮ ⋮ ⋯ ⋮ R [ i − 1 ] R [ i − 2 ] R [ i − 3 ] ⋯ R [ 1 ] R [ i ] R [ i − 1 ] R [ i − 2 ] ⋯ R [ 0 ] ] [ 0 − α i − 1 ( i − 1 ) − α i − 2 ( i − 1 ) ⋮ − α 1 ( i − 1 ) 1 ] = [ γ ( i − 1 ) 0 0 ⋮ 0 ε ( i − 1 ) ] \begin{bmatrix} R[0] & R[1] & R[2] & \cdots & R[i] \\ R[1] & R[0] & R[1] & \cdots & R[i-1]\\ R[2] & R[1] & R[0] & \cdots & R[i-2]\\ \vdots & \vdots & \vdots & \cdots & \vdots\\ R[i-1] & R[i-2] & R[i-3] &\cdots & R[1]\\ R[i] & R[i-1] & R[i-2] &\cdots & R[0] \end{bmatrix} \begin{bmatrix} 0\\ -\alpha_{i-1}^{(i-1)}\\ -\alpha_{i-2}^{(i-1)}\\ \vdots\\ -\alpha_{1}^{(i-1)}\\ 1\\ \end{bmatrix}= \begin{bmatrix} \gamma^{(i-1)}\\ 0\\ 0\\ \vdots\\ 0\\ \varepsilon^{(i-1)}\\ \end{bmatrix} R[0]R[1]R[2]R[i1]R[i]R[1]R[0]R[1]R[i2]R[i1]R[2]R[1]R[0]R[i3]R[i2]R[i]R[i1]R[i2]R[1]R[0]0αi1(i1)αi2(i1)α1(i1)1=γ(i1)000ε(i1)
4、将2和3两步中的公式合并可得
R i ⋅ [ [ 1 − α 1 ( i − 1 ) − α 2 ( i − 1 ) ⋮ − α i − 1 ( i − 1 ) 0 ] − k i [ 0 − α i − 1 ( i − 1 ) − α i − 2 ( i − 1 ) ⋮ − α 1 ( i − 1 ) 1 ] ] = [ [ ε ( i − 1 ) 0 0 ⋮ 0 γ ( i − 1 ) ] − k i [ γ ( i − 1 ) 0 0 ⋮ 0 ε ( i − 1 ) ] ] R^i· \begin{bmatrix} \begin{bmatrix} 1\\ -\alpha_1^{(i-1)}\\ -\alpha_2^{(i-1)}\\ \vdots\\ -\alpha_{i-1}^{(i-1)}\\ 0 \end{bmatrix} -k_i \begin{bmatrix} 0\\ -\alpha_{i-1}^{(i-1)}\\ -\alpha_{i-2}^{(i-1)}\\ \vdots\\ -\alpha_{1}^{(i-1)}\\ 1\\ \end{bmatrix} \end{bmatrix}= \begin{bmatrix} \begin{bmatrix} \varepsilon^{(i-1)}\\ 0\\ 0\\ \vdots\\ 0\\ \gamma^{(i-1)} \end{bmatrix} -k_i \begin{bmatrix} \gamma^{(i-1)}\\ 0\\ 0\\ \vdots\\ 0\\ \varepsilon^{(i-1)}\\ \end{bmatrix} \end{bmatrix} Ri1α1(i1)α2(i1)αi1(i1)0ki0αi1(i1)αi2(i1)α1(i1)1=ε(i1)000γ(i1)kiγ(i1)000ε(i1)
该式逼近了表达式 R ( i ) α ( i ) = e ( i ) R^{(i)}α^{(i)}=e^{(i)} R(i)α(i)=e(i),然后选择 γ ( i − 1 ) γ^{(i-1)} γ(i1)使方程右边的向量只有一个非零元素,此时新参数 k i k_i ki必须为:
k i = γ ( i − 1 ) ε i − 1 = R [ i ] − ∑ j = 1 i − 1 α j ( i − 1 ) R [ i − j ] ε i − 1 k_i=\frac{\gamma^{(i-1)}}{\varepsilon^{i-1}}=\frac{R[i]-\sum_{j=1}^{i-1}\alpha_j^{(i-1)} R[i-j]}{\varepsilon^{i-1}} ki=εi1γ(i1)=εi1R[i]j=1i1αj(i1)R[ij]
这样就确保方程右边的向量的最后一个元素为0,则此时第一个元素为:
ε i = ε i − 1 − k i γ ( i − 1 ) = ε i − 1 ( 1 − k i 2 ) \varepsilon^i=\varepsilon^{i-1}-k_i\gamma^{(i-1)}=\varepsilon^{i-1}(1-k_i^2) εi=εi1kiγ(i1)=εi1(1ki2)
5、选好 γ ( i − 1 ) γ^{(i-1)} γ(i1)后,第i阶的预测系数向量为:
α i ( i ) = k i \alpha_i^{(i)}=k_i αi(i)=ki
6、可得系数更新方程组为
α j ( i ) = α i ( i − 1 ) − k i α i − j ( i − 1 ) , j = 1 , 2 , ⋯   , i − 1 \alpha_j^{(i)}=\alpha_i^{(i-1)}-k_i\alpha_{i-j}^{(i-1)},j=1,2,\cdots,i-1 αj(i)=αi(i1)kiαij(i1),j=1,2,,i1

α i ( i ) = k i \alpha_i^{(i)}=k_i αi(i)=ki

因此,对于某个特定的阶数p,最佳预测系数为:
α j = α i ( i ) = k i , j = 1 , 2 , ⋯   , p \alpha_j=\alpha_i^{(i)}=k_i,j=1,2,\cdots,p αj=αi(i)=ki,j=1,2,,p
最终伪代码:

请添加图片描述

matlab实现

用到lpc函数:

a=lpc(x,n);

这里x为一帧语音信号,n为计算LPC参数的阶数。通常x为240点或256点的数据,n取10-12。

博主表示还是似懂非懂的,略难受。

希望有大牛推荐推荐书籍入个门。

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值