Я начинаю программист для 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/
использование Jtransforms
Код, который вы отправили, подходит только для простых звуков, таких как синусоидальные волны. Реальные звуки обычно намного сложнее. – hotpaw2
«Пожалуйста, расскажите мне подробно о алгоритме определения высоты тона». В Интернете есть много информации об обнаружении высоты тона. Если вы не можете понять это (не оскорбление, предназначенное здесь, некоторые вещи просто занимают значительное количество специализированного фона для понимания), как мы можем описать его вам так, как вы можете это понять? SO - это вопрос программирования и сайта для ответов, а не действительно подходящий форум для такого типа вопросов. – tom10