【问题标题】:Python SciPy convolve vs fftconvolvePython SciPy 卷积与 fftconvolve
【发布时间】:2013-02-07 17:41:30
【问题描述】:

我知道一般来说FFT and multiplication通常比直接convolve操作快,当数组比较大的时候。但是,我将一个非常长的信号(比如 1000 万点)与非常短的响应(比如 1000 点)进行卷积。在这种情况下,fftconvolve 似乎没有多大意义,因为它强制第二个数组的 FFT 与第一个数组的大小相同。在这种情况下直接进行卷积会更快吗?

【问题讨论】:

  • 您是否有理由不能同时为这两种方法计时,例如使用timeit?
  • 我不知道这个功能。我会尽力。不过,我也想知道基本理论。
  • 注意:从 v0.19 开始,convolve 会自动选择 fftconvolve 或基于估计更快的直接方法。

标签: python scipy fft convolution


【解决方案1】:

看看我在这里做的比较:

http://scipy-cookbook.readthedocs.io/items/ApplyFIRFilter.html

您的情况可能接近使用普通卷积和使用基于 FFT 的卷积之间的过渡,因此您最好的选择(正如 @Dougal 在评论中所建议的那样)是自己计时。

(请注意,我没有在该比较中进行重叠添加或重叠保存。)

【讨论】:

  • 链接似乎没有指向您的意思(尽管我可以在页面中找到它)
  • @luca 谢谢。该页面最初位于旧的 scipy wiki 上,现在已经消失了。我已经更新了链接。
【解决方案2】:

感谢您的帮助。现在我自己做了测试,我用 2 个数组做了卷积,大小分别为 2^20 和 2^4,结果是这样的:

numpy.convolve: 110 ms
scipy.signal.convolve: 1.0 s
scipy.signal.fftconvolve: 2.5 s

所以我们有一个赢家,numpy convolve 比其他的要快得多。我仍然不知道为什么。


现在我尝试了 2 个更长的数组,大小分别为 2^22 和 2^10。结果是:

numpy.convolve: 6.7 s
scipy.signal.convolve: 221 s
scipy.signal.fftconvolve: MemoryError

差距越来越大。

【讨论】:

  • 感谢您的反馈。也许related.
【解决方案3】:

通过重叠添加或重叠保存算法的 FFT 快速卷积可以在有限的内存中通过使用仅比脉冲响应大一小倍(例如 2 倍)的 FFT 完成。它将长 FFT 分解为适当重叠的较短但零填充的 FFT。

即使有重叠开销,对于足够大的 N 和 M,O(NlogN) 的效率也会超过 M*N。

【讨论】:

  • 感谢您的回答!您的意思是即使使用fftconvolve 函数,它也会自动将长 FFT 分解为短 FFT,我无需担心?
  • @LWZ:scipy 的 fftconvolve 不这样做,不。 hotpaw,你有那个方法的参考/实现吗?
猜你喜欢
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多