3

私は1D FFTをやっています。FFTW と同じ入力データがありますが、CUFFT からの戻り値は、FFTW と同じように「整列」していないようです。つまり、私のFFTWコードでは、ゼロパディングの中心を計算し、すべてのデータを「左揃え」にするためにシフトを行い、末尾にゼロを付けることができました。

CUFFT では、FFT の結果は同じように見えるデータですが、ゼロが出力の「中央に配置」されていないため、アルゴリズムの残りの部分が壊れます。(データを左揃えにシフトすると、不正なシフトの後にまだ「ギャップ」があります)。

誰でも私に洞察を与えることができますか?それらの互換性フラグと関係があると思っていましたが、 cufftSetCompatibilityMode(plan, CUFFT_COMPATIBILITY_FFTW_ALL); でも。いまだに悪い結果が出ています。

以下は、最初の行からのデータの大きさのプロットです。左側のデータは逆 CUFFT の出力で、右側のデータは逆 FFTW の出力です。

ありがとう!ここに画像の説明を入力

FFTW および CUFFT プランのセットアップ コードは次のとおりです。

ifft = fftwf_plan_dft_1d(freqCols, reinterpret_cast<fftwf_complex*>(indata), 

                  reinterpret_cast<fftwf_complex*>(outdata), 

                  FFTW_BACKWARD, FFTW_ESTIMATE);

CUFFT:

cufftSetCompatibilityMode(plan, CUFFT_COMPATIBILITY_FFTW_ALL);
cufftPlan1d(&plan, width, CUFFT_C2C, height);

および実行コード:

fftwf_execute(ifft);

CUFFT:

cufftExecC2C(plan, d_image, d_image, CUFFT_INVERSE); //in place inverse

いくつかのテストコードを完成させました:

complex<float> *input = (complex<float>*)fftwf_malloc(sizeof(fftwf_complex) * 100);
    complex<float> *output = (complex<float>*)fftwf_malloc(sizeof(fftwf_complex) * 100);

    fftwf_plan ifft;
    ifft = fftwf_plan_dft_1d(100, reinterpret_cast<fftwf_complex*>(input), 

                          reinterpret_cast<fftwf_complex*>(output), 

                          FFTW_BACKWARD, FFTW_ESTIMATE);


    cufftComplex *inplace = (cufftComplex *)malloc(100*sizeof(cufftComplex));
    cufftComplex *d_inplace;
    cudaMalloc((void **)&d_inplace,100*sizeof(cufftComplex));
    for(int i = 0; i < 100; i++)
    {
        inplace[i] = make_cuComplex(cos(.5*M_PI*i),sin(.5*M_PI*i));
        input[i] = complex<float>(cos(.5*M_PI*i),sin(.5*M_PI*i));
    }

    cutilSafeCall(cudaMemcpy(d_inplace, inplace, 100*sizeof(cufftComplex), cudaMemcpyHostToDevice));
    cufftHandle plan;
    cufftPlan1d(&plan, 100, CUFFT_C2C, 1);
    cufftExecC2C(plan, d_inplace, d_inplace, CUFFT_INVERSE);
    cutilSafeCall(cudaMemcpy(inplace, d_inplace, 100*sizeof(cufftComplex), cudaMemcpyDeviceToHost));


    fftwf_execute(ifft);

これらの FFT 呼び出しの両方からの出力をダンプすると、同じように見えました。何を見ていたのか正確にはわかりません。データの 75 行目の値は 100 でした。あれは正しいですか?

4

1 に答える 1

2

IFFTの1つへの入力で、複雑なデータの実数成分と虚数成分を交換した可能性があります。このスワップにより、時間領域で偶数関数が奇数関数に変更されます。

于 2011-09-26T20:31:17.537 に答える