我正在尝试计算存储在缓冲区中的音轨的响度。缓冲区包含信号的PCM数据,我想通过使用均方根来获得“响度”。我假设我可以在时域中执行此操作,而不必切换到频域。这样做的伪代码是什么?

我是否只需采样一秒钟(音频[0]-音频[44099],音频[44099]-音频[88199]等。)并计算这些值的均方根值?因此,例如,我会这样做:

$$ RMS = \ sqrt {\ frac {\ text {audio} [0] ^ 2 + \ text {audio} [1] ^ 2 + \ text {audio} [2] ^ 2 ..... \ text {audio} [44099] ^ 2} {44100}} $$

每秒?

评论

上面的表达式中有一个缺少的括号-我自己添加了它,但显然编辑至少需要6个字符...

@PaulR-您可以添加<!-html注释->来解决字符限制,在极少数情况下,否则本来不错的帖子会有一个很小但非常重要的错误。这种需求很少发生:通常需要进行6个以上的改进。例如,当缺少括号时,通常最好在TeX中使用\ sqrt {}和\ frac {} {}结构。

@Kevin:感谢您的提示-以后我会使用您的HTML注释建议。

@PaulR-之前已经讨论过:限制是有意的,旨在防止不完整或毫无意义的编辑(请参阅此处的防御),但有反对者(请参阅此处的讨论)。

请注意,仅RMS并不能告诉您响度。极低或极高的声音的音量低于相同RMS值的3 kHz。 A加权滤波器将为您提供更准确的估计。 gist.github.com/148112

#1 楼

另一件事是,RMS值与感知的响度不是很好地相关。您可能需要考虑将其称为音量或音量。
有一种叫做等响度的轮廓,它可以量化耳朵对一种特定频率与另一种频率相比的敏感程度,请参阅Wikipedia文章。这些曲线取决于电平。
例如,此耳朵显示,耳朵对1kHz的声音与100Hz的声音相比非常敏感,如该图所示(横轴为频率,单位为Hz):



您可以做的相对简单的事情之一就是用相等的响度曲线倒置来过滤PCM数据。或者,您可以应用标准的A加权,请参阅Wikipedia加权过滤器文章。然后,您可以计算等响度加权滤波器输出的RMS值。

评论


$ \ begingroup $
我尚不清楚如何从quesitoner的代码转到此。问题的示例是对音频样本的平方求和。答案是要对频率应用滤波器,因此似乎“用倒置的等响度曲线滤波PCM数据”是不够的。您首先必须具有每个频率的值,然后您才能弄清楚如何正确应用曲线?但这是一个重大的步骤。
$ \ endgroup $
– gman
19-2-25在13:14

$ \ begingroup $
@gman的想法是使用滤波器对音频进行预处理,然后使用问题中的结果(RMS计算)。我不确定100%的意思。您不确定如何进行滤波或滤波器设计吗?
$ \ endgroup $
– niaren
19年2月27日在12:44