如何在Cuda中获得2D真实到复杂FFT的所有数据

How to get ALL data from 2D Real to Complex FFT in Cuda

本文关键字:FFT 复杂 数据 真实 2D Cuda      更新时间:2023-10-16

我正在尝试使用CUFFT做2D真实到复杂的FFT。

我意识到我将这样做并得到W/2+1复值(W是我的H*W矩阵的"宽度")。

问题是-如果我想在转换后构建这个矩阵的完整H*W版本-我如何将H*(W/2+1)结果矩阵中的一些值复制回完整大小的矩阵以获得正确位置的部分和DC值

谢谢

我不熟悉CUDA,所以在阅读我的回复时要考虑到这一点。不过,我对fft和信号处理很熟悉。

听起来你从一个H(行)x W(色)矩阵开始,你正在做一个2D FFT,基本上在每一行上做一个FFT,你最终得到一个H x W/2+1矩阵。W宽FFT返回W值,但CUDA函数只返回W/2+1,因为实际数据在频域中甚至,因此负频率数据是冗余的。

因此,如果您想重现丢失的W/2-1点,只需镜像正频率。例如,如果其中一行如下:


索引数据0 12 + i
1 5 + 2i
2 6
3 2 - 3i

0指标是你的直流功率,1指标是最低正频率bin,以此类推。因此,您将使最接近直流的负频率为5+2i,下一个最接近的为6,以此类推。把这些值放到数组的哪个位置取决于你。我会按照Matlab的方式来做,将负频率数据放在正频率数据之后。

有两种方法可以实现。您必须编写自己的内核来实现这两种功能。

1)你需要对你得到的(一半)数据进行共轭才能找到另一半。
2)既然你想要完整的结果,最好是将输入数据从实数转换为复数(通过填充0虚数)并执行复数到复数的转换。

从实践中,我注意到两种方式在速度上都没有太大的区别。

我实际上搜索了nVidia论坛,发现有人写了一个内核,它正好满足了我的要求。这就是我用的。如果你在cuda论坛搜索"冗余结果fft"或类似的内容,你会找到它。