3

我必须对许多图像的每一行应用卷积过滤器。经典的是 1024x1024 像素的 360 幅图像。在我的用例中,它是 720 张 560x600 像素的图像。

问题是我的代码比文章中宣传的要慢得多。

我已经实现了朴素卷积,它需要 2m 30s。然后我使用 fftw 切换到 FFT。我使用了 complex 2 complex,在每个转换中过滤两行。我现在20多岁。

问题是文章在 10 多岁左右做广告,对于经典条件甚至更少。所以我想问问这里的专家是否有更快的方法来计算卷积。

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

也许我会浪费时间复制数据。使用 real 2 real 转换,我不必将数据复制到复杂的值中。但无论如何我必须用 0 填充。

编辑:请参阅下面我自己的答案以获取进度反馈和有关解决此问题的更多信息。

问题(精确的重新表述):

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

4

3 回答 3

6

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

获得最大性能的关键(在硬件之外...... GPU 是一个很好的建议)将把你的信号填充到 2 的幂。使用 FFTW 时,在创建计划时使用“耐心”设置以获得最佳性能。您不太可能手动推出比 FFTW 提供的更快的实现(忘记 NR)。还要确保使用正向 1D FFT 的 Real 版本,而不是 Complex 版本;如果可以,请仅使用单(浮点)精度。

如果 FFTW 不适合你,那么我会看看英特尔的(非常实惠的)IPP 库。已针对具有各种位深度的图像进行了优化的英特尔处理器手动调整了 FFT。

保罗
中心空间软件

于 2009-10-27T06:59:38.737 回答
1

您可能希望将图像处理添加为标签。

但是,这篇文章可能很有趣,尤其是假设图像是幂或 2。您还可以看到他们优化 FFT 的位置。我希望您正在查看的文章做出了一些假设,然后针对这些假设优化了方程。

http://www.gamasutra.com/view/feature/3993/spired_feature_implementation_.php

如果你想跑得更快,你可能想使用 GPU 来实际完成工作。

如果您使用 GPU,这本书可能对您有所帮助: http ://www.springerlink.com/content/kd6qm361pq8mmlx2/

于 2009-10-11T03:17:39.183 回答
0

这个答案是为了收集关于这个问题的进度报告反馈。

10 月 11 日编辑:

我测量的执行时间并不能反映 FFT 的有效时间。我注意到当我的程序结束时,CPU 仍然在系统时间中忙了 10 秒,高达 42%。当我等到 CPU 回到 0% 时,在重新启动我的程序之前,我会得到来自 GPU 处理的 15.35 秒执行时间。如果我注释掉 FFT 过滤,我会得到相同的时间。

因此,FFT 实际上目前比 GPU 更快,并且只是受到竞争系统任务的阻碍。我还不知道这个系统任务是什么。我怀疑这是由于分配了一个巨大的堆块,我在将处理结果写入磁盘之前复制了它。对于输入数据,我使用内存映射。

我现在将更改我的代码以准确测量 FFT 处理时间。让它更快仍然是现实,因为有空间来优化 GPU 处理,例如通过流水线传输数据到处理。

于 2009-10-11T07:42:35.247 回答