【问题标题】:Web Audio Api working with Decibels使用分贝的 Web 音频 Api
【发布时间】:2014-05-01 12:29:18
【问题描述】:

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

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

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 也是。

我在这个答案中读到了一些有趣的东西,但远远不能满足我的需要: Is there a way get something like decibel levels from an audio file and transform that information into a json array?

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

【问题讨论】:

    标签: html audio html5-audio web-audio-api


    【解决方案1】:

    分贝是一种有趣的野兽。分贝本身并不是真正的音量度量 - 它们是增益或衰减的度量,如http://en.wikipedia.org/wiki/Decibel 中所述。分贝数是两个功率量之比的以 10 为底的对数的十倍。

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

    当然,增益控制通常以分贝表示,因为它们是一个比率的量度 - 单位与音量旋钮设置的任何值之间的比率。将单位(0 dB,增益 = 1)视为“扬声器发出的声音”。

    要以分贝表示增益,请记住增益为 1(无衰减,无增益)等于 0 分贝 - 因为 10^0 = 1。(实际上 - 因为 10 ^ (0/10) = 1。显然,零除以任何东西仍然是零 - 但请记住,这些是 DECI-bels,其中有 10 个因数。)前面提到的 Wikipedia 文章对此进行了深入的解释。

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

    decibel_level = 20 * log10( gain.value );
    

    又名

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

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

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

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

    【讨论】:

    • 非常感谢克里斯,这对我很有帮助。
    • 其实我觉得应该是Math.pow(10, dB / 20)(参见teropa.info/blog/2016/08/30/amplitude-and-loudness.html
    • 我不明白,那么哪个代码是正确的? gain.value = Math.pow(10, (decibel_level / 20));或 Math.pow(10, dB / 20) ?
    • 关于上面的评论。这两个公式都可以,但它们是相同的。之前的评论似乎是错误的。
    猜你喜欢
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多