Ответ 1
Ваша проблема была решена здесь EDIT: здесь архивировано, Также вы можете анализировать частоту, используя FFT.
EDIT: FFTBasedSpectrumAnalyzer (пример кода, ссылка из комментария)
Я хочу разработать приложение для расчета частоты звука в Android. Устройство Android будет принимать Звук от микрофона (то есть внешний звук), и у меня есть один цветной экран в приложении. при изменении частоты звука я должен изменить цвет фона экрана.
Итак, мой вопрос: "Как я могу получить частоту звука"?
есть ли доступный API-интерфейс Android?
Пожалуйста, помогите мне решить эту проблему.
Ваша проблема была решена здесь EDIT: здесь архивировано, Также вы можете анализировать частоту, используя FFT.
EDIT: FFTBasedSpectrumAnalyzer (пример кода, ссылка из комментария)
Спасибо за ответ. Я сделал это, используя образец на
http://som-itsolutions.blogspot.in/2012/01/fft-based-simple-spectrum-analyzer.html
Просто измените свой код, чтобы рассчитать частоту звука, используя метод ниже.
// sampleRate = 44100
public static int calculate(int sampleRate, short [] audioData){
int numSamples = audioData.length;
int numCrossing = 0;
for (int p = 0; p < numSamples-1; p++)
{
if ((audioData[p] > 0 && audioData[p + 1] <= 0) ||
(audioData[p] < 0 && audioData[p + 1] >= 0))
{
numCrossing++;
}
}
float numSecondsRecorded = (float)numSamples/(float)sampleRate;
float numCycles = numCrossing/2;
float frequency = numCycles/numSecondsRecorded;
return (int)frequency;
}
Другие ответы показывают, как отображать спектрограмму. Я думаю, что вопрос заключается в том, как обнаружить изменение основной частоты. Об этом часто спрашивают на Stack Exchange. Я написал запись в блоге (с кодом!) Об этом:
http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html
По общему признанию, код находится в C, но я думаю, вам будет легко переноситься.
Короче говоря, вы должны:
низкочастотный входной сигнал, так что более высокие частотные обертоны не ошибаются для основной частоты (это может не показаться проблемой в вашем приложении, поскольку вы просто ищете изменение высоты тона, но я рекомендую делать это в любом случае по причинам, которые слишком сложны для перехода сюда).
введите сигнал, используя правильную функцию окна. Чтобы получить наиболее отзывчивый результат, вы должны перекрывать окна, которые я не делаю в своем примере кода.
Выполните БПФ по данным в каждом окне и вычислите частоту, используя индекс максимального абсолютного пикового значения.
Помните о своем приложении, где вы, вероятно, хотите точно и быстро определить изменение высоты тона, метод FFT, который я описываю, может оказаться недостаточным. У вас есть два варианта:
Существуют методы повышения специфичности отслеживания тангажа с использованием информации о фазе, а не только абсолютного пика.
Используйте метод временной области, основанный на автокорреляции. Инь - отличный выбор. (Google для "отслеживания высоты инь" )
Вот ссылка на упомянутый код. Там также есть и другой полезный код.
Здесь сделка с ZeroCrossings:
Неточно определять частоту, основанную на записанном аудио на Android. Тем не менее, по-прежнему полезно придать вашему приложению общий смысл, что звук, который он слышит, - это постоянный тон пения, а не только шум.
Код здесь, кажется, работает достаточно хорошо для определения частоты, (если вы можете перевести его с С# на java) http://code.google.com/p/yaalp/