6

以下に投稿した文字では、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 は、処理中の画像の行の幅です。

明らかに明らかな何かが見えますか?

ここに画像の説明を入力

4

1 に答える 1

8

したがって、CUFFT は実数部と虚数部を返し、FFTW は実数部のみを返しているようです。CUFFT 複素数ライブラリに付属する cuCabsf() 関数により、複素数の両方の部分がある場合、これにより sqrt(2) の倍数が得られます。

余談ですが、FFTWとCUFFTの間の中間ステップで正確に一致する結果を得ることができたことはありません。ただし、IFFT と FFT の両方を実行すると、近い値が得られるはずです。

于 2011-03-23T21:22:03.020 に答える