归一化音频波形代码实现(峰值、RMS)
Normalizing audio waveforms code implementation (Peak, RMS)
- 我有一些音频数据(浮点数组),我用它来绘制一个简单的
波形。
- 绘制时,波形不会在边缘达到最大值。
- 没问题 - 数据只需要标准化。我迭代一次以找到最大值,然后再次迭代将每个除以最大值。再次绘图,一切看起来都很棒!
- 但是等待有响亮开场或响亮爆炸声的视频会导致波形的其余部分仍然很小。
- 经过一些研究,我发现了应该解决这个问题的 RMS。我遍历样本并计算 RMS,然后再次将每个样本除以 RMS 值。这导致相当大的 "clipping":
- 解决此问题的最佳方法是什么?
- 直觉上,似乎我可能需要根据移动 window(而不是整个集合)计算局部最大值或平均值,但我不完全确定。帮忙?
- 注意:波形纯属视觉目的(音频不会回放给用户)。
您可以转置它(有效地使 y 轴非线性,或者您可以将其视为 companding 的一种形式)。
假设信号在[-1, 1]范围内。
一种流行的快速简单的解决方案是简单地应用 hyperbolic tangens function (tanh)。这将通过更多地惩罚更高的值来将值限制为 [-1, 1]。如果在应用 tanh 之前放大信号,效果会更明显。
另一种选择是对数变换。随着信号改变符号,必须执行一些预处理。
如果 r
是一系列样本值,一种方法可能是这样的:
r.log1p <- log2(1.1 * (abs(r) + 1)) * sign(r)
也就是说,对于每个取其绝对值的值,加一,乘以某个小常数,取对数,最后将其与其对应的旧值的符号相乘。
效果可以是这样的:
- 我有一些音频数据(浮点数组),我用它来绘制一个简单的 波形。
- 绘制时,波形不会在边缘达到最大值。
- 没问题 - 数据只需要标准化。我迭代一次以找到最大值,然后再次迭代将每个除以最大值。再次绘图,一切看起来都很棒!
- 但是等待有响亮开场或响亮爆炸声的视频会导致波形的其余部分仍然很小。
- 经过一些研究,我发现了应该解决这个问题的 RMS。我遍历样本并计算 RMS,然后再次将每个样本除以 RMS 值。这导致相当大的 "clipping":
- 解决此问题的最佳方法是什么?
- 直觉上,似乎我可能需要根据移动 window(而不是整个集合)计算局部最大值或平均值,但我不完全确定。帮忙?
- 注意:波形纯属视觉目的(音频不会回放给用户)。
您可以转置它(有效地使 y 轴非线性,或者您可以将其视为 companding 的一种形式)。
假设信号在[-1, 1]范围内。
一种流行的快速简单的解决方案是简单地应用 hyperbolic tangens function (tanh)。这将通过更多地惩罚更高的值来将值限制为 [-1, 1]。如果在应用 tanh 之前放大信号,效果会更明显。
另一种选择是对数变换。随着信号改变符号,必须执行一些预处理。
如果 r
是一系列样本值,一种方法可能是这样的:
r.log1p <- log2(1.1 * (abs(r) + 1)) * sign(r)
也就是说,对于每个取其绝对值的值,加一,乘以某个小常数,取对数,最后将其与其对应的旧值的符号相乘。
效果可以是这样的: