规范化音频波形代码实现(峰值,RMS)
Posted
技术标签:
【中文标题】规范化音频波形代码实现(峰值,RMS)【英文标题】:Normalizing audio waveforms code implementation (Peak, RMS) 【发布时间】:2017-09-24 14:11:08 【问题描述】: 我有一些音频数据(浮点数组),我用它来绘制一个简单的 波形。 绘制时,波形不会在边缘达到最大值。 没问题 - 数据只需要标准化。我迭代一次以找到最大值,然后再次迭代将每个除以最大值。再次绘制,一切看起来都很棒! 但是等待具有响亮介绍或响亮爆炸的视频会导致波形的其余部分仍然很小。 经过一些研究,我遇到了应该解决这个问题的 RMS。我遍历样本并计算 RMS,然后再次将每个样本除以 RMS 值。这会导致相当大的“剪辑”: 解决此问题的最佳方法是什么? 直观地说,我可能需要根据移动窗口(而不是整个集合)计算局部最大值或平均值,但我并不完全确定。帮忙? 注意:波形仅用于视觉目的(音频不会播放给用户)。【问题讨论】:
【参考方案1】:您可以转置它(有效地使 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 值较高,则应需要较低的预增益常数。确切地说,这种功能关系会是什么样子,我不知道,最好只是尝试一些事情。以上是关于规范化音频波形代码实现(峰值,RMS)的主要内容,如果未能解决你的问题,请参考以下文章