1

我正在尝试使用音频记录类而不是 getMaxAmplitude() 函数开发一个 android 应用程序(声音计)。

我按照此链接进行操作:

android中有没有声音过滤库

我对这段代码有几个问题:

  1. calculatePowerDb() 函数中的功率是如何计算的?为什么我们做样本的平方和?换句话说,这个等式“power = (sqsum - sum * sum / samples) / samples”代表什么?
  2. 是输出值“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 ?
   }

此代码返回负值(希望声功率)并在对设备进行一些校准后正常工作(添加/提取比率)

现在,我想了解这段代码的某些部分(上面有评论)。

感谢您的回复和所有可以完成的细节!

4

1 回答 1

1

功率值正在计算信号的方差并将其归一化为用于计算它的样本数。从本质上讲,它向您显示了最高记录样本值的强度与最低(或更准确地说)之间存在多少分布 - 它是对设备捕获的样本分布分布的度量。这是信号中功率的常用度量。

鉴于您的参考功率为MAX_16_BIT * MAX_16_BIT ,因此返回值只是分贝的标准定义,请在此处查看分贝的 wiki 页面:http ://en.wikipedia.org/wiki/Decibel

您可能还想查看: http ://en.wikipedia.org/wiki/Signal-to-noise_ratio

于 2014-05-20T10:22:38.847 回答