得到函数的倒数,毫米到百分比&百分比到毫贝尔

时间:2016-03-17 21:30:41

标签: c# directx directshow directsound

音频菜鸟在这里和数学挑战。我正在使用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;
    }

1 个答案:

答案 0 :(得分:2)

你走了!

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之间出现明显的问题,答案会略有不同。

编辑:根据教导如何捕鱼请求,这是实现解决方案的第一个数学步骤。我没有展示整件事,因为我不想破坏allll的乐趣。除非另有说明,否则所有日志功能都应视为Log base 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

让millibels = 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,它会“神奇地”给你答案。 Check this out