2015-11-06 390 views
0

我有一個使用FFT的數據的數組(大小爲128)。我試圖通過FFT譜找出數據的頻率。問題是公式freq = i * Fs/N似乎沒有工作。我的數據相當嘈雜,我不知道是因爲我的噪音數據還是因爲我做了其他事情。下面是我的原始數據:從嘈雜的數據獲取FFT頻率?

Raw Data

這是從產生的頻譜的變換:

Spectrum

我在獲得同等幅度兩個最大峯值在指數4和128輸出數組。的數據的頻率應爲約1.1333赫茲,但是當我使用式我正在5-6或完全錯誤值:

freq = i * Fs/N; 

i哪裏是最大幅度峯值的數組索引,Fs是採樣率以Hz爲單位,並且N是數據大小。

使用我的數據,你得到freq = (4 * 11.9)/128 = 0.37赫茲,這是非常不符合預期。

如果我的計算是正確的,有沒有改善我的數據的任何方式?或者,我的頻率計算是否有誤?

+0

對於你的頻譜似乎包含256點,所以我猜你正在繪製交錯的實部和虛部而不是幅度。如果'i'是頻譜圖中顯示的指數,那麼結果將會減少2倍(儘管並不幫助你的情況)。然後你有一個強大的平均值/非常低的頻率分量(原始數據的分段在98-100之間變化,而不是接近0),這自然會出現在較低頻譜分箱中。消除偏差,你可能會更好地看到與你的數據振盪相關的頻譜峯值。 – SleuthEye

+0

強平均值是指頻譜邊緣的峯嗎?我移除了每邊大約1/5的頻譜,並得到這個:[image link](http://imgur.com/Fc4ExB3)。所以我猜測我的數據太吵了,無法創建精確的頻譜? – Piglet

+0

我也對最大幅度的指標感到困惑。假設有256個數據點,並且虛數部分是交錯的,如果最高的數值在索引90處,那麼我會說i = 45,因爲第45個真實數值是在索引90處? – Piglet

回答

1

讓我們先確定你正在看實際的幅度。 FFT將返回與每個頻率倉相關聯的複數值。這些複數值通常由兩個值表示:一個用於實部,另一個用於虛部。然後可以通過計算sqrt(real*real+imaginary*imaginary)來獲得頻率分量的大小。

這應該給你一半多值和相應的頻譜(用分貝表示幅值):

enter image description here

正如你可以看到有爲0Hz附近有強峯。這與您的原始數據具有較大的平均值以及從時間0到〜4.2s(兩者均大於振盪幅度)的增加趨勢一致。如果我們以除去這些低頻貢獻(具有例如繞0.25Hz截止頻率的高通濾波器),我們將得到以下波動數據:

enter image description here

與相應的譜:

enter image description here

正如你可以看到振盪頻率可以更容易地在箱11中觀察到,它給你freq = (11 * 11.9)/128 = 1Hz的。

然而要注意是否波紋管0.25HZ除去這些頻率分量是改善您的數據取決於那些頻率成分是否爲您的應用程序的興趣(可能不是因爲你似乎有興趣在相對較快的波動)。

-1

您需要在FFT之前刪除DC偏差(所有采樣的平均值),以測量接近0 Hz(或接近FFT的第0個結果倉)的頻率。在消除DC偏差之後和FFT之前應用窗函數(von Hann或Hamming窗口)也可能有所幫助。