1 个稳定版本

使用旧 Rust 2015

1.0.0 2018年4月7日

#1501数据库接口

LGPL-2.1

115KB
511

README

Build status

这是一个 LADSPA 高质量噪声抑制插件。它可以通过任何启用 LADSPA 的音频处理应用程序使用。它能够从音频信号中移除几乎所有类型的连续噪声,包括蓝色、白色、粉红色和棕色噪声。

许可证

本插件版权ⓒ2011-2018 Jérôme M. Berger,并根据 GNU LGPLv2.1 的条款发布。您应该已经找到了附在此插件中的许可证副本,或者您可以在 此处 找到。

参数

插件公开以下参数

  • Reduction amount (dB) – 噪声减少的量。
  • Noise level (dB) – 噪声水平(见 噪声模型)。
  • Noise shape (dB/decade) – 每十倍的噪声形状(见 噪声模型)。
  • Filter length – 滤波长度。此参数会影响时间分辨率和频率分辨率之间的平衡。较小的值提供更好的时间分辨率,而较大的值提供更好的频率分辨率。此参数最好设置为 2 的幂。
  • Residual output – 如果启用,则滤波器效果将反转:不是移除噪声,而是滤波器将只保留噪声。这可以用来检查您是否没有移除与噪声一起的部分信号。
  • Automatic noise model – 如果启用,则从输入信号中估计 Noise levelNoise shape 参数。通过输入端口提供的参数值将被忽略。
  • Automatic reactivity – 自动噪声形状调整到输入噪声变化的速度。较小的值意味着滤波器更稳定但适应性较慢(在最极端的情况下,如果此值为 0,则滤波器将根据第一个窗口估计参数,并且如果噪声发生变化则不进行适应)。较大的值会使滤波器适应更快,这可能导致滤波器变化时的伪影。请注意,默认值 0.25 会得到一个非常稳定的滤波器,但仍能适应仅在几毫秒内(在 44kHz 时,滤波器长度为 4096 的 20ms 以下)的变化。
  • 快速模式 – 如果启用此功能,过滤器将只重叠两个窗口而不是四个。这会导致过滤器运行速度提高一倍,但可能会略微降低输出质量。

注意:自动噪声模型相当保守,往往低估噪声水平。当启用自动模型时,不要犹豫增加减少量(在这种情况下增加4dB是合理的)。

噪声模型

过滤器依赖于一个简单的噪声模型来决定信号的哪个部分是噪声,哪个部分是有效信号。噪声模型假定噪声在频率$f$处的电平为$l_n(f)$ dB,

$$l_n(f)=L-shape\times\log\left(\frac{f}{f_0}\right)$$

其中

  • $f_0$是一个任意固定到$F_s/100$的参考频率(对于44 kHz的采样频率,这导致$f_0=440,\text{Hz}$)。
  • $L$是频率$f_0$处的噪声电平(dB)。这可以从频谱图估计,使用大小等于滤波器长度两倍的Hann或Hanning窗口,并向上取整到下一个2的幂。
  • $shape$表示噪声形状(dB/decade)。它是每次频率乘以10时噪声电平降低的量。可以从频谱图中估计,通过查看100 Hz和1 kHz(或任何频率比为10的频率对)的噪声水平。

标准噪声形状

  • 蓝色噪声的电平随频率增加而增加,并使用$shape=-10,\text{dB/decade}$进行建模。请注意,蓝色噪声在音频处理中很少见。
  • 白噪声在所有频率上的电平都相同,并使用$shape=0,\text{dB/decade}$进行建模。
  • 粉红色噪声随着频率的增加而降低电平,并使用$shape=10,\text{dB/decade}$进行建模。
  • 棕色噪声比粉红色噪声降低得更快,并使用$shape=20,\text{dB/decade}$进行建模。

实时使用

只要滤波器长度参数不变,插件就具有实时兼容性。

技术细节

插件假定任何电平显著高于建模噪声水平的频率主要是信号,应该保留。相反,任何电平接近或低于建模噪声水平的频率主要是噪声,应该移除。因此,插件构建了一个动态均衡滤波器,其频率响应取决于任何给定时刻的输入。

滤波器响应

理想频率响应由以下公式给出

$$g(f)=1-e^{-\frac{l(f)}{s(f)}}$$

其中$l(f)$是频率$f$处的输入电平,$s(f)$是该频率处的滤波器强度。这为大多数是信号的较大输入电平提供响应为1,为大多数是噪声的较小输入电平提供值为0。

强度$s(f)$是从建模噪声水平$l_n(f)$和所需的减少量$a$计算的,以便响应将等于$a$,如果测量的电平等于建模噪声水平

$$1-e^{-\frac{l_n(f)}{s(f)}}=a$$

求解$s(f)$得到

$$s(f)=-\frac{l_n(f)}{\ln(1-a)}$$

然后,通过一个取决于滤波器长度的量$\delta_f$来放大这个理想响应。这种放大确保了窄带信号将通过窗口保留。不幸的是,这也保留接近信号的频率处的噪声。然而,这在实践中不是一个问题,因为心理声学效应意味着信号将掩盖大多数保留的噪声。放大的响应由以下公式给出

$$g_d(f)=\max_{|\phi-f|<\delta_f}g(\phi)$$

最后,为了避免吉布斯现象,对放大的响应进行窗口处理。

重叠窗口的应用

为了应用过滤器,输入信号被分为大小为滤波器长度两倍的窗口(向上取最近的2的幂)。然后对每个窗口进行分析以创建均衡滤波器,并将此滤波器应用于信号。在快速模式下,每个窗口与上一个窗口重叠其长度的一半。在标准模式下,四个窗口重叠。在任何情况下,输出都会混合以确保均衡滤波器之间的平滑过渡。

自动噪声模型

在使用自动噪声模型时,每个窗口都会进行分析,以猜测噪声水平和噪声形状。分析是一个两步过程

  • 通过在频谱两端寻找局部最小值来创建一个粗糙的噪声模型。
  • 通过仅对频谱进行线性回归,并保留粗略模型认为主要是噪声的频带,创建一个精细的噪声模型。

粗糙噪声模型

为了创建粗糙的噪声模型,插件会查看频谱的局部最小值,即振幅小于紧邻前后频带的频带。这些频带被认为主要是噪声,因此适合构建我们的噪声模型。插件搜索两个这样的频带,一个位于频谱的低端($l(f_l)$)和一个位于频谱的高端($l(f_h)$),然后从这两个频带构建粗糙的噪声模型

$$l^{(r)}_n(f)=\frac{l(f_h)-l(f_l)}{log(f_h)-log(f_l)}(log(f)-log(f_l))+l(f_l)$$

为了提高模型的鲁棒性,插件会查看频谱低端的第一个三个局部最小值,以及频谱高端的最后一个三个局部最小值,并保留每组三个中的中间水平频带。

精细噪声模型

通过在loglog域中对频谱进行线性回归,并仅保留满足$l(f)<l^{(r)}_n(f)+M$(其中$M$设置为10dB)的频带,创建精细模型。

依赖关系

~3.5MB
~66K SLoC