Web Audio Api使用Decibels

Mik*_*ike 11 audio html5 html5-audio web-audio-api

我想了解如何在Web Audio API中使用分贝

这里我有一个连接到增益节点的音频缓冲区

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

var gainNode=context.createGain();

mybuffer.connect(gainNode);
gainNode.connect(context.destination);
Run Code Online (Sandbox Code Playgroud)

增益音量是从0(静音)到n的范围,其中1是默认音量,但据我所知,音频通常与这样的音域无关,音量以分贝(Db)为单位,操作也以Db为单位.

我已经在这个答案中读到了一些有趣的东西,但它完全符合我的需求: 是否有办法从音频文件中获取分贝级别并将该信息转换为json数组?

我想知道如何确定音频节点的分贝,如何使用分贝编辑音量

cwi*_*lso 14

分贝是一个有趣的野兽.如http://en.wikipedia.org/wiki/Decibel所述,分贝本身并不是音量的衡量标准 - 它们是衡量收益或关注度的标准.分贝数是两个功率量的比率的10的对数的10倍.

可以从Web Audio API中的一个关键位置获得分贝 - RealtimeAnalyser的getFloatFrequencyData以分贝为单位返回每个频段的衰减浮点数组.它在技术上不是音量 - 但它是从统一衰减(1),这是在全音量(-1到1)的频率中的正弦波.

当然,增益控制通常以分贝表示,因为它们是比率的度量 - 在统一与音量旋钮设置的任何值之间.将统一性(0 dB,增益= 1)视为"与扬声器一样响亮".

要以分贝表示增益,请记住增益为1(无衰减,无增益)等于0分贝 - 因为10 ^ 0 = 1.(实际上 - 这是因为10 ^(0/10)= 1.显然,为零除以任何东西仍然为零 - 但请记住,这些是DECI-bels,其中有十分之一.)前面提到的维基百科文章很好地解释了这一点.

要在两者之间进行转换 - 例如,在你有分贝时设置增益值,并从gain.value获得分贝增益 - 你只需要使用公式

decibel_level = 20 * log10( gain.value );
Run Code Online (Sandbox Code Playgroud)

又名

gain.value = Math.pow(10, (decibel_level / 20));
Run Code Online (Sandbox Code Playgroud)

请注意,基本10日志在Javascript中稍微复杂一些,因为只能访问自然对数,而不是基数10对数 - 但是你可以通过

function log10(x) {
    return Math.log(x)/Math.LN10;
}
Run Code Online (Sandbox Code Playgroud)

(有一个Math.log10()方法,但它是实验性的,并未在所有浏览器中实现.)