我必须在许多图像的每一行上应用卷积滤镜。经典是1024x1024像素的360度图像。在我的用例中,它是720像素560x600像素。
问题是我的代码比文章中宣传的要慢得多。
我实施了天真的卷积,需要2分30秒。然后我使用fftw切换到FFT。我使用了复数2复数,在每个变换中过滤两行。我现在20多岁了。
事情是,文章广告大约10s甚至更少的经典条件。 所以我想问一下这里的专家是否有更快的方法来计算卷积。
数值配方建议避免在dft中进行排序并相应地调整频域滤波器功能。但是没有代码示例如何做到这一点。
也许我在复制数据时浪费时间。使用真正的2实数变换,我不必将数据复制到complexe值中。但无论如何我必须用0填充。
编辑:请参阅下面我自己的答案,了解进度反馈和解决此问题的进一步信息。
问题(精确重新制定):
我正在寻找一种算法或一段代码来将非常快速的卷积应用于离散的非周期函数(512到2048个值)。显然离散时间傅里叶变换是要走的路。虽然,我想避免数据复制和转换为复杂,并避免蝴蝶重新排序。
答案 0 :(得分:6)
FFT是卷积信号的最快技术,而FFTW是可用于计算FFT的最快的免费库。
获得最佳性能的关键(在硬件之外... GPU是一个很好的建议)将把信号填充到2的幂。使用FFTW时,在创建计划时使用“患者”设置以获得最佳性能。你不可能手动推出比FFTW提供更快的实现(忘记N.R.)。另外一定要使用前向1D FFT的Real版本,而不是复杂版本;如果可以,只使用单一(浮点)精度。
如果FFTW没有为你削减它,那么我会看看英特尔(非常实惠的)IPP库。手动调整了针对英特尔处理器的FFT,这些处理器针对具有不同位深度的图像进行了优化。
保罗
CenterSpace软件
答案 1 :(得分:1)
您可能希望将图像处理添加为标记。
但是,这篇文章可能很有意思,特别是假设图像是一个幂或2.你也可以看到他们优化FFT的位置。我希望您正在查看的文章做出一些假设,然后优化这些方程式。
http://www.gamasutra.com/view/feature/3993/sponsored_feature_implementation_.php
如果你想加快速度,可能需要使用GPU来实际完成工作。
如果您使用GPU,本书可能对您有所帮助: http://www.springerlink.com/content/kd6qm361pq8mmlx2/
答案 2 :(得分:0)
这个答案是收集关于这个问题的进度报告反馈。
编辑11 oct。:
我测量的执行时间并不反映FFT的有效时间。我注意到,当我的程序结束时,CPU仍然忙于系统时间高达42%,持续10秒。当我等到CPU恢复到0%时,在重新启动程序之前,我得到了来自GPU处理的15.35s执行时间。如果我注释掉FFT滤波,我会得到相同的时间。
因此,FFT实际上目前比GPU更快,并且受到竞争系统任务的干扰。我还不知道这个系统的任务是什么。我怀疑它是由于分配了一个巨大的堆块而导致我在将其写入磁盘之前复制处理结果。对于输入数据,我使用内存映射。
我现在将更改我的代码以准确测量FFT处理时间。使其更快仍然是现实,因为存在优化GPU处理的空间,例如通过流水线传输数据到处理。