【发布时间】:2014-07-06 04:23:38
【问题描述】:
我正在尝试使用 FFT 方法(基本上是来自 scipy.signal 的方法)重新采样一维信号。但是,即使我的输入信号的长度是 2 的幂,代码也需要永远运行。看了profiling,找到了问题的根源。
基本上,这种方法先进行 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. 我可以做些什么来避免这个问题并且仍然有效地进行下采样。
现在我可以将输入信号填充为 2 的幂,以使 FFT 运行得非常快,但不知道如何为反向操作做同样的事情。我什至没有意识到这是 IFFT 的问题:P
【问题讨论】:
-
IFFT中的点数是多少?例如,如果它是质数,则需要很长时间。 FFT 和 IFFT 使用相同的算法。
-
是的,我认为这就是问题所在。我的原始长度是 13648384,它有几个因素,但第一对是 [1, 2, 4, 8, 16, 19, 23, 32]。另一方面,我从 22050Hz 采样到 1200Hz,所以新长度将是 742769,只有三个因素:[1、151、4919]。所以我猜问题是第二个长度的因素很少,但我不确定如何在不搞乱采样率转换的情况下解决这个问题......
-
有一些 FFT 算法在这方面比一个 numpy 可以运送(许可证的东西)要好得多。因此,您可以尝试 FFTW 存在哪些 python 包装器。
-
这个问题更适合dsp.stackexchange.com
标签: python numpy scipy signal-processing fft