C++ 如何在Cuda中实现二维实到复FFT的全数据采集

C++ 如何在Cuda中实现二维实到复FFT的全数据采集,c++,cuda,fft,C++,Cuda,Fft,我正在尝试使用CUFFT做一个二维实到复FFT 我意识到我将这样做,并得到W/2+1复数值(W是我的H*W矩阵的“宽度”) 问题是-如果我想在转换后构建该矩阵的完整H*W版本-我如何将一些值从H*(W/2+1)结果矩阵复制回完整大小矩阵,以获得正确位置的部分和DC值 谢谢我不熟悉CUDA,所以在阅读我的回复时要考虑到这一点。不过,我对FFT和信号处理一般都很熟悉 听起来像是从一个H(rows)xw(cols)矩阵开始,然后做一个2dfft,基本上是对每一行进行FFT,最后得到一个hxw/2+1矩

我正在尝试使用CUFFT做一个二维实到复FFT

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

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


谢谢

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

听起来像是从一个H(rows)xw(cols)矩阵开始,然后做一个2dfft,基本上是对每一行进行FFT,最后得到一个hxw/2+1矩阵。宽W的FFT返回W值,但CUDA函数仅返回W/2+1,因为实际数据在频域中是偶数,因此负频率数据是冗余的

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

索引数据
0 12+i
15+2i
26
3 2-3i
...

0指数是你的直流电,1指数是最低的正频率,依此类推。因此,你会使你最近的直流负频率bin 5+2i,下一个最近的6,依此类推。在数组中放置这些值的位置由您决定。我会像Matlab那样做,在正频率数据之后使用负频率数据


我希望这是有道理的。

有两种方法可以实现这一点。您必须编写自己的内核来实现这两个目标之一

1) 您需要对得到的(一半)数据执行共轭运算,以找到另一半。
2) 因为您无论如何都希望得到完整的结果,所以最好将输入数据从实数转换为复数(用0虚数填充),并执行复数到复数的转换


从实践中我注意到,无论速度如何,都没有什么差别。

< P>我实际上搜索了英伟达论坛,发现了一个内核,有人写了,就是我所要求的。这就是我用的。如果你在cuda论坛上搜索“冗余结果fft”或类似内容,你会找到它