草庐IT

ALC AGC DRC-容易混淆的音频前端算法

西岸行者 2024-01-07 原文

回顾学习ALC AGC DRC-容易混淆的音频前端算法


音频前端距离模拟端最近的数字信号是需要动态改变幅值的,输出端即希望饱满的声音,有担心幅值大引起失真,所以DRC就必不可少,简单的可以用limiter来处理;采集端希望捕获的信号能在最佳表达区间,所以agc就需要了,如果没有真实的模拟gain控制,也可称为alc-自动电平控制(这么解释也很牵强,两者的表达的控制主体不一样,实质是一回事),即对采集的信号进行数字增益控制。

DRC-线性压缩还是对数压缩

drc的概念就不赘述了,只是有一个有趣的问题这里提一下,在stanfold的一篇教学课件中有一张典型的DRC原理图:

这张图中基本介绍了DRC要做的事情和几个关键的参数,观察坐标可以看出这是基于电压即线性空间的动态压缩。然而在另一篇Digital Dynamic Range Compressor Design—A Tutorial and Analysis专著中,介绍的是对数域的方法,引用其中的一张图如下:

那么哪个更好呢?粗略的比较了两文,觉得对数域更符合人类听觉感知,而时域上对实时计算有很大的优势。

ALC AGC

alc( agc)比drc要复杂,主要用于音频的采集通路,下图是一个简单的alc算法,可以将输入端很低的信号动态放大到合适的范围,但令人苦恼的是alc深受噪声和语音激活状态的影响,三个方法的波形都将最后的非稳态噪声显著的放大了,第二个方法采用了包络检测,由于粗略的估计,致使很多音频没有被放大,声音听上去很难接受。

WebRtc中的agc

初涉agc才发现为什么能和ans、aec并称为3A算法,原理虽然不复杂,但能调整出稳定舒服的agc信号,是不容易的。为此,我们学习一下WebRtc中legacy的agc方法,窥见一下此A的奥妙之处。

WebRtcAgc的vad

从上图中可以看到有三处调用WebRtcAgc_ProcessVad的地方,两处检测近端,一处检测远端。

  1. 近端都是从AnalyzeCaptureAudio开始的调用vad检测,这个是归属LegacyAgc结构里的vadMic,这个vad是为了AnalogProcess过程服务的,他将通过WebRtc_SpeakerInactiveCtrl更新vadThreshold,然后在WebRtcAgc_ProcessAnalog的最后根据vad评估结果设置不同的mic电平。
  2. 近端从ProcessCaptureAudio一路调用的vad,这个归属LegacyAgc结构里的子结构体DigitalAgc中的vadNearend,既是为数字agc的近端服务的。
  3. 远端是评估对讲端有可能产生回声的情况,但这个回声反馈延时需要在工程实施的时候自己tuning,否则如何保证远端叠加到近端的是哪一段?

WebRtcAgc_AddMic在调用vad之前,做了三件事:

  1. 如果micVol比模拟最大的增益还大,意味着信号很小,所以根据MaxAnolog,Maxlevel增益的设定,对信号做最大10db的放大;
  2. 计算10个子帧(1ms)的最大10个能量,作为信号包络;
  3. 归一化(16k采样率降到8k,32k采样率采用低8k)合并10个子帧(1ms)到5个子帧(2ms)的block能量,作为信号强度指示;
    然后利用in_Mic的数据进行vad估计,因为直接对mic数据进行vad估计,所以噪声和回声都是比较敏感的。

WebRtcAgc_VirtualMic是自适应数字通道,对WebRtcAgc_AddMic又做了一层封装,可以理解为虚拟的音量调节。

WebRtcAgc要控制什么

kAgcModeFixedDigital

这个控制顾名思义,就是按照固定的gain来调整输入信号的电平,但VAD是一样的流程。纵向的观察,核心内容就如下面的流程,关键是要读懂GainTable的生成,以及DigitalGain的计算,这是没有自动(自适应)以及反馈给模拟增益的环路的。这可以理解为带与设定增益的输入DRC,因为会有limiter,所以不会担心溢出。

kAgcModeAdaptiveAnalog&&kAgcModeAdaptiveDigital

WebRtcAgc_Analyze在调用WebRtcAgc_ComputeDigitalGains之后,会调用WebRtcAgc_ProcessAnalog,然后WebRtcAgc_Process就是直接调用WebRtcAgc_ApplyDigitalGains,可见WebRtcAgc_ProcessAnalog是关键的评估自动调整增益的缓解。下图是kAgcModeAdaptiveDigital场景下,最大三种gain调整的流程,可见webrtc对agc的控制是很严谨的。

参考文档

Dynamic Range Processing and Digital Effects
Digital Dynamic Range Compressor Design—A Tutorial and Analysis
FabFilter Pro-C 2 online hel
Advanced Audio and Video Development — Lesson 3: Automatic Gain Control (AGC)
Advanced Audio and Video Development — Lesson 2: Acoustic Echo Cancellation
breakway audio
an all-digital implementation of an AGC
Automatic Gain Control Algorithms for Wireless Sensors
详解 WebRTC 高音质低延时的背后 — AGC(自动增益控制)
Webrtc AGC 算法原理介绍(一)
WEBRTC AGC 算法原理初识(二)
Webrtc AGC 算法原理初识(一)
WebRTC AGC 流程解析
Webrtc AGC 算法原理介绍(一)
Webrtc AGC 算法原理介绍(二)
Webrtc AGC 算法原理介绍(三)
Webrtc AGC 算法原理介绍(四)
Webrtc AGC 算法原理介绍(五)
Webrtc AGC 算法原理介绍(六)
深入浅出 WebRTC AEC(声学回声消除)
Automatic Gain Control
CNG算法原理分析
史上最全的dB分贝单位合集: dB,dBFS, dB FS, dBTP, dB TP, dBO, dBov, dBu/dBv, dBV, dBm/dBmW, dBW,…
WebRTC中AGC模块分析(上)
WebRTC VAD模块分析

