2010-09-12 186 views
0

我不知道從FFT上一個wav file.How獲得一組複數後做什麼,我能獲得相應的frequencies.This輸出進行FFT後,我得到了它如下所示我們如何從python中執行FFT後獲得的一組複數中獲得頻率的大小?

[ 12535945.00000000 +0.j   -30797.74496367 +6531.22295858j 
    -26330.14948055-11865.08322966j ...,  34265.08792783+31937.15794965j 
    -26330.14948055+11865.08322966j -30797.74496367 -6531.22295858j] 
+2

可能重複的[如何提取與python fft值相關的頻率](http://stackoverflow.com/questions/3694918/how-to-extract-frequency-associated-with-fft-values-in-python ) – kennytm 2010-09-12 15:09:24

回答

0

如果我沒有弄錯,頻率可以通過計算複數的大小來獲得。所以這些複數中的每一個簡單的abs(x)應該返回頻率。

+0

不是。這是每個頻率的幅度。 (無論如何,它是'2 * abs(x)/ x.size') – 2010-09-12 15:40:15

+0

可以在你的plz中輸入一個python代碼.....對於相同的 – zzz 2010-09-12 18:10:06

1

作爲@KennyTM上重複的問題已經說明:

頻率由所述陣列的所述索引確定。每個元素對應一個頻率。

要確定每個元素表示的頻率,您需要知道數據的採樣頻率和數組的長度。

基本上,這會是這樣:

sampling_freq = 1000.0 # in Hz 
freq = np.linspace(0, (1.0/sampling_freq/2.0), (x.size/2) + 1) 

用於FFT陣列的一半(它是對稱的中心)。我的內存是生鏽的,不過,所以這可能是有點過了......

無論哪種方式,numpy的有一個輔助函數來爲你做它:numpy.fft.fftfreq

4

其實ABS(x)的操作只有一轉換從結果列表中將實際/虛擬的一對變成一個數量級。除非你想保留未來使用的虛構部分,否則就這樣做。所以在轉換之後,結果列表中的每個數字代表頻譜中特定頻率處的信號幅度。所以頻率由列表索引表示。當您在XY圖上繪製數據時,您看到的是您的源信號包含的頻率的大小。不要忘記,只有你的前半部分數據是有效的。另一半通常是由於混疊造成的前半部分的鏡像。

例如,假設您在包含以10Khz採樣的數據的wav文件上運行1024點FFT。 FFT將採用該10Khz頻譜並將其分成1024個「分箱」。然後FFT將決定源wav文件中每個頻譜塊的大小。你的輸出應該是那些垃圾箱。通常當我進行頻率分析時,我得到的實際數字並不重要。它相對於周圍的,我很感興趣,垃圾箱的大小。


對於更詳細一點,我們依靠疊加原理其中規定,包含許多頻率的任何隨時間變化的信號可以拆分分成許多包含一個分量頻率的信號,反之亦然。所以FFT輸出反映了這個屬性。輸出列表中的每個值都表示單個頻率(通常稱爲「bin」)信號的幅度,該頻率出現在您的源信號中。將所有這些信號組合在一起,你應該得到你的源信號。

哦,如果你不知道,由於奈奎斯特規則(或法律,不確定),只有你的結果列表的前半部分是有效的,這說明所有的採樣系統只能複製信號中的頻率最多隻有采樣頻率的一半。因此,如果您在10Khz採樣信號,則只能從採樣過程中採集的數據中重現高達5Khz的頻率。同樣的原理是隻有前半部分FFT數據有效的原因。下半場是上半場的別名。

對不起,這個冗長的解釋,你的問題並沒有說明你有什麼經驗,所以我認爲需要解釋一下FFT的一般要點。

+2

實際上,'numpy.abs'並不完全剝離虛部。它返回一個複數的大小。例如:複數「a + ib」的'sqrt(a^2 + b^2)'。見http://www.scipy.org/Numpy_Example_List_With_Doc#head-dcec325e12b04ed82f0db9149deed4f8073eddf9不過,很好的一般解釋! – 2010-09-12 16:12:59

+0

嗨,感謝您對abs()的看法。 – spade78 2010-09-13 01:36:23

相關問題