我目前正致力于实现峰值仪表,需要重新调整对数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);
}
答案 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,...):
因此,我看到了一个解决方案,你不要将dB值转换为线性刻度,,只是以统一的比例显示它们。