有关ALC AGC DRC-容易混淆的音频前端算法的更多相关文章

  1. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  2. ruby - 关于 Ruby 中 Dir[] 和 File.join() 的混淆 - 2

    我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案

  3. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  4. ruby - 在 Ruby 中实现 Luhn 算法 - 2

    我一直在尝试用Ruby实现Luhn算法。我一直在执行以下步骤:该公式根据其包含的校验位验证数字,该校验位通常附加到部分帐号以生成完整帐号。此帐号必须通过以下测试:从最右边的校验位开始向左移动,每第二个数字的值加倍。将乘积的数字(例如,10=1+0=1、14=1+4=5)与原始数字的未加倍数字相加。如果总模10等于0(如果总和以零结尾),则根据Luhn公式该数字有效;否则无效。http://en.wikipedia.org/wiki/Luhn_algorithm这是我想出的:defvalidCreditCard(cardNumber)sum=0nums=cardNumber.to_s.s

  5. Ruby 斐波那契算法 - 2

    下面是我写的一个计算斐波那契数列中的值的方法:deffib(n)ifn==0return0endifn==1return1endifn>=2returnfib(n-1)+(fib(n-2))endend它工作到n=14,但在那之后我收到一条消息说程序响应时间太长(我正在使用repl.it)。有人知道为什么会这样吗? 最佳答案 Naivefibonacci进行了大量的重复计算-在fib(14)fib(4)中计算了很多次。您可以将内存添加到您的算法中以使其更快:deffib(n,memo={})ifn==0||n==1returnnen

  6. ruby-on-rails - Rails add_index 算法 : :concurrently still causes database lock up during migration - 2

    为了防止在迁移到生产站点期间出现数据库事务错误,我们遵循了https://github.com/LendingHome/zero_downtime_migrations中列出的建议。(具体由https://robots.thoughtbot.com/how-to-create-postgres-indexes-concurrently-in概述),但在特别大的表上创建索引期间,即使是索引创建的“并发”方法也会锁定表并导致该表上的任何ActiveRecord创建或更新导致各自的事务失败有PG::InFailedSqlTransaction异常。下面是我们运行Rails4.2(使用Acti

  7. ruby-on-rails - 在 Rails 应用程序的前端获取实时日志 - 2

    在Rails3.x应用程序中,我正在使用net::ssh并向远程pc运行一些命令。我想向用户的浏览器显示实时日志。比如,如果两个命令在net中运行::ssh执行即echo"Hello",echo"Bye"被传递然后"Hello"应该在执行后立即显示在浏览器中。这是代码我在ruby​​onrails应用程序中使用ssh连接和运行命令Net::SSH.start(@servers['local'],@machine_name,:password=>@machine_pwd,:timeout=>30)do|ssh|ssh.open_channeldo|channel|channel.requ

  8. ruby - 如何在转换器插件中访问页面属性(YAML 前端) - 2

    我正在为Jekyll编写一个转换器插件,需要访问一些页眉(YAML前端)属性。只有内容被传递给主要的转换器方法,似乎无法访问上下文。例子:moduleJekyllclassUpcaseConverter关于如何在转换器插件中访问页眉数据有什么想法吗? 最佳答案 基于Jekyll源代码,无法在转换器中检索YAML前端内容。根据您的情况,我看到了两种可行的解决方案。您的文件扩展名可以具有足够的描述性,以提供您本应包含在前言中的信息。看起来Converter插件的设计就是这么基本的。如果修改Jekyll是一个选项,您可以更改Convert

  9. ruby - RVM Gemsets 和 Ruby Gemfile 混淆 - 2

    请有人帮助我了解ruby​​应用程序如何管理应用程序的gemfile和rvmgemsets。如果我当前使用的是Gemset,安装了一堆gem,并且我的gemfile中也有gems,那么Ruby应用程序是使用gemfile中的gem还是应用程序的gemset中的gem? 最佳答案 要理解这一点,您需要退后一步,了解ruby​​gems的一般工作原理。让我们从一个没有rvm或Gemfile的系统开始。当您通过“geminstall”安装gem时,它会进入系统gem位置。每当您编写ruby​​脚本并需要gem时,它就会从那里获取。现在假设

  10. ruby - 趋势算法 - 2

    我正在开发一个类似微论坛的项目,其中一个特殊用户发布一条快速(接近推文大小)的主题消息,订阅者可以用他们自己的类似大小的消息来响应。直截了当,没有任何形式的“挖掘”或投票,只是每个主题消息的响应按时间顺序排列。但预计会有很高的流量。我们想根据它们引起的响应嗡嗡声来标记主题消息,使用0到10的等级。在谷歌上搜索了一段时间的趋势算法和开源社区应用示例,到目前为止已经收集到两个有趣的引用资料,但我还没有完全理解它们:Understandingalgorithmsformeasuringtrends,关于使用基线趋势算法比较维基百科页面浏览量的讨论,在SO上。TheBritneySpearsP

随机推荐