其实Matlab自带了时频分析的函数specgram,这个函数就是相当于一个短时傅里叶转换功能,就不用傅里叶转换了。FFT只计算出1帧频谱,而specgram是计算出多帧频谱,如果信号a较长,当然也计算了更长的时间范围。specgram的调用格式是: specgram(x,nfft,fs,window,noverlap);
[b,f,t]=specgram(data,nfft,Fs,window,numoverlap);
imagesc(t,f,20*log10(abs(b))), axis xy, colormap(jet); % 画时频图 其中:
% nfft是fft的长度,越长的话,频域分辨率越高,但是,对于语音这种时变信号,不能过长,一般采样率16k或者8k的取1024或者512,要看采样率的高低。 % fs就是采样率,不多说了。
% window是指窗的长度,一般和nfft相同即可。
% numoverlap是指nfft减去步长,越大越好,但运算量越大。一般取nfft的3/4效果就比较好了。overlap是帧重叠的长度,要<= 1/2 * nff, 取1/4 * nff 就可以了。 % 举例:
% b= specgram(a,512,8000,512,384);
% b是一个矩阵,复数的,画图的时候需要取绝对值!
用spectrogram和specgram两函数得到的时频图为啥不一样???
两个命令分别如下:
h=window('hamming',512);[B,f,t]=specgram(x,512,Fs,h,400);figure;imagesc(t,f,abs(B));axis('xy');能出来图
figure(2);spectrogram(x,512,400,512,44100,'yaxis');
前者得到的图根本看不清,后者得到的图颜色又太多,到底是哪条线反映正确的频率??????????????? 还有,那么多颜色,代表什么意思??
因篇幅问题不能全部显示,请点此查看更多更全内容