评估音频能量,音频PCM数据通过RMS计算出 dB值
下面使用 16bit位深 的PCM数据计算dB值
#define EPSILON 1e-6
const int kMinLevel = 127;
const double kMaxSquaredLevel = 32768.0 * 32768.0;
u32 RMS(s16* pBuf, u32 dwDataLen)
{
if (pBuf == NULL || dwDataLen == 0)
{
return kMinLevel;
}
u32 length = dwDataLen;
double sum_square = 0.0;
s16* data = (s16 *)pBuf;
for (int index = 0; index < length; ++index)
{
double data_d = static_cast<double>(data[index]);
sum_square += data_d * data_d;
}
// Normalize by the max level.
double rms = sum_square / (length * kMaxSquaredLevel);
//if (rms > -EPSILON && rms < EPSILON)
if (rms <= 0.0)
{
return kMinLevel;
}
// 20log_10(x^0.5) = 10log_10(x)
rms = 10 * log10(rms);
if (rms > 0)
rms = 0;
else if (rms < -kMinLevel)
rms = -kMinLevel;
rms = -rms;
return (u32)(rms+0.5);
}