动态范围控制-dynamic range control

本文对音频信号处理中一个比较重要的模块—动态范围控制(dynamic range control)的基本原理作以介绍,主要参考资料是书籍 DAFX: Digital Audio Effects Second Edition。如有表述不当之处欢迎批评指正。欢迎任何形式的转载,但请务必注明出处。

4.2. Dynamic Rang Control

动态范围控制包含几个不同的方面,主要介绍以下几个常见的动态范围控制器:limiters, compressors, expanders 以及 noise gates

动态处理的流程通常为:首先检测输入信号的电平,接着使用一条静态曲线(static curve)从输入电平中推导出增益因子,最后对该增益因子做平滑,并将其作用到输入信号上。可选的,可以对输入信号做延迟以补偿侧链(图 4.7 中下面的路径)中的任何延迟。

图 4.7

4.8 给出了一个动态范围控制器作用于输入信号上的例子。该例子展示的动态范围控制器是 compressor: 在输入电平较小的时候,增益 g ( n ) g(n) g(n) 被设置为 1 1 1,而当输入电平较大的时候,增益被衰减以降低信号的电平。因此,信号的电平差异随着时间减少,从而压缩了信号的动态范围。

图 4.8

信号处理
通常有两种方法来检测输入信号的电平:

  • peak measurement:一个全波整流器联合一个 AR-averager(见图 4.9 ),并配上特点短的攻击时间(attack time)可以用来跟踪信号的峰值。
  • RMS measurement:对单个时间常量进行平均的平方器(见图 4.10 )给出了 RMS 值,其用于测量信号的功率。

图 4.9
图 4.10

典型的动态范围控制器通常包含其中一个甚至两个都包含。

静态曲线决定了动态控制器是哪种类型。引入 X , G , Y X, G, Y X,G,Y 以在 dB 尺度上表示相应的信号。也就是 X = 20 ⋅ log 10 ( x PEAK ( n ) ) X = 20 \cdot \text{log}_{10}(x_{\text{PEAK}}(n)) X=20log10(xPEAK(n)) X = 10 ⋅ log 10 ( x RMS ( n ) ) X = 10 \cdot \text{log}_{10}(x_{\text{RMS}}(n)) X=10log10(xRMS(n))。动态范围控制器得到输出信号的过程也变为了 Y = X + G Y = X + G Y=X+G

在对数域中,增益通常是通过分段线性函数从输入信号的电平中推导出来的。图 4.11 给出了一个 compressor 的特性曲线,左图从输入信号的电平映射出输出信号的电平,右图从输入信号的电平映射出增益因子。在达到某个输入电平之前,也就是小于压缩器的阈值 C T CT CT(这个例子中是 − 30 -30 30 dB)时,增益因子是 0 0 0 dB。当超出该阈值时,特性曲线是通过比率 R R R 定义的,它指定了输入电平的变换 △ X \triangle X X 到输出电平的变化 △ Y \triangle Y Y 之间的关系,即 △ Y = 1 R ⋅ △ X \triangle Y = \frac{1}{R} \cdot \triangle X Y=R1X。或者也可以用斜率因子 S = 1 − 1 R S = 1 - \frac{1}{R} S=1R1 来代替比率 R R R。、

图 4.11

动态范围控制器的动态表现受电平检测方法(peak measurement 方法使用攻击和释放时间 AT、RT \text{AT}、\text{RT} ATRTRMS measurement 方法使用平均时间 TAV \text{TAV} TAV)的影响,并且进一步被平滑滤波器调整(它也用到了攻击时间和释放时间),如图 4.12 所示。攻击时间的参数可以用以下公式计算:
AT = 1 − e − 2.2 T / t AT , \begin{align} \text{AT} = 1 - e^{-2.2 T/t_{\text{AT}}}, \notag \end{align} AT=1e2.2T/tAT,

