對訊號做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)"就行了……
對訊號做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)"就行了……