声音信号的频谱分析(二)
——wav文件的分段傅里叶分析
在上一篇“声音信号的频谱分析(一)”中,给出了几种声音信号的时域波形图和频谱图。但存在两个问题:第一,对wav文件全部读取出来一次性地进行傅里叶变换,点数太大,而实际中运用DSP的FFT点数是有限的;第二,语音是分节的,不同时间段上的频谱特性不同,应该对它进行分段分析。下面引入分段处理数据的方法。仍以matlab中自带的文件“bird.wav”为例进行分析。
示例程序:
[w,fs,bits]=wavread('C:\MATLAB701\toolbox\vr\vrealm\program\sounds\bird.wav');
sound(w,fs,bits); %听一下原始声音
y=w(:,1); %取其中一列
display('声音文件的大小为:');
size(w)
%按照每段N0个点分段,做N0
N0=1024;K=length(y)/N0;
Z=zeros(K,N0);
for i=1:K
Z(i,:)=(fft(y(1024*(i-1)+1:1024*i),N0)');
end
mesh(abs(Z)');
xlabel('x');ylabel('y');zlabel('z');
运行结果如下图所示,x坐标表示段数(即K的值,本程序中,K=19),y坐标表示每段的点数(该程序中,每段1024个点),z坐标表示频域幅度谱。显然,幅度谱是以1024/2=512为对称的,这是所有实信号的幅度谱的共性。
首先沿x方向看,整个wav数据分成的K段中,每段有两个峰值,与上表中的分析是一致的,但不同段幅度差别较大,如果沿y方向看,分成的K段中同一y位置处的幅度也是不同的,乘波浪起伏变化,说明语音是分节的,不同时间段的频谱不同。