2012-07-19 11 views
6

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

は難しいですか?結局のところ、アンドロイド市場には約80億個のギターチューナーアプリがあります。

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

+2

あなたが求めているものを実装するには、高速フーリエ変換の基本的な知識が必要です。あなたがJava FFTライブラリを探しているなら、それを見つけるのは難しいとは想像もしません。代わりにギター・チューナー・ライブラリーを探して、信号処理を学ぶ必要がないとお勧めします。基本的な理解なしに実装するのは難しいでしょう。 – Tucker

答えて

3

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

FFTを実際に実装する場合、Googleの「高速フーリエ変換サンプルコード」を使用すると、いくつかの例が得られます。

+1

この[example](http://stackoverflow.com/a/2065693/230513)は、テストに役立つ場合があります。 – trashgod

+1

私は、どのように入手するのか、それとも何を意味するのかわからない、値の配列が必要なサンプルをたくさん見つけました。私たちはそこに着いています。右の郵便番号に[this](http://introcs.cs.princeton.edu/java/97data/FFT.java.html)がありますか? – brainmurphy1

+1

@ brainmurphy1そのリンクは正しいもののように見えます。アレイからマイクロフォンからの入力を読み取ることができます。私は以前これをやったことはありませんが、Googleはあなたが[AudioRecord]を望んでいると言います(http://www.jarvana.com/jarvana/view/com/google/android/android/2.2.1/android-2.2.1-javadoc .jar!/android/media/AudioRecord.html)クラスであり、ここに例があります:http://www.androiddevblog.net/android/android-audio-recording-part-2 –

12

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

  1. あなたの信号を低域:あなたは本当にFFTを使用したい場合は

    は、ここに一つのアプローチです。これは、ノイズと高調波が偽の結果を生成するのを防ぎます。おそらく、このステップをスキップして代わりにFFTの低い値に向かって結果を重み付けすることができます。基本周波数が強い楽器の場合、これは必要ではないかもしれません。

  2. あなたの信号をウィンドウで開きます。 Windowsのサイズは4096でなければなりません。より大きな周波数分解能が得られるので、より大きい方が良い点です。大きすぎると、計算時間と待ち時間が長くなります。 hann関数は、あなたのウィンドウにとっては良い選択です。 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. YINのようなより良いアルゴリズムを使用する。http://www.ircam.fr/pcm/cheveign/pss/2002_JASA_YIN.pdf

ウィンドウインステップをスキップして、オーディオを個別のチャンク多くのサンプルを分析したいと思っています。これは動作する正方形のウィンドウを使用するのと同じですが、結果に大きなノイズが発生する可能性があります。

BTW:これらのチューナーアプリのライセンスコードの多くは、zプレーンやiZotopeなどのサードパーティ製のものです。

更新:CソースコードとFFTメソッドの完全なチュートリアルが必要な場合は、written oneです。このコードはMac OS Xでコンパイルされ、実行され、他のプラットフォームにも簡単に変換できるはずです。それは最高になるようには設計されていませんが、理解しやすいように設計されています。

+1

これは私が必要としているように見えますが、私は「ローパス」、「ウインドウ」、および「ハーン関数」が何であるかわからないので、私には役に立たないです。 (リンクにもかかわらず、私はまだそれがどのように適用されるのか理解していません。)上記の提案は、もっと知っている人を助けるかもしれませんが、私はそれらの知識が全くないのでこの質問をしています。 – brainmurphy1

+0

windowing:http://en.wikipedia.org/wiki/Window_function –

+0

私は別の方法を提案しましたが、それが何であるかわからない場合は、googleで別の質問をすることができます。それは別の質問の副回答として容易にカバーできるものではありません。 –