【问题标题】:IFFT taking orders of magnitude more than FFTIFFT 比 FFT 高出几个数量级
【发布时间】: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


【解决方案1】:

如果您的 IFFT 长度与 FFT 的长度不同,并且 IFFT 的长度不是仅由非常小的素因数(2,3 等)组成,那么效率可能会显着下降。

因此,这种重采样方法仅在两个采样率因质因数较小的比率不同时才有效,例如 2、3 和 7(提示)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 2019-12-24
    相关资源
    最近更新 更多