c++ - 如何在 Cuda 中从 2D 实数到复数 FFT 获取所有数据

标签 c++ cuda fft

我正在尝试使用 CUFFT 进行二维实数到复数 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 + 我
1 5 + 2i
2 6
3 2 - 3i
...

索引 0 是您的直流电源,索引 1 是最低的正频率仓,依此类推。因此,您将使最接近 DC 的负频率仓为 5+2i,下一个最接近的为 6,依此类推。您将这些值放在数组中的什么位置取决于您。我会按照 Matlab 的方式来做,在正频率数据之后使用负频率数据。

我希望这是有道理的。

关于c++ - 如何在 Cuda 中从 2D 实数到复数 FFT 获取所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5872118/

相关文章:

pointers - 将结构中的双指针传递给 CUDA

parallel-processing - CUDA 并行 block 的最佳数量

android - 在 AudioRecord Android 中查找峰值频率

audio - 音频演示中出现意外的嗡嗡声

php - 在Centos5.11上编译PHP5.6.24

c++ - 二进制表达式的无效操作数是什么意思?

c - 是否可以说哪个指针由 cudaMalloc 分配,哪个由 malloc 分配?

java - 提取频率出现的时间

c++ - 将 const std::vector<char> 转换为 unsigned char*?

c++ - CMake find_path 包含目录前缀