如何用matlab繪製三維的頻譜圖(時間-頻率-能量)?

(圖片來源:基於指紋的音樂檢索 - 姚光超的專欄 - 博客頻道 - CSDN.NET)

FFT小白一隻,正在做一個提取音樂指紋的程序,其中需要對初始音頻做FFT並得到如上圖的頻譜圖,用FFT我只能得到二維的圖像,而

[S,F,T,P] = spectrogram(a,win,noverlap,nfft,fs);

surf(T,F,10*log10(P),"edgecolor","none")

得到的z軸是負的,不知道是為什麼。


對信號做FFT只能得到頻率和能量這二維,而(a)中的立體圖是做了STFT也就是將信號分為若干幀之後再對每一幀做FFT,所以得到的圖像是三維的。

你的代碼[S,F,T,P] = spectrogram(a,win,noverlap,nfft,fs);就是對採樣率為fs的信號做STFT: 把信號用長度為win的窗分割成若干幀,幀與幀之間重合的長度為noverlap,每一幀下做FFT返回的頻率數量為nfft(也就是設定頻域解析度為fs/nfft)。返回的F,T,P中每一個值代表是每一幀下每個頻率下的功率譜密度。

你在作圖時使用的surf(T,F,10*log10(P),"edgecolor","none")會繪製三維圖像,其中x軸為時間,y軸為頻率,z軸是10*log10(P)也就是將單位原本為Watts/Hz的P轉換為dB/Hz,在數字音頻界用的是滿刻度電平即把16bit採樣允許的最大值為0dB,你的信號如果沒有過載自然z軸都是負值。

如果你想像例子中一樣將(a)立體圖轉換成(b)平面圖顯示,surf之後加行代碼「view(2)"就行了……


做傅里葉變換後設置時間和頻率刻度,直接mesh。


推薦閱讀:

為什麼有些程序員會鄙視MATLAB?
MATLAB如何使不同值域具有不同的顏色?

TAG:MATLAB | 傅里葉變換FourierTransform | 音頻處理 |