重新定标对数dB值刻度

时间:2017-04-20 10:21:03

标签: audio signal-processing draw decibel

我目前正致力于实现峰值仪表,需要重新调整对数dB值。 搜索现有函数我发现了这个:How do I calculate logrithmic labels for a VU meter scale?

它几乎可以满足我的需要。 我没有得到这些函数的数学背景。

我希望有人能解释一下。

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);
}

1 个答案:

答案 0 :(得分:1)

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

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

... 并且不要考虑任何事情 (因为这些比例是严格定义的)。

至于对数&线性刻度,你应该考虑一下,因为你应该知道你当前使用的是哪种尺度:例如,你有一些"对数"价值,但目标线性标度的限制是什么?从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,...):

enter image description here

因此,我看到了一个解决方案,你不要将dB值转换为线性刻度,,只是以统一的比例显示它们