将matlab FFT转换为CUDA FFT
converting matlab FFT to CUDA FFT
我目前正在使用以下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内核来做填充,另一个来做取消填充和移位。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 在cuda线程之间共享大量常量数据
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- CUDA内核和数学函数的显式命名空间
- CUDA:统一内存和指针地址的更改
- 调试 CUDA MMU 故障
- 使用 CUDA 和纹理进行图像减法
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数
- 编译 CUDA 与数学函数的叮当
- 为什么 CUDA 不会导致C++代码加速?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 1D中的非均匀FFT正向和反向测试
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- CUDA三角函数中的数学保证
- CUDA 使用共享内存平铺 3D 卷积实现
- CUDA:cudaMallocManage处理退出吗?
- CUDA FFT不会返回我期望的值
- 如何在Cuda中获得2D真实到复杂FFT的所有数据
- 将matlab FFT转换为CUDA FFT