我正在尝试使用音频记录类而不是 getMaxAmplitude() 函数开发一个 android 应用程序(声音计)。
我按照此链接进行操作:
我对这段代码有几个问题:
- calculatePowerDb() 函数中的功率是如何计算的?为什么我们做样本的平方和?换句话说,这个等式“power = (sqsum - sum * sum / samples) / samples”代表什么?
- 是输出值“return Math.log10(power) * 10f + FUDGE;” 两个功率(功率电平/参考功率)之间的区别是什么?
其实这个函数我看不懂:
public final static double calculatePowerDb(short[] sdata, int off, int samples){
// Calculate the sum of the values, and the sum of the squared values.
// We need longs to avoid running out of bits.
double sum = 0;
double sqsum = 0;
for (int i = 0; i < samples; i++) {
final long v = sdata[off + i];
sum += v; // Ok until here I understand
sqsum += v * v; //why this??
}
double power = (sqsum - sum * sum / samples) / samples;//what's this equation?
// Scale to the range 0 - 1.
power /= MAX_16_BIT * MAX_16_BIT;
// Convert to dB, with 0 being max power. Add a fudge factor to make
// a "real" fully saturated input come to 0 dB.
return Math.log10(power) * 10f + FUDGE; //the value is at decibel?
//if it is, is it a db(a) value,
//a power level value
//or a pressure level value ?
}
此代码返回负值(希望声功率)并在对设备进行一些校准后正常工作(添加/提取比率)
现在,我想了解这段代码的某些部分(上面有评论)。
感谢您的回复和所有可以完成的细节!