热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

动态范围控制原理

DRC介绍开门见山,动态范围的定义就是信号的最大幅值和最小幅值比值的对数(单位dB),动态范围会受到系统中各个环节的影响。例如同样是这段音乐࿰

DRC介绍

  开门见山,动态范围的定义就是信号的最大幅值和最小幅值比值的对数(单位dB),

  动态范围会受到系统中各个环节的影响。例如同样是这段音乐,在一个40dB背景噪声的环境中播放,那么由于掩蔽效应等因素的影响,最终实际听到的音乐动态范围实际上是50dB。

  动态范围会受到系统中各个环节的影响。例如同样是这段音乐,在一个40dB背景噪声的环境中播放,那么由于掩蔽效应等因素的影响,最终实际听到的音乐动态范围实际上是50dB。如果对响度和动态范围感兴趣的可以移步看鬼斧神工的文章《详解音频中的响度与动态范围。(推力、耳放、响度战争、高解析度等)》

  动态范围控制(Dynamic Range Control,DRC)将输入音频信号的动态范围映射到指定的动态范围,可以使声音听起来更柔和或更大声,即一种信号幅度调节方式。通常映射后的动态范围小于映射前的动态范围,因此称之为动态范围压缩。音频信号可以进行整体的动态范围控制,也可以划分为若干子带分别进行动态范围控制。DRC广泛应用于音频信号处理领域,例如助听器中最常见的宽动态范围压缩方法(Wide Dynamic Range Compression,WDRC)、音频信号处理中最常用的自动增益控制(Automatic Gain Control,AGC)方法等。DRC侧重于从数字域上对增益进行有选择、有目的地调整,以保证最大信号有合适的headroom,中间信号得到合适的amplify,小信号或者底噪被cutoff掉。

作用

  • 将音频信号电平与其环境相匹配
  • 对输入的忽大忽小语音进行动态拉伸,使语音听起来平稳。
  • 抑制低电平噪声,避免噪声在后续模块AGC中被放大。
  • 保护 AD 转换器免受过载
  • 优化信息;也就是使音频信号使用到满幅的动态范围;

动态范围控制的类型

  • 动态范围压缩器(Dynamic range compressor):衰减超过给定阈值声音的音量;通常用于录音系统以保护硬件并提高整体响度。
  • 动态范围限幅器(Dynamic range limiter):是压缩器的一种,可以限制超过给定阈值的信号;
  • 动态范围扩展器(Dynamic range expander):衰减低于给定阈值的安静声音音量。它们通常用于使安静的声音更加安静。
  • 噪声门(Noise gate):是扩展器的一种,可以限制声音低于给定阈值

DRC的增益调整基本上是三段:对底噪,中等幅度信号,幅度较大的信号的三段不同的处理,比如:

  • 底噪:Cutoff,attenuation
  • 中等幅度信号:Expander
  • 幅度较大,防止削顶的:Limiter

  整体而言算法较为简单,其中最关键的地方在于曲线的设计。DRC的曲线一般具备下图这样的结构,该图表示的是来滤除小信号的曲线图,如果想要动态拉伸的功能,那么整体曲线需要高于$y=x$这条直线。

静态曲线(图片来自《Digital Audio Signal Processing-Udo Zölzer》第七章)

名词解释

  • NT:噪声门限(Noise Gate),低于NT的输入信号将会被滤除
  • LT:限制器阈值(Limiter threshold),高于CT且低于LT的信号也会被压缩,而高于LT的信号将会被直接限幅
  • CT:压缩器阈值(Compressor threshold),高于ET且低于CT的信号将会保持不变
  • ET:扩展器阈值(Expander threshold),高于NT且低于ET的信号将会被抑制

MALTAB的Audio Toolbox中实现了 动态范围压缩器、动态范围限幅器、动态范围扩展器和噪声门。本教程还提供了动态范围限制器各个阶段的动态范围限制示例。

