【问题标题】:cufft image processing袖带图像处理
【发布时间】:2016-05-26 21:19:41
【问题描述】:

我继承了一个图像处理应用程序。试图在这里弄清楚事情。我有三个问题。 1) 我的 F2C、C2C、C2F 顺序是否正确? 2)我应该在一个方向运行一次C2C吗? 3) 我应该使用哪个方向(向前或向后)?

背景:

输入和输出是二维图像。

首先使用 cufftF2C(现成的 cuda)完成 R2C 然后一个C2C就完成了。这是由原始开发人员手工编码的。 最后使用 cufftC2F(现成的 cuda)完成 C2R

结果是一张很棒的图片,只是出现了难看的锯齿形线条。最初的开发者使用 1D 计划(nx = x 和 batch = y)。我想用 2D 计划(nx = x 和 ny = y)替换这些。我还想用现成的 cuda cufftC2C 替换国产 C2C。

【问题讨论】:

  • CUFFT 中没有 F2C 或 C2F。也许您的意思是 R2C 和 C2R。这里一个非常好的答案(IMO)需要一个非常长的答案,主要是关于傅立叶变换的教程。我觉得这是一个相当广泛的问题。目前尚不清楚您是否了解傅立叶变换、它们的作用以及如何使用它们(这是一个完全独立于 CUDA 的主题)。

标签: image-processing cuda nvidia cufft


【解决方案1】:

1) 我的顺序是否正确 [R2C]、C2C、[C2R]? 不,傅里叶变换有两个域:空间和频率。使用CUFFT_FORWARD 进行从空间到频率的转换,使用CUFFT_INVERSE 进行频率到空间的转换。

2) 是否应该单向运行一次C2C? 根据 Hermitian 对称的使用情况,您不一定需要 C2C(见下文)。

3) 我应该使用哪个方向(向前或向后)? 如果您想应用图像处理过滤器,您的输出很可能与输入在同一空间中,因此您必须应用一个正向变换和一个逆变换。

关于数据布局和R2C / C2R 优化的说明

当使用C2RR2C变换时,频率空间向量的cufftis making use of the Hermitian symmetry,因此只存储向量的前半部分(其余部分甚至不触及):

除了一般的复数到复数 (C2C) 变换之外,cuFFT 还有效地实现了另外两种类型:实数到复数 (R2C) 和复数到实数 (C2R)。在许多实际应用中,输入向量是实值的。可以很容易地证明,在这种情况下,输出满足 Hermitian 对称性( X k = X N - k * ,其中星号表示复共轭)。反之亦然:对于复厄米特输入,逆变换将是纯实值。 cuFFT 利用了这种冗余,并且只对 Hermitian 向量的前半部分起作用。

如果您在频域中执行的操作不具有相同的 Hermitian 对称性,则优化不再正确,C2R 操作不会为您提供预期的结果。

还要注意该方法的数据要求和布局,这与C2C 的方法有点不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 2016-08-21
    • 2016-08-16
    • 2019-08-05
    • 2011-04-22
    相关资源
    最近更新 更多