Как проверить алгоритм среднеквадратичного значения уровня звука

Мое приложение. вычисляет уровень шума и пиковую частоту входного звука. Я использовал БПФ, чтобы получить массив буферов shorts[], и это код: bufferSize = 1024, sampleRate = 44100

 int bufferSize = AudioRecord.getMinBufferSize(sapleRate,
                channelConfiguration, audioEncoding);
        AudioRecord audioRecord = new AudioRecord(
                MediaRecorder.AudioSource.DEFAULT, sapleRate,
                channelConfiguration, audioEncoding, bufferSize);

и это преобразование кода:

short[] buffer = new short[blockSize];
        try {
            audioRecord.startRecording();
        } catch (IllegalStateException e) {
            Log.e("Recording failed", e.toString());
        }
        while (started) {
            int bufferReadResult = audioRecord.read(buffer, 0, blockSize);

            /*
             * Noise level meter begins here
             */
            // Compute the RMS value. (Note that this does not remove DC).
            double rms = 0;
            for (int i = 0; i < buffer.length; i++) {
                rms += buffer[i] * buffer[i];
            }
            rms = Math.sqrt(rms / buffer.length);
            mAlpha = 0.9;   mGain = 0.0044;
            /*Compute a smoothed version for less flickering of the
            // display.*/
            mRmsSmoothed = mRmsSmoothed * mAlpha + (1 - mAlpha) * rms;
            double rmsdB = 20.0 * Math.log10(mGain * mRmsSmoothed);

Теперь я хочу знать, правильно ли работает этот алгоритм или я что-то упускаю? И я хочу знать, правильно ли это, и у меня есть звук в дБ, отображаемый на мобильном телефоне, как это проверить? Мне нужна любая помощь, пожалуйста, спасибо заранее :)


person Fareed    schedule 21.04.2013    source источник
comment
Я думаю, что будет сложно получить надежное абсолютное значение дБ из-за аппаратных различий в цифро-аналоговых преобразователях и микрофонах. Вам придется откалибровать его на источник звука известной громкости. Кроме того, почему вы умножаете log10 на коэффициент 20.0? Разве это не должно быть 10 (потому что это _deci_bel)? Кроме того, возможно, вам нужно применить усиление до расчета среднеквадратичного значения, а не после, в зависимости от того, что именно здесь означает «усиление».   -  person Thomas    schedule 21.04.2013
comment
@Thomas: 20*log10 в данном случае правильно, так как мы имеем дело с напряжением. 10*log10 используется для питания. (Обратите внимание, что вы также можете достичь того же результата более эффективно, если не берете sqrt величины, а затем используете 10*log10.)   -  person Paul R    schedule 21.04.2013


Ответы (1)


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

        double rmsdB = 20.0 * Math.log10(mGain * mRmsSmoothed);

to:

        double rmsdB = mGain * mRmsSmoothed >.0 0 ?
                           20.0 * Math.log10(mGain * mRmsSmoothed) :
                           -999.99;  // choose some appropriate large negative value here for case where you have no input signal
person Paul R    schedule 21.04.2013
comment
Большое спасибо за ваш ответ, у меня есть вопрос .. как я могу проверить результат? или как я могу откалибровать устройство? - person Fareed; 21.04.2013
comment
Вам нужен эталонный источник звука — он довольно дорогой, но вы можете арендовать его в компаниях по аренде электронного оборудования на неделю или месяц. - person Paul R; 21.04.2013
comment
Обратите внимание, что приведенный выше комментарий предполагает, что вы говорите об измерении дБ SPL через микрофонный вход. Если вы просто хотите, скажем, дБВ или дБм с линейного входа, это намного проще. - person Paul R; 21.04.2013
comment
Я хочу получать данные с микрофона телефона Android и отображать уровень звука в дБ на пиковой частоте. Легко ли проверить результат и как? Если вам нужен какой-либо код, я могу получить. - person Fareed; 21.04.2013
comment
Вы хотите дБ SPL? Собираетесь ли вы применить какое-либо взвешивание, например. Взвешивание ? - person Paul R; 21.04.2013
comment
Нет, я не буду этого делать, просто dBV .. как лучше всего это проверить? - person Fareed; 21.04.2013
comment
Для dBV вы просто вводите опорный сигнал, например, на -6 дБВ при 1 кГц, а затем определите постоянную калибровки на основе измеренного значения. Однако это работает только для аналогового входа — если это микрофонный вход, вам снова понадобится эталонный источник звука. - person Paul R; 22.04.2013
comment
В чем разница между измерением уровня звука и его измерением на пиковой частоте? - person Fareed; 22.04.2013
comment
Прочитайте ссылки, которые я дал выше, на dB SPL и A Weighting. Обычно уровни звука измеряются в широком диапазоне частот, и применяется взвешивающая кривая (чаще всего А-взвешивание). - person Paul R; 22.04.2013