我必须对许多图像的每一行应用卷积滤波器。经典的是 1024x1024 像素的 360 度图像。在我的用例中,它是 720 张 560x600 像素的图像。
问题是我的代码比文章中宣传的慢得多。
我实现了朴素卷积,需要2m 30s。然后我使用 fftw 切换到 FFT。我使用了 Complex 2 Complex,在每个转换中过滤两行。我现在20多岁了。
问题是,对于经典条件,文章的广告时间大约为 10 秒,甚至更少。
所以我想请教这里的专家是否可以有更快的方法来计算卷积。
数值方法建议避免在 dft 中进行排序并相应地调整频域滤波器函数。但没有代码示例如何做到这一点。
也许我在复制数据方面浪费了时间。通过实数 2 实数变换,我不必将数据复制到复数值中。但无论如何我都必须用0来填充。
编辑:请参阅下面我自己的答案,以获取进度反馈和解决此问题的更多信息。
问题(精确重新表述):
我正在寻找一种算法或一段代码,将非常快速的卷积应用于离散非周期函数(512 到 2048 个值)。显然,离散时间傅立叶变换是正确的选择。不过,我想避免复杂的数据复制和转换,并避免蝶式重新排序。
FFT 是已知的最快的信号卷积技术,而 FFTW 是可用于计算 FFT 的最快的免费库。
获得最大性能的关键(在硬件之外……GPU 是一个很好的建议)是将信号填充到 2 的幂。使用 FFTW 时,在创建计划时使用“耐心”设置以获得最佳性能。您不太可能手动推出比 FFTW 提供的更快的实现(忘记 N.R.)。还要确保使用正向 1D FFT 的实数版本,而不是复数版本;如果可以的话,只使用单精度(浮点)。
如果 FFTW 不适合你,那么我会看看 Intel 的(非常实惠的)IPP 库。他们针对英特尔处理器手动调整了 FFT,并针对各种位深度的图像进行了优化。
Paul
中心空间 http://centerspace.net软件
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)