AudioContext:将音量增加 x 分贝

mis*_*nic 0 html javascript math audio audiocontext

我正在使用 AudioContext() 进行听力测试,我想知道如何将音量提高/降低 x dB。甚至有可能吗?

目前,我有一个 GainNode 连接到我的 AudioContext,它看起来(简而言之)如下:

var context = new AudioContext(), gainNode;
context.decodeAudioData(req.target.response, function(buffer) {
    gainNode = context.createGain();
    ...
}
Run Code Online (Sandbox Code Playgroud)

要更改音量,我这样做:

gainNode.gain.value = {-1 to 1}
Run Code Online (Sandbox Code Playgroud)

在这里,我没有机会准确定义 dB 值。还有其他方法吗?

我认为问题是,浏览器永远不知道扬声器发出的声音的确切音量,因此没有计算新的 dB 音量的基础。

确定当前 dB 值的一种方法是通过 2 个声音的差异,例如测试声音(白噪声)和语音数字。为了计算差异,我找到了公式:

20 * Math.log10(gainNoise / gainSpeech);
Run Code Online (Sandbox Code Playgroud)

然后我有一个基数,例如 -6 dB,当语音是 -0.6 并且噪音是 -0.3 时。但是如何将这个值提高一个特定的 dB 值?

示例:我将 -6 dB 提高 5 dB 至 -1 dB。如何重新计算语音/噪音?

jak*_*ket 5

增益通常是指信号幅度的线性增加或减少。例如,您可以通过乘以 2 将信号的幅度加倍,而无需考虑原始信号电平。同样,您可以通过乘以 0.5 将信号减半。在数字中,增益是通过将输入信号的每个样本乘以所需比率来应用的。增益同样适用于信号和噪声。

你的问题暗示增益的范围是 -1 到 1。我已经阅读了文档,但找不到任何证明是这种情况的证据。我怀疑它更像是 0 到 N。-1 的增益是无意义的,因为它只会产生反转信号的效果。0 到 1 的增益范围只会让您降低增益。

通常的做法是用 dB 来谈论增益。在比率增益和以 dB 为单位的增益之间有一个简单的转换。

dB = 20 * log10(ratio)
ratio = 10^(dB/20)
Run Code Online (Sandbox Code Playgroud)

要从以 dB 为单位的值设置增益,您只需应用转换为比率。

dBgain = 20;
gainNode.gain.value = 10^(dBgain/20);
Run Code Online (Sandbox Code Playgroud)