FFT実装をテストするためにどのデータを使用する必要があり、どのような精度を期待する必要がありますか?


14

私はFFTアルゴリズムを実装するための取り組みに関与しており、入力テストデータを使用するために推奨されるアドバイスが何であるか、そしてその理由を知りたいと思っています。-そして、どのような精度が期待されますか。

テストの入力については、古いUsenetの投稿に回答として投稿する少しのガイダンスが見つかりましたが、それは正当な理由のない1人の提案にすぎません。

正確性について、ウィキペディアはエラーがO(e log N)であるべきだと言っていますが、絶対的な用語で合理的な期待は何ですか?

編集して追加:実際のテストは、入力データの配列と比較対象の事前計算された「参照」出力データを格納した形式になっているため、必ずしも閉じた形式のソリューションを必要としません。

回答:


12

離散フーリエ変換の既知の特性を持つ目的の関数を実行するという意味で、FFTアルゴリズムの正確性を検証する場合は、次で提案されているアプローチを使用できます。

エルギュン、ファンダ。(1995年6月)。多変量線形関数のテスト:ジェネレーターのボトルネックを克服します。ではPROC。二十七アン。ACM Symp。コンピューティングの理論。(p。407–416)。

上記の論文は、FFTWのメーカーが、特定のFFT実装が適切に機能することを検証するための選択方法として参照されています。提案された手法は、関数を3つの主要なコンポーネントに抽出し、個別のテストで検証します。

  • 線形性: DFTは(フーリエファミリーの他のいとこ変換と一緒に)線形演算子であるため、すべての値について、次の方程式が成り立つ必要があります。a1,a2,x1[n],x2[n]

FFTa1バツ1[n]+a2バツ2[n]=a1FFTバツ1[n]+a2FFTバツ2[n]
  • 単位インパルスのDFT:クロネッカーデルタ関数に等しい時間領域信号がFFTアルゴリズムの入力に適用され、出力が単位インパルス関数の既知のDFTに対してチェックされます(すべての出力で一定値に変換されます)ビン)。FFTアルゴリズムがIFFTを提供する場合、逆にテストして、ユニットインパルス関数が再び得られることを示すことができます。

  • タイムシフト: 2組のデータがFFTアルゴリズムの入力に適用されます。時間領域の2つの間の唯一の違いは、一定の時間シフトです。DFTの既知の特性に基づいて、これは2つの信号の周波数領域表現間の既知の線形位相シフトに影響を与えるはずです。位相シフトの勾配は時間シフトに比例します。

この論文の著者は、これらのテストはFFT実装の正確性を検証するのに十分であると主張しています。過去にこの手法を使用したことはありませんが、それは理にかなっているようです。検証問題への適切なアプローチに関する信頼できる機関として、FFTWの著者(フリーソフトウェアのすばらしい作品を作成した)を信頼します。


ありがとう!著者は、線形性テストで使用するa1、a2、x1 [n]、およびx2 [n]の値について何か提案がありますか(または、これはほとんど問題ではないと断言しますか)。それに、タイムシフトテストに使用するデータセットについてはどうでしょうか。
ブルックスモーゼス

3
実際に論文を読んで、私は自分の質問に答えることができます。著者は、直線性テストの実行方法については説明しませんが、「ほとんどの入力」に当てはまることを証明するのに十分であると仮定します。また、このペーパーでは、正確な算術を想定した正確な正確性の証明について説明しています。近似プログラムの数値誤差を特性化するための手段を記述していません(有限精度演算を使用した結果として必然的に)。
ブルックスモーゼス

これは確かにこれまでのベストアンサーであるため、先に進んでこれを承認済みとしてマークしますが、使用するテスト入力データセット(およびその理由)、または予想される精度の詳細をカバーする他のアンサーにまだ興味があります。ありがとう!
ブルックスモーゼス

2
FFTアルゴリズムの検証に関する質問には、実際には2つの要素があります。正確性の検証と数値精度の測定です。私の答えは最初のものだけに対処しました。本質的に実装依存であるため、どのような数値の精度が期待できるかについての説明を行うのは困難です。算術のタイプ(固定対浮動小数点など)、アルゴリズムの実装に使用される構造、FFTの長さ(つまり、問題の分解に使用されるステージの数)、実行速度を改善するために使用されるショートカットなどがすべて再生されます因数分解し、一般化することは困難です。
ジェイソンR

いい視点ね; 私はそれらを別々の質問として尋ねるべきだったでしょう。
ブルックスモーゼス

5

質問で言及したように、アーカイブされたcomp.dsp Usenetの投稿(http://www.dsprelated.com/showmessage/71595/1.php、「tdillon」による投稿)で提案のセットを見つけました。

A.Single FFT tests - N inputs and N outputs
 1.Input random data
 2.Inputs are all zeros
 3.Inputs are all ones (or some other nonzero value)
 4.Inputs alternate between +1 and -1.
 5.Input is e^(8*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 6.Input is cos(8*2*pi*i/N) for i = 0,1,2, ...,N-1.
 7.Input is e^((43/7)*j*2*pi*i/N) for i = 0,1,2, ...,N-1. (j = sqrt(-1))
 8.Input is cos((43/7)*2*pi*i/N) for i = 0,1,2, ...,N-1.

B.Multi FFT tests - run continuous sets of random data
 1.Data sets start at times 0, N, 2N, 3N, 4N, ....
 2.Data sets start at times 0, N+1, 2N+2, 3N+3, 4N+4, ....

スレッドは、2つの正弦波を実行することも提案しています。1つは大きな振幅で、もう1つは小さな振幅です。

主な質問で述べたように、これが特に良い回答のセットなのか、それとも非常に完全なものなのかはわかりませんが、投票してコメントできるようにここに置いています。


1
「1.入力ランダムデータ」は何を明らかにしますか?
ディリップサーワテ

1
@DilipSarwate:ファズテストは、クラッシュを明らかにするのに役立ちます。また、ノイズ入力のタイプ(ピンクノイズやホワイトノイズなど)に応じて、全体的なエネルギー分布が予想どおりであることを確認するのに役立ちます。
スモクリス

2
@Dilip-私のfftの「煙テスト」はifft(fft(random_stuff))〜= random_stuffです。
hotpaw2

@ hotpaw2「ランダムなもの」とは、正弦波などのパターンに当てはまらない数の数字が表示されることを意味しますか?または、出力をテストして、数値が「ランダム」とみなせるかどうかを確認します。たとえば、入力を複素数ガウス、次に(with、たとえば、信頼性)FFT出力の散布図は、ランダムサンプルから得られる散布図のように見えますか?NCN0199N CN(0,1
ディリップサルワテ

2
@Dilip:私はハードウェアの男です。すべての乗算器とCSAのすべてのビットの高い割合を切り替えることができるものが欲しかった。
hotpaw2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.