基本原理

  DRC的原理其实很简单,就是通过设计一条曲线,将输入语音幅度$x(n)$通过曲线进行映射得到另一语音幅度值$y(n)$。然后计算两者之间的差值得到增益值$g_c(n)$,然后根据设置的attack time和release time进行增益平滑以及计算make-up增益,最后再应用到语音得到处理后的语音。基本流程如下

通用的动态范围控制系统 (来自Matlab官网)

1、线性到dB转换

从线性值转换为dB值

$$x_{dB}(n) = 20log_{10}(x(n))$$

2、计算增益

通过将$x_{dB}(n) $信号传递到静态特征方程(DRC静态曲线),假设设计的曲线函数关系为$f(x)$

$$x_{sc}(x_{db})=f(x_{db}(n))$$

计算差值:$g_c(n)=x_{sc}(n)-x_{dB}(n)$

不同类型的DRC都具有不同的静态特征和不同的可调属性:

  • Threshold:所有的静态特性都有一个阈值。在阈值的一侧,信号不变。在阈值的另一侧,应用compression, expansion, limiting, 或 gating。
  • Ratio:Expanders  和 compressors 使您能够将静态特性的输入输出比调整为高于或低于给定阈值。
  • KneeWidth:expander、compressors和 limiters 使您能够调整静态特性的拐点宽度。静态特性的拐点以阈值为中心。knee width的增加会在阈值周围产生更平滑的过渡。knee width为零不提供平滑,称为硬拐点(hard knee)。knee width大于零被称为软拐点(soft knee)。

在下面这些静态特性图中,expander、limiter和compressor 各有一个 knee width 的拐点宽度。

3、增益平滑

  增益平滑减少了增益的急剧变化,避免伪像和不自然的声音。expander和noiseGate具有相同的平滑方程(都是扩展器),limiter和compressor具有相同的平滑方程(都是压缩器)。

  增益平滑的类型由启动时间(attack time)、释放时间(release time)和保持时间(hold time)组合指定。启动时间和释放时间对应于增益信号从其最终值的10%上升到90%所需的时间。保持时间是应用增益之前的延迟时间。

expander 和 noiseGate 的平滑方程

