我想知道信號中特定頻率的能量。我正在使用FFT來獲取頻譜,頻率步長取決於我的信號長度。如何提取python中特定頻率的峯值
我想在一個特定頻率拿到譜峯,-0.08。然而,頻譜的離散化僅給我一個-0.0729和-0.0833的峯值。
有沒有辦法改變頻譜以確保在我想要的頻率上有數據點?或者一種獲得價值而不必使用fft的方法?
非常感謝!
我想知道信號中特定頻率的能量。我正在使用FFT來獲取頻譜,頻率步長取決於我的信號長度。如何提取python中特定頻率的峯值
我想在一個特定頻率拿到譜峯,-0.08。然而,頻譜的離散化僅給我一個-0.0729和-0.0833的峯值。
有沒有辦法改變頻譜以確保在我想要的頻率上有數據點?或者一種獲得價值而不必使用fft的方法?
非常感謝!
當你進行DFT(或任何傅立葉變換)時,你實際上在做什麼,正在測量你的信號與某些頻率的正弦波「相交」的程度。這是通過將你的信號乘以任意頻率的波的複共軛來完成的。所以如果你只對一個頻率感興趣,不要拿整個DFT,只要看看你想要的。我不確定你的單位是什麼,所以我假設你想要在f0 = -0.08赫茲的峯值(如果你的單位是別的東西,比如標準化到採樣頻率,那麼你需要說明這一點)。這對應於複數指數exp(2*pi*j*f0*t)
。由於您正在採樣,因此您的t是離散的,所以t = n/fs
,其中fs是採樣頻率(以Hz爲單位)。
# assuming you're using numpy arrays
w = exp(-2*pi*1j*f0*arange(len(signal))/fs)
peak = abs(sum(signal*w))
DFT有不同的定義;我很確定numpy的對應於我上面的內容。指數中的額外負數是因爲它是複共軛。
請注意,w實際上不可能是週期性的。如果樣本數量足夠大,這並不重要。一個好的啓發是至少10個時期。
如果您有離散數據但需要連續變量的輸出,您將需要某種插值函數。對於請求風格的價值,我會建議Scipy interp1d(example of the use of a interp1d function)。我相信這是達到預期結果的最快方法。
非常感謝你,這正是我一直在尋找的!你是對的,沒有必要在這裏把整個頻譜。 – Mathilde