2012-10-09 50 views
4

MATLAB documentation examples for the spectrogram function給出了頻率軸設置爲[0 500]的示例。我可以將其更改爲[0 100]之類的內容嗎?很明顯,運行axis命令會爲我執行此操作,但會調整最終結果並「炸燬」結果圖,使其像素化。我基本上想要建立一個光譜圖,只查找0-100之間的頻率,而不是在建立光譜圖後重新縮放。我可以調整譜圖頻率軸嗎?

下面是從文檔的例子:

T = 0:0.001:2; 
X = chirp(T,0,1,150); 
spectrogram(X,256,250,256,1E3,'yaxis'); 

這將產生以下:下面到350Hz Linear chirp spectrogram

一切都是不需要的。在建立譜圖時,是否有辦法不包括350到500之間的所有內容,而不是事後調整座標軸?

回答

6

從文檔:

[S,F,T] =譜圖(X,窗口,noverlap,F)使用以Hz頻率的矢量F。 F必須是一個至少有兩個元素的向量。這種情況下使用Goertzel算法計算頻率爲F的頻譜圖。指定的頻率被舍入到與信號分辨率相稱的最近的DFT箱。在使用nfft或nfft默認值的所有其他語法情況下,將使用短時傅立葉變換。返回的F矢量是四捨五入頻率的矢量。 T是計算譜圖的時間的向量。 F的長度等於S的行數.T的長度等於k,如上所定義,並且每個值對應於每個段的中心。

這對你有幫助嗎?

+0

也許吧。我一直在仔細研究試圖理解函數在做什麼的文檔;我沒有信號分析背景,所以這對我來說都很新。你能否提供輸出譜圖的例子? –

+0

@DangKhoa對不起,我沒有MATLAB在我面前。如果這個問題還沒有解決,我會盡力爲你生成一個。但是,這要說的是,如果你提供了一個頻率向量,例如'F = [1 10 20 50 100];'並將它傳遞給'spectrogram'函數,它將只計算頻譜圖在那些頻率(這是你想要的,我認爲) –

+0

使用'頻譜圖(x,窗口,noverlap,F,fs,'yaxis')'來完成這個操作。謝謝! –

-1

FFT速度如此之快,以至於最好提高分辨率,然後丟棄不需要的數據。如果您需要更好的頻譜分辨率(更多頻率分檔),請增加FFT大小。爲了在時間維上獲得更平滑的頻譜,增加noverlap值以減少每個後繼FFT的增量。在這種情況下,您不會指定F.如果FFT大小爲1024,那麼您將得到1024/2 + 1個頻率分檔。

FFTN = 512; 
start = 512*(350/500); % Only care about freq bins above this value 
WIN_SIZE = FFTN; 
overlap = floor(FFTN*0.8); 
[~,F,T,P] = spectrogram(y, WIN_SIZE, overlap, FFTN); 
f = 0:(length(F)-1); 
f = f*((Fs/2)/length(F)); 
P = P(start:512,:); 
f = f(1,start:512); 
imagesc(T,f,10*log10(P),[-70 20]); 
+0

爲什麼這會被投票? – kashiraja