如何从 PCM 音频数据中获取音量级别?

信息处理 声音的 pcm
2022-02-15 10:40:24

我有一个从Web Audio API获得的解码 PCM 音频数据。

我想生成一个图表,表示随时间变化的音量水平(人类感知)。

volume|
 level|    ******
      |   *      *                           **
      |  *        *                         *  **
      |**          *      ***              *    
      |             ** * *   *            *
      +---------------*-*-----************------+--- time
      0                                        30s
          audio is             and quiet 
          loud here            here

这是我目前的方法,因为我有一个由 6 个通道组成的音频。

计算时间 T 的音量:

  1. 对于每个通道,计算 200ms 窗口的 RMS 值(在我的例子中为 44100 * 0.2 = 8820 个样本)。时间 T 将在窗口的中间(忽略边缘)。

  2. 计算在步骤 #1 中获得的 6 个值的平均值。

我得到这样的东西:

在此处输入图像描述

这是获取音量级别的合理方法吗?

将 RMS 转换为 dB(步骤 #3:计算20*Log_10(step #2))会产生更准确的图表吗?

什么是平滑/噪声消除的适当方法?

1个回答

您的问题背后有两个单独的问题:测量的持续时间和用于进行实际计量的算法。在音频术语中,用于感知电平测量的术语是响度测量

持续时间

您需要解决的第一个问题是用于测量的窗口的长度。通常,在音频中,它们可以分为三类:

  • 瞬时,它给出了一个随时间快速变化的响度级别(通常为几百毫秒)
  • 短期,几秒钟的时间
  • 集成,从头到尾给出整个音频文件的响度级别

窗口长度的实际值与规范不同,但此 EBU技术说明指定瞬时持续时间为 400 毫秒,短期持续时间为 3 秒,当然,文件的整个持续时间为集成。此外,如果您对测光进行实时跟踪,也会出现测量刷新率的问题,但您可能希望在您的情况下将其搁置一旁。最后,注意使用矩形窗口可能很有用,这与音频中的其他情况(例如短期傅立叶变换)相反。

响度计量

为了准确地表示感知水平,您需要比简单的 RMS 测量更复杂的东西。随着时间的推移,已经开发了各种方法,从评论中提到的简单A 加权(只是在计算 RMS 值之前进行过滤),到ITU-R BS 中指定的 LUFS(相对于满量程的响度单位)测量。 1770-4建议。后者是一种复杂的算法,但它提供了测量多声道音频文件中感知响度的方法,这就是你的情况。

关于你的最后一个问题:

  1. 将测量值转换为 dB 是生成更易于理解的图表的好主意,并且大多数实施响度测量的音频产品都会以 dB 为单位给出值。
  2. 窗口化方法已经具有固有的平滑性,因为给一个窗口一个值,比如说,400ms 时间已经是一种低通滤波。关于噪声去除,大多数现代算法都实现了选通,即一种去除给定水平以下的所有噪声的算法,这意味着音频文件中的长时间静音不会降低进行综合测量时的测量值。然后可以比较不同来源的响度(例如,在 2 小时的电影和 3 分钟的摇滚歌曲之间)。

最后,请注意(正如评论中强调的那样)该值将以相对于满量程的 dB 为单位给出,因此它不会反映实际音频源的电平,除非您知道数字校准- 用于初始记录的模拟转换器。


有很多音频插件可以实现计量,最新的插件之一是Fabfilter Pro-L您可能不需要如此复杂的测量,但最好了解一下行业中的做法、给出值的方式以及良好的响度曲线是什么样的。

您可以在网络上找到更全面、更广泛的响度测量资源,尤其是在专业音频制造商的网站上,例如TC ElectronicWaves