计算卷积的最快方法

chm*_*ike 3 fft image-processing convolution

我必须在许多图像的每一行上应用卷积滤镜.经典是1024x1024像素的360度图像.在我的用例中,它是720像素560x600像素.

问题是我的代码比文章中广告的要慢得多.

我实施了天真的卷积,需要2分30秒.然后我使用fftw切换到FFT.我使用了复数2复数,在每个变换中过滤两行.我现在20多岁了.

事情是,文章广告大约10s甚至更少的经典条件.所以我想问一下这里的专家是否有更快的方法来计算卷积.

数字配方建议避免在dft中进行排序并相应地调整频域滤波器功能.但是没有代码示例如何做到这一点.

也许我浪费时间复制数据.使用真正的2实数变换,我不必将数据复制到complexe值中.但无论如何我必须用0填充.

编辑:请参阅下面的答案,了解进度反馈以及解决此问题的更多信息.

问题(精确重新制定):

我正在寻找一种算法或一段代码来将非常快速的卷积应用于离散的非周期函数(512到2048个值).显然离散时间傅里叶变换是要走的路.虽然,我想避免数据复制和转换复杂,并避免蝴蝶重新排序.

Pau*_*aul 6

FFT是用于卷积信号的最快技术,而FFTW是可用于计算FFT的最快的免费库.

获得最大性能的关键(硬件之外...... GPU是一个很好的建议)是将信号填充为2的幂.使用FFTW时,在创建计划时使用"患者"设置以获得最佳性能.你手动推出比FFTW提供的更快的实现(忘记NR)是不太可能的.另外一定要使用前向1D FFT的Real版本,而不是复杂版本; 如果可以,只使用单(浮点)精度.

如果FFTW没有为你削减它,那么我会看看英特尔(非常实惠的)IPP库.手动调整了针对英特尔处理器的FFT,这些处理器针对具有不同位深度的图像进行了优化.

保罗
中心空间软件

  • FFT非常适合大图像和大内核.但是,对于大图像和小内核,直接(非FFT)卷积通常更快. (4认同)