我正在使用 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的复数转换应该没有问题?我对计划的制定方式和参数有点怀疑,我试图在网上找到一些例子,但它们没有那么有用,也没有那么一致。然后我只是根据自己的理解通过编程指南设置参数。
如标题所示,输出部分正确(左半平面),右半平面为零,这让我很困惑。我尝试设置不同类型的兼容模式,但没有太大帮助。我比较的版本是 MATLAB fft2()。