0

私は初心者のAndroidプログラマーです。(私の母国語は英語ではないので、私の英語は貧弱です。)

アプリを作り、周波数を録音した人間の声を取得し、「C3」や「G#4」のようなメモを表示したい...

ですから、人間の音声周波数を検出したいのですが、難しすぎます。

FFTを使用してみますが、ピアノ(またはギター)の音はかなり良好に検出されます(一部、octave4を超えると、低周波のピアノ(またはギター)の音は検出されませんでした)が、人間の声は検出できません。

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

たくさんの情報を見つけましたが、理解できません。

ほとんどの人は、ピッチ検出アルゴリズムを使用し、wikiだけをリンクすると言います。

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

(実際にはサンプルコードが必要です:(

また

私のアプリを使用するアイデアはありますか?

これが私のソースコードです:

 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を使用する

4

1 に答える 1

0

ピッチ検出に関するウィキペディアのページは、自己相関を説明している別のウィキペディアのページにリンクしています: http://en.m.wikipedia.org/wiki/Autocorrelation#section_3は、試すことができる多くのピッチ推定方法の 1 つです。

投稿したコード例を実行すると、FFT ピーク周波数推定が、多くの一般的なピッチ音の音楽ピッチ検出と推定において非常に貧弱であることを示すことができます。

于 2012-04-13T15:09:49.730 に答える