gpt4 book ai didi

c++ - FFTW 和 CUFFT 输出之间的差异

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:46 27 4
gpt4 key购买 nike

在下面发布的字符中,我比较了 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 和 outdataW 是我正在处理的图像的行宽。

看到任何明显的东西了吗?

enter image description here

最佳答案

所以看起来 CUFFT 返回的是实部和虚部,而 FFTW 只返回实部。 CUFFT 复数库附带的 cuCabsf() 函数导致它在我同时拥有复数的两个部分时为我提供 sqrt(2) 的倍数

顺便说一句 - 我从来没有能够在 FFTW 和 CUFFT 之间的中间步骤中获得完全匹配的结果。但是,如果您同时执行 IFFT 和 FFT,您应该得到接近的结果。

关于c++ - FFTW 和 CUFFT 输出之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5248889/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com