这篇文章上次修改于 222 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

窗函数分析

我们先画出一个N=50的典型矩形窗和汉明窗的时域图、频域图和归一化频谱图:
MATLAB代码:

close all,clear all,clc
N=50;
w_rec=rectwin(N);
w_hamm=hamming(N);
fre_w_rec=fft((w_rec),N*4);
fre_w_hamm=fft(w_hamm,N*4);
figure
subplot(211)
stem([0:N-1],w_rec),ylabel('幅度'),xlabel('样点数')
subplot(212)
plot(-N*2+1:N*2,(abs(fftshift(fre_w_rec)))),ylabel('振幅'),xlabel('频率')
figure
subplot(211)
stem([0:N-1],w_hamm),ylabel('幅度'),xlabel('样点数')
subplot(212)
plot(-N*2+1:N*2,(abs(fftshift(fre_w_hamm)))),ylabel('振幅'),xlabel('频率')
fvtool(w_rec)
fvtool(w_hamm) 

矩形窗波形:
NQO96E_NY1P_DW_0AGT0FQ3.png

汉明窗波形:
AZ~I6V_4Q@6NL5J1I68DAC5.png

从时域图上看,我们可以看到,在同为N=50的采样点的情况下,矩形窗像一个矩形,边缘是直接变换,而汉明窗是平滑的进行变化,汉明窗的分辨率大于矩形窗;
从频率域上看,矩形窗的旁瓣比较高,不能很好的抑制住旁瓣,存在旁瓣泄露的问题,并且还有负旁瓣,这样不能将能量很好的集中在主瓣上,会导致变换中的干扰和泄露。
由图可以看出汉明窗的主瓣降低了,但是因此也让旁瓣比起矩形窗而言显著地减小,因此,和矩形窗相比起来,泄露和波动都更低。但是由于汉明窗的主瓣加宽,这样导致分析带宽加宽,因此,在频率域上,矩形窗的分辨率要大于汉明窗。

