我目前使用的是以下matlab函数:
function out = fft_2d(in)
out = fftshift(fft2(ifftshift(in)));据我所知,它接受一个“自然顺序”输入,并将其“交换”给fft2,然后再次使用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。
谢谢
发布于 2011-04-20 06:51:15
CUDA FFT的输入:
由于频域中的复杂格式,单元的填充宽度为(宽度/2+1)*2。这个初始填充将是结果图像的大小-->必须裁剪结果。
然后填充到2实数浮点矩阵的2*整幂的整数幂(从右到下填充零)。
输出,r,i,r,i,...甚至复数浮点值(实数列,虚数列,实数列,...),中心周围填充零。
在频域中使用复数乘法,而不是规则乘法。
在IFFT之后,裁剪图像的侧面以接收高度*天花板(宽度/2+1)*2中心。再次裁剪以删除右侧可能的多余线条(裁剪到高*宽)。
不要忘了使用FIT-shift。我记不清什么时候,所以尝试在ifft之后移位,如果结果错误,那么在fft之后移位。
尝试使用增量内核进行乘法测试。
内核应该在中间填充,而不是边角。
对于偶数矩阵,中心是右半个单元格,在中心之下。
你可以编写定制的CUDA内核来做填充,而另一个内核可以一次完成解填充和移位。
https://stackoverflow.com/questions/5722876
复制相似问题