我知道,一般来说,当数组相对较大时,FFT and multiplication
通常比直接convolve
操作更快。然而,我正在卷入一个非常长的信号(比如1000万点),响应非常短(比如1000点)。在这种情况下,fftconvolve
似乎没有多大意义,因为它强制第二个数组的FFT与第一个数组的大小相同。在这种情况下直接卷积是否更快?
答案 0 :(得分:6)
看看我在这里做的比较:
http://scipy-cookbook.readthedocs.io/items/ApplyFIRFilter.html
你的情况可能接近使用普通卷积和使用基于FFT的卷积之间的过渡,所以你最好的选择(正如@Dougal在评论中所建议的)是自己计时。
(请注意,我没有在比较中进行重叠添加或重叠保存。)
答案 1 :(得分:3)
谢谢你的帮助。现在我自己做了测试,我用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
差异变大了。
答案 2 :(得分:2)
通过重叠相加或重叠保存算法的FFT快速卷积可以通过使用仅比脉冲响应大的小倍数(例如2X)的FFT在有限的存储器中完成。它将长FFT分解为适当重叠的短但零填充的FFT。
即使有重叠开销,O(NlogN)也会在效率上超过M * N,足够大的N和M.