このサイトでは、ピッチ検出の概念について多くの質問がありますが、それらはすべて、私がよく知らないこの魔法のFFTを扱っています。ピッチ検出を実装する必要があるAndroidアプリケーションを構築しようとしています。これを行うために使用されるアルゴリズムについては、まったく理解していません。
そんなに難しいことはありませんか?結局のところ、Android市場には約80億のギターチューナーアプリがあります。
誰かが助けることができますか?
FFTは、ピッチ検出またはピッチ追跡を実装するための実際の最良の方法ではありません。1つの問題は、最も大きな周波数が必ずしも基本周波数であるとは限らないということです。もう1つは、FFT自体が、楽器のチューニングに必要な解像度を取得するためにかなりの量のデータと処理を必要とするため、応答が遅い(つまりレイテンシー)ように見える可能性があることです。さらに別の問題は、FFTの結果は必然的に直感的に操作できることです。複素数の配列を取得し、それらを解釈する方法を知っている必要があります。
本当にFFTを使用したい場合は、次の1つの方法があります。
インデックスから頻度をどのように計算しますか?サイズ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でコンパイルおよび実行され、他のプラットフォームに非常に簡単に変換できるはずです。最高のデザインではありませんが、わかりやすいデザインになっています。
高速フーリエ変換は、関数を時間領域から周波数領域に変更します。したがって、マイクから取得する信号がf(t)
どこにあり、その信号の時間インデックスであるかではなく、がFFTであり、が周波数であることがわかります。を取得したら、振幅が最も大きいもの、つまり「最も大きい」周波数を見つける必要があります。それがあなたが拾っている音の主要なピッチになります。f
t
g(θ)
g
f
θ
g(θ)
θ
実際にFFTを実装する場合、「高速フーリエ変換のサンプルコード」をグーグルで検索すると、たくさんの例が得られます。