语音信号处理
——语音信号的清、浊音分析
班级:
姓名:
学号:
时间:2014年9月22日
1 实验目的
通过Matlab 编程实现语音信号的时域波形图,并观察清音、浊音信号的时域特点。
掌握语音信号的时域分析技术,如短时平均能量、短时平均幅度、短时平均过零率分析、短时平均自相关、短时平均幅度差。
2 实验原理
语音信号是一种非平稳的时变信号,它携带着各种信息。
在语音编码、语音合成、语音识别和语音增强等语音处理中无一例外需要提取语音中包含的各种信息。
语音信号分析的目的就在与方便有效的提取并表示语音信号所携带的信息。
语音信号分析可以分为时域和变换域等处理方法,其中时域分析是最简单的方法,直接对语音信号的时域波形进行分析,提取的特征参数主要有语音的短时能量,短时平均过零率,短时自相关函数等。
3 实验过程
1)观察信号波形图
信号的采样周期为20kHz ,图中幅度较大的为浊音,幅度较小的为清音。
2)计算语音信号的短时能量、短时平均幅度并画图
1
20()N n n m E x m -==∑
1
0|()|N n n m M x m -==∑
由于语音信号的能量随时间变化,清音和浊音之间的能量差别显著。
平均幅度函数没有平方运算,因此动态范围比短时能量小,接近于标准能量计算的动态范围的平方根。
虽然都可以用来区分清、浊音,但短时平均幅度的清浊音幅度差没有短时能量明显。
3)计算信号的短时平均过零率并画图 1
1{|sgn[()]sgn[(1)]|}2N n n m Zn x m x m -==--∑
过零率可以反映信号的频谱特性。
高频率对应着高过零率,低频对应着低过零率。
浊音过零率低,清音的过零率低。
4)分别取语音信号的清、浊音部分,分析其短时自相关函数
1
0()()()N k n n n m R k x m x m k --==
+∑
分别取小段浊音、清音信号,计算其短时自相关函数。
浊音的自相关函数呈现出周期性,有明显突出的峰值,在80个采样点附近,其基因周期:
T=(1/fs)*80=(1/20000)*80=3ms ;
清音的短时自相关函数没有周期性,也不具有明显突出的峰值,其性质类似于噪声。
5)计算语音信号的短时平均幅度差函数并画图
1
0()|()()|N k n n n
m F k x m x m k --==
-+∑
由短时平均幅度差函数曲线可以看出,浊音信号在基因周期上出现极小值,而清音上没有明显的极小值。
短时自相关函数的运算量比较大,其乘法运算所需时间较长;短时平均幅度差函数只需加减和取绝对值运算,可以简化运算量,在语音信号分析时具有很大的优势。
4 小结
通过这次课程设计,使我对语音信号的时域分析有了全面的认识,对清浊音的特点及如何区分有了一定的认识。
了解了时域特征分析原理,并利用已学知识,编写程序求解语音信号的短时过零率、短时能量、短时自相关特征,分析实验结果,并能掌握借助时域分析方法所求得的参数分析语音信号的基音周期。
通过查书和资料,复习了MATLAB相关知识。
5 源程序:
clear;clc;clf;
fs=20000; %抽样频率
Y=wavread('a.wav');
sound(Y,fs); %读取语音信号“大学”
figure(1)
plot(Y) %做原始语音信号的时域图形
title('原始语音信号波形“大学”');
xlabel('样点数'); %x轴的名字是“样点数”ylabel('幅值'); %y轴名字是“幅值”
%axis([25000 50000 -0.3 0.2]);
grid on;
N=200;
L=length(Y);
LL=length(Y)/N;
figure(2)
Em=zeros(1,(LL-1)*200);
for ii=1:(LL-1)*200,
temp=Y(ii:ii+200);
Em(ii)=sum(temp.*temp);
end
jj=[1:(LL-1)*200];
subplot(211)
plot(jj,Em,'b'); %绘制短时平均能量曲线title('短时平均能量');
grid on;
%短时平均幅度Mn=sum(abs(Y))/N
Mn=zeros(1,(LL-1)*200);
for ii=1:(LL-1)*200,
temp=Y(ii:ii+200);
Mn(ii)=sum(abs(temp));
end
figure(2)
jj=[1:(LL-1)*200];
subplot(212)
plot(jj,Mn,'b'); %绘制短时平均幅度曲线
title('短时平均幅度');
grid on;
%短时过零率
Zn=zeros(1,(LL-1)*200);
for ii=2:(LL-1)*200,
temp1=sign(Y(ii:ii+200));
temp=sign(Y(ii-1:ii+200-1));
Zn(ii)=sum(abs(temp1-temp));
end
figure(3)
jj=[1:(LL-1)*200];
plot(jj,Zn,'b'); %绘制短时过零率函数曲线
title('短时过零率');
grid on;
%浊音,取14701--15700个点
%短时自相关函数
temp=Y(14701:15700);
Rn1=zeros(1,1000);
for nn=[1:1000],
for ii=[1:1000-nn],
Rn1(nn)=Rn1(nn)+temp(ii)*temp(nn+ii);
end
end
figure(4)
subplot(211)
jj=[1:1000];
plot(jj,Rn1,'b'); %绘制浊音短时自相关函数曲线title('浊音短时自相关函数');
grid on;
%清音,取10001--11000个点
%短时自相关函数
temp=Y(10001:11000);
Rn2=zeros(1,1000);
for nn=[1:1000],
for ii=[1:1000-nn],
Rn2(nn)=Rn2(nn)+temp(ii)*temp(nn+ii);
end
end
figure(4)
subplot(212)
jj=[1:1000];
plot(jj,Rn2,'b'); %绘制清音短时自相关函数曲线title('清音短时自相关函数');
grid on;
%浊音,取14701--15700个点
%短时幅度差函数
temp=Y(14701:15700);
Rn3=zeros(1,1000);
for nn=[1:1000],
for ii=[1:1000-nn],
Rn3(nn)=Rn3(nn)+abs(temp(ii)-temp(nn+ii));
end
end
figure(5)
subplot(211)
jj=[1:1000];
plot(jj,Rn3,'b'); %绘制浊音短时幅度差函数曲线
title('浊音短时幅度差函数');
grid on;
%清音,取10001--11000个点
%短时幅度差函数
temp=Y(10001:11000);
Rn4=zeros(1,1000);
for nn=[1:1000],
for ii=[1:1000-nn],
Rn4(nn)=Rn4(nn)+abs(temp(ii)-temp(nn+ii));
end
end
figure(5)
subplot(212)
jj=[1:1000];
plot(jj,Rn4,'b'); %绘制清音短时幅度差函数曲线
title('清音短时幅度差函数');
grid on;。