2016-03-07 31 views
1

該代碼對信號進行FFT並將其繪製在新的頻率軸上。對繪製FFT幅度時的頻率軸如何產生混淆

f=600; 
Fs=6000; 
t=0:1/Fs:0.3; 
n=0:1:length(t); 
x=cos(2*pi*(400/Fs)*n)+2*sin(2*pi*(1100/Fs)*n); 
y=fft(x,512); 

freqaxis=Fs*(linspace(-0.5,0.5, length(y))); 
subplot(211) 
plot(freqaxis,fftshift(abs(y))); 

我明白了爲什麼我們使用fftshift,因爲我們希望看到在0赫茲(DC)價值爲中心的信號,這是觀察好。

enter image description here

但是我似乎是混淆頻率軸是如何定義的。具體而言,爲什麼我們特別將[-0.5 0.5]的範圍乘以Fs,並且我們獲得[-3000 3000]範圍?它可能是[-0.25 0.25]

回答

3

範圍介於[-Fs/2,Fs/2]之間的原因是因爲Fs/2Nyquist frequency。這是可能的最大頻率,具有可視化的能力,並且頻率分解中最終會出現的頻率。我也不同意你的評論,其範圍「可能在[-0.25,0.25]」之間。這與奈奎斯特頻率的定義相反。

從信號處理理論,我們知道我們必須採樣至少兩倍的信號帶寬,才能正確重構信號。帶寬被定義爲可以在您的信號中看到的最大可能頻率分量,這也稱爲奈奎斯特頻率的。換句話說:

Fs = 2*BW 

的,我們可以可視化的頻譜和最終帶寬/奈奎斯特頻率的上限值設定爲:

BW = Fs/2; 

因此,因爲你的採樣頻率爲6000赫茲,這個裝置奈奎斯特頻率是3000赫茲,所以可視範圍是[-3000,3000]赫茲,這在你的幅度圖中是正確的。


順便說一句,你的bin中心的每個頻率是不正確的。您將FFT中的二進制文件總數指定爲512,但您指定的文件箱的方式是相對於信號的總長度。我很驚訝爲什麼你沒有得到語法錯誤,因爲fft函數的輸出應該給你512點,但你的頻率軸變量將是一個大於512的數組。在任何情況下,這是不正確的。在每個箱i頻率應該是:

f = i * Fs/N, for i = 0, 1, 2, ..., N-1 

N是個總數你在你的FFT,這是512你原本作爲length(y),這是不正確......所以這可能是您檢查頻率軸時出現混淆的原因。你可以通過參考用戶Paul R的精彩帖子來了解爲什麼會出現這種情況:How do I obtain the frequencies of each value in an FFT?

請注意,我們只指定了從0到N-1的bin。考慮到這一點,當你指定每個頻率的bin中心,你通常在linspace命令指定額外點和刪除最後一個點:

freqaxis=Fs*(linspace(-0.5,0.5, 513); %// Change 
freqaxis(end) = []; %// Change 

順便說一句,你聲明freqaxis的方式是有點混淆了我。這對我來說是更具可讀性:

freqaxis = linspace(-Fs/2, Fs/2, 513); 
freqaxis(end) = []; 

我個人討厭使用length和我喜歡numel更多。


在任何情況下,當我運行更正後的代碼,以指定的bin中心,我現在得到這個情節。需注意,我插入多個數據光標在頻譜的峯值,其對應的頻率爲每一個已經聲明餘弦(400赫茲和1100赫茲)的:

enter image description here

你看到了有一些輕微的不準確,主要是由於您指定的箱數(即512)。如果你增加了箱子的總數,你會發現每個峯值的頻率會更準確。