如何在Cuda中获得2D真实到复杂FFT的所有数据
How to get ALL data from 2D Real to Complex FFT in Cuda
我正在尝试使用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"或类似的内容,你会找到它。
- 函数复杂度分析
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- while循环中while循环的时间复杂度是多少
- 我可以创建一个包含两个变量的 for 循环,但时间复杂度仍然为 O(n) 吗?
- 函数的时间复杂度是多少?
- 如何检查两个 std::向量在小于 O(n) 的时间复杂度内是否相等
- 使用 Python Extension API 包装复杂C++类
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何计算此排序函数的时间复杂度?
- 计算两个代码块的时间复杂度
- 将平面阵列重塑为复杂的特征类型
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在复杂继承中访问静态成员变量
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 1D中的非均匀FFT正向和反向测试
- OpenCV 傅里叶变换复杂输出问题
- 关于FFTW3大师接口的困惑:3个同时复杂的FFT
- 开源库复杂的数学问题,如矩阵多,LU, FFT等在OpenCL
- 如何在Cuda中获得2D真实到复杂FFT的所有数据