资源描述
2015.10.14
1.介绍
语音是人类相互交流和通信最方便快捷的手段。如何高效地实现语音传输、存储或通过语音实现人机交互,是语音信号处理领域中的重要研究课题。语音信号处理涉及数字信号处理、语言学、语音学、生理学、心理学、计算机科学以及模式识别、人工智能等诸多学科领域,是目前信息科学技术学科中发展最为迅速的一个领域。
在语音处理技术中,线性预测是第一个真正得到实际应用的技术,可以用于估计基本的语音参数,如基因周期、共振峰频率、频谱特征及声道面积函数等。
线性预测的基本原理是把待分析的信号用一个模型表示出来,信号是这个模型的输出,构成这个模型的参数是这个信号的重要特征,称为线性预测系数。一个语音取样的现在值可以用若干个语音取样的过去值的加权线性组合来逼近。加权系数称为预测系数。如果利用过去 p个样点值来进行预测,称为p 阶线性预测。线性预测编码就是利用过去的样值对新鲜值进行预测,然后将样值的实际值与其预测值相减得到一个误差信号,显然误差信号的动态范围小于原始语音信号的动态范围,对误差信号进行量化编码,可大大减少量化所需的比特数,使编码速率降低。通常情况下,随着线性预测阶数p的增大,预测误差也将会越来越小,但是p也不是一直增加的,随着线性预测阶数p的增大,信号中的可预测部分也将越来越少,预测误差的变化趋于平稳,误差减小不再明显。此时,伴随着预测阶数p的增大,整个系统的计算量将会越来越大。为此,对于不同的信号,我们需要确定一个最优的预测阶数p,进而进行预测分析。
在对原始语音信号进行处理之前我们要对信号进行预处理,语音信号的预处理也叫作前端处理,是指在特征提取之前,先对原始语音进行处理,使处理后的信号更能满足实际的需要,对提高处理精确度有重要的意义。一般预处理的步骤包括采样、预加重、加窗分帧和去噪等,本文采取分帧去除直流分量后再剔除噪声帧来进行预处理,本文求阈值的方法就是求出语音信号中的高斯白噪声,然后设置阈值,将没帧信号和阈值进行比较,如果比阈值小的就是噪声帧,直接去除。预处理结束后,我们对语音信号进行LPC分析,本文中通过Levinson-Durbin算法求出预测系数,在通过不同阶数P的滤波器得到预测误差从而找出最小误差值下的最优阶数P,最后作出最小误差与P的关系曲线图。
2.LPC基本原理
(1)语音信号的样值序列为s(n),n=1,2,3……n,s(n)的预测值为
(1)
线性误差为e(n)
(2)
设计传递函数为A(z),为LPC误差滤波器,设计预测误差滤波器A(z)就是求解预测系数,使得误差在预定准则下最小
(3)
(2)理论上常用的是均方误差最小的准则,对各个系数求偏导,另其结果为0,得到
(4)
S(n)的自相关序列为
(5)
因为它是偶对称,因此
(6)
所以上式可以表示为
, (7)
设,,
式子(7)的矩阵形式为,所以就可以求出P个线性预测系数。
3. Levinson-Durbin算法
杜宾算法是一种有效计算预测系数的算法,它主要是采用递归算法求解,基本思想是:递归解法分步进行。在某一步已经有了一个解,这是第(i-1)阶预测器的系数。然后利用(i-1)阶方程组的解来表示,(i-1)阶方程组的解又可以用(i-2)阶方程组的解表示,依此类推。因此只要解出任意一阶方程的解,就可以通过递推解出任意方程组的解。利用杜宾算法我们从最低阶开始,从低阶到高阶逐阶递推。过程如下:
(8)
(9)
(10)
(11)
(12)
(13)
上式(8)—(13)对i=1,2,……,p进行递推求解,其最终解为
(14)
在上面的一组式子中,i表示预测器阶数,如表示i阶预测器的第j个预测系数。对于p阶预测器,在上述求解预测器系数的过程中,阶数低于p的各个阶预测器系数也同时得到。
4.结果图像分析
5.结论
图像结果最佳预测点P值如下表所示
语音文件
最佳系数P
Bird
26
Dog
14
GirlEng
13
MaleChns
9
从上图中我们可以看出来不同的语言信号在相同的算法下得到的最佳预测阶数是不同的,鸟儿语音所要的阶数是最高的,其余三个语音的阶数相差不大。
6.附加程序
BIRD语音程序
clear all;
clc;
filename='Bird';
load Bird wavedata;%读入语音
%对语音进行分帧
len=200;inc=80; %设置帧长,帧移
wavesize=size(wavedata,2);
fsum=fix((wavesize-len+inc)/inc);%计算帧数
f=zeros(fsum,len);%初始化
i=1;n=1;
while i<=fsum
j=1;
while j<=len
f(i,j)=wavedata(1,n);
n=n+1;
j=j+1;
end
n=n+inc-len;
i=i+1;
end
%去除噪声帧
if size(wavedata,1)<=1 %求出鸟鸣语音的直流量
dc=sum(wavedata(30000:34000))/4000;
else
a=wavedata(1,:);
for i=2:size(wavedata,1)
a=cat(2,a,wavedata(i,:));
end
dc=sum(a(1:4000))/4000;
end
wavesize1=size(f,2);
n=1;
for i=1:size(f,1)
fp=sum((f(1:wavesize1)-dc).^2)/(wavesize1-1);%帧信号的平均能量
eva=sum((wavedata(30000:34000)-dc).^2)/4000;%鸟鸣语音求出高斯白噪声的估计方差
threshold=2*wavesize1*eva*(erfcinv(10^-3))^2/(wavesize1-1);%求阈值
if fp>=threshold%阈值进行比较,比阈值大的就是有效帧
wvalid(n,:)=f(i,:);%设置有效语音矩阵
n=n+1
end
end
vs=n-1;%将有效帧的个数赋给vs
for k=1:vs
[ap(1:50,1:50,k),g(k,1:50),ep(k,1:50),r0(1,k)]=levinson_durbin(wvalid(k,:),50,dc);%调用函数求得预测系数,增益G,以及误差值
end
div=zeros(2,50);
for p=1:50
div(1,p)=sum((ep(1:vs,p)')./r0(1,1:vs))/vs;%使用方法一来获取最小均方误差与帧能量的比值
end
%绘制图形
plot((1:1:50),div(1,:),'-*k');
title(['归一化误差与阶数关系','(',filename,')']);
xlabel('线性预测阶数p');ylabel('归一化误差')
axis([1,50,0,1]);
grid on;
杜宾算法函数
function [ap,g,ep,r0]=levinson_durbin(waveframe,p,dc)
fl =size(waveframe,2);%求帧信号的长度
r=zeros(1,p);%自相关序列
wave=waveframe-dc;%帧信号减去直流量
for k=1:fl
r(k) =wave(1:fl-k+1)*(wave(k:fl))'/fl; %求自相关函数的渐近无偏估计
end
k=zeros(1,p);%反射系数
e=zeros(1,p);%最小均方误差
a=zeros(p,p);%线性预测系数矩阵
k(1)=r(2)/r(1);%初始化
e(1)=(1-k(1)^2)*r(1);
a(1,1)=k(1);
for i=2:p%levinson_durbin递推算法
k(i)=(r(i+1)-a(i-1,1:i-1)*fliplr(r(1+1:i))')/e(i-1);
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);
end
ap=a;
g=sqrt(e(1:p));
ep=e(1:p);
r0=r(1);
犬吠的高斯白噪声部分在10000~14000部分
人声的部分在1~4000部分,所以上述程序中只要将白噪声部分数据更换就可以得到其余的图像。
7.参考文献
[1]宋知用. MATLAB在语音信号分析与合成中的应用 [M] 北京:北京航空航天大学出版社,2013.
[2]张雪英.数字语音处理及MATLAB仿真 [M] 北京:电子工业出版社,2010.
展开阅读全文