1 つの周波数のみをテストする必要がある場合は、DFTの対応するポイントを計算するだけで済みます。DFT アルゴリズムは O(N^2) ですが、FFT アルゴリズムは中間結果を再利用して、DFT の計算に O(NlogN) を達成します。ただし、1 つの周波数サンプルのみが必要な場合は、DFT の 1 つの出力サンプルを計算するだけで O(N) パフォーマンスを達成できます。
これは、ウィキペディアのページで DFT の方程式を見て(ここでは入力しません)、対象の周波数に対応する単一の k に対して Xk を計算することで実行できます。k は、DFT の出力のインデックスです。
k (DFT 出力のインデックス) を実際の周波数 (Hz) にマッピングすることは、次の 2 つの条件に依存します。
- サンプリング周波数 (たとえば、CD オーディオの場合は 44100 Hz)
- FFT サイズ
実周波数は次のように k にマッピングされます。
F = k*Fs/N for k = 0 ... N/2-1 ((N-1)/2 for odd N)
また
k = F*N/Fs for F = 0Hz ... Fs/2-Fs/N
ここF
で、 は Hz 単位の周波数、N
は FFT サイズ、Fs
はサンプリング周波数 (Hz) です。注意すべき点:
- k は整数であるため、すべての周波数が整数 k にマップされるわけではありません。最も近い k を見つける
- より高い周波数分解能が必要な場合は、N を増やします。
- Fs でサンプリングされた信号は、Fs/2 (ナイキストレート)を含まず、最大で周波数を正確に表すことができます。これが、k から Hz へのマッピングが出力サンプルの半分に対してのみ有効であることを示した理由です。後半が何を表しているかについては説明しません (実際の入力信号では前半の鏡像になります)。
- DFT/FFT の出力は複雑です。あなたはおそらくこれの大きさを取りたいと思うでしょう。
- 少数の DFT 出力を計算する必要がある場合でも、DFT を使用して必要な出力サンプルだけを計算するのではなく、使用可能な FFT 関数を使用してすべての出力サンプルを取得する方がよい場合があります。その理由は、ほとんどの FFT アルゴリズムが大幅に最適化されているため、理論的には作業が少なくても、FFT よりも時間がかかる場合があるためです。おそらく、これをベンチマークして、どちらのアプローチが優れているかを確認する必要があります。
簡単にするために、アプリケーションにとって重要ではない他の多くの詳細を省略しました。