2012-12-05 33 views
4

我知道有很多類似的問題,我仍然無法找出答案。 比方說,我們在MATLAB時間信號:在MATLAB中計算實際頻率值和FFT圖索引之間的關係時出現混淆

t=0:1/44100:1 

和頻率500Hz的餘弦信號:

x=cos(2*pi*500*t); 

現在,我想要繪製使用的信號x的fft命令獲得的幅度譜

FFT=abs(fft(x)) 
plot(FFT) 

根據該理論,我們應該得到的情節兩個高峯,一個在-500赫茲,另一個在500Hz的。 我不明白的是我確實有兩個峯值,但我無法弄清楚這些峯值的頻率是多少。我知道有一種方法可以使用FFT索引,輸入信號的長度和採樣頻率來計算頻率,但我仍然無法計算頻率。

我知道有一些方法可以對齊FFT圖,以便使用fftshift函數的峯值位於它們所代表的頻率的索引號上,但我想要的是使用所得到的圖形計算出頻率從簡單的調用這個函數:

FFT=fft(x) 

在這種情況下,我已經知道,信號包含500Hz的的餘弦,但如果我們想獲得的FFT信號時間之前是未知的。我們如何使用fft函數的輸出得到該樣本中峯值的頻率值?

回答

1

您需要自己生成頻率數組,並根據它繪製FFT結果。

像這樣:

function [Ycomp, fHz] = getFFT(data, Fs) 
    len = length(data); 
    NFFT = 2^nextpow2(len); 
    Ydouble = fft(data, NFFT)/len; % Double-sided FFT 
    Ycomp = Ydouble(1:NFFT/2+1); % Single-sided FFT, complex 
    fHz = Fs/2*linspace(0,1,NFFT/2+1); % Frequency array in Hertz. 
    semilogx(fHz, abs(Ycomp)) 
end 
1

你會看到在500Hz和Fs的峯 - 500赫茲(即44100 - 500 = 43600赫茲你的具體情況)。

這是因爲實數到複數FFT輸出是複共軛對稱的 - 當您剛剛查看幅度並因此是多餘的時,上半部分譜圖是下半部分的「鏡像」。

請注意,繪製功率譜通常可以使用MATLAB的periodogram函數爲您節省大量工作,而不是直接處理FFT,窗口函數,繪圖等的所有細節。