FFTがDFTよりも効率的になるには、いくつのフーリエ振幅を計算する必要がありますか?


8

複雑な2次元配列の少数の低周波数フーリエ成分のみを計算する必要があります。入力配列が変わると、同じフーリエ成分を何度も計算します。明らかに、フーリエ成分が1つだけ必要な制限では、私が求めている成分を与えるDFT行列を作成し、その行列を繰り返し乗算するのが最も高速です。

もう1つの制限では、すべてのフーリエ成分が必要な場合は、FFTを使用する方が高速です。

どの時点で、配列のFFTを計算し、単純に私が求めているコンポーネントを引き出す方が速くなりますか?

それが違いを生む場合、私の特定の状況では、入力配列はようなものになります。私はMATLABを使用しているので、FFTはFFTWを使用して実行され、行列DFTの行列乗算は、MATLABが内部で使用する行列乗算アルゴリズムを介して実行されます。256×256


2
最初に、注意してください。DFTは数学的変換であり、FFTはそれらを計算するための高速アルゴリズムです。DFTによって、離散フーリエ変換式の直接実装を意味しているように見えます。第二:あなたは逆が必要ないのですか?その場合、必要な要素の変換のみを実装できます。
fcruz

はい、DFTとFFTの違いを認識しています。多分、私がこの用語を使用した方法は、私と私の同僚以外には一般的ではありません。あなたが言ったことは本質的に正しいです。私は「DFT」という用語を使用して、1つ以上のフーリエ係数の直接計算を指します。FFTは効率的ですが、DCからナイキスト周波数の2倍までの周波数の計算に制限されています。サンプル間隔は1 / Nで、Nは配列のサイズです。一般に、DFTはこれらのサブセット、または中間周波数(非整数kの場合はk / N)さえ計算できますが、それほど効率的ではありません。
コリンK

@fcruz:また、「必要な要素のみの変換を実装する」というのがこの質問の意味です。FFT全体を実行してから不要な値を捨てるだけの簡単な方法である前に、DFTで計算できる要素の数を尋ねています。rcomptonの答えは、この点ではかなり正しいようです。
Colin K

回答:


9

17。

多くの作業が適切なfftの実装に組み込まれているため、適切なfftライブラリよりも確実に優れたパフォーマンスを発揮することはできません。たとえば、fftw「自分のマシン、キャッシュ、メモリのサイズ、レジスタの数、および通常複数のマシン用にプログラムを最適化することを不可能にする他のすべての要因に自動的に適応する」は、このページを参照します

少数のドット積を計算する方が高速であるが、システムに大きく依存する状況があることは正しいです。

実験:

EDU>> n = 256^2;
EDU>> x = randn(n,1);
EDU>> d = randn(1,n); %really, you should take a row from the output of the dftmtx command. But dftmtx(n) won't fit on my laptop...
EDU>> tic;d*x;toc; %time to compute a single frequency from the dft matrix
Elapsed time is 0.000225 seconds.
EDU>> tic;fft(x);toc; %time to compute the entire fft
Elapsed time is 0.003909 seconds.

したがって、4096個のデータポイントがある場合、fft全体の計算には、単一のドット積の計算よりも約17倍長くかかります。


1
最初の「17」は何ですか。あなたの投稿で?
shuhalo

2
それが答えです:)私は自分のマシンでテストを実行し、得られた結果は、入力配列サイズが64以下になるまで、多かれ少なかれこれに同意します。しかし、全体としての答えははっきりしていません。そのため、まだ受け入れていません(たとえば、dftmtx(256 ^ 2)を生成する必要はないはずです)が、すぐに誰もがでチャイムません。
コリン・K

4

別の方法として、Goertzelアルゴリズムを使用して、関心のある周波数成分を直接計算することもできます。


+1。間違いなく良い提案です。しかし、驚いたことに、Matlabs Signal Processing Toolkitに含まれているgoertzelアルゴリズムは非常に低速です。テストできる入力配列サイズと出力値の数の組み合わせについては、DFTおよびFFTよりも悪いです。
コリンK

1
アルゴリズム自体の方が計算効率が高い場合もありますが、Matlabの実装は純粋なMatlabで記述されていますが、DFTで使用されるFFTと行列乗算はどちらも高度に最適化されたCで記述されています。
コリンK

Goertzel alg。の場合、FFTと比較したアルゴリズムの効率性についての議論は、MITの離散時間信号コースのこの講義部分で取り上げられていました。
fcruz

単純にGoertzelアルゴリズムを実装すると、結果が不正確になる可能性があるため、注意が必要です。代わりに、Christian Reinschによって提案された修正を使用することを検討するかもしれません。たとえば参照してください、Bulirsch / Stoerの説明を
JM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.