• Audition RMS计算原理解析


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

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

    图片

    容易得到16位音频的声音范围为0~-96dBFS。我们常用的Audition就采用的是dBFS作为声音大小的单位。

    有了以上公式我们就可以计算音频对应的RMS了。首先生成一个如文章封面所示的音频,其频率为1kHz,采样率为8kHz,采样位宽为16bit的正弦波,并限定其幅值为-6dB。它在Audition中振幅统计如下所示:

    图片

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

    图片

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

    1. float kMaxSquaredLevel = 32767 * 32767;
    2. while(fread(input, FRAME_LEN, sizeof(short), in))
    3. {
    4. float sum = 0.0f;
    5. for(int i=0; i<FRAME_LEN; i++)
    6. {
    7. sum += input[i] * input[i];
    8. }
    9. sum = sum / FRAME_LEN;
    10. float rms = sum/kMaxSquaredLevel;
    11. float rms_db = 10 * log10(rms);
    12. printf("current rms = %.4f\n", rms_db);
    13. }

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

    图片

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

    图片

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

    图片

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

    图片

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

    图片

    参考文献:

    [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

  • 相关阅读:
    kube-apiserver限流机制原理
    游戏史上五个定价最高的量产型游戏机
    静态IP怎么设置网速快?
    《C和指针》(5)操作符和表达式
    基于SpringBoot设计模式之结构型设计模式·适配器模式
    LabVIEW中比较两个VI
    使用解构赋值简化axios返回对象属性元素的提取
    linux驱动之I2C
    4面全过之后还有交叉面,阿里新零售Java岗面试也太“刺激”了
    [附源码]Python计算机毕业设计Django的专业技能认证系统
  • 原文地址:https://blog.csdn.net/weixin_48827824/article/details/132901308