我正在尝试使用音频记录类而不是getMaxAmplitude()函数开发一个Android应用程序(声音计)。
我按照这个链接去做了:
Is there any Sound filtering library in android
我对此代码有几个问题:
事实上,我不明白这个功能:
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 ?
}
此代码返回负值(希望声功率)并在设备上进行一些校准后工作正常(加/撤比率)
现在,我想了解这段代码的某些部分(上面已经评论过)。
感谢您的回复和所有可以做的细节!
答案 0 :(得分:0)
如果您的参考功率为 MAX_16_BIT * MAX_16_BIT ,那么当您有信号功率时,返回值只是分贝的标准定义。请在此处查看维基页面的分贝:{{3 }}
您可能还想查看: http://en.wikipedia.org/wiki/Decibel