用Matlab编程实现语音信号的短时分析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
for ii=[1:240-nn],
Yn1(nn) =Yn1(nn)+ abs(temp(ii)-temp(nn+ii));
end
end
figure(2)
subplot(4,1,2)
jj=[1:240];
plot(jj, Yn1,'b');
grid
%%%%%%清音,取12120--12360个点
%短时自相关函数
(2)浊音:短时能量大、短时平均幅度大、短时过零率低;清音:短时能量小、短时平均幅度小、短时过零率高。
(3)基音提取-消除共振峰的影响。从画出的图形中间可以看出,没有加滤波器的声音信号处理后共振峰的影响很大。但是加一个60~500Hz的带通滤波器,利用滤波后的信号进行基因估计,这样可除去大部分共振峰的影响,自相关函数和短时平均幅度差函数具有更尖锐地峰值,有利于判决地准确性。
%axis([9,50,-0.01,0.02])
%短时平均幅度差函数
Yn2=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Yn2(nn) =Yn2(nn)+ abs(temp(ii)-temp(nn+ii));
end
end
figure(2)
subplot(4,1,4)
temp=Y(12121:12360);
%% %temp2=reshape(temp,1,240);
%temp=temp2.*B;
Rn2=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Rn2(nn) =Rn2(nn)+ temp(ii)*temp(nn+ii);
subplot(4,1,1)
jj=[1:240];
plot(jj, Rn1,'b');
grid
%axis([9,50,-0.01,0.02])
%短时平均幅度差函数
Yn1=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Yn1(nn) =Yn1(nn)+ abs(temp(ii)-temp(nn+ii));
temp=Y(13271:13510);
%
% wc1 = 0.0075; wc2 = 0.9625;
% wn = [wc1/pi,wc2/pi];
% h = fir1(239,wn,blackman(240));
% h=reshape(h,240,1);
% temp= temp.*abs(h);
%
%% %temp2=reshape(temp,1,240);
浊音:短时能量大、短时平均幅度大、短时过零率低;清音:短时能量小、短时平均幅度小、短时过零率高。浊音,取13270--13510个点,清音,取12120--12360个点。分别计算他们的短时自相关函数和平均幅度差函数;
(5)根据图形,分析浊音段语音的基音周期。
四、实验结论与分析
(1)从图中明显可以看出,浊音信号的具有明显的周期性,其自相关函数和平均幅度差函数也表现出周期性。清音信号稍微差一点,但不是很明显,主要是由于清音信号的位置找的不是很好。
图1
图2
五、心得体会
在本次的课程设计中,通过自己查找资料,修改程序,最后得出了基音频率。这种以实验方式学习的过程,加深了我对语音信号理论知识的理解,在设计中,也使我获得了很多新的知识,熟练对matlab的使用,对MATLAB的应用也更加熟练了。总的说来,这个实验在周老师的指导下完成,感谢周老师在这个课程教会了我们很多关于语音处理的知识。
%短时能量
Em=zeros(1,(LL-1)*240);
for ii=1:(LL-1)*240,
temp=Y(ii:ii+240);
Em(ii)=sum(temp.*temp);
end
subplot(4,1,1)
jj=[1:(LL-1)*2Baidu Nhomakorabea0];
plot(jj, Em,'b');
grid
% axis([12000,16000,0.15,0.4])
end
end
figure(2)
subplot(4,1,2)
jj=[1:240];
plot(jj, Yn1,'b');
grid
%%%%%%清音,取12120--12360个点
%短时自相关函数
temp=Y(12121:12360);
%% %temp2=reshape(temp,1,240);
%temp=temp2.*B;
三、实验步骤
(1)从网上找了一段录音,采样率为8KHZ,量化精度为16比特线性码。
(2)利用设计方案中给定的公式分别编程计算这段语音信号的短时能量、短时平均幅度、短时过零率,然后分别画出它们的曲线;
(3)然后画出短时零能比曲线。
(4)根据上述结果判断找出其中的一帧浊音信号和一帧清音信号。判断依据是,
figure(1)
set(1,'Position',[10,35,350,650])
%短时能量
Em=zeros(1,(LL-1)*240);
for ii=1:(LL-1)*240,
temp=Y(ii:ii+240);
Em(ii)=sum(temp.*temp);
end
subplot(4,1,1)
jj=[1:(LL-1)*240];
plot(jj, Zn./Em,'b');
grid
% axis([12000,16000,0,100])
%
% Wn=[60/8000 ,500/8000]
% n=[1:240];
% B = FIR1(239,Wn,'bandpass');
%%%%%%浊音,取13270--13510个点
%短时自相关函数
(4)画出的波形如下所示:
图1为没有加窗nowindow.wav,,无滤波,图2为加窗后的语音信号为havewindow.wav,有滤波。
图1没有滤波的第一列的图形从上到下分别表示:短时能量、短时平均幅度、短时过零
率和零能比曲线,第二列从上到下分别为浊音的短时自相关函数、短时平均幅度差函数和轻清音的短时自相关函数、短时平均幅度差函数。
%temp=temp2.*B;
Rn1=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Rn1(nn) =Rn1(nn)+ temp(ii)*temp(nn+ii);
end
end
figure(2)
set(2,'Position',[400,35,350,650])
Zn(ii)=sum(abs(temp1-temp));
end
figure(1)
subplot(4,1,3)
jj=[1:(LL-1)*240];
plot(jj, Zn,'b');
grid
% axis([12000,16000,0,20])
%零能比曲线
figure(1)
subplot(4,1,4)
jj=[1:(LL-1)*240];
plot(jj, Mn,'b');
grid
% axis([12000,16000,0.02,0.04])
%短时过零率
Zn=zeros(1,(LL-1)*240);
for ii=2:(LL-1)*240,
temp1=sign(Y(ii:ii+240));
temp=sign(Y(ii-1:ii+240-1));
%短时平均幅度Mn=sum(abs(Y))/N
Mn=zeros(1,(LL-1)*240);
for ii=1:(LL-1)*240,
temp=Y(ii:ii+240);
Mn(ii)=sum(abs(temp))/N;
end
figure(1)
subplot(4,1,2)
jj=[1:(LL-1)*240];
end
end
figure(2)
subplot(4,1,3)
jj=[1:240];
plot(jj, Rn2,'b');
grid
%axis([9,50,-0.01,0.02])
%短时平均幅度差函数
Yn2=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Yn2(nn) =Yn2(nn)+ abs(temp(ii)-temp(nn+ii));
Rn2=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Rn2(nn) =Rn2(nn)+ temp(ii)*temp(nn+ii);
end
end
figure(2)
subplot(4,1,3)
jj=[1:240];
plot(jj, Rn2,'b');
grid
jj=[1:240];
plot(jj, Yn2,'b');
grid
%%加窗后的语音信号为havewindow.wav
N=240
Y=WAVREAD('havewindow',[1 18000]);
L=length(Y)%30秒,每秒8000个点,一共240000个点
LL=length(Y)/N %一共1000帧
temp1=sign(Y(ii:ii+240));
temp=sign(Y(ii-1:ii+240-1));
Zn(ii)=sum(abs(temp1-temp));
end
figure(1)
subplot(4,1,3)
jj=[1:(LL-1)*240];
plot(jj, Zn,'b');
grid
% axis([12000,16000,0,60])
%%%%%%浊音,取13270--13510个点
%短时自相关函数
temp=Y(13271:13510);
%% %temp2=reshape(temp,1,240);
%temp=temp2.*B;
Rn1=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Rn1(nn) =Rn1(nn)+ temp(ii)*temp(nn+ii);
用Matlab编程实现语音信号的短时分析
一、目的
1.在理论学习的基础上,进一步地理解和掌握语音信号短时分析的意义,短时时域分析的基
本方法。
2.进一步理解和掌握语音信号短时平均能量函数及短时平均过零数的计算方法和重要意义。
二、原理及方法
一定时宽的语音信号,其能量的大小随时间有明显的变化。其中清音段(以清音为主要成份的语音段),其能量比浊音段小得多。短时过零数也可用于语音信号分析中,发浊音时,其语音能量约集中于3kHz以下,而发清音时,多数能量出现在较高频率上,可认为浊音时具有较低的平均过零数,而清音时具有较高的平均过零数,因而,对一短时语音段计算其短时平均能量及短时平均过零数,就可以较好地区分其中的清音段和浊音段,从而可判别句中清、浊音转变时刻,声母韵母的分界以及无声与有声的分界。这在语音识别中有重要意义。
六、附录
源程序:
%没有加窗nowindow.wav
N=240
Y=WAVREAD('nowindow',[1 18000]);
L=length(Y)%30秒,每秒8000个点,一共240000个点
LL=length(Y)/N %一共1000帧
figure(1)
set(1,'Position',[10,35,350,650])
plot(jj, Em,'b');
grid
% axis([0,(LL-1)*240,0,0.6])
% axis([12000,16000,0,0.06])
%短时平均幅度Mn=sum(abs(Y))/N
Mn=zeros(1,(LL-1)*240);
for ii=1:(LL-1)*240,
temp=Y(ii:ii+240);
Mn(ii)=sum(abs(temp))/N;
end
figure(1)
subplot(4,1,2)
jj=[1:(LL-1)*240];
plot(jj, Mn,'b');
grid
% axis([12000,16000,0,0.015])
%短时过零率
Zn=zeros(1,(LL-1)*240);
for ii=2:(LL-1)*240,
end
end
figure(2)
set(2,'Position',[400,35,350,650])
subplot(4,1,1)
jj=[1:240];
plot(jj, Rn1,'b');
grid
%axis([9,50,-0.01,0.02])
%短时平均幅度差函数
Yn1=zeros(1,240);
for nn=[1:240],
%零能比曲线
figure(1)
subplot(4,1,4)
jj=[1:(LL-1)*240];
plot(jj, Zn./Em,'b');
grid
%axis([12000,16000,0,3*10^7])
%
% Wn=[60/8000 ,500/8000]
% n=[1:240];
% B = FIR1(239,Wn,'bandpass');
Yn1(nn) =Yn1(nn)+ abs(temp(ii)-temp(nn+ii));
end
end
figure(2)
subplot(4,1,2)
jj=[1:240];
plot(jj, Yn1,'b');
grid
%%%%%%清音,取12120--12360个点
%短时自相关函数
(2)浊音:短时能量大、短时平均幅度大、短时过零率低;清音:短时能量小、短时平均幅度小、短时过零率高。
(3)基音提取-消除共振峰的影响。从画出的图形中间可以看出,没有加滤波器的声音信号处理后共振峰的影响很大。但是加一个60~500Hz的带通滤波器,利用滤波后的信号进行基因估计,这样可除去大部分共振峰的影响,自相关函数和短时平均幅度差函数具有更尖锐地峰值,有利于判决地准确性。
%axis([9,50,-0.01,0.02])
%短时平均幅度差函数
Yn2=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Yn2(nn) =Yn2(nn)+ abs(temp(ii)-temp(nn+ii));
end
end
figure(2)
subplot(4,1,4)
temp=Y(12121:12360);
%% %temp2=reshape(temp,1,240);
%temp=temp2.*B;
Rn2=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Rn2(nn) =Rn2(nn)+ temp(ii)*temp(nn+ii);
subplot(4,1,1)
jj=[1:240];
plot(jj, Rn1,'b');
grid
%axis([9,50,-0.01,0.02])
%短时平均幅度差函数
Yn1=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Yn1(nn) =Yn1(nn)+ abs(temp(ii)-temp(nn+ii));
temp=Y(13271:13510);
%
% wc1 = 0.0075; wc2 = 0.9625;
% wn = [wc1/pi,wc2/pi];
% h = fir1(239,wn,blackman(240));
% h=reshape(h,240,1);
% temp= temp.*abs(h);
%
%% %temp2=reshape(temp,1,240);
浊音:短时能量大、短时平均幅度大、短时过零率低;清音:短时能量小、短时平均幅度小、短时过零率高。浊音,取13270--13510个点,清音,取12120--12360个点。分别计算他们的短时自相关函数和平均幅度差函数;
(5)根据图形,分析浊音段语音的基音周期。
四、实验结论与分析
(1)从图中明显可以看出,浊音信号的具有明显的周期性,其自相关函数和平均幅度差函数也表现出周期性。清音信号稍微差一点,但不是很明显,主要是由于清音信号的位置找的不是很好。
图1
图2
五、心得体会
在本次的课程设计中,通过自己查找资料,修改程序,最后得出了基音频率。这种以实验方式学习的过程,加深了我对语音信号理论知识的理解,在设计中,也使我获得了很多新的知识,熟练对matlab的使用,对MATLAB的应用也更加熟练了。总的说来,这个实验在周老师的指导下完成,感谢周老师在这个课程教会了我们很多关于语音处理的知识。
%短时能量
Em=zeros(1,(LL-1)*240);
for ii=1:(LL-1)*240,
temp=Y(ii:ii+240);
Em(ii)=sum(temp.*temp);
end
subplot(4,1,1)
jj=[1:(LL-1)*2Baidu Nhomakorabea0];
plot(jj, Em,'b');
grid
% axis([12000,16000,0.15,0.4])
end
end
figure(2)
subplot(4,1,2)
jj=[1:240];
plot(jj, Yn1,'b');
grid
%%%%%%清音,取12120--12360个点
%短时自相关函数
temp=Y(12121:12360);
%% %temp2=reshape(temp,1,240);
%temp=temp2.*B;
三、实验步骤
(1)从网上找了一段录音,采样率为8KHZ,量化精度为16比特线性码。
(2)利用设计方案中给定的公式分别编程计算这段语音信号的短时能量、短时平均幅度、短时过零率,然后分别画出它们的曲线;
(3)然后画出短时零能比曲线。
(4)根据上述结果判断找出其中的一帧浊音信号和一帧清音信号。判断依据是,
figure(1)
set(1,'Position',[10,35,350,650])
%短时能量
Em=zeros(1,(LL-1)*240);
for ii=1:(LL-1)*240,
temp=Y(ii:ii+240);
Em(ii)=sum(temp.*temp);
end
subplot(4,1,1)
jj=[1:(LL-1)*240];
plot(jj, Zn./Em,'b');
grid
% axis([12000,16000,0,100])
%
% Wn=[60/8000 ,500/8000]
% n=[1:240];
% B = FIR1(239,Wn,'bandpass');
%%%%%%浊音,取13270--13510个点
%短时自相关函数
(4)画出的波形如下所示:
图1为没有加窗nowindow.wav,,无滤波,图2为加窗后的语音信号为havewindow.wav,有滤波。
图1没有滤波的第一列的图形从上到下分别表示:短时能量、短时平均幅度、短时过零
率和零能比曲线,第二列从上到下分别为浊音的短时自相关函数、短时平均幅度差函数和轻清音的短时自相关函数、短时平均幅度差函数。
%temp=temp2.*B;
Rn1=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Rn1(nn) =Rn1(nn)+ temp(ii)*temp(nn+ii);
end
end
figure(2)
set(2,'Position',[400,35,350,650])
Zn(ii)=sum(abs(temp1-temp));
end
figure(1)
subplot(4,1,3)
jj=[1:(LL-1)*240];
plot(jj, Zn,'b');
grid
% axis([12000,16000,0,20])
%零能比曲线
figure(1)
subplot(4,1,4)
jj=[1:(LL-1)*240];
plot(jj, Mn,'b');
grid
% axis([12000,16000,0.02,0.04])
%短时过零率
Zn=zeros(1,(LL-1)*240);
for ii=2:(LL-1)*240,
temp1=sign(Y(ii:ii+240));
temp=sign(Y(ii-1:ii+240-1));
%短时平均幅度Mn=sum(abs(Y))/N
Mn=zeros(1,(LL-1)*240);
for ii=1:(LL-1)*240,
temp=Y(ii:ii+240);
Mn(ii)=sum(abs(temp))/N;
end
figure(1)
subplot(4,1,2)
jj=[1:(LL-1)*240];
end
end
figure(2)
subplot(4,1,3)
jj=[1:240];
plot(jj, Rn2,'b');
grid
%axis([9,50,-0.01,0.02])
%短时平均幅度差函数
Yn2=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Yn2(nn) =Yn2(nn)+ abs(temp(ii)-temp(nn+ii));
Rn2=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Rn2(nn) =Rn2(nn)+ temp(ii)*temp(nn+ii);
end
end
figure(2)
subplot(4,1,3)
jj=[1:240];
plot(jj, Rn2,'b');
grid
jj=[1:240];
plot(jj, Yn2,'b');
grid
%%加窗后的语音信号为havewindow.wav
N=240
Y=WAVREAD('havewindow',[1 18000]);
L=length(Y)%30秒,每秒8000个点,一共240000个点
LL=length(Y)/N %一共1000帧
temp1=sign(Y(ii:ii+240));
temp=sign(Y(ii-1:ii+240-1));
Zn(ii)=sum(abs(temp1-temp));
end
figure(1)
subplot(4,1,3)
jj=[1:(LL-1)*240];
plot(jj, Zn,'b');
grid
% axis([12000,16000,0,60])
%%%%%%浊音,取13270--13510个点
%短时自相关函数
temp=Y(13271:13510);
%% %temp2=reshape(temp,1,240);
%temp=temp2.*B;
Rn1=zeros(1,240);
for nn=[1:240],
for ii=[1:240-nn],
Rn1(nn) =Rn1(nn)+ temp(ii)*temp(nn+ii);
用Matlab编程实现语音信号的短时分析
一、目的
1.在理论学习的基础上,进一步地理解和掌握语音信号短时分析的意义,短时时域分析的基
本方法。
2.进一步理解和掌握语音信号短时平均能量函数及短时平均过零数的计算方法和重要意义。
二、原理及方法
一定时宽的语音信号,其能量的大小随时间有明显的变化。其中清音段(以清音为主要成份的语音段),其能量比浊音段小得多。短时过零数也可用于语音信号分析中,发浊音时,其语音能量约集中于3kHz以下,而发清音时,多数能量出现在较高频率上,可认为浊音时具有较低的平均过零数,而清音时具有较高的平均过零数,因而,对一短时语音段计算其短时平均能量及短时平均过零数,就可以较好地区分其中的清音段和浊音段,从而可判别句中清、浊音转变时刻,声母韵母的分界以及无声与有声的分界。这在语音识别中有重要意义。
六、附录
源程序:
%没有加窗nowindow.wav
N=240
Y=WAVREAD('nowindow',[1 18000]);
L=length(Y)%30秒,每秒8000个点,一共240000个点
LL=length(Y)/N %一共1000帧
figure(1)
set(1,'Position',[10,35,350,650])
plot(jj, Em,'b');
grid
% axis([0,(LL-1)*240,0,0.6])
% axis([12000,16000,0,0.06])
%短时平均幅度Mn=sum(abs(Y))/N
Mn=zeros(1,(LL-1)*240);
for ii=1:(LL-1)*240,
temp=Y(ii:ii+240);
Mn(ii)=sum(abs(temp))/N;
end
figure(1)
subplot(4,1,2)
jj=[1:(LL-1)*240];
plot(jj, Mn,'b');
grid
% axis([12000,16000,0,0.015])
%短时过零率
Zn=zeros(1,(LL-1)*240);
for ii=2:(LL-1)*240,
end
end
figure(2)
set(2,'Position',[400,35,350,650])
subplot(4,1,1)
jj=[1:240];
plot(jj, Rn1,'b');
grid
%axis([9,50,-0.01,0.02])
%短时平均幅度差函数
Yn1=zeros(1,240);
for nn=[1:240],
%零能比曲线
figure(1)
subplot(4,1,4)
jj=[1:(LL-1)*240];
plot(jj, Zn./Em,'b');
grid
%axis([12000,16000,0,3*10^7])
%
% Wn=[60/8000 ,500/8000]
% n=[1:240];
% B = FIR1(239,Wn,'bandpass');