【发布时间】:2020-03-01 17:26:48
【问题描述】:
我正在尝试编写一个具有对数缩放的滑块来控制麦克风 RMS 阈值。
我已经编写了下面的函数,它可能很可怕(数学不是我的强项),但似乎确实做了我想要的对数缩放。但是,我现在需要在使用刻度的条形图中显示 RMS 电平,所以我需要反转这个函数。
const rmsLogarithmicScale = (value, max) => {
const log = ((100 - (Math.log((1 - value) * 100) / 4.605170185988092) * 100) / 100) * max;
return log === Infinity ? max : log;
};
console.log(rmsLogarithmicScale(0.5, 0.05)); // Result: 0.007525749891599539
console.log(rmsLogarithmicScale(0.5, 300)); // Result: 45.15449934959723
const rmsLogarithmicScaleInverse = (rms, max) => {
// I have literally no idea where to start...
}
rmsLogarithmicScaleInverse(0.007525749891599539, 0.05); // Result: 0.5
有没有好心的数学家可以帮我解决这个问题?
【问题讨论】:
-
要明确一点,您知道
* max部分在除法后完成,对吧?不是blah / (100 * max),而是(blah / 100) * max。话虽如此,不需要数学家,只要让Wolfram Alpha为你做。 -
我给了你链接,该链接从字面上解决了“映射回”的数学问题,因此该部分已排序。是否有 XY 问题是另一回事:最明显的问题当然是“你为什么要编写自己的代码?”因为在过去 25 年的 JS 和 5 年的 Node 中似乎没有人用 JS 编写过 DSP 包。
-
对数的反函数是对应的指数。
-
你应该先简化为
const log = -Math.log(1 - value) / Math.log(100) * max; -
@Bergi 感谢您的链接,我仍然不明智。我了解代码,并且几乎可以根据需要使用数学。我真的很难阅读方程式,这是我生活的祸根。看起来我可以使用您建议的简化版本并设法自己计算出逆向,所以我对此非常满意。感谢大家的帮助。
标签: javascript math logarithm