9

このサイトでは、ピッチ検出の概念について多くの質問がありますが、それらはすべて、私がよく知らないこの魔法のFFTを扱っています。ピッチ検出を実装する必要があるAndroidアプリケーションを構築しようとしています。これを行うために使用されるアルゴリズムについては、まったく理解していません。

そんなに難しいことありませんか?結局のところ、Android市場には約80億のギターチューナーアプリがあります。

誰かが助けることができますか?

4

2 に答える 2

15

FFTは、ピッチ検出またはピッチ追跡を実装するための実際の最良の方法ではありません。1つの問題は、最も大きな周波数が必ずしも基本周波数であるとは限らないということです。もう1つは、FFT自体が、楽器のチューニングに必要な解像度を取得するためにかなりの量のデータと処理を必要とするため、応答が遅い(つまりレイテンシー)ように見える可能性があることです。さらに別の問題は、FFTの結果は必然的に直感的に操作できることです。複素数の配列を取得し、それらを解釈する方法を知っている必要があります。

本当にFFTを使用したい場合は、次の1つの方法があります。

  1. 信号をローパスします。これにより、ノイズや高調波が誤った結果を生成するのを防ぐことができます。おそらく、このステップをスキップして、代わりにFFTの低い値に結果を重み付けすることができます。基本周波数が強い一部の機器では、これは必要ない場合があります。
  2. 信号をウィンドウ処理します。Windowsのサイズは少なくとも4096でなければなりません。周波数分解能が高くなるため、ポイントが大きいほど良いです。大きくしすぎると、計算時間とレイテンシが増加することになります。ハン関数はウィンドウに適しています。http://en.wikipedia.org/wiki/Hann_function
  3. ウィンドウ信号をできるだけ頻繁にFFTします。重なり合う窓でもいいです。
  4. FFTの結果は複素数です。sqrt(real ^ 2 + imag ^ 2)を使用して、各複素数の大きさを見つけます。最大の大きさのFFT配列のインデックスは、ピーク周波数のインデックスです。
  5. より一貫性のある結果を得るために、複数のFFTを平均化することをお勧めします。

インデックスから頻度をどのように計算しますか?サイズNのウィンドウがあるとしましょう。FFTを実行すると、N個の複素数が得られます。ピークがn番目で、サンプルレートが44100の場合、ピーク周波数は(44100/2)* n/Nに近くなります。なぜ近いのですか?(44100/2)* 1/Nのエラーがあります。ビンサイズが4096の場合、これは約5.3Hzです。A440で簡単に聞こえます。1.フェーズを考慮に入れる(マグニチュードを考慮する方法のみを説明しました)、2。より大きなウィンドウを使用する(FFTはN Log Nアルゴリズムであるため、レイテンシと処理要件が増加します)、または3.YINhttp://www.ircam.fr/pcm/cheveign/pss/2002_JASA_YIN.pdfなどのより優れたアルゴリズムを使用する

ウィンドウ処理の手順をスキップして、分析するサンプルの数に応じてオーディオを個別のチャンクに分割することができます。これは、正方形のウィンドウを使用するのと同じですが、結果にノイズが増える可能性があります。

ところで:これらのチューナーアプリのライセンスコードの多くは、z-planeやiZotopeなどのサードパーティを形成しています。

更新:CソースコードとFFTメソッドの完全なチュートリアルが必要な場合は、1つ作成しました。コードはMacOSXでコンパイルおよび実行され、他のプラットフォームに非常に簡単に変換できるはずです。最高のデザインではありませんが、わかりやすいデザインになっています。

于 2012-07-19T21:11:53.397 に答える
5

高速フーリエ変換は、関数を時間領域から周波数領域に変更します。したがって、マイクから取得する信号がf(t)どこにあり、その信号の時間インデックスであるかではなく、がFFTであり、が周波数であることがわかります。を取得したら、振幅が最も大きいもの、つまり「最も大きい」周波数を見つける必要があります。それがあなたが拾っている音の主要なピッチになります。ftg(θ)gfθg(θ)θ

実際にFFTを実装する場合、「高速フーリエ変換のサンプルコード」をグーグルで検索すると、たくさんの例が得られます。

于 2012-07-19T02:24:50.860 に答える