2013-03-12 89 views
0

我一直在試圖找到導致峯值頻率的DFT(或FFT)的簡單實現。然而,我見過的大多數實現都會輸出一個複數的數組。如何將這些基數爲2的結果轉換爲具體的頻率?在音頻信號中尋找峯值頻率?

例如,我有輸入數據是500之間振盪的正弦波函數的16個樣本 - 2000Hz的,像這樣:

int n = 16;  
double[] input = { 1250, 1537, 1780, 1943, 2000, 1943, 1780, 1537, 
      1250, 963, 720, 557, 500, 557, 720, 963 }; 

現在,我假定從該峯值頻率因爲(2000 - 500)/ 2 = 750,所以它恰好是750赫茲。

我正在考慮我的採樣率Fs = 2000 Hz,因爲那是我限制正弦波的上限。每個bin k的中心頻率定義爲k * Fs/n,因此我的bin是125 Hz,250 Hz,375 Hz,500 Hz,625 Hz和750 Hz。但是因爲我的振動下限是500赫茲,所以我假設我需要用500赫茲來抵消箱子,因此它們變成:750 Hz, 825 Hz, 1000 Hz, 1125 Hz, 1250 Hz, 1375 Hz, 1500 Hz

然後,使用jtransforms' DoubleFFT_1D類,我發現了一些FFT數據:

DoubleFFT_1D fft = new DoubleFFT_1D(n); 
fft.realForward(input); 

輸入變量現在包含:

[20000.0, 0.0, -4.547473508864641E-13, -5999.381020591891, 0.0, 0.0, -1.6292522886374172E-14, 1.1183950775908065, 0.0, -0.0, 1.6292522886374172E-14, -0.7488526914476931, 0.0, 0.0, 4.547473508864641E-13, -1.2482683609296146] 

分組中的光的陣列值來更容易理解的形式(一些信息我得到了elsewhere在SO中):

20000.0           [sum of input array values] 
0.0,           [1625 Hz] 
-4.547473508864641E-13, -5999.381020591891,  [re1 and im1] [750 Hz] 
0.0, 0.0,          [re2 and im2] [875 Hz] 
-1.6292522886374172E-14, 1.1183950775908065, [re3 and im3] [1000 Hz] 
0.0, -0.0,          [re4 and im4] [1125 Hz] 
1.6292522886374172E-14, -0.7488526914476931, [re5 and im5] [1250 Hz] 
0.0, 0.0,          [re6 and im6] [1375 Hz] 
4.547473508864641E-13, -1.2482683609296146  [re7 and im7] [1500 Hz] 

Tw o問題:

  1. 我對頻率點的假設是否正確?
  2. 我現在如何通過總結一些幅度從這些數據中獲得峯值頻率?

謝謝。

+3

注意:「基數-2」是FFT的內部實現細節。結果簡單「複雜」。 – 2013-03-12 09:20:21

回答

0

用於每個頻率段,你應該有兩個值,實際(x)和虛部(Y)的平方和給你在這個頻率幅度:

magnitude = sqrt(x*x + y*y); 

但如果你只是想發現高峯期,你不需要平方根,只要找到最高

magSquared = x*x + y*y 
+1

該OP想找到一個頻率... – 2013-03-12 09:21:02

+0

@OliCharlesworth好點。 – 2013-03-12 09:22:50

1

根據定義的頻率,輸出值的FFT的不是頻率; 變量(即圖上的軸)是頻率。你想要做的是找到複雜結果的大小來獲得絕對值,但這些不是頻率 - 相反,產生最大峯值的值是你想要的頻率。

如果您不確定,複數的大小在Wikipedia上描述。它只是真實和複雜部分平方和的平方根,然而爲了找到最大值,您顯然不需要計算平方根。

+0

「輸入是頻率」充其量是誤導性的。 – 2013-03-12 09:25:23

+0

同意。在我的腦海中似乎是正確的,我會嘗試對它進行更好的說明。 – jazzbassrob 2013-03-12 09:25:55

+0

謝謝你的回答,但我仍然感到困惑。請參閱我對原始問題的編輯。 – Pompair 2013-03-12 10:26:39