2009-10-10 111 views
3

我必须在许多图像的每一行应用卷积过滤器。经典的是360像素的1024x1024像素。在我的使用情况下,它是720图像560x600像素。最快的方法来计算卷积

问题是,我的代码比文章中公布的要慢得多。

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

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

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

也许我会在复制数据上失去时间。通过真正的2实数变换,我不必将数据复制到复数值中。不过无论如何我必须填充0。

编辑:请参阅我自己的回答下面的进度反馈和解决此问题的进一步信息。

问(精确再形成):

我正在寻找算法或一段代码到一个非常快速卷积应用于离散的非周期函数(512至2048的值)。显然,离散时间傅里叶变换是一条路。尽管如此,我想避免将数据复制和转换复杂化,并避免重新排序。

+0

什么编程语言?什么广告文章? – 2009-10-10 19:45:17

+0

C或C++。文章“使用GPU硬件的快速锥束CT图像重建 ”,严国瑞,田洁,朱寿平,戴亚康,秦成虎,X射线科学与技术杂志16(2008)225,IOS Press [http: //www.3dmed.net/paper/YanGR_XRay_Fast%20cone-beam%20CT%20image%20reconstruction%20using%20GPU%20hardware.pdf。在8800GTX(8MP)上播放的360张图像的播放时间为5.9秒,在512^3上播放,我使用的是280GTX(30MP)。 – chmike 2009-10-11 07:56:44

+0

你的意思是你应用了2D图像上的一维内核?内核的大小是多少? – Royi 2017-08-04 22:01:11

回答

6

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

获得最佳性能(硬件之外... GPU是一个好建议)的关键是将信号填充到2的幂。使用FFTW时,请在创建计划时使用“患者”设置以获得最佳性能。你不太可能会比FFTW提供更快的实现(忘记N.R.)。还要确保使用前向一维FFT的真实版本,而不是复杂版本;如果可以的话,只使用单点(浮点)精度。

如果FFTW没有为您降价,那么我会考虑英特尔(非常实惠)的IPP库。英特尔处理器针对不同位深度的图像进行了优化,具有手动调整的FFT。

保罗
CenterSpace软件您使用的

+4

FFT对于大图像和大内核非常有用。但是,对于大图像和小内核,直接(非FFT)卷积通常更快。 – solvingPuzzles 2012-09-25 05:53:36

1

您可能想要将图像处理添加为标记。

但是,这篇文章可能是有趣的,尤其是假设图像是功率或2。您还可以看到他们在哪里优化FFT。我期望你看到的文章做了一些假设,然后优化了这些方程。

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

如果你想走得快,你可能需要使用GPU来实际做的工作。

这本书可能对你有所帮助,如果你去与GPU: http://www.springerlink.com/content/kd6qm361pq8mmlx2/

+1

非常有趣的阅读。我应该补充说,FFT计算与GPU卡中的其他处理并行执行。在这个领域中通常的做法是在CPU上执行FFT,因为据说它比在GPU上执行的处理快得多。不幸的是,在我目前的情况下,FFT滤波较慢。 GPU处理花费约15秒,FFT滤波约20秒。 – chmike 2009-10-11 07:09:47

0

这个答案是收集关于这一问题的进展报告反馈。

编辑10月11日:

我测量并不反映FFT的有效时间的执行时间。我注意到,当我的程序结束时,CPU在系统时间内仍然忙于高达42%10秒。当我等到CPU回到0%时,在重新启动我的程序之前,我会得到来自GPU处理的15.35s执行时间。如果我注释掉FFT滤波,我会得到同样的结果。因此,FFT现在实际上比GPU更快,并且仅仅受到竞争系统任务的阻碍。我还不知道这个系统的任务是什么。我怀疑它是由于分配一个巨大的堆块而导致的,我在将它写入磁盘之前复制处理结果。对于输入数据我使用内存映射。

我现在将更改我的代码,以获得FFT处理时间的准确度量。使其更快速仍然是现实,因为有优化GPU处理的空间,例如通过流水线传输数据进行处理。