获取函数的倒数,毫贝尔到百分比和百分比到毫贝尔



这里的音频菜鸟和数学挑战。我正在使用 DirectSound,它使用 -10000 到 0 的范围,将其转换为 0-100 的比例。我在这里找到了这个函数,以根据百分比获得毫贝尔:

    private int ConvertPercentageToMillibels(double value)
    {
        double attenuation = 1.0 / 1024.0 + value / 100.0 * 1023.0 / 1024.0;
        double db = 10 * Math.Log10(attenuation) / Math.Log10(2);
        return (int)(db * 100);
    }

我需要帮助获取此函数的反函数,基本上是为了获得基于毫贝尔的百分比。这是我到目前为止得到的,它不起作用:

    private double ConvertMillibelsToPercentage(int value)
    {
        double db = value / 100;
        double attenuation = Math.Pow(10, db) / 10 * Math.Pow(10, 2);
        double percentage = (1.0 * attenuation) - (1024.0 * 100.0 / 1023.0 * 1024.0);
        return percentage;
    }

你去吧!

private double ConvertMillibelsToPercentage(int value)
{
    double exponent = ((value / 1000.0) + 10);
    double numerator = 100.0 * (Math.Pow(2, exponent) - 1);
    return numerator / 1023.0;
}

由于在 int 和 double 之间出现明显的问题,答案会略有不同。

编辑:根据教如何钓鱼的要求,这是达成解决方案的第一个数学步骤。 我没有展示整个事情,因为我不想破坏所有的乐趣。 除非另有说明,否则所有日志函数都应被视为日志基数 10:

millibels = db*100; // Beginning to work backward
millibels = 10*Log(attenuation)*(1/Log(2))*1000; // Substituting for db
millibels = 1000*Log(attenuation)/Log(2); // Simplifying

设毫贝尔 = m。 然后:

m = 1000*Log(attenuation)/Log(2);

从这里你可以走两条路线,你可以使用日志的属性来查找:

m = 1000* Log_2(attenuation);// That is, log base 2 here
attenuation = 2^(m/1000);

或者,您可以忽略该特定属性并实现:

attenuation = 10^(m*Log(2)/1000);

尝试通过插入您知道的衰减值来从上述选项之一中计算出来:

attenuation = (1/1024)+(percentage/100)*(1023/1024);

然后求解百分比。 祝你好运!

PS 如果你遇到这样的事情,我强烈建议你去数学堆栈交换 - 那里有一些聪明的人喜欢解决数学问题。

或者,如果你特别懒惰,只是想要答案,你通常可以简单地将这些东西输入到 Wolfram Alpha 中,它会"神奇地"给你答案。 看看这个

最新更新