2012-04-13 22 views
0

私は初心者アンドロイドプログラマーです。 (私の自宅の言語が私の英語が悪いので、英語ではありません。)周波数を検出する方法は?

私は周波数が「C3」または「G#4」のような人間の声やショーのメモを記録します、アプリを作りたい...

だから、私は人間の声の頻度を検出したいが、それは難しい。

FFTを試してみると、ピアノ(またはギター)の音がかなり(一部、オクターブ4以上、低音域のピアノ(またはギター)の音は検出されませんでした)検出しますが、 。

は、私は多くの情報を見つけましたが、私は理解できない

(私は一般的なMIDIを使用ピアノのプログラムを使用します)。

ほとんどの人がピッチ検出アルゴリズムを使用し、ウィキをリンクしていると言っています。

ピッチ検出アルゴリズムについて詳しく教えてください。 ?

は(実際に私は例のコード:(

または

をしたい私のアプリを使用するには、任意のアイデアがある

ここに私のソースコード:

public void Frequency(double[] array) { 

    int sampleSize = array.length; 

    double[] win = window.generate(sampleSize); 

    // signals for fft input 
    double[] signals = new double[sampleSize]; 
    for (int i = 0; i < sampleSize; i++) { 
     signals[i] = array[i] * win[i]; 
    } 
    double[] fftArray = new double[sampleSize * 2]; 

    for (int i = 0; i < sampleSize - 1; i++) { 
     fftArray[2 * i] = signals[i]; 
     fftArray[2 * i + 1] = 0; 
    } 


    FFT.complexForward(fftArray); 
    getFrequency(fftArray); 
} 

private void getFrequency(double[] array) { 

    // ========== Value ========== // 

    int RATE = sampleRate; 
    int CHUNK_SIZE_IN_SAMPLES = RECORDER_BUFFER_SIZE; 
    int MIN_FREQUENCY = 50; // HZ 
    int MAX_FREQUENCY = 2000; // HZ 

    int min_frequency_fft = Math.round(MIN_FREQUENCY * CHUNK_SIZE_IN_SAMPLES/RATE); 
    int max_frequency_fft = Math.round(MAX_FREQUENCY * CHUNK_SIZE_IN_SAMPLES/RATE); 
    // ============================ // 

    double best_frequency = min_frequency_fft; 
    double best_amplitude = 0; 
    for (int i = min_frequency_fft; i <= max_frequency_fft; i++) { 

     double current_frequency = i * 1.0 * RATE/CHUNK_SIZE_IN_SAMPLES; 

     double current_amplitude = Math.pow(array[i * 2], 2) + Math.pow(array[i * 2 + 1], 2); 

     double normalized_amplitude = current_amplitude * Math.pow(MIN_FREQUENCY * MAX_FREQUENCY, 0.5)/current_frequency; 

     if (normalized_amplitude > best_amplitude) { 
      best_frequency = current_frequency; 
      best_amplitude = normalized_amplitude; 
     } 
    } 

    FrequencyArray[FrequencyArrayIndex] = best_frequency; 
    FrequencyArrayIndex++; 
} 

私はこれを参照してください:http://code.google.com/p/android-guitar-tuner/

Pitch_detection_algorithm

使用Jtransforms

+0

送信したコードは、正弦波などの単純な音にのみ適しています。実際の音は、通常ははるかに複雑です。 – hotpaw2

+0

"ピッチ検出アルゴリズムについて詳しく教えてください。"ピッチ検出に関するウェブには多くの情報があります。あなたがそれを理解できない場合(ここで意図された犯罪はなく、理解するためにはかなりの量の特殊な背景を取るだけです)、あなたが理解できる方法でそれをどのように記述することができますか? SOはプログラミングの質疑応答サイトであり、このタイプの質問には適切なフォーラムではありません。 – tom10

答えて

0

自己相関を説明する別のWikipediaのページへのピッチ検出リンク上のウィキペディアのページ:http://en.m.wikipedia.org/wiki/Autocorrelation#section_3、あなたが試みることができる多くのピッチ推定方法の一つです。

投稿したサンプルコードを実行すると、多くの一般的なピッチ音の音楽ピッチ検出と推定で、FFTピーク周波数推定値が非常に悪いことがわかります。