获取函数的反函数,毫贝到百分比和百分比到毫巴

Get the inverse of a function, millibels to percentage & percentage to millibels

此处是音频菜鸟和数学挑战。我正在使用 DirectSound,它使用 -10000 到 0 的范围,将其转换为 0-100 的范围。 我发现这个函数 here 可以根据百分比获取毫贝:

    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 = 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,它就会 "magically" 给您答案。 Check this out