CUDA cufft库2D FFT只对左半平面正确

时间:2016-04-10 06:12:10

标签: cuda fft cufft

我正在使用CUFFT库对128个128 x 128大小的图像进行2D FFT。我使用该库的方式如下:

unsigned int nx = 128; unsigned int ny = 128; unsigned int nz = 128;
// Make 2D fft batch plan
int n[2] = {nx, ny};
int inembed[] = {nx, ny};
int onembed[] = {nx, ny};

cufftPlanMany(&plan,
            2, // rank
            n, // dimension
            inembed,
            1, // istride
            nx * ny, // idist
            onembed,
            1, //ostride
            nx * ny, // odist
            CUFFT_D2Z,
            nz);
cufftSetCompatibilityMode(plan,CUFFT_COMPATIBILITY_NATIVE)

// Create output array
complex<double>* out_complex = new complex<double>[nx * ny * nz];
// Initialize output array
for (unsigned int i = 0; i < nx * ny * nz; i++) {
   out_complex[i].real(0);
   out_complex[i].imag(0);
}
cudaMalloc( (void**)&idata, sizeof(cufftDoubleReal) * nx * ny * nz );
cudaMalloc( (void**)&odata, sizeof(cufftDoubleComplex) * nx * ny * nz );
cudaMemcpy( idata, in_real, nx * ny  * nz * sizeof(cufftDoubleReal), 
                                  cudaMemcpyHostToDevice )  );
cudaMemcpy( odata, out_complex, nx * ny * nz *  sizeof(cufftDoubleComplex), 
                                  cudaMemcpyHostToDevice )  );

cufftExecD2Z( plan, idata, odata );

cudaMemcpy( out_complex, odata, nx * ny * nz * sizeof(cufftDoubleComplex),
                                  cudaMemcpyDeviceToHost ) );

主机上的输入in_real是一个包含3D图像的大数组,这是一个双数组。我想从/到cufftDoubleReal和从/到cufftDoubleComplex的转换为/从double转换是没有问题的?我对计划的制定方式和参数有点怀疑,我试图在网上找到一些例子,但它们并没有那么有用也不一致。然后我只使用我自己的理解通过programming guide设置参数。

如标题所示,输出部分正确(左半平面),右半平面为零,这让我很困惑。我尝试设置不同类型的兼容模式,但没有那么有用。我要比较的版本是MATLAB fft2()。

1 个答案:

答案 0 :(得分:4)

你需要(重新)阅读documentation的真实到复杂的变换。引用:

  

在许多实际应用中,输入向量是实值的。它可以   很容易证明在这种情况下输出满足Hermitian   对称性(X k = X N - k *,其中星形表示复数   共轭)。反过来也是如此:对于复杂的Hermitian输入   逆变换将是纯粹的实值。 cuFFT需要   这种冗余的优点只适用于前半部分   厄米特传染媒介

即。实数到复数变换的输出是对称的,并且cuFFT通过不计算冗余(对称)系数来利用它。因此,只有半个&#34;是正常的。转换的输出,因为另一半&#34;一半&#34;是相同的。这不是cuFFT独有的,FFTW和大多数其他高性能FFT库以这种方式工作,用于实际到复杂的变换以及复杂到真实的逆变换。