2011-04-19 72 views
2

我目前使用下面的MATLAB功能的MATLAB FFT转换为CUDA FFT

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是什么。

由于

+0

我不知道ifftshift是什么,为什么你需要它,但cuda fft部分看起来不错。根据matlab的 – fabrizioM 2011-04-19 22:47:19

+0

帮助它撤销fftshift的结果 – Derek 2011-04-20 17:35:36

回答

2

输入到FFT CUDA:

垫宽度细胞(宽度/ 2 + 1)* 2由于在频域的复格式。 这个初始填充将是结果图像的大小 - >必须裁剪结果。

然后填充2个实数浮点矩阵的2 *整数幂的整数幂(从右下角填零)。

输出,r,i,r,i,...甚至复数浮点值(实数列,虚数列,实数列,...),零填充在中心附近。

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

IFFT后,裁剪图像的边缘以接收高度*细胞(宽度/ 2 + 1)* 2中心。 再次裁剪以删除可能的多余的线(如果有的话)(裁切为高度*宽度)。

不要忘记FIT-shift。我不记得当然, 因此,如果结果是错误的,那么在fft之后尝试转移ifft snd。

尝试乘以delta内核进行测试。

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

对于偶数矩阵,中心位于中心位置的右半格。

您可以编写自定义的CUDA内核来执行填充操作,而另一个可以执行unpaddings并一次移动。