其中 t AT t_{\text{AT}} tAT 是时间参数,单位为秒, T T T 是采样周期, − 2.2 -2.2 2.2 可以用 l o g e ( 9 ) log_{e}(9) loge(9) 代替。释放时间参数 RT \text{RT} RT 和平均时间参数 TAV \text{TAV} TAV 可以通过将上式中的 t AT t_{\text{AT}} tAT 分别替换为 t RT t_{\text{RT}} tRT t TAV t_{\text{TAV}} tTAV 来计算。如图 4.12 所示,静态函数的输出信号 f ( n ) f(n) f(n) 作为配置有攻击和释放时间的动态滤波器的输入信号,输出信号 g ( n ) g(n) g(n) 是增益因子,作用到图 4.7 所示的延迟输入信号上 x ( n − D ) x(n-D) x(nD)。接下来将详细讨论一些特定的动态范围控制器。

图 4.12

4.2.1 limiter

Limiter 的目的是对信号的最高峰值加以控制,尽可能不改变信号的动态范围。这是通过下面的公式来实现的:
G = { 0    dB if      X < L T L T − X else. (4.8) G = \begin{cases} 0 \; \text{dB} & \text{if} \; \; X < LT \\ LT - X & \text{else.} \tag{4.8} \end{cases} G={0dBLTXifX<LTelse.(4.8)

其中 L T LT LTlimiter 的阈值。这也就意味着 limiter 的特性曲线中的 R = ∞ R = \infty R=。因此,输出 Y = X + G Y = X + G Y=X+G 永远不应该超过阈值 L T LT LT

limiter 检测电平的方法是 peak measurement,而且要对输入信号超过其阈值的情况快速做出反应。limiter 中典型参数的取值为 t A T = 0.02 ⋯ 10   ms t_{AT} = 0.02 \cdots 10 \, \text{ms} tAT=0.0210ms t R T = 1 ⋯ 5000   ms t_{RT} = 1 \cdots 5000 \, \text{ms} tRT=15000ms,这对 peak measurement 和平滑滤波器都适用。

图 4.13

4.13 给出了 limiter 的一个实现,它在线性尺度上计算增益因子的方式为:
g ( n ) = min ( 1 , l t x PEAK ( n ) ) \begin{align} g(n) = \text{min}(1, \frac{lt}{x_{\text{PEAK}}(n)}) \tag{4.9} \end{align} g(n)=min(1,xPEAK(n)lt)(4.9)

其中 l t = 1 0 L T 20 lt = 10^{\frac{LT}{20}} lt=1020LT 是线性尺度上的阈值。M-file 4.1 给出了该方法的实现。图 4.14 给出了信号经过该 limiter 后的表现。

M-file 4.1(limiter.m)

function y = limiter(x, lt)
% function y = limiter(x, lt)
% Author: M. Holters

at = 0.3;
rt = 0.01;
delay = 5;

xpeak = 0;
g = 1;
buffer = zeros(1, delay);

for n = 1:length(x)
  a = abs(x(n));
  if a > xpeak
    coeff = at;
  else
    coeff = rt;
  end;
  xpeak = (1-coeff) * xpeak + coeff * a;
  f = min(1, lt/xpeak);
  if f < g
    coeff = at;
  else
    coeff = rt;
  end;
  g = (1-coeff) * g + coeff * f;
  y(n) = g * buffer(end);
  buffer = [x(n) buffer(1:end-1)];
end;

图 4.14

4.2.2 Compressor and expander

Compressor 用于压缩信号的动态范围,动态范围被压下来以后,可以在不超过幅度阈值的情况下,对信号做拉升,从而提高信号的整体响度。而 expander 所做的正好与 compressor 相反,它用来提升信号的动态范围。Compressor 所对应的特性曲线的比率和斜率分别为: C R > 1 CR > 1 CR>1 0 < C S < 1 0 < CS < 1 0<CS<1Expander 所对应的特性曲线的比率和斜率分别为: 0 < E R < 1 0 < ER < 1 0<ER<1 E S < 0 ES < 0 ES<0

CompressorsExpanders 通常使用平均时间为 t = 5 ⋯ 130    ms t = 5 \cdots 130 \; \text{ms} t=5130msRMS measurement 来检测输入信号的水平。使用 t AT = 0.1 ⋯ 2600    ms t_{\text{AT}} = 0.1 \cdots 2600 \; \text{ms} tAT=0.12600ms 以及 t RT = 1 ⋯ 5000    ms t_{\text{RT}} = 1 \cdots 5000 \; \text{ms} tRT=15000ms 的平滑滤波器来对增益因子进行平滑。

对高电平的信号使用 compressor 并且对低电平的信号使用 expander,可以得到以下增益因子:
G = { C S ⋅ ( C T − X ) if      X > C T 0    dB if      E T < = X < = C T E S ⋅ ( E T − X ) if      X < E T (4.10) G = \begin{cases} CS \cdot (CT - X) & \text{if} \; \; X > CT \\ 0 \; \text{dB} & \text{if} \; \; ET <= X <= CT \\ ES \cdot (ET - X) & \text{if} \; \; X < ET \end{cases} \tag{4.10} G= CS(CTX)0dBES(ETX)ifX>CTifET<=X<=CTifX<ET(4.10)

= min ( 0 , C S ⋅ ( C T − X ) , E S ⋅ ( E T − X ) ) \begin{align} = \text{min}(0, CS \cdot (CT - X), ES \cdot (ET - X)) \tag{4.11} \end{align} =min(0,CS(CTX),ES(ETX))(4.11)

其中 C T CT CT E T ET ET 分别表示 compressorexpander 的阈值。图 4.15 给出了两者的联合系统,它在线性尺度上计算增益因子的方式为:
g ( n ) = min ( 1 , ( x RMS ( n ) c t 2 ) − C S / 2 , ( x RMS ( n ) e t 2 ) − E S / 2 ) \begin{align} g(n) = \text{min}(1, (\frac{x_{\text{RMS}}(n)}{ct^{2}})^{-CS/2}, (\frac{x_{\text{RMS}}(n)}{et^{2}})^{-ES/2}) \tag{4.12} \end{align} g(n)=min(1,(ct2xRMS(n))CS/2,(et2xRMS(n))ES/2)(4.12)

图 4.15

M-file 4.2 给出了上述实现。

M-file 4.2(compexp.m)

function y = compexp(x, CT, CS, ET, ES)
% function y = compexp(x, CT, CS, ET, ES)
% Author: M. Holters

tav = 0.01;
at = 0.03;
rt = 0.003;
delay = 150;

xrms = 0;
g = 1;
buffer = zeros(1, delay);

for n = 1:length(x)
  xrms = (1-tav) * xrms + tav * x(n)^2;
  X = 10*log10(xrms);
  G = min([0, CS*(CT-X), ES*(ET-X)]);
  f = 10^(G/20);
  if f < g
    coeff = at;
  else
    coeff = rt;
  end;
  g = (1-coeff) * g + coeff * f;
  y(n) = g * buffer(end);
  buffer = [x(n) buffer(1:end-1)];
end;

并行压缩 Parallel compression
Compressor 的常用应用为降低特定阈值以上的幅度。然而,在某些情况下,例如对于打击乐器或原声吉他来说,希望的是增强信号较弱部分的同时,保持高幅值瞬时信号不受影响。对于这类应用来说,建议使用 Parallel compression,它将高度压缩过的信号加到不受影响的信号上。使用低阈值、高比率以及短攻击时间对声音的较弱部分进行高度压缩。然后,将压缩过的信号进行放大并与原始信号进行混合。生成的声音保留了原始声音的通透性,因为高幅值瞬时信号没有受到影响。这种类型的压缩有时也称为 New-York compression or side-chain compression

多带压缩 Multiband compression
也可以根据声音的频谱,仅在特定的频带上进行压缩。考虑大号和现场电子乐曲的音乐,无论乐器的低频音表现怎样,都必须对指法和呼吸噪声做处理。解决方案是借助高通滤波器,对信号的高频部分进行压缩,而不会影响信号低频部分。

对于更一般的情况,也就是需要对多个频带分别进行处理,这时就需要用到 multiband compression。使用滤波器组将输入信号划分为多个带(通常是 3 3 3 5 5 5 个),然后对这些带分别进行处理。多带动态处理器常用于母带制作。

Multiband compression 的优势之一是压缩的副作用,比如音调平衡的改变或失真,可以被限制在给定频段内。

4.2.3 Noise gate

Noise gate 可以被认为是斜率为 − ∞ -\infty expander。这意味着将低于阈值 N T NT NT 的信号完全静音。正如它的名字,noise gate 通常被用来对噪声进行静音,这是通过将阈值设置为正好高于背景噪声的级别来完成的。

图 4.16

4.16 展示了 noise gate 的框图。使用 peak measuremen 检测信号电平,配合上攻击和释放时间,可以实现增益因子 g ( n ) g(n) g(n)fade in/out。更进一步的改进包括,使用两个阈值来实现 a hysteresis and a hold time,以避免输入信号电平在阈值附近波动所造成的副作用。M-file 4.3 给出了上述实现。

M-file 4.2(noisegt.m)

function y = noisegt(x,holdtime,ltrhold,utrhold,release,attack,a,Fs)
% function y = noisegt(x,holdtime,ltrhold,utrhold,release,attack,a,Fs)
% Author: R. Bendiksen

% noise gate with hysteresis
% holdtime   - time in seconds the sound level has to be below
%                  the threshold value before the gate is activated
% ltrhold    - threshold value for activating the gate
% utrhold    - threshold value for deactivating the gate > ltrhold
% release    - time in seconds before the sound level reaches zero
% attack     - time in seconds before the output sound level is the
%                  same as the input level after deactivating the gate
% a          - pole placement of the envelope detecting filter < 1
% Fs         - sampling frequency
rel = round(release * Fs); % number of samples for fade
att = round(attack * Fs); % number of samples for fade
g = zeros(size(x));
lthcnt = 0;
uthcnt = 0;
ht = round(holdtime * Fs);
h = filter([(1 - a)^2], [1.0000 - 2 * a a^2], abs(x)); % envelop detection
h = h / max(h);
for i = 1:length(h)
  if (h(i) <= ltrhold) | ((h(i) < utrhold) & (lthcnt > 0))
% Value below the lower threshold?
    lthcnt = lthcnt + 1;
    uthcnt = 0;
    if lthcnt > ht
% Time below the lower threshold longer than the hold time?
      if lthcnt > (rel + ht)
        g(i) = 0;
      else
        g(i) = 1 - (lthcnt - ht) / rel; % fades the signal to zero
      end;
    elseif ((i < ht) & (lthcnt == i))
      g(i) = 0;
    else
      g(i) = 1;
    end;
  elseif (h(i) >= utrhold) | ((h(i) > ltrhold) &(uthcnt > 0))
% Value above e upper threshold or is the signal being faded in?
    uthcnt = uthcnt + 1;
    if(g(i-1) < 1)
% Has the gate been activated or isn't the signal faded in yet?
      g(i) = max(uthcnt / att, g(i-1));
    else
      g(i) = 1;
    end;
    lthcnt = 0;
  else
    g(i) = g(i-1);
    lthcnt = 0;
    uthcnt = 0;
  end;
end;
y = x .* g;
y = y * max(abs(x)) / max(abs(y));

4.2.4 De-esser

De-esser 包含一个频率范围为 2 2 2 6 kHz 6\text{kHz} 6kHz 的带通滤波器,用于检测该频带信号的电平。如果超出某个阈值,峰值或陷波滤波器的增益将被调整,以对该频带进行压缩。如图 4.17 所示。De-essers 主要用来消除语音或人声的高频嘶嘶声(齿音)。

图 4.17

除了带通或陷波滤波器,高通和 shelving 滤波器也会得到较好的结果。为了让 de-esser 对输入电平的变化更鲁棒,阈值应该取决于信号的整体电平,也就是说阈值是一个相对的阈值。

4.2.5 Infinite limiters

为了捕获 compressorlimiterovershoots,可能需要使用 clipper 或者说是 infinite limiter。与上述动态范围控制器相比,infinite limiter 是一个非线性操作,它直接作用在波形上,对那些超过阈值的信号进行拉平(flattening)。最简单的一个是 hard clipping,不过它会产生大量的高阶谐波。更温和的 infinite limitersoft clipping,which rounds the signal shape before the absolute clipping threshold。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值