6

単純なテストプログラムを作成しました。このプログラムでは、Complex to Complex FTを実行し、データ1..50を生成して、配列の各インデックスの実数部と虚数部に貼り付けました。

このような操作を行うとIFFT(FFT(A))= A

それらをテストするために、ライブラリごとに異なる結果が得られています。

FFTW、元のAを取り戻すには、出力をlen(A)で割る必要があります

ただし、これを順方向に実行してからCUFFTを使用して逆方向にFFTを実行すると、元のデータに戻すために(sqrt(2)* 50)で除算する必要があるように見えます。

この余分な平方根係数はどこから来ていますか?

CUFFTのドキュメントによると:CUFFTは正規化されていないFFTを実行します。つまり、入力データセットに対して順方向FFTを実行し、続いて結果セットに対して逆方向FFTを実行すると、要素数でスケーリングされた入力に等しいデータが生成されます。データセットのサイズの逆数によるいずれかの変換のスケーリングは、ユーザーが適切と思われるように実行できるように残されています。

前もって感謝します

4

2 に答える 2

6

CUFFT は FFTW と同じ動作をし、正規化されていない FFT を計算します。 IFFT(FFT(A))=n Aここで、n はベクトルの長さです。長さnはサンプル数です (float やバイトではありません)。C2R と R2C を使用した FFTW と CUFFT の間にはいくつかのパディングの違いがあり、単純な比較を台無しにする可能性がありますが、C2C ではそうではありません。データの設定と長さの計算を再確認し、FFTW と CUFFT の両方で計画を検証します。

于 2011-06-23T21:28:17.740 に答える
1

これは、複素数の絶対値を計算する方法に問題がありました。ライブラリでstd::complexは、ベクトルの距離を計算していました。

于 2011-07-12T23:22:20.213 に答える