这里的音频菜鸟和数学挑战。我正在使用 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 中,它会"神奇地"给你答案。 看看这个