Audio 规范化音频波形代码实现(峰值、RMS) 我有一些音频数据(浮动数组),我用它来绘制一个简单的 波形 绘制时,波形不会在边缘达到最大值 没问题-数据只需要标准化。我迭代一次以找到最大值,然后再迭代一次,将每个值除以最大值。再次绘制,一切看起来都很棒 但是,如果视频中有一个响亮的介绍,或者是巨大的爆炸声,则会导致波形的其余部分仍然很小 经过一些研究,我发现RMS应该解决这个问题。我遍历样本并计算RMS,然后再将每个样本除以RMS值。这将导致相当大的“剪辑”:

Audio 规范化音频波形代码实现(峰值、RMS) 我有一些音频数据(浮动数组),我用它来绘制一个简单的 波形 绘制时,波形不会在边缘达到最大值 没问题-数据只需要标准化。我迭代一次以找到最大值,然后再迭代一次,将每个值除以最大值。再次绘制,一切看起来都很棒 但是,如果视频中有一个响亮的介绍,或者是巨大的爆炸声,则会导致波形的其余部分仍然很小 经过一些研究,我发现RMS应该解决这个问题。我遍历样本并计算RMS,然后再将每个样本除以RMS值。这将导致相当大的“剪辑”:,audio,signal-processing,waveform,Audio,Signal Processing,Waveform,解决这个问题的最佳方法是什么 直觉上,我可能需要根据一个移动窗口(而不是整个集合)计算一个局部最大值或平均值,但我不能完全确定。帮忙 注意:波形仅用于视觉目的(音频不会播放给用户) 您可以将其转置(有效地使y轴非线性,或者您可以将其视为一种形式) 假设信号在范围[-1,1]内 一个流行的快速简单的解决方案是简单地应用(tanh)。这将通过更大程度地惩罚更高的值,将值限制在[-1,1]。如果在应用tanh之前放大信号,效果会更明显 另一种选择是对数变换。当信号改变时,必须进行一些预处理 如果r是一

  • 解决这个问题的最佳方法是什么
  • 直觉上,我可能需要根据一个移动窗口(而不是整个集合)计算一个局部最大值或平均值,但我不能完全确定。帮忙
  • 注意:波形仅用于视觉目的(音频不会播放给用户)
您可以将其转置(有效地使y轴非线性,或者您可以将其视为一种形式)

假设信号在范围[-1,1]内

一个流行的快速简单的解决方案是简单地应用(tanh)。这将通过更大程度地惩罚更高的值,将值限制在[-1,1]。如果在应用tanh之前放大信号,效果会更明显

另一种选择是对数变换。当信号改变时,必须进行一些预处理

如果
r
是一系列样本值,那么一种方法可以是这样的:

r.log1p <- log2(1.1 * (abs(r) + 1)) * sign(r)

r.log1p这太棒了,工作得非常完美。关于如何为给定的数据集确定一个合适的放大“常数”有什么想法吗?我不太确定我该怎么做来确定它。一种方法可能是使用您已经获得的RMS值,或滚动RMS的最小值。假设信号已标准化,如果RMS值较高,则需要较低的预增益常数。我不知道这种功能关系到底会是什么样子,最好的办法可能是尝试一些东西。