将 matlab FFT 转换为 CUDA FFT

发布于 2024-11-02 12:06:50 字数 557 浏览 1 评论 0原文

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

谢谢

I am currently using the following matlab function:

function out = fft_2d(in)

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

As I understand it, this takes a "natural order" input, in, and "swaps" it to be passed to fft2, and then shifts the result of fft2 again using fftshift to give me back the natural ordering output. is this correct?

I am porting this code to C, and I want to use CUFFT to do this. According to the docs, I think I would use:

/* 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);

But what kind of shifting will I have to do to the data coming out of cufftExecC2R? Also, does odata need to be a NX*NY block of contiguous data? Does it have to be in column or row major order? Row i'd guess, since thats what C is.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

美人如玉 2024-11-09 12:06:50

CUDA FFT 的输入:

由于频域格式复杂,焊盘宽度到单元 (宽度/2+1)*2。
该初始填充将是结果图像的大小 -->必须作物结果。

然后填充到 2 的整数次方 * 2 实数浮点矩阵的整数次方(从右侧和底部填充零)。

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

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

IFFT 后,裁剪图像的边以获得高度 * ceil(宽度/2+1)*2 中心。
再次裁剪以删除右侧可能存在的多余线条(如果有的话)(裁剪为高度*宽度)。

不要忘记FIT-shift。我记不清具体是什么时候,
因此,如果结果错误,请尝试在 ifft snd 之后移位,然后在 fft 之后移位。

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

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

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

您可以编写自定义 CUDA 内核来进行填充,然后编写另一个内核来一次性进行取消填充和移位。

Input to CUDA FFT:

Pad width to cell(width/2+1)*2 due to complex format in frequency domain.
This initial padding will be size of result image --> must crop result.

Then pad to whole power of 2 * whole power of 2 real float matrix (zero padded from right and bottom).

Output, r,i,r,i,... even complex float values (real column, imaginary column, real column, ...), zero padded around center.

Use complex multiplication in frequency domain, not regular one.

After IFFT, crop sides of images to receive height * ceil(width/2+1)*2 center.
Crop again to remove possible extra line at right if any (crop to height*width).

Do not forget to FIT-shift. I can not remember for certain when,
So try shifting after ifft snd if result is wrong, then after fft.

Try multiplying with delta kernel for testing.

Kernel should be padded around center, not corner.

For even matrices, center is half a cell right and under center.

You cab write custom CUDA kernel to do padding and another to do unpaddings and shift in one go.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文