0

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

背景:

输入和输出是二维图像。

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

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

4

1 回答 1

1

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

2)我应该在一个方向运行一次C2C吗? 根据 Hermitian 对称性的使用,您不一定需要C2C(见下文)。

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

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

在使用C2RR2C变换时,cufft 是利用频率空间向量的厄尔米特对称性,因此只存储向量的前半部分(其余部分甚至没有被触及):

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

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

还要注意该方法的数据要求和布局,这与C2C.

于 2016-05-27T08:14:22.640 回答