重新缩放对数 dB 值刻度

Rescale logarithmic dB value scale

我目前正在实施峰值计,需要重新调整对数 dB 值。 搜索现有函数我发现了这个:

它几乎可以满足我的需要。 我不了解这些函数的数学背景。

希望有人能解释一下。

function sigLog(n) {
    return Math.log(Math.abs(n) + 1) / Math.log(10) * sig(n);
}

function sig(n) {
    return n == 0 ? 0 : Math.abs(n) / n;
}


function sigExp(n) {
    return (Math.pow(10, Math.abs(n)) - 1) * sig(n);
}

首先,logarithmic scale 只是其中一种可能的数值尺度,线性只是另一种。例如,摄氏或华氏温标。您可能对 "Celsius" 或 "Fahrenheit" 一无所知,但您可以简单地使用公式:

[°C] = ([°F] - 32) × 5/9  
[°F] = [°C] × 9/5 + 32

... 并且什么都别想(因为这些尺度是严格定义的)

至于对数和线性标度,您应该考虑一下,因为您应该知道您当前使用的是哪种标度:例如,您有一些 "logarithmic" 值,但限制是多少你的目标线性比例?从 0 到 32768,或者可能是从 0 到 1?此外,标准使用的对数底数是 10,但也可以是另一个。

我用来将对数音量参数转换为线性比系数(从"log"到[0, 1]线性比例),在c++中:

float db_to_linear_ratio(float db_val)
{
    return pow(10.0, db_val/10.0);    
}

See: Why is a logarithmic scale used to measure sound?

编辑。至于峰值表,我从未见过真正的线性刻度。在声音编辑器中,峰值表仅以统一的比例显示对数值(-72、-30、-1、0、...):

因此,我看到了一个解决方案,不将 dB 值转换为线性标度,而是以统一的标度显示它们