【问题标题】:converting matlab FFT to CUDA FFT将matlab FFT转换为CUDA FFT
【发布时间】:2011-08-09 00:51:15
【问题描述】:

我目前正在使用以下matlab函数:

function out = fft_2d(in)

out = fftshift(fft2(ifftshift(in)));

据我了解,这需要一个“自然顺序”输入,并“交换”它以传递给 fft2,然后使用 fftshift 再次移动 fft2 的结果以返回自然顺序输出。这是正确的吗?

我正在将此代码移植到 C,并且我想使用 CUFFT 来执行此操作。根据文档,我想我会使用:

/* Create a 2D FFT plan. */
cufftPlan2d(&plan, NX, NY, CUFFT_C2R);
/* Use the CUFFT plan to transform the signal out of place. */
cufftExecC2R(plan, idata, odata);

但是我必须对来自 cufftExecC2R 的数据做什么样的转变?此外,odata 是否需要是 NX*NY 连续数据块?它必须按列或行主要顺序吗?我猜是行,因为这就是 C。

谢谢

【问题讨论】:

  • 我不确定 ifftshift 做了什么以及为什么需要它,但 cuda fft 部分看起来不错。
  • 根据matlab的帮助撤消fftshift的结果

标签: c++ matlab cuda signal-processing fft


【解决方案1】:

CUDA FFT 的输入:

由于频域中的复杂格式,填充到单元格的宽度(宽度/2+1)*2。 此初始填充将是结果图像的大小 --> 必须裁剪结果。

然后填充到 2 的整数幂 * 2 实浮点矩阵的整数幂(从右侧和底部填充零)。

输出,r,i,r,i,... 甚至是复杂的浮点值(实数列、虚数列、实数列……),中心周围填充零。

在频域中使用复数乘法,而不是常规乘法。

在 IFFT 之后,裁剪图像的边以接收 height * ceil(width/2+1)*2 center。 再次裁剪以删除右侧可能的多余线(如果有)(裁剪到高度*宽度)。

不要忘记 FIT-shift。我记不清什么时候了, 因此,如果结果错误,请尝试在 ifft snd 之后移动,然后在 fft 之后。

尝试与增量内核相乘进行测试。

内核应该围绕中心而不是角落填充。

对于偶数矩阵,中心是中心右下方的半个单元格。

您可以编写自定义 CUDA 内核来进行填充,另一个来进行取消填充和一次切换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-09
    • 2018-09-05
    • 2015-11-08
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多