我有一堆不同的 WAV 格式的录音(所有不同的乐器和音高),我想将它们“标准化”,以便它们在播放时听起来大致相同。
我试过测量平均样本幅度(所有绝对值的总和除以样本数),但通过这种测量进行归一化效果不佳。我认为这种方法不起作用,因为它没有考虑声音的频率,而且我知道高频录音听起来比相同幅度的低频声音更响亮。
有谁知道测量声音响度的好方法?
均方根通常用于估计声音文件的响度。这是因为如果声音非常短,可能不会以这种方式感知非常响亮的声音。还要记住,功率随幅度的平方呈指数增长。
Hydrogen Audio 的音频极客对这些东西了解很多……查看他们的免费 Replay Gain软件。您可能根本不需要进行任何编程。
编辑:包括关于功率与幅度的评论反馈。
好吧,不是音频专家并添加到先前的评论中,您应该弄清楚您定义为“峰值功率的最短时间”,然后将波形转换为原始浮点并在一段时间内使用 RMS并不断地花大量的时间,找到MAX,在那里你就有了最高的峰值功率。
添加到 PeterAllenWebb 的回复中:
在计算 RMS 之前,您应该首先“居中”您的样本(考虑一个 5 分钟的 .wav,其中每个样本都具有最大 + 幅度)。最好的方法是使用亚音速的高通滤波器。
这仍然不会计算人类敏感的频率。为此,您可以使用 A 加权。有一个页面可以在线计算: http ://www.diracdelta.co.uk/science/source/a/w/aweighting/source.html
代码似乎在这里: http ://www.diracdelta.co.uk/science/source/a/w/aweighting/multicalc.js
重申其他人所说的,使用 RMS 值来估计声音通道的“响度”。
但是,如果您正在处理诸如弹拨或击鼓之类的脉冲声音,您会想要做一个滑动 RMS 值并只挑选出峰值 RMS 值。测量100毫秒的声音,滑动窗口,再次测量等,然后根据你找到的最大值进行归一化。
在做 RMS 之前一定要去掉任何 DC 值,A 加权会让它更像我们听到的。这是MATLAB/Octave和Python中的 A 加权代码。
我可能离这里很远,但是,如果你有波板,你可以加载多个文件并稍微弄乱卷,所以它们都是一样的。此外,如果文件的某些部分声音较大,您可以选择该部分并降低该部分的音量。
编辑:对不起,它不是真正的测量体积的“方法”,但如果你只需要让它们都一样,这应该可以正常工作。