我正在尝试使用CUFFT进行2D实数到复数FFT。
我意识到我将这样做并获得W / 2 + 1个复数值(W是H * W矩阵的“宽度”)。
问题是-如果要在转换后建立此矩阵的完整H * W版本,该怎么办-我该如何将H *(w / 2 + 1)结果矩阵中的某些值复制回完整大小矩阵以在正确的位置获得两个部分和DC值
谢谢
最佳答案
我不熟悉CUDA,因此在阅读我的回答时要考虑到这一点。不过,我通常对FFT和信号处理很熟悉。
听起来您是从H(行)x W(cols)矩阵开始的,并且您正在执行2D FFT,实际上是对每一行进行FFT,最后得到H x W / 2 + 1矩阵。 W宽的FFT返回W值,但是CUDA函数仅返回W / 2 + 1,因为实际数据在频域中是偶数,因此负频率数据是多余的。
因此,如果要重现丢失的W / 2-1点,只需镜像正频率即可。例如,如果其中一行如下所示:
索引数据
0 12 +我
1 5 + 2i
2 6
3 2-3i
...
0索引是您的直流电源,1索引是最低的正频率档,依此类推。因此,您将使最接近DC的负频率档位5 + 2i,下一个接近DC的频率档位6,依此类推。将这些值放在数组中的位置由您决定。我会按照Matlab的方式来做,将负频率数据放在正频率数据之后。
我希望这是有道理的。
关于c++ - 如何在Cuda中将所有数据从2D实数转换为复杂FFT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5872118/