Web Audio Api работает с децибелами

Я хочу понять, как работать с децибелами в API веб-аудио.

Здесь у меня есть звуковой буфер, подключенный к коэффициенту усиления node

var mybuffer = context.createBufferSource());
mybuffer.buffer = buffer; //an audio buffer

var gainNode=context.createGain();

mybuffer.connect(gainNode);
gainNode.connect(context.destination);

Объём громкости - это диапазон от 0 (тихий) до n, где 1 - это уровень по умолчанию, но, как я знаю, обычно звук не связан с таким диапазоном, его объем измеряется в децибелах (Db), и операции выполняются в Db тоже.

Я прочитал что-то интересное в этом ответе, но это далеко не все для моих нужд: Есть ли способ получить что-то вроде уровней децибел из аудиофайла и преобразовать эту информацию в массив json?

Интересно, как определить децибел для аудио Node, как отредактировать том, используя децибелы

Ответ 1

Децибелы - интересный зверь. Децибелы на самом деле не являются мерой объема, само по себе - они являются показателем усиления или внимания, как описано в http://en.wikipedia.org/wiki/Decibel. Количество децибел в десять раз больше логарифма до основания 10 от отношения двух величин мощности.

Вы можете получить децибелы из одного критического места в API веб-аудио - RealtimeAnalyser getFloatFrequencyData возвращает массив с плавающей точкой затухания на полосу частот в децибелах. Это не технически объем, но это затухание из единицы (1), которая была бы синусоидальной волной на этой частоте при полном объеме (от -1 до 1).

Элементы управления усилением, конечно, обычно выражаются в децибелах, потому что они являются мерой отношения - между единицей и любым вашим регулятором громкости. Подумайте о единстве (0 дБ, коэффициент усиления = 1) как "громкий, как ваши динамики будут идти".

Чтобы выразить усиление в децибелах, помните, что коэффициент усиления 1 (без ослабления, без усиления) будет равен 0 децибелам - потому что 10 ^ 0 = 1. (Фактически - это потому, что 10 ^ (0/10) = 1. Очевидно, что нуль, деленный на что-либо, все равно равен нулю, но помните, что это DECI-bels, там есть десять факторов.) В вышеупомянутой статье Википедии это объясняется с большой долей.

Чтобы преобразовать между двумя - например, установить значение коэффициента усиления.Если у вас есть децибелы и получить коэффициент децибела от gain.value - вам просто нужно использовать формулу

decibel_level = 20 * log10( gain.value );

ака

gain.value = Math.pow(10, (decibel_level / 20));

Обратите внимание, что база 10 log немного сложнее в Javascript из-за доступа только к натуральному логарифму, а не к логарифму базы 10, но вы можете получить это через

function log10(x) {
    return Math.log(x)/Math.LN10;
}

(Там есть метод Math.log10(), но он экспериментальный и не реализован во всех браузерах.)