将matlab FFT转换为CUDA FFT

converting matlab FFT to CUDA FFT

本文关键字:FFT CUDA 转换 matlab      更新时间:2023-10-16

我目前正在使用以下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。

谢谢

CUDA FFT输入:

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

然后填充到2的全幂* 2的实浮点矩阵的全幂(从右到下填充零)

输出,r, r,我,我……甚至复杂的浮点值(实列,虚列,实列,…),中间填充零。

在频域使用复乘法,而不是正则乘法。

IFFT后,裁剪图像的侧面接收高度*天花板(宽度/2+1)*2中心。再次裁剪以删除右边可能的额外线条(裁剪至高度*宽度)。

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

尝试与δ核相乘进行测试。

内核应该填充在中心,而不是角落。

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

你可以编写自定义的CUDA内核来做填充,另一个来做取消填充和移位。