gpt4 book ai didi

python - 需要在 Python 中进行循环 FFT 卷积

转载 作者:太空宇宙 更新时间:2023-11-04 09:55:11 24 4
gpt4 key购买 nike

我需要一个更快的模拟

scipy.signal.convolve2d(data, filter, boundary="wrap", mode="same")

你能告诉我如何更换它吗?

附言scipy.signal.fftconvolve 足够快,但它没有 boundary 选项,我无法让它在循环卷积模式下工作。

最佳答案

如果您计算以下内容:

from scipy.fftpack import fft2, ifft2

f2 = ifft2(fft2(data, shape=data.shape) * fft2(filter, shape=data.shape)).real

然后 f2 包含与 convolve2d(data, filt, boundary='wrap', mode='same') 相同的值,但值发生了偏移("滚动”,在 numpy 术语中)在每个轴上。 (这是 convolution theorem 的一个应用。)

这是一个简短的函数,它可以滚动结果以给出与 convolve2d 函数调用相同的结果:

def fftconvolve2d(x, y):
# This assumes y is "smaller" than x.
f2 = ifft2(fft2(x, shape=x.shape) * fft2(y, shape=x.shape)).real
f2 = np.roll(f2, (-((y.shape[0] - 1)//2), -((y.shape[1] - 1)//2)), axis=(0, 1))
return f2

例如,

In [91]: data = np.random.rand(256, 256)

In [92]: filt = np.random.rand(16, 16)

In [93]: c2d = convolve2d(data, filt, boundary='wrap', mode='same')

In [94]: f2 = fftconvolve2d(data, filt)

验证结果是否相同:

In [95]: np.allclose(c2d, f2)
Out[95]: True

检查性能:

In [96]: %timeit c2d = convolve2d(data, filt, boundary='wrap', mode='same')
44.9 ms ± 77.3 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [97]: %timeit f2 = fftconvolve2d(data, filt)
5.23 ms ± 11.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

FFT 版本比 快得多(但请注意,我选择 data 的维度是 2 的幂)。

关于python - 需要在 Python 中进行循环 FFT 卷积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46203604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com