Чтение в WAV-файл и расчет RMS - PullRequest
0 голосов
/ 22 марта 2019

Итак, я пытаюсь протестировать некоторый код, который анализирует объем некоторых данных PCM.Я получаю некоторые странные измерения объема, которые не имеют смысла с данными, которые я получаю из Audacity.Кажется, мои измерения повсюду.

Я не уверен, что моя ошибка связана с тем, как я читаю данные WAV, или с тем, как я вычисляю объем.

Итак, вот где я читаю данные в байтах и ​​преобразую их в шорты, так как это 16-битная PCM.

        InputStream pcmStream = this.getClass().getClassLoader().getResourceAsStream("Test-16Bit-PCM.wav");
        ArrayList<Byte> bytes = new ArrayList<>();
        int b = pcmStream.read();
        while(b != -1)
        {
            bytes.add((byte)b);
            b = pcmStream.read();
       }

       // First 44 bytes of WAV file are file info, we already know PCM properties since we recorded test audio
        byte [] bytesArray = new byte[bytes.size()-44];
        for(int i = 44; i < bytes.size(); i++)
        {
            bytesArray[i-44] = bytes.get(i);
        }
        bytes = null;
        pcmStream = null;
        short [] pcm = new short[bytesArray.length/2];
        ByteBuffer bb = ByteBuffer.wrap(bytesArray).asShortBuffer().get(pcm);
        bb.order(ByteOrder.LITTLE_ENDIAN);
        bb.asShortBuffer().get(pcm);
        bytesArray = null;

То, что short [] затем передается непосредственно в мой анализатор, я затем разделяюданные с шагом 0,1 секунды и усредняют громкость на каждом шаге.

Здесь я рассчитываю среднеквадратичное значение и дБ

        double sumOfSamples = 0;
        double numOfSamples = settings.shortsPerTimeStep();
        for(int i = start; i < start+settings.shortsPerTimeStep(); i++)
        {
           sumOfSamples = originalPcm[i]*originalPcm[i];
        }
        double rms = Math.sqrt(sumOfSamples/numOfSamples);
        // Convert to decibels
        calculatedVolume = 20*Math.log10(rms/20);

Звук, который я читаю, был записан при 44100 MONO исохранено как WAV 16 Подписано PCM в Audacity.Не уверен, что я делаю неправильно.

Любая помощь будет оценена!Спасибо

РЕДАКТИРОВАТЬ: обнаружил, что я неправильно читал данные WAV.Я исправил это, добавив endianian endianness.Однако я все еще не понимаю, как рассчитать объем.Значения лучше, но все еще трудно расшифровать, и я не уверен, в каких единицах измерения находится моя RMS и в каких единицах должно быть эталонное значение.

1 Ответ

1 голос
/ 23 марта 2019

В ваших вычислениях есть ошибка - sumOfSamples = originalPcm[i]*originalPcm[i]; должно быть на sumOfSamples += originalPcm[i]*originalPcm[i];, поэтому вы будете накапливать значения.
Что касается контрольного значения - почему вы используете 20? Обычно вы используете наименьшее возможное значение (в данном случае 1), или вы можете использовать максимальное значение (sqrt (32768)), и все ваши значения будут ниже этого значения, поэтому вы получите отрицательные значения в дБ. .

...