2017-09-24 179 views
3
  • 我有一些音频数据(浮点数组),我用它来绘制一个简单的 波形。
  • 绘制时,波形不会在边缘出现最大值。
  • 没问题 - 数据只需要标准化。我迭代一次找到最大值,然后再次迭代,再除以最大值。再画一次,一切都很棒!
  • 但是等待有一个大声的介绍或大爆炸的视频导致其余的波形仍然很小。
  • 经过一番研究,我遇到了应该解决这个问题的RMS。我遍历样本并计算RMS,并再次将每个样本除以RMS值。这导致相当大的 “裁剪”:

enter image description here正常化音频波形代码实现(峰值,有效值)

  • 什么是解决这个的最好方法是什么?
  • 直观地看,我可能需要基于移动窗口(而不是整个集合)来计算局部最大值或平均值,但我并不完全确定。帮帮我?
  • 注意:波形纯粹用于视觉目的(音频不会播放给用户)。

回答

2

你可以转置它(有效地使y轴非线性,或者你可以认为它是一种形式companding)。

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

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

另一种选择是对数变换。随着信号改变符号,一些预处理必须执行。

如果r是一个系列的样本值一种方法可能是这样的:

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

也就是说,每个值取其绝对值,增加一个,有一些小的常数相乘,取对数和然后最后乘以其相应的旧值的符号。

的影响可以是这样的: enter image description here

+0

这是辉煌和完美。关于如何确定给定数据集合适的放大“常数”的任何想法? –

+1

我不太确定我会做什么来确定。一种方法可能是使用已有的RMS值或滚动RMS的最小值。假设信号已经归一化,如果RMS值很高,则应该要求较低的预增益常数。准确地说,这种功能关系看起来如何,我不知道,最好的可能是尝试一些事情。 – AkselA