Подтвердить что ты не робот

Как рассчитать частоту звука в Android?

Я хочу разработать приложение для расчета частоты звука в Android. Устройство Android будет принимать Звук от микрофона (то есть внешний звук), и у меня есть один цветной экран в приложении. при изменении частоты звука я должен изменить цвет фона экрана.

Итак, мой вопрос: "Как я могу получить частоту звука"?

есть ли доступный API-интерфейс Android?

Пожалуйста, помогите мне решить эту проблему.

4b9b3361

Ответ 2

Спасибо за ответ. Я сделал это, используя образец на
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;
}

Ответ 3

Другие ответы показывают, как отображать спектрограмму. Я думаю, что вопрос заключается в том, как обнаружить изменение основной частоты. Об этом часто спрашивают на Stack Exchange. Я написал запись в блоге (с кодом!) Об этом:

http://blog.bjornroche.com/2012/07/frequency-detection-using-fft-aka-pitch.html

По общему признанию, код находится в C, но я думаю, вам будет легко переноситься.

Короче говоря, вы должны:

  • низкочастотный входной сигнал, так что более высокие частотные обертоны не ошибаются для основной частоты (это может не показаться проблемой в вашем приложении, поскольку вы просто ищете изменение высоты тона, но я рекомендую делать это в любом случае по причинам, которые слишком сложны для перехода сюда).

  • введите сигнал, используя правильную функцию окна. Чтобы получить наиболее отзывчивый результат, вы должны перекрывать окна, которые я не делаю в своем примере кода.

  • Выполните БПФ по данным в каждом окне и вычислите частоту, используя индекс максимального абсолютного пикового значения.

Помните о своем приложении, где вы, вероятно, хотите точно и быстро определить изменение высоты тона, метод FFT, который я описываю, может оказаться недостаточным. У вас есть два варианта:

  • Существуют методы повышения специфичности отслеживания тангажа с использованием информации о фазе, а не только абсолютного пика.

  • Используйте метод временной области, основанный на автокорреляции. Инь - отличный выбор. (Google для "отслеживания высоты инь" )

Ответ 4

Вот ссылка на упомянутый код. Там также есть и другой полезный код.

https://github.com/gast-lib/gast-lib/blob/master/library/src/root/gast/audio/processing/ZeroCrossing.java

Здесь сделка с ZeroCrossings:

Неточно определять частоту, основанную на записанном аудио на Android. Тем не менее, по-прежнему полезно придать вашему приложению общий смысл, что звук, который он слышит, - это постоянный тон пения, а не только шум.

Код здесь, кажется, работает достаточно хорошо для определения частоты, (если вы можете перевести его с С# на java) http://code.google.com/p/yaalp/