我正在研究Nvidia CUDA sdk的convolutionFFT2D示例背后的代码,但我不明白这一点:
cufftPlan2d(&fftPlan, fftH, fftW/2, CUFFT_C2C);
显然,这会初始化一个复杂的平面,以便运行FFT,但我没有看到将平面宽度除以2的点。
准确地说:fftH和fftW是imageX + kernelX + 1和imageY + kernelY + 1维度的舍入值(仅出于速度原因)。我知道在频域中你通常有一个正分量和一个相同频率的对称负分量......但这听起来像是削减了一半的图像数据..
有人可以向我解释这个好一点吗?我从未使用过FFT(我只知道傅立叶变换背后的理论)
答案 0 :(得分:1)
当您执行实数到复数的FFT时,由于对称性,频域数据是冗余的。这只是2D FFT的一个轴的情况。您可以将2D FFT视为两个1D FFT操作,第一个操作在所有行上,对于实值图像,这将为您提供复杂的行值。在第二阶段,您对每列应用1D FFT,但由于行值现在很复杂,因此复杂的FFT将很复杂,输出中没有冗余。因此,在水平轴上只需要宽度/ 2点,但在垂直轴上仍然需要高度点。