7

音の特定の周波数の大きさを決定する最も簡単で最良の方法は何だろうと思っています。

FFT関数が信号のすべての周波数の大きさを返すことは私の理解です。特定の周波数だけに関心がある場合に使用できるショートカットがあるかどうか疑問に思っています。

iPhoneのマイクを使って音声を録音します。私の推測では、音声をファイルに録音する必要がないため、録音には Audio Queue Services を使用することになります。私は SDK 4.0 を使用しているので、必要に応じて Accelerate フレームワークで定義されている関数 (FFT 関数など) を使用できます。

更新: コンラッドの提案に従って、より明確になるように質問を更新しました。

4

1 に答える 1

16

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 よりも時間がかかる場合があるためです。おそらく、これをベンチマークして、どちらのアプローチが優れているかを確認する必要があります。

簡単にするために、アプリケーションにとって重要ではない他の多くの詳細を省略しました。

于 2010-05-30T06:31:41.550 に答える