矩形窗的归一化频率:
87_`7P2_2_JAO5_8FRTPUYC.png

汉明窗的归一化频率:
_XBOXVUXVATVD1MT_Z_9D3R.png

从归一化频率上分析:矩形窗的变化并没有汉明窗明显,变化的幅度较小,而汉明窗的变化较大,阻带衰减在50db左右。

浊音与清音的录制

现在,录制一段带有清音和浊音的语音信息,代码如下:

close all
clear all
clc
t=5;%录音时长
fs=8000;%采样频率
Nbit=16;%bit数
Nchan=1;%通道数
myvoice=audiorecorder(fs,Nbit,Nchan);
disp('开始录音,按任意键开始')
pause
recordblocking(myvoice,t);
disp('录音结束');
play(myvoice);
myRecording=getaudiodata(myvoice);
plot(myRecording);
audiowrite('myvoice.wav',myRecording,fs);

采样频率8000hz,我们设置为单通道语音,以便于分析。
录制语音为:“你不想吃它吗?”
其中,浊音为“吗”和“你”,轻音为“它”和“不”,信号图谱如下:
N_EBYI9SKW5_0_F1OL@N02Q.png

短时能量分析

我们选取N=50和N1=512*2的窗长度,并分别选用矩形窗和汉明窗进行短时能量的分析:

clear all
close all
clc
[s1 f1]=audioread('D:\englishapp\MATLAB\single\myvoice.wav'); 
N=100;N1=512*2;  ste=64;
s1=s1';
win=hamming(N)';%汉明窗和长度50
win1=rectwin(N)';%矩形窗和长度50
winm=hamming(N1)';%汉明窗和长度512*2
winm1=rectwin(N1)';%矩形窗和长度512*2
ns1=[]; ns2=[]; ns11=[]; ns22=[];
mans1=[]; mans11=[]; %magnitude
for i=1:ste:(length(s1)-N)%分段取出数据
ns1=[ns1;s1(i:i+N-1)];
end
for i=1:ste:(length(s1)-N1)%窗长度为512*2
ns11=[ns11;s1(i:i+N1-1)];
end
energy=[]; energy1=[];energyre=[]; energyh=[]; 
energyre1=[];energyh1=[];%mg=[]; mg1=[]; mgh=[];
for i=1:size(ns1,1)
energy=[energy;sum((ns1(i,:)).^2)];%原始能量
end
for i=1:size(ns11,1)
energy1=[energy1;sum((ns11(i,:)).^2)];%原始能量,N=512*2
end
for i=1:size(ns1,1)
energyh=[energyh;sum((ns1(i,:).*win).^2)];%加汉明窗
end
for i=1:size(ns1,1)
energyre=[energyre;sum((ns1(i,:).*win1).^2)];%加矩形窗
end
for i=1:size(ns11,1)
energyh1=[energyh1;sum((ns11(i,:).*winm).^2)];%512*2加汉明窗
end
for i=1:size(ns11,1)
energyre1=[energyre1;sum((ns11(i,:).*winm1).^2)];%512*2加矩形窗
end
figure(1)
plot(s1)
figure(2)
subplot(2,3,1),plot(energy),title('N=50原始能量图')
subplot(2,3,2),plot(energyre),title('N=50矩形窗能量图')
subplot(2,3,3),plot(energyh),title('N=50汉明窗能量图')
subplot(2,3,4),plot(energy1),title('N=512*2原始能量图')
subplot(2,3,5),plot(energyre1),title('N=512*2矩形窗能量图')
subplot(2,3,6),plot(energyh1),title('N=512*2汉明窗能量图')

结果如下:
SXT8XED~C1FK0H_XGM48570.png
由图可以看出,在窗长度都为N=50的时候,矩形窗的幅度比汉明窗更高,但是与此同时,对低频部分的压制上,汉明窗比矩形窗更好,因此,汉明窗更能突出高频部分的内容。
在N不同的情况下,窗的长度更长的N=512*2的平滑作用比N=50的平滑作用更明显。同时幅度值更高,但是由于平滑作用更明显,短时能量的变化并不大,无法很好地体现语音信号的时变特性。
当N不够长的时候,不够平滑,无法很好的体现出振幅的变化规律。

短时过零率分析

这里,我们将信号进行短时过零率计算:

clear all
close all
clc
[s1 f1]=audioread('D:\englishapp\MATLAB\single\myvoice.wav');
len=128;
ste=64;
s1=s1(:,1)';
ns1=[]; ns2=[];
for i=1:ste:(length(s1)-len)
ns1=[ns1;s1(i:i+len-1)];
end
z=[];z1=[];
for i=1:size(ns1,1)
ztemp=0;
for j=1:length(ns1(i,:))-1
if ns1(i,j)*ns1(i,j+1)<0
ztemp=ztemp+1;
end
end
z=[z;ztemp];
ztemp=0;
T=0.005;
for j=1:length(ns1(i,:))-1
if ((ns1(i,j)-T)*(ns1(i,j+1)-T))<0
ztemp=ztemp+1;
end
end
z1=[z1;ztemp];
end
 
figure
plot(z)
figure
plot(z1)

[2xO4Ag.png]
从短时能量上看,浊音的“吗”和“你”的幅度明显高于“它”和“不”,而从短时过零率上看,轻音的过零率高于浊音,可以得出清音基本上是中高频的能量,而过零率反映主要的波形变化,过零率越高的,波形也就越大。

自相关函数分析

截取浊音“你”和轻音“不”的语音采样点,以不同的窗长N进行分析:

clear all;
close all;
clc
[s1 f1]=audioread('D:\englishapp\MATLAB\single\myvoice.wav');
N=128; ste=64;N1=512*2;
s=s1(5000:9000)';
ss=s1(12680:15760)';
win=hanning(N)';
s_corr=[];ss_corr=[];
for k=0:N-1
temp=0;temps=0;
% for i=1:N-k
for i=1:N
temp=temp+s(i)*s(i+k);
end
s_corr=[s_corr; temp];
end
for k=0:N-1
temp=0;
% for i=1:N-k
for i=1:N
temps=temps+ss(i)*ss(i+k);
end
ss_corr=[ss_corr; temps];
end
 
s_corr1=[];ss_corr1=[];
for k=0:N1-1
temp1=0;temps1=0;
% for i=1:N-k
for i=1:N1
temp1=temp1+s(i)*s(i+k);
end
s_corr1=[s_corr1; temp1];
end
for k=0:N1-1
temp1=0;
% for i=1:N-k
for i=1:N1
temps1=temps1+ss(i)*ss(i+k);
end
ss_corr1=[ss_corr; temps1];
end
figure
subplot(2,2,1),plot(s_corr),title('N=128浊音自相关函数')
subplot(2,2,2),plot(ss_corr),title('N=128轻音自相关函数')
subplot(2,2,3),plot(s_corr1),title('N=512*2浊音自相关函数')
subplot(2,2,4),plot(ss_corr1),title('N=512*2轻音自相关函数')

J_L~9QWT__4KK7OX_S2_L~N.png
从N=128的自相关函数图可以看出,浊音的自相关函数幅度会迅速下降,而轻音不会迅速下降,从N=512*2的自相关函数图,浊音具有明显的周期性,而清音没有周期性。因此我们还能够通过自相关函数进行分辨浊音和轻音。