我一直在試圖找到導致峯值頻率的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問題:
- 我對頻率點的假設是否正確?
- 我現在如何通過總結一些幅度從這些數據中獲得峯值頻率?
謝謝。
注意:「基數-2」是FFT的內部實現細節。結果簡單「複雜」。 – 2013-03-12 09:20:21