需要峰值限制/音频压缩公式

信息处理 噪音 动态范围压缩
2022-01-13 15:58:25

我正在寻找一种有效压缩音频波形以限制峰值的公式。这不是一个“自动音量控制”应用程序,可以控制放大器增益以保持音量水平,而是我想限制(“软”截断)单个峰值。(我知道这会引入谐波,但我正在尝试分析数据,而不是听它。)

到目前为止,我的(非常粗略的)公式是:

factor = (10 * average / level) + exp(-sqrt(0.1 * level / average))

其中level是瞬时声级,average是历史平均声级,factor是用于产生“调整后”级的乘数(因子乘以level)。

此外,该乘数仅在其计算到的值小于 1 时才应用。否则,水平保持不变。

目的是将调整后的水平限制在历史平均水平的某个倍数(使用此公式约为 15 倍)。这个公式有点像我需要的,但随着数字变大,会出现“下降”。也就是说,调整后的水平(即因子乘以水平)随着未调整水平的增加而增加到一个点,但随后实际上开始变小,而不是渐近。(事实上​​,添加第一个因素主要是为了防止公式以极高的值归零。)

(想要以这种方式限制值的原因主要是瞬态噪声不会严重破坏声级的运行平均值。但是当您分析打鼾时,“瞬态噪声”非常重要,所以我可以简单地压制它.)

那么,任何人都可以提出更好的建议吗?(似乎渐近行为在你不想要的时候很容易产生,但在你想要的时候很难产生。)

1个回答

这里有两个问题:如何获得对电平的可靠估计,以及如何压缩数据。

  • 对原始(非峰值限制)数据(如中位数或分位数)使用稳健的统计数据,而不是运行平均值,以使您的“典型水平”检测对异常值具有稳健性。
  • k×tanh(xk)很好用C压缩公式,这实际上是某些音频电路中发生的事情(使用 OTA)。要获得保留原始信号动态并仅去除瞬变的自适应压缩,请让 k 跟踪平滑的“平均”电平。

例子

  • 蓝色:原始信号
  • 绿色:作为“典型水平”检测的滑动窗口上绝对值的 2 x 中值
  • 红色:tanh 压缩(上面给出的公式,其中 k 等于以绿色绘制的水平)