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