首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >matlab FFT到CUDA FFT的转换

matlab FFT到CUDA FFT的转换
EN

Stack Overflow用户
提问于 2011-04-20 05:22:16
回答 1查看 2.1K关注 0票数 2

我目前使用的是以下matlab函数:

代码语言:javascript
复制
function out = fft_2d(in)

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

据我所知,它接受一个“自然顺序”输入,并将其“交换”给fft2,然后再次使用fft2将结果移位,以返回自然顺序输出。这是正确的吗?

我正在将这段代码移植到C,并且我想使用CUFFT来做这件事。根据文档,我想我会使用:

代码语言:javascript
复制
/* 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。

谢谢

EN

回答 1

Stack Overflow用户

发布于 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内核来做填充,而另一个内核可以一次完成解填充和移位。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5722876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档