Рассчитать децибелы - PullRequest
21 голосов
/ 11 ноября 2010

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

Вот моя попытка вычислить децибелы по выборке:

        double peak = 0;

        for (var i = 0; i < _buffer.Length; i = i + 2)
        {
            var sample = BitConverter.ToInt16(_buffer, i);
            if (sample > peak)
                peak = sample;
            else if (sample < -peak)
                peak = -sample;
        }

        var decibel = (20 * Math.Log10(peak/32768));

Если я выведу значение децибела на экран, я смогу увидеть, как значения становятся выше, чем громче, и ниже, когда я говорю мягче. Тем не менее, это всегда колеблется около -40, когда я абсолютно тихо ... Я бы предположил, что это будет -90. Я должен иметь неправильный расчет в блоке выше ?? из того, что я читал на некоторых сайтах, -40 эквивалентно "мягкому разговору" ... однако, это совершенно тихо.

Кроме того, если я выключу свой микрофон, он сразу перейдет к -90.

Я делаю это неправильно?

Ответы [ 3 ]

31 голосов
/ 11 ноября 2010

При измерении уровня звукового сигнала вы должны рассчитать дБ из значения RMS. В вашем примере вы смотрите на абсолютный пиковый уровень. Одно (пиковое) значение выборки определяет значение в дБ, даже если все остальные выборки равны 0.

попробуйте это:

double sum = 0;
for (var i = 0; i < _buffer.length; i = i + 2)
{
    double sample = BitConverter.ToInt16(_buffer, i) / 32768.0;
    sum += (sample * sample);
}
double rms = Math.Sqrt(sum / (_buffer.length / 2));
var decibel = 20 * Math.Log10(rms);

Для «мгновенных» уровней в дБ вы обычно рассчитываете среднеквадратичное значение за отрезок 20–50 мс. Обратите внимание, что рассчитанное значение дБ относительно полной шкалы. Для звука значение дБ должно быть связано с 20 uPa, и вам нужно будет откалибровать ваш сигнал, чтобы найти правильное преобразование из цифровых значений в значения давления.

5 голосов
/ 28 сентября 2012

Я ценю пост Хана и написал подпрограмму, которая может рассчитывать децибелы в 8- и 16-битных аудиоформатах, используя несколько каналов на его примере.

3 голосов
/ 11 ноября 2010

Я думаю, что Янн означает, что децибелы - это относительная шкала. Если вы пытаетесь измерить фактический уровень звукового давления или уровень звукового давления, вам необходимо выполнить калибровку. То, что вы измеряете, это dBFS (децибелы в натуральную величину, я думаю). Вы измеряете, на сколько децибел тише сигнал, чем самый громкий из возможных сигналов, которые может представлять система («полномасштабный» сигнал или 32768 для этих 16-битных выборок). Вот почему все значения отрицательны.

...