C++ FFTW和袖口输出之间的差异

C++ FFTW和袖口输出之间的差异,c++,cuda,fftw,C++,Cuda,Fftw,在下面我发布的char中,我比较了FFTW和CUFT中IFFT运行的结果 可能的原因是什么?真的有那么多舍入误差吗 以下是相关的代码片段: cufftHandle plan; cufftComplex *d_data; cufftComplex *h_data; cudaMalloc((void**)&d_data, sizeof(cufftComplex)*W); complex<float> *temp = (complex<float>*)fftwf_ma

在下面我发布的char中,我比较了FFTW和CUFT中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
cufftHandle平面图;
袖套复杂*d_数据;
袖套复杂*h_数据;
Cudamaloc((void**)和d_数据,尺寸(袖套复合体)*W;
复合体*temp=(复合体*)fftwf_malloc(sizeof(fftwf_复合体)*W);
h_数据=(cufftComplex*)malloc(sizeof(cufftComplex)*W);
memset(h_数据,0,W*sizeof(袖套复合体));
/*创建1D FFT计划*/
袖口平面图(和平面图,W,袖口C2C,1);
如果(!reader->getData(rowBuff,row))
返回0;
//从读取缓冲区复制到我们的FFT输入缓冲区
memcpy(indata、rowBuff、fCols*sizeof(complex));
for(int c=0;c
ifft的定义如下:

ifft = fftwf_plan_dft_1d(freqCols, reinterpret_cast<fftwf_complex*>(indata),
                         reinterpret_cast<fftwf_complex*>(outdata), 
                         FFTW_BACKWARD, FFTW_ESTIMATE);
ifft=fftwf\u平面图\u dft\u 1d(频率、重新解释(indata),
重新解释(输出数据),
FFTW_向后,FFTW_估计);
为了生成图形,我在fftw_执行之后转储了h_数据和outdata W是我正在处理的图像行的宽度

看到明显的东西了吗


所以看起来CUFFT返回的是实部和虚部,而FFTW只返回实部。CUFFT复杂函数库附带的cuCabsf()函数使我在拥有复杂函数的两个部分时得到sqrt(2)的倍数


顺便说一句,在FFTW和CUFT之间的中间步骤中,我从来没有能够得到精确的匹配结果。如果你同时做IFFT和FFT,你应该会得到一些接近的结果。

你在画什么?真正的部分?模量?复数的大小numbers@Derek:如何计算它们?你有没有试过| a+bi |=| a |*(1+(b/a)^2)如果a>b,| b |*(1+(a/b)^2?我刚刚使用了std::complex Library的abs()函数创建了一个简单的例子,只需生成一个数字数组1-50并对其进行正向和反向FFT,我发现CUFFT库的比例因子为1/sqrt(2)。知道这是从哪里来的吗?