2012-04-13 2 views
0

Je suis programmeur android débutant. (Ma langue maternelle est pas l'anglais, mon anglais est pauvre.)comment détecter la fréquence vocale?

je veux faire application, obtenir la voix humaine et spectacle note enregistrée fréquence comme « C3 » ou « G # 4 » ...

Donc, je veux détecter la fréquence de la voix humaine, mais c'est trop difficile. J'essaie d'utiliser du FFT, il détecte un son de piano (ou de guitare) assez bon (en partie, sur octave4, il ne détecte pas le son de piano basse fréquence (ou de guitare).), Mais il ne peut pas détecter la voix humaine .

(i utiliser programme de piano utilisé midi général)

J'ai trouvé beaucoup d'informations, mais je ne peux pas comprendre.

la plupart des gens disent utiliser l'algorithme de détection de hauteur et ne lient que le wiki.

S'il vous plaît dites-moi en détail sur l'algorithme de détection de hauteur.

(en fait je veux un exemple de code :(

ou

est-il une idée d'utiliser mon application

EST ICI MON CODE SOURCE:

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++; 
} 

Je me réfère à ceci: http://code.google.com/p/android-guitar-tuner/

Pitch_detection_algorithm

utilisation Jtransforms

+0

Le code que vous avez posté ne convient que pour les sons simples, tels que les ondes sinusoïdales. Les sons réels sont généralement beaucoup plus compliqués. – hotpaw2

+0

"S'il vous plaît dites-moi en détail sur l'algorithme de détection de hauteur." Il y a beaucoup d'informations sur le web concernant la détection de hauteur. Si vous ne pouvez pas comprendre cela (aucune infraction intentionnée ici, certaines choses prennent juste une quantité significative d'arrière-plan spécialisé pour comprendre), comment pouvons-nous vous le décrire d'une manière que vous pouvez comprendre? SO est un site de questions et réponses de programmation, et pas vraiment un forum approprié pour ce type de question. – tom10

Répondre

0

La page Wikipédia sur les liens de détection de pas vers une autre page Wikipedia expliquant: http://en.m.wikipedia.org/wiki/Autocorrelation#section_3 autocorrelation, ce qui est l'une des nombreuses méthodes d'estimation de pas que vous pourriez essayer. L'exécution de l'exemple de code que vous avez affiché peut montrer que l'estimation de la fréquence de crête FFT est très médiocre lors de la détection et de l'estimation de hauteur tonale pour de nombreux sons de hauteur commune.

Questions connexes