(できれば) C# での高速フーリエ変換の実装/チュートリアルのサンプルをどこでも探しています。
ただし、私が見つけたものはすべて、何が起こっているのかを説明するのが不十分であるか、コメントが不十分でした。または、FFT アルゴリズムを既に知っていることを前提としているか、FFT の使用方法についてのチュートリアルです。
良いサンプル/チュートリアルを知っている人はいますか?
ハイパーリンクが不足していることをお詫びします。ハイパーリンクを追加する権限がありません:(
あなたはここで2つのことを求めています
1)FFTの説明
非常に簡単に:
フーリエ変換を使用する信号の周波数領域表現を取得する場合、これは信号を時間領域から周波数領域に変換する数学的変換です。デジタル信号を操作する場合、離散サンプルのセットがあるため、離散フーリエ変換またはDFTを使用する必要があります。ただし、これはかなり遅い操作であり、簡単に最適化できるため、代わりに高速フーリエ変換アルゴリズムまたはFFTを使用します。
これは大きな信号処理のトピックなので、リファレンスとして使用する信号処理の本を探すことをお勧めします。「デジタル信号処理:実用的なアプローチ」を提案します。もちろん、どこにでもあるウィキペディアの記事もあります。
2)FFTの実装
FFTプラットフォームの高度に最適化された性質と言語には特定の実装があることが多いため、標準ライブラリに含まれている場合は、ヘッダーとドキュメント(通常は「オーディオ」セクションにあります)を確認する必要があります。
アルゴリズムを自分で実装したい場合は、数値レシピのコピーを見つけることをお勧めします。これには、FFTの章全体と、「フーリエおよびスペクトルアプリケーション」の章が含まれています。十分に文書化された擬似コードがあり、どの言語にも簡単に書き写すことができます。
サードパーティのソリューションの場合、一般的な選択肢はCライブラリであるFFTWです。「FFTライブラリ」をグーグル検索すると、いくつかの選択肢が表示されます。
http://www.cmlab.csie.ntu.edu.tw/cml/dsp/training/coding/transform/fft.html (はい、これは便利だと思いましたが、フォントとレイアウトはひどいです。それが私のブラウザだといいのですが。変である)
数の計算のための古い標準的な本:数値レシピは、十分な説明があるかもしれません。
コピーを見つけることができれば、ハル・チェンバリンによるマイクロプロセッサの音楽的応用、1983年(?)にFFTのセクションがあるかもしれません-残念ながら、私のコピーは現在機能しているので、FFTの知恵について特に本をチェックすることはできません。しかし、私はオーディオフィルタリング、サンプリングなどの多くの基本を学びました。フーリエ変換とその使用法についてはたくさんの資料があります。
問題は、「良い」という言葉を 2 つのまったく異なるものに解釈することにあります。
FFTW などの高速で最新の最適化された FFT は、何が起こっているのかを説明するのにはほとんど役に立ちません。通常、コードの大部分は、基本的な FFT アルゴリズムよりも、コンパイラ ヒント、パイプライン処理、並列処理、キャッシュ ブロックなどに関係するパフォーマンスの最適化です。
一方、FFT コードの短い (コードの半分以下の) 再帰的な例は、FFT の (クリーンでエレガントな短い) 教科書の派生の 1 つの要約のように見えるかもしれませんが、FFTW と比較して非常に遅く、より多くのメモリを使用します。 (またはベクトル化された pffft など)。
ウィキペディアには、FFT に関する優れた記事があります: http://en.wikipedia.org/wiki/Fft。
実装に関する限り、FFTW は私が今まで使った中で最速ですが、コードはクレイジーに最適化されているため、理解するのが非常に困難です。C# を含め、基本的な FFT 実装へのリンクがたくさんあります。Googleはここであなたの友達です。
これはCで書かれた別のものです。
http://www.archelon.com/fft.html
また、質問をより具体的にすることはできますか。たとえば、DFT と FFT を比較しますか? FFT が非常に高速である理由に興味がありますか?
私の記憶が正しければ、DFT は N^2 の乗算のようなものであり、FFT は約 N log N の乗算です。ここで、N は信号のサンプル数です。