实验四 语音信号的LPC参数分析(4课时)
通过Matlab编程掌握语音信号的LPC倒谱参数的求解方法。
线性预测分析的基本思想是:由于语音样点之间存在相关性,所以可以用过去的样点值来预测现在或未来的样点值,即一个语音的抽样能够用过去若干个语音抽样或它们的线性组合来逼近。通过使用实际语音抽样和线性预测抽样之间的误差在某个准则下达到的最小值来决定唯一的一组预测系数。而这组预测系数就反映了语音信号的特性,可以作为语音信号特征参数用于语音识别、语音合成等。
值:预测误差为:
理论上通常采用预测系数{ak}的取值使均方误差E[e2(n)](是{ak}的函数)最小的准则。
预测误差与过去的样点不相关
j=1…P
求解以上P个方程组则可得到预测系数ak。
方程组的求解方法有自相关的算法,有协方差的方法,本实验采用Durbin算法来求解,完整的递推过程如下:
(1)
(2)
(3)
(4)
(5) if i<p go to (2)
(6)
实验四程序
[x,fs,bits]=wavread('c:\WINDOWS\Media\1.wav');
x=x(:,1);
x=x';
x=mapminmax(x,-1,1);%归一化
len=length(x);
N=256;
M=128;
Fn=fix((len-N)/M+1);
y=[];
for i=1:Fn
down=1+(i-1)*M;
up=down+N-1;
temp=x(down:up);
temp=temp.*hamming(N)';
y=[y;temp];
end
P=12;
a=[];
k=[];
lpc=[];
for q=1:Fn
temp2=y(q,:);%取出每一帧
R=autocorr(temp2);%自相关系数
for i=1:P%Levison-Durbin递推算法
if i==1
E(1)=R(1);
k(1)=R(2)/R(1);
a(1,1)=k(1);
E(2)=(1-k(i).^2)*E(1);
else
temp4=0;
for s=1:i-1
temp4=temp4+a(s,i-1)*R(i-s+1);
end
k(i)=(R(i+1)-temp4)/E(i);
a(i,i)=k(i);
for s=1:i-1
a(s,i)=a(s,i-1)-k(i)*a(i-s,i-1);
end
E(i+1)=(1-k(i).^2)*E(i);
end
end
for n=1:P;
b(n)=a(n,P);
end
lpc=[lpc;b];
end
plot(lpc(28,:))