$$g_s[n]=\left\{\begin{array}{cl}
\alpha_A g_s[n-1]+\left(1-\alpha_A\right) g_c[n] & \text { if }\left(C_A>k\right) \&\left(g_c[n] \leq g_s[n-1]\right) \\
g_S[n-1] & \text { if } C_A \leq k \\
\alpha_{R}g_s[n-1]+\left(1-\alpha_R\right) g_c[n] & \text { if }\left(C_R>k\right) \&\left(g_c[n]>g_s[n-1]\right) \\
g_S[n-1] & \text { if } C_R \leq k
\end{array}\right.$$

$\alpha_A$和$\alpha_R$由采样率和指定的启动和释放时间确认:$\alpha_A=exp(\frac{-log(9)}{Fs*T_A})$,$\alpha_R=exp(\frac{-log(9)}{Fs*T_R})$

$k$是以样本为单位的指定保持时间。$C_A$和$C_R$分别是启动和释放hold counters

compressor 和 limiter 的平滑方程

$$g_s(n)=\left\{\begin{matrix}
a_Ag_s(n-1)+(1-\alpha_A)g_c(n),\ \ g_c\le g_s(n-1) \\
a_Rg_s(n-1)+(1-\alpha_R)g_c(n),\ \ g_c > g_s(n-1)
\end{matrix}\right.$$

$\alpha_A$和$\alpha_R$由采样率和指定的启动和释放时间确认:$\alpha_A=exp(\frac{-log(9)}{Fs*T_A})$,$\alpha_R=exp(\frac{-log(9)}{Fs*T_R})$

增益平滑实例

输入信号两步动态范围压缩的一个简单案例。在此示例中,压缩器的阈值为 –10 dB,压缩比为 5,拐点较硬。

下图为了显示了增益平滑的几种变化。

  • 在顶部,显示了针对不同启动时间值的平滑增益曲线,释放时间设置为零秒
  • 在中间,释放时间是变化的,启动时间保持在零秒不变
  • 在底部,启动和释放时间均由非零值指定

4、补偿增益(make-up gain)

  补偿增益适用于compressors 和 limiters,其中信号的较高 dB 部分被衰减或阻塞。dB 降低会显著降低总信号功率。在这些情况下,增益平滑后应用补偿增益以增加信号功率。在MATLAB的 Audio Toolbox 中,可以指定一个设定的补偿量或将补偿模式指定为'auto'。

'auto'补偿增益确保 0 dB 输入产生 0 dB 输出。例如,假设具有软拐点的compressors 的静态特性:

$$x_{s c}\left(x_{d B}\right)=\left\{\begin{array}{cc}
x_{d B} & x_{d B}<\left(T-\frac{W}{2}\right) \\
x_{d B}&#43;\frac{\left(\frac{1}{R}-1\right)\left(x_{d B}-T&#43;\frac{W}{2}\right)^2}{2 W} & \left(T-\frac{W}{2}\right) \leq x_{d B} \leq\left(T&#43;\frac{W}{2}\right) \\
T&#43;\frac{\left(x_{d B}-T\right)}{R} & x_{d B}>\left(T&#43;\frac{W}{2}\right)
\end{array}\right.$$

$T$是threshold&#xff0c;$W$是knee width&#xff0c;$R$是compression ratio。计算出的自动补偿增益是在 0 dB 时评估的静态特性方程的负值&#xff1a;

$$\text { MAKE-UP GAIN }&#61;-x_{s c}(0)&#61;\left\{\begin{array}{cl}
0 & \frac{W}{2}-\frac{\left(\frac{1}{R}-1\right)\left(T-\frac{W}{2}\right)^2}{2 W} & -\frac{W}{2} \leq T \leq \frac{W}{2} \\
-T&#43;\frac{T}{R} & -\frac{W}{2}>T
\end{array}\right.$$

5、dB到线性转换

将增益从dB域变换到线性域&#xff1a;$g_{lin}(n)&#61;10^{\frac{g_m(n)}{20}}$

6、应用增益

$$y(n)&#61;x(n)*g_{lin}(n)$$

栗子

示例&#xff1a;动态范围限制器

本例中描述的音频信号是 0.5 秒间隔的鼓音。limiter属性是&#xff1a;

  • Threshold  &#61; –15 dB
  • Knee width &#61; 0(硬膝盖)
  • Attack time &#61; 0.004 秒
  • Release time &#61; 0.1 秒
  • Make-up gain &#61; 1 dB

此示例提供了动态范围限制器系统各个阶段的可视化演练。

线性到 dB 转换

增益计算

静态特性将 dB 信号限制在 –15 dB。为了确定导致此限制的 dB 增益&#xff0c;增益计算从静态特性处理的 dB 信号中减去原始 dB 信号。

增益平滑

当所应用的增益突然增加时&#xff0c;相对较短的启动时间规格会导致陡峭的曲线。相对较长的释放时间会导致应用增益逐渐减小。

补偿增益

假设限制器具有 1 dB 补偿增益值。补偿增益被添加到平滑增益信号。

dB 到线性转换

以 dB 为单位的增益逐个元素转换为线性标度。

应用计算增益

原始信号乘以线性增益

参考

【书籍】Digital Audio Signal Processing 2nd Edition

【音频探险记】DRC--动态范围控制

【MATLAB】Dynamic Range Control

【MATLAB】Multiband Dynamic Range Compression

【知乎】详解音频中的响度与动态范围。(推力、耳放、响度战争、高解析度等)

【论文】Zolzer, Udo. "Dynamic Range Control." Digital Audio Signal Processing. 2nd ed. Chichester, UK: Wiley, 2008.

【论文】Giannoulis, Dimitrios, Michael Massberg, and Joshua D. Reiss. "Digital Dynamic Range Compressor Design –– A Tutorial And Analysis." Journal of Audio Engineering Society. Vol. 60, Issue 6, 2012, pp. 399–408.



推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
author-avatar
H-蔡鸿晖_515
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有