(基于matlab自写代码)语音信号的线性预测

预测之前先把信号采样。
把过去的p个样值sn-k分别乘上适当的系数ɑn-k,再累加起来即得到现时样值的预测值。
当ɑn-k取实数,则p个样值中任何一个有变化,都使预测值xn成比例地变化。因为预测公式是一个线性方程,所以这种预测称为线性预测。
式中p称为预测阶数;ɑn-k称为预测系数;真实值与预测值之差en=sn-xn,称为预测误差。
预测的目的就是找出一组合适的系数ɑn-k,使误差en的统计值最小。实际预测过程一般是先把采样序列按一定的数目组成帧,然后逐帧进行预测,每帧都找出该帧的p个最佳预测系数ɑn-k。
预测的好坏(精确度)不是以某一个样值的预测结果来衡量,而是要看帧内各样值预测的总效果。
在用线性预测编码通信时,把每帧的p个预测系数和各样值预测误差en编码后传输。收信端则利用这些参数来重建原信号。

自己编写MATLAB程序代码,对一段语音,取帧长为256个点,计算其12个lp系数并以表列出其参数值。

matlab程序
[x,fs]=audioread(‘E:\lyr.mp3’); %读入语音信号
xx=double(x); %求线性预测函数方程
y=filter([1 -0.9495],1,xx);
N=256;
y1=y(1:N);
w1=hamming(N);
y2=(y1.*w1)';
p=30;
r=zeros(1,p+1);
for k=1:p+1
sum=0;
for m=1:N+1-k
sum=sum+y2(m).*y2(m-1+k)';
end
r(k)=sum;
end
k=zeros(1,p);
k(1)=r(2)/r(1);
a=zeros(p,p);
a(1,1)=k(1);
e=zeros(1,p);
e(1)=(1-k(1)^2)*r(1);
for i=2:p
c=zeros(1,i);
sum=0;
for j=1:i-1
sum=sum+(a(i-1,j).*r(i+1-j));
end
c(i)=sum;
k(i)=(r(i+1)-c(i))/e(i-1);
if find(abs(k)>1)
disp('default')
else
subplot(413);plot(abs(k));title(‘|k(i)|<=1’)
end
a(i,i)=k(i);
for j=1:i-1
a(i,j)=a(i-1,j)-k(i).*a(i-1,i-j);
end
e(i)=(1-k(i)^2)*e(i-1);
subplot(414);plot(e);title(‘预测器残差能量E(i)’)
end
d=zeros(1,p);
for t=1:p
d(t)=a(p,t);
end
z=zeros(1,12);
for i=1:p
z(i)=y2(i);
end
figure(1); %将程序结果图像显示
subplot(411);plot(y2);title(‘原始数据’)
subplot(412);plot(z);title(‘durbin算法求线性预测系数’)

在这里插入图片描述

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值