Получите частоту от микрофона Android - PullRequest
0 голосов
/ 19 декабря 2018

Я знаю, что этот вопрос был задан, но на него нет четкого ответа.Итак, я нашел здесь пример: Анализ спектра БПФ Где я могу преобразовать свой массив двойников с классом БПФ

RealDoubleFFT transformer;
int blockSize= */2048;
short[] buffer = new short[blockSize];
double[] toTransform = new double[blockSize];
         bufferReadResult = audioRecord.read(buffer, 0, blockSize);

                            for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                                toTransform[i] = (double) buffer[i] / 32768.0; // signed 16 bit
                            }

                            transformer.ft(toTransform);

, так что теперь я не знаю, какполучить частоту

Я написал такой метод:

public static int calculateFFTFrequency(double[] audioData){
    float  sampleRate = 44100;
    int numSamples = audioData.length;
    double max = Double.MIN_VALUE;
    int index = 0;
    for (int i = 0; i< numSamples -1; i++){
        if (audioData[i] > max) {
            max = audioData[i];
            index = i;
        }
    }
    float freq = (sampleRate / (float) numSamples * (float) index) * 2F;
    return (int)freq;
}

Я пытаюсь реализовать формулу, но она не дает мне ничего хорошего - некоторые дикие числа

Iпопробовал также пройти ноль:

 public static int calculateFrequency(short [] audioData){

        int sampleRate = 44100;
        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;
    }

Но в методе обнуления, если я играю ноту "A" на пианино, она показывает мне 430 на мгновение (что близко к A), а затем начинает показывать какой-то дикийцифры, когда звук затухает - 800+, 1000+ и т. д.

Может кто-нибудь помочь мне получить более или менее актуальную частоту от микрофона?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

То, что вы слышите от пианино, это высота, а не только спектральная частота.Они не одно и то же.Пек - это психоакустический феномен, который больше зависит от периодичности, а не только от спектрального пика.Чистое БПФ сообщает о спектральных частотах, которые могут состоять из обертонов, гармоник и других артефактов, и могут включать или не включать основную частоту основного тона.

Так что вы можете использовать вместо БПФ:алгоритм обнаружения / оценки основного тона, который немного сложнее, чем просто выбор пиковой величины из БПФ.

0 голосов
/ 19 декабря 2018

Вы должны протестировать свое решение, используя сгенерированный поток, а не микрофон, а затем проверить, соответствует ли ожидаемая частота.Затем вы можете делать реальные тесты с микрофоном, вы должны проанализировать данные, собранные микрофоном самостоятельно в случае каких-либо проблем.В вашей среде могут быть не слышимые звуки, которые могут привести к странным результатам.Когда звук затухает, могут быть некоторые гармонические звуки, и эти гармоники могут стать более громкими, чем основной звук.При обработке звуков из реальной среды необходимо учитывать множество факторов.

...