Ответ 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(), но он экспериментальный и не реализован во всех браузерах.)