如何计算VU表刻度的logrithmic标签?

时间:2015-06-02 13:31:14

标签: javascript html5 audio canvas html5-canvas

我使用画布编写仪表小部件,需要计算秤的标签值。没问题,除非我正在尝试重建VU表的刻度。我理解它是对数的,但是这种类型的仪表上的值不是10的幂。

请参阅:https://en.wikipedia.org/wiki/VU_meter

我给的函数给出了刻度的最小值和最大值。对于正常尺度,它也被赋予值之间的步长。例如,给定-20和30,步长为10,它将产生标签:

-20 -10 0 10 20 30

对于给定为-20和6的VU表,我需要生成标签:

-20 -10 -5 -3 0 3 6

并且,这些值之间的比例间距不同。

我不是要求实际的代码示例,而是要求如何最好地实现这一点的想法。

我应该编写函数,以便其中一个参数是标签列表,然后以对数标度绘制它们吗?这似乎不能正常工作,因为数字不会在适当的VU表的上图中看到正确的位置。

是否有一些特殊的公式只适用于不是简单日志功能的dB级别?

同样,我不是要求代码示例,只是为了帮助理解最佳使用方法。

谢谢!

1 个答案:

答案 0 :(得分:3)

我想你有一个像素到像素的功能。你需要写的是函数。

当你有反函数时,你只需将屏幕区域划分为N个相等的部分(图中你有6个区域)。一个区域的宽度为X像素。现在,您可以使用反函数来获取该像素位置的值。

这不是一个整数,它将是3.434或11.34之类的东西 - 你需要一个更漂亮的函数来产生最接近的“漂亮”数字(假设只是在十进制之后切掉部分)。

现在你取得漂亮的值并用原始函数计算它的像素位置。

一些代码:

function value2px(value, valueMin, valueMax, pxMin, pxMax) {
    var valueWidth = sigLog(valueMax) - sigLog(valueMin);
    var pixelWidth = pxMax - pxMin;
    var ratio = pixelWidth / valueWidth;

    return ratio * (sigLog(value) - sigLog(valueMin)) + pxMin;
}

function px2value(px, valueMin, valueMax, pxMin, pxMax) {
    var valueWidth = sigLog(valueMax) - sigLog(valueMin);
    var pixelWidth = pxMax - pxMin;
    var ratio = pixelWidth / valueWidth;

    return sigExp((px - pxMin) / ratio + sigLog(valueMin));
}

和演示: http://jsfiddle.net/ambcwoLg/1/