2012-04-13 3 views
0

Я начинаю программист для Android. (Мой родной язык не английский, поэтому, мой английский оставляет желать лучшего.)как распознать частоту сигнала?

я хочу, чтобы сделать приложение, получить частоты человеческого голоса, записанные и показать записку, как «C3» или «G # 4» ...

поэтому я хочу определить частоту человеческого голоса, но это слишком сложно.

Я пытаюсь использовать FFT, он обнаруживает, что звук фортепиано (или гитары) довольно хорош (часть, над октавой4, он не обнаружил звук низкой частоты фортепиано (или гитары).), Но он не может обнаружить человеческий голос ,

(я использую программу фортепиано используется общий миди)

Я нашел много информации, но я не могу понять.

большинство людей говорят, что используют алгоритм определения высоты тона и ссылку только 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

+0

Код, который вы отправили, подходит только для простых звуков, таких как синусоидальные волны. Реальные звуки обычно намного сложнее. – hotpaw2

+0

«Пожалуйста, расскажите мне подробно о алгоритме определения высоты тона». В Интернете есть много информации об обнаружении высоты тона. Если вы не можете понять это (не оскорбление, предназначенное здесь, некоторые вещи просто занимают значительное количество специализированного фона для понимания), как мы можем описать его вам так, как вы можете это понять? SO - это вопрос программирования и сайта для ответов, а не действительно подходящий форум для такого типа вопросов. – tom10

ответ

0

страница на Википедии ссылку обнаружения тангажа на другую страницу Википедии, объясняющей автокорреляции: http://en.m.wikipedia.org/wiki/Autocorrelation#section_3, который является одним из многих методов оценки шага вы могли бы попробовать.

Запуск кода примера, который вы опубликовали, может показать, что оценка частоты пиковых частот FFT является довольно низкой при обнаружении и оценке музыкального тона для многих распространенных звуков.