我正在尝试使用CUFFT进行2D Real To Complex FFT。
我意识到我会这样做并获得W / 2 + 1复数值(W是我的H * W矩阵的“宽度”)。
问题是 - 如果我想在变换后构建该矩阵的完整H * W版本怎么办?如何将H *(w / 2 + 1)结果矩阵中的某些值复制回一个完整尺寸的矩阵,可以将两个部分和DC值都放在正确的位置
由于
答案 0 :(得分:1)
我不熟悉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 + i
1 5 + 2i
2 6
3 2 - 3i
......
0指数是您的直流电源,1指数是最低的正频率垃圾箱,依此类推。因此,您将使最接近DC的负频率仓5 + 2i,下一个最接近的6,依此类推。将这些值放在数组中的位置取决于您。我会按照Matlab的方式进行,并在正频率数据之后使用负频率数据。
我希望这是有道理的。
答案 1 :(得分:1)
有两种方法可以实现。你必须编写自己的内核来实现其中任何一个。
1)你需要在(一半)数据上执行共轭以找到另一半 2)因为无论如何你想要完整的结果,最好将输入数据从实数转换为复数(通过0虚构填充)并执行复数到复数变换。
从实践中我发现无论如何都没有太大的速度差异。
答案 2 :(得分:1)
我实际上搜索了nVidia论坛,发现有人编写的内核正是我所要求的。这就是我用过的东西。如果您在cuda论坛上搜索“冗余结果fft”或类似内容,您会找到它。