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