2014-05-17 26 views
0

我試圖使用FFT方法(基本上是scipy.signal中的一個)重新採樣一維信號。然而,即使我的輸入信號的長度是2的冪,代碼仍會持續運行。在分析後,我發現了問題的根源。IFFT的數量級大於FFT

基本上,這種方法需要一個FFT,然後去除部分傅立葉頻譜,然後採用IFFT以較低的採樣率將其帶回時域。

的問題是,該IFFT正在更長的時間比FFT運行:

ncalls tottime percall cumtime percall filename:lineno(function) 1 6263.996 6263.996 6263.996 6263.996 basic.py:272(ifft) 1 1.076 1.076 1.076 1.076 basic.py:169(fft)

我認爲這有什麼做的傅立葉分截止後剩餘的金額。這就是說,這是一個令人難以置信的放緩,所以我想確保:

A.這種行爲是半合理的,並不是絕對的錯誤。 B.我能做些什麼來避免這個問題,並且仍然有效地降低採樣率。

現在,我可以將我的輸入信號加到兩個冪,以使FFT運行真的很快,但不知道如何爲反向操作做同樣的事情。我甚至沒有意識到這是IFFT的問題:P

+0

IFFT中的點數是多少?例如,如果是素數,則需要很長時間。 FFT和IFFT使用相同的算法。 –

+1

是的,我認爲這是問題所在。我原來的長度是13648384,有幾個因素,但第一對是[1,2,4,8,16,19,23,32]。 另一方面,我從22050Hz到1200Hz採樣,所以新長度將是742769,只有三個因素:[1,151,4919]。所以我想問題是第二長度有很少的因素,但我不知道如何解決這個問題,而不會搞亂採樣率轉換... – choldgraf

+1

有FFT算法比這更好的一個numpy可以發貨(許可證的東西)。所以你可以嘗試python包裝存在的FFTW。 – seberg

回答

1

如果您的IFFT的長度與FFT的長度不同,並且IFFT的長度不僅由非常小的素因子(2, 3等),那麼效率會明顯下降。

因此,這種重採樣方法僅在兩個採樣率與具有小質因子(例如2,3和7(提示))的比率不同時纔有效。