Audition RMS计算原理解析

分贝(deci-Bel, dB)是语音中一个比较常见的概念,经常听别人说声音多少dB,但是有时候会发现,dB一会儿是正的一会儿是负的,让人一头雾水,摸不着头脑,我们在震惊!这个声音25岁以上听不到这篇文章中讲过几种dB的区别,正的dB用分贝仪测量,负的dB用音频软件(如Audition)查看,那么Audition等音频软件展示的dB是如何计算出来的呢?我们今天就介绍下这个简单的问题。

音频软件中查看到的dB其实是dBFS,其中FS是Full Scale的缩写,即全刻度。dBFS的基准并不是最小的或者是中间的某一个值,而是最大的那个值。即0dBFS对应数字设备的最大值。对于常用的16位采样的语音样本,dBFS可以表示为:

Audition RMS计算原理解析

容易得到16位音频的声音范围为0~-96dBFS。我们常用的Audition就采用的是dBFS作为声音大小的单位。有了以上公式我们就可以计算音频对应的RMS了。首先生成一个如文章封面所示的音频,其频率为1kHz,采样率为8kHz,采样位宽为16bit的正弦波,并限定其幅值为-6dB。它在Audition中振幅统计如下所示:

Audition RMS计算原理解析

我们首先看峰值振幅怎么计算的,最大采样值为16423,采样位宽为16bit,那么最大值为32767,此时有:

Audition RMS计算原理解析

近似等于-6dB。继续往下看会发现一个问题,图中的RMS振幅都是-9.04dB,这个是怎么计算的呢。talk is cheap, show you my code。

    float kMaxSquaredLevel = 32767 * 32767;
    while(fread(input, FRAME_LEN, sizeof(short), in))
    {
     float sum = 0.0f;
     for(int i=0; i<FRAME_LEN; i++)
     {
      sum += input[i] * input[i];
     }
     sum = sum / FRAME_LEN;

     float rms = sum/kMaxSquaredLevel;
     float rms_db = 10 * log10(rms);
     printf("current rms = %.4f\n", rms_db);
    }

上面这段代码计算结果如下,可以发现和Audition计算结果基本接近。

Audition RMS计算原理解析

但是如果你用其他音频软件可能查看到的结果与Audition不同,比如我用oceanaudio查看的RMS结果是-6dB,这是为什么呢?

Audition RMS计算原理解析

这是因为Audition计算RMS时会将dB水平与全刻度的正弦波或者方波相对应,不同对应方式有一些偏差,如下所示。

Audition RMS计算原理解析

同样的音频我们把Audition中RMS设置改为0dB = FS正弦波

Audition RMS计算原理解析

对同样的音频进行振幅统计,此时其结果为-6dB,与-9.01dB相差刚好3.01dB。

Audition RMS计算原理解析

参考文献:

[1]. https://chromium.googlesource.com/external/webrtc/trunk/webrtc/+/f54860e9ef0b68e182a01edc994626d21961bc4b/modules/audio_processing/rms_level.cc

[2]. https://helpx.adobe.com/cn/audition/using/analyzing-phase-frequency-amplitude.html

作者:Ryuk
来源:语音算法组
原文:https://mp.weixin.qq.com/s/OZ1immREHEYqLyLjRRvWqA

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论