在我在下面发布的字幕中,我正在比较FFTW和CUFFT中的IFFT运行结果。
出现这种情况的可能原因有何不同?是真的那么多错误吗?
以下是相关的代码段:
cufftHandle plan;
cufftComplex *d_data;
cufftComplex *h_data;
cudaMalloc((void**)&d_data, sizeof(cufftComplex)*W);
complex<float> *temp = (complex<float>*)fftwf_malloc(sizeof(fftwf_complex) * W);
h_data = (cufftComplex *)malloc(sizeof(cufftComplex)*W);
memset(h_data, 0, W*sizeof(cufftComplex));
/* Create a 1D FFT plan. */
cufftPlan1d(&plan, W, CUFFT_C2C, 1);
if (!reader->getData(rowBuff, row))
return 0;
// copy from read buffer to our FFT input buffer
memcpy(indata, rowBuff, fCols * sizeof(complex<float>));
for(int c = 0; c < W; c++)
h_data[c] = make_cuComplex(indata[c].real(), indata[c].imag());
cutilSafeCall(cudaMemcpy(d_data, h_data, W* sizeof(cufftComplex), cudaMemcpyHostToDevice));
cufftExecC2C(plan, d_data, d_data, CUFFT_INVERSE);
cutilSafeCall(cudaMemcpy(h_data, d_data,W * sizeof(cufftComplex), cudaMemcpyDeviceToHost));
for(int c = 0; c < W; c++)
temp[c] =(cuCrealf(h_data[c]), cuCimagf(h_data[c]));
//execute ifft plan on "indata"
fftwf_execute(ifft);
...
//dump out abs() values of the first 50 temp and outdata values. Had to convert h_data back to a normal complex
ifft的定义如下:
ifft = fftwf_plan_dft_1d(freqCols, reinterpret_cast<fftwf_complex*>(indata),
reinterpret_cast<fftwf_complex*>(outdata),
FFTW_BACKWARD, FFTW_ESTIMATE);
并生成图表我在fftw_execute之后转出了h_data和outdata W是我正在处理的图像行的宽度。
看到明显的任何东西?
答案 0 :(得分:8)
所以看起来CUFFT正在返回一个真实和想象的部分,而FFTW只返回真实的部分。 CUFFT复杂库中的cuCabsf()函数会导致我在复杂的两个部分时给出一个sqrt(2)的倍数
顺便说一句 - 我从来没有能够在FFTW和CUFFT之间的中间步骤中获得完全匹配的结果。如果你同时进行IFFT和FFT,你应该得到一些接近的东西。