2016-01-07 103 views
0

嗨我正在開發一個程序來分析聲音文件,我需要在1秒陣列上做DFT,通常是44100個樣本。尋找FFT(1D,任意長度)代碼

所以我需要工作在任意長度的一維FFT算法,即什麼不是2

任何想法的動力?

+3

您可以添加零來創建兩個數組長度冪(零填充) – MBo

+2

如果您確實需要一個44100長度的FFT,那麼您可能會出錯。對於任意長度的DFT,最有效的算法在內部使用更大的冪次冪FFT,所以即使在最好的情況下,長度爲44100的FFT也需要比長度爲65536的FFT更長的時間。 –

+0

由於44100 = 2「3」5「7」,總時間將大致與'2x(2 + 3 + 5 + 7)'成比例,與'16x2'進行比較。 –

回答

2

https://en.wikipedia.org/wiki/Cooley%E2%80%93Tukey_FFT_algorithm通常用於二元分割,但實際上處理任意分解。只要你的號碼完全分解成小數字(你的號碼是2*2*3*3*5*5*7*7),這將給出一個相當有效的FFT。 (請參閱「通用分解」一節。)

還有其他可以處理任意大小的FFT算法,但它們速度要慢得多(儘管比天真好)。見https://en.wikipedia.org/wiki/Chirp_Z-transform#Bluestein.27s_algorithm爲一個。

http://www.nayuki.io/page/free-small-fft-in-multiple-languages以多種語言(包括JavaScript)實現了一般Cooley-Tukey FFT算法。它沒有對任意素數做有效的實現,但是你沒有任何大的處理。