date
Mar 31, 2025
slug
2025-03-31-the-summary-of-auido-3A-AEC-ANS-AGC
status
Published
tags
Audio
音视频
summary
type
Post
category
音视频
AI summary
本系列文章完整的总结了消费类摄像头领域中针对音频进行处理的3A(AGC,AEC,ANS)概念理论及其工作原理进行总结,为该领域产品中音频效果的调优和问题接近打下基础。
在消费类摄像头领域中,相比与视频图像方面的3A(自动曝光AE Auto Exposure,自动白平衡AWB Auto White Balance以及自动对焦AF Auto Focus)处理,在对音频数据的处理上同样存在3A处理,也就是音频3A:自动增益控制AGC(Auto Gain Control),声学回声消除AEC(Acoustic Echo Cancellation),自动噪声抑制ANS(Auto Noise Suppression)。本文的目的就是尝试对以上音频3A处理的理论技术以及工作原理流程进行总结。
下图是一个典型的音频3A处理并通过服务器与远端进行语音双向通信交互的流程图:
- 麦克风采集的数据,首先要结合收到对端的语音数据信息,识别出来其中的回声,利用AEC回声消除算法消除回声。
- 然后把经过回声消除的语音信息再经过ANS降噪处理过滤掉音频噪声,提升音频采集的品质。
- AGC则用于根据采集语音的幅度动态自适应的调整音频增益,把传输到对端的声音信号强度调整到合适的幅度。
- 对原始音频数据进行编码并通过网络和服务器传输到语音通信交互的对端。
- 对端收到语音信息后利用各种缓冲、丢包重传等机制对音频数据进行整理。
- 对端对收到的音频压缩数据进行解码,恢复出来原始音频数据。
- 最后再结合本地混音等的设置,把原始音频数据在扬声器上播放出来。

总的来说,对于音频3A在一个全双工的双向音频对讲的应用中,一般的处理顺序是AEC回声消除最先处理,其次是ANS音频噪声抑制,最后是AGC自动增益控制环节。
声学回声消除AEC
AEC要解决的问题则是在双向语音通话中(例如电话会议中),通话一端扬声器发出的声音(这个声音来自于通话的另一端)会被同一端的麦克风收集到,并传输到另外一端,这样就会造成双方说话的声音在两端之间反复回传后形成明显的回声的效果。
下图就是在双向全双工语音通话和电话会议中出现回声的示意图:

从以上的这个双向通话回音生成原理的示意图上可以看出,只有在双向全双工(也就是通话两端的麦克风和喇叭都保持打卡状态)语音通话的时候才会发生回声的问题。如果是半双工的话(类似于对讲机),是不存在回音及其回音消除问题的。因为,在半双工语音通话的情况下,同一时间只有一方的麦克风打开,而且通话过程中总是一方听完对方说的话以后,才会按下通话键向对方发送自己的语音,这样的话,每次某一方的麦克风打开时,他自己的喇叭是不会发出声音的,这样的话自然就不存在回声和回声消除的问题了。当然,这样的通信方式自然是比较低效的,因为同一时间只能有一方说话。
在具体的回声消除的应用场景中,又往往根据回声产生的路径,把回声分为两种类型:
- 直接回声:也称为线性回声。是指远端传输过来的声音信号在本地端的喇叭上播放出来以后,没有经过任何反射和折射,直接被本地端的麦克风所采集的情况。这种直接回声不受环境影响,只与本地端的麦克风和喇叭之间的距离和位置有关,也因此回声产生的时间延迟相对比较好估计。
- 间接回声:也称为非线性回声。是指远端传过来的声音信号在本地端的喇叭上播放出来以后,还要经过本地端环境中的各种障碍物、墙面、地面等反射和折射回来以后,才会被本地端的麦克风所采集的情况。因此间接回声的大小与房间环境、布局甚至各种障碍物的声波吸收系数等均有关。当通话设备本身处于移动状态之下,喇叭和麦克风与回声环境各种障碍物的位置也就在始终变化中,回声的延迟也就是动态变化的,因此,这类回声相对不太好处理。
回声消除问题的处理逻辑
从回声所产生的流程上讲,通话双方A和B,A端的语音信号被A端的麦克风采集以后,传输给B端,在B端的喇叭播放出来以后,又重新被B端的麦克风所采集,与B端本身的语音信号叠加在一起,再传输给A端,这样A端就能在自己的喇叭中听到自己刚才所说的话。因此,整个过程中,A端是无辜的,出现回声问题是由于B端的麦克风在采集声音的时候,把自己的语音信号和喇叭播放出来的A端语音信号混合在一起,未作任何处理直接发给A端,导致A端出现回声问题。

因此,回声问题的解决,就要从B端着手,在B端麦克风采集到音频数据后,要从其中识别和分离出来自己的语音信号和喇叭中播放的A端的语音信号,然后把麦克风采集的混合音频信号中的A端语音信号处理掉,只保留自己的语音信号,然后再发给A端。这就是针对这个问题需要在B端引入AEC回声消除模块的处理逻辑所在。
当然,因为A端和B端始终是在全双工双向语音通信之中,双方是对等的,那么在实践中就需要在两端同时分别加入各自的AEC回声消除功能和模块,在这个模块中把自己喇叭播放出来的对端语音信号从麦克风采集的混合信号中识别并消除掉。
回音消除的工作原理
如上所述,所谓的回音消除,就是在麦克风端接收到的混合信号中,把本地喇叭播放出来的远端语音信号识别出来,并且消除掉,确保只有本地的原始语音信号会被被传输到另外一端。那么针对这个设计需求,回音消除模块的实现上一般而言就存在以下四个模块。
1. 时延估计模块。
要把喇叭播放出来的远端语音信号消除掉,首先要能够从本地麦克风采集的混合信号中把该信号识别出来,并确定出来喇叭播放出来的远端语音信号和本地麦克风采集的语音信号之间的时间差。有了这个时间差,才能在后续的处理模块中准确的定位需要削弱的远端语言信号在麦克风采集数据中的位置。
那怎么才能找到两个语音信号(收到远端的语音信号数据,本地麦克风采集的语音信号数据)之间的时间差呢?答案是对两个语音信号做切片处理,分别针对分片的音频数据帧做傅里叶变换,得到其频谱数据,然后通过互功率谱等计算来比较二者在频域上的相似性,直到找到双方的音频数据的频谱表现在哪个切片上一致性最佳,就找到了双方的时间差。
2. 基于自适应滤波器的线性回声消除模块。
该模块是整个回声消除模块的核心所在。
在回声消除算法的具体实现中,以本地接收到的远端语音数据作为输入,通过动态迭代和更新自适应滤波的滤波器权重参数,使其输出信号尽可能接近真实的回声信号数据,最终从麦克风采集到的混合信号中减去自适应滤波器输出的预测回声数据,达到保留纯净本地语音数据的目标。
3. 非线性残留回声抑制模块。
以上基于自适应滤波器实现的线性回声消除模块,仅能消除声学路径的线性回声成分,但是无法完全消除非线性失真。因此,在使用自适应滤波器对线性回声进行过滤之后,就需要利用非线性模块,通过频域能量分析、动态增益控制等手段,进一步抑制残留的非线性回声。
4. 双向对讲检测模块。
该模块通过对远端语音数据以及本地麦克风采集的语音数据的动态监测,判断当前是只有一方在说话,还是双方都在说话。
因为如果双方同时对讲的情况下,本地麦克风采集的音频数据中就同时包含了双方的语音数据,在这种情况下,本地的语音信号就会被误判为回声的残留部分,导致滤波器参数错误更新。因此在算法通过双向对讲检测模块识别到双方正在处于双讲状态时,就会冻结滤波器权重的更新,避免算法因噪声干扰而发散。
而如果双向对讲检测模块检测到当前只有一方在说话时,就可以恢复对自适应滤波器的权重更新,并且提升滤波器的回声抑制强度,彻底消除残留回声,从而达到更好的对讲效果。
结合下图可以更好的理解完整的回音消除算法的实现,及其各个子模块在完整的回音消除流程中所起的作用。

自动噪声抑制ANS
我们常用的手机、消费类摄像头等产品的麦克风所采集的原始声音信号中往往包含了比较多的背景噪音,不仅影响用户录音和回放的使用体验,而且这些噪声数据还会降低音频编码的压缩效率,因此有必要对音频底噪进行抑制处理,这就是ANS(Auto Noise Suppression)功能的用武之地。
音频3A中对于环境噪音的控制,除了以上的自动噪声抑制ANS技术以外,还存在一个主动噪声消除ANC(Active Noise Cancellation)的环节。ANS与ANC的区别主要在于,前者是采用被动降噪的方式,分析环境噪声中频率成分针对性的对其滤波处理,尽可能保留清晰的语音部分,并提高音质;而后者常见于目前市场上非常流行的主动降噪耳机,针对环境中存在的噪音,对噪声声波的频率相位等分析,产生与噪声相位相反的声音信号来实现噪声抵消的效果。因此两者主要的区别就在于,ANS采用被动滤波的方式进行降噪,ANC则采用主动产生与噪声波形相位相反的方式来实现与噪声的相互抵消。一般而言,在消费类摄像头领域中,对于摄像头麦克风所采集声音数据的处理只会用到ANS,因此本文仅关注ANS方式的被动降噪处理机制。
音频背景噪音的来源
一般来说,对于模拟系统来讲,噪声可产生于系统的各个环节之中,因此模拟系统更容易受到干扰而产生噪声,而对于数字设备而言,抗干扰和噪声的性能要好很多,噪声窜入的薄弱环节总是设备中的A/D、D/A转换部分。在消费类电子领域,从成本等角度考虑,目前模拟音频元件和处理电路仍然是应用中的主流,所以该类型产品中因为各种干扰所造成的背景噪声等方面的声音质量劣化往往是产品开发中的难点所在。
总的来讲,消费类Camera产品的音频噪声主要来源于以下几个方面:
- 设备电子元器件运行中的固有噪声。例如,电子元器件(电容、电阻等)在高频运行下本身就会产生细微的白噪声,这些噪声很容易被附近灵敏度高的麦克风拾取、放大后变得清晰可闻。
- 电磁干扰。电路在高频开关切换的运行过程中,尤其设备内部空间中有无线通信电路功能运行时,所产生的高频电磁波辐射干扰,通过音频传输线路窜入模拟音频信号之中,从而产生电磁干扰噪声。
- 电源干扰和接地回路噪声。电源电路中的尖峰、脉冲、浪涌等,通过电源线路窜入音频线路,以及不同电路部分的地线接地电位差导致电流环路,这些电源和接地方面的噪声会对音频的小模拟信号产生显著影响。
从以上音频噪声的来源总结可以看到,这些音频噪声大多数来源于硬件设备相关的设计和实现,其中部分噪声来源是可以优化的,例如通过优化电源接地设计,以及调整布局改善音频线路处理模块的电磁干扰状况,但是不可否认的是,消费类电子产品的结构和电子设计方面的局限性,会导致部分干扰因素无法从硬件层面完全解决。此时就要想办法利用Audio Codec中的音频增强功能甚至软件层面上的音频噪声过滤算法来提升音频采集的质量。
噪声的典型分类及其处理
从总体上,音频背景噪声可以分为两类:平稳噪声和瞬时噪声。
平稳噪声的最大特点就是其统计特性((如均值、方差、频谱分布)不随时间变化。
- 平稳噪声在时域上,振幅波动较小,呈现出规律性分布(如高斯分布)。
- 在频域方面,其频谱连续且稳定,例如白噪声会覆盖全频带。
- 比较典型的平稳噪声场景包括:高斯白噪声、电子设备的热噪声、量化噪声、持续的背景环境噪声(如空调声、风扇声等)。
瞬时噪声则是突发性强、持续时间短(毫秒至秒级)的噪声,其统计特性一般会随时间剧烈变化。
- 在时域方面,瞬时噪声一般具有高幅值、短时间冲击的特性。
- 在频域方面,其能量一般集中在高频或者特定的频段。
- 典型的瞬时噪声包括脉冲噪声(敲击键盘声音、敲门声、开关)、机械冲击声、不规则的电磁干扰(如静电放电)等。
总的来讲,对于平稳噪声的处理,因为其统计特性及其频谱分布相对比较稳定,容易识别,因此可以根据噪声的频谱特性和具体的信号特征进行针对性抑制,相对容易处理。但是瞬时噪声在时域上突发性很强,而且频谱基本上总是和正常语音的频谱混叠在一起,很难进行抑制,因此技术上对于瞬时噪声如何有效的抑制缺乏好的解决方案。
典型的音频降噪算法:谱减法,自适应LMS滤波
下图是典型的音频降噪算法的处理流程图。无论是传统的信号处理算法,还是基于AI增强处理的思路,最终都是要对音频噪声的类型进行检测,对噪声模型进行建模,然后基于噪声的模型针对性的进行处理。

以下以两个常用的传统音频数字信号处理模式的音频降噪算法,即谱减法和自适应LMS滤波法对音频降噪的流程进行解释和说明。
谱减法
谱减法是一种基于频域的噪声抑制技术,也就是通过对噪声频谱的估计和建模,在频域中从包含噪音的混合信号中减去噪声成分的处理方式。既然是基于频域的处理方式,那么总体的处理流程中,就不可避免地要使用FFT把时域中采集的音频采用数据序列转换成频域的频谱序列 ,在频域中进行处理后,再通过IFFT把处理后的信号转换回时域。这样的处理流程自然就涉及到加大的运算量。
谱减法的整体工作原理是,在语音静默段(也就是仅含噪声的时间里面)估计和建立噪声功率谱模板,然后从包含噪声信号在内的混合信号的功率谱中减去噪声模板的功率谱,从而达到只保留语音成分的目的。
基于谱减法进行音频噪声消除的工作流程大致如下:
- 首先对音频在时域中的采样数据序列分片处理,分片的时长固定并与要计算FFT的点数相一致,例如在16KHz音频采样,进行512点FFT计算的情况下,以32ms为单位进行音频数据的分片,一个音频分片单位就是一个音频帧。
- 对这个音频帧进行FFT计算,得到其频谱数据。
- 通过一个独立的VAD检测模块,检测当前是否处于语音静默期。在当前处于语音静默期的情况下,基于当前通过FFT计算得到的频谱序列对噪声功率谱模板进行动态的更新,使之与当前的噪声频谱状态相一致。
- 针对当前音频帧的频谱数据序列,在频域执行谱减运算:也就是把当前音频帧的频谱数据,与当前噪声功率谱模块的同频数据进行相减,在当前音频帧的频谱上减去噪声的功率谱,得到仅保留通话语音成分的频域数据。
- 最后再通过IFFT把处理过的数据从频域转换回到时域,重新合并为音频数据序列,恢复为时域的连续音频采样信号。
自适应LMS滤波算法
不同于在频域工作的谱减法,LMS滤波算法是一种在时域工作的自适应滤波器算法,通过动态比较音频实时采样的数据序列与滤波器的输出,通过其计算误差迭代调整滤波器系数,来实现最小化期望信号与滤波器输出之间的均方误差。
自适应LMS滤波器主要有两个参数:
- 滤波器阶数L:用于建模的噪声长度,用于匹配噪声的时间相关性。L越大,意味着对于每个音频采样的过滤会参考越多的历史采样数据,计算量也越大。典型值为64-256之间。
- 补偿μ:主要用于控制噪声变化跟踪的收敛速度和稳定性,典型值为0.001-0.01之间。
自适应LMS滤波算法的执行流程:
- 首先把当前要进行过滤的音频采样数据input,以及该采样之前的L-1个历史音频采样数据放在缓冲区History中。
- 基于History历史缓冲区数据以及LMS滤波器的当前参数W,计算LMS滤波器的输出值Y:累加历史采样数据History[i]与滤波器参数W[i]的乘积。
- 计算当前音频采样数据input与以上计算出来的LMS滤波器输出Y的差值E,这个差值E就是经过LMS自适应过滤的值。
- 基于以上差值E、历史缓冲区中的采样数据History[i]、LMS滤波器的μ对滤波器系统的运行参数W[i]进行更新。
- 返回以上计算出来的差值E。
以下是一段进行自适应LMS滤波算法处理的参考代码,可以配合理解以上的执行流程:
LMS自适应滤波算法在应用中还经常会配合双麦克风来实现更好的降噪效果。主麦克风靠近人的嘴部用于采集人说话的声音,副麦克风远离嘴部并放在噪声源附近(如耳机外侧)用于采集环境噪声,工作的过程中用副麦克风采集的环境噪声数据训练和更新LMS滤波器的参数,然后对主麦克风的音频采样数据进行过滤。这种方式对对周期性噪声(发动机声、风扇声)的抑制效果极佳。
- 当然,如果要使用主副麦克风的话,以上LMS过滤算法的执行流程和对应的代码,就需要增加一个参考音频信号(来自副麦克风)的采样序列,History和LMS滤波器的输出及其参数更新基于副麦克风的采样数据进行计算,对于主麦克风采样数据的过滤则使用主麦克风的采样数据减去LMS滤波器的输出即可。
从以上的谱减法和自适应LMS滤波算法的实现比较来看,谱减法要涉及到频域和时域之间的两次相互转换,因此数据的计算量是比较大的,但是对于一帧音频数据进行一次运算;而自适应LMS滤波算法是直接在时域中进行运算,但是针对每个采样都需要执行两次与滤波器阶数相同的浮点数运算,分别用于计算滤波器输出和更新滤波器的运行参数,所以如果滤波器阶数比较高的话,计算量也会比较可观。但是总的来说,后者对于计算资源的要求更低,更适合用于资源有限的嵌入式系统。
音频自动增益控制AGC
在音频通话和视频会议中,音频自动增益控制AGC模块的主要作用:
- 稳定音频信号的输出电平。无论麦克风采集信号的强弱(如用户离麦克风远近程度不同),尽可能保证音频采集模块的输出音量保持相对一致,不会偏大造成消波,也不会偏小导致听不清楚。
- 动态适应音量采集的变化环境。即可以应对环境中噪音变化、设备差异(如不同麦克风灵敏度)、用户说话习惯差异,动态自动调整语音信号的强度,使得其输出保持在一个合适的水平。
在常见的消费类电子产品的音频编解码器Audio Codec的处理链路之中,AGC模块一般工作中经过ADC转换之后的数字域处理环节,通过DSP算法来实现动态调整语音信号数据增益的功能,这样的处理方式灵活性更好,并且可以与其他DSP算法如降噪、AEC等协同优化。当然,一些低端的Audio Codec(例如TLV320AIC3101)内部缺少丰富的数字音频处理功能,那么AGC模块也可以直接在模拟域对PGA的增益进行调节来实现自动增益控制的效果。如下图是TLV310AIC3101的AGC处理链路。

另外,我们只有在音频信号的输入链路的处理中,也就是对麦克风采集语音信号的处理中,才会用到AGC动态调整增益来实现语音信号强度基本保持一致的效果;在音频信号的输出链路,也就是对扬声器播放语音信号的处理链路之中,一般是不需要AGC的,此时对于输出语音信号的大小通常由用户手动设置或系统音量管理,无需自动增益。
AGC音频处理链路与VAD模块
一般而言,从麦克风采集到的声音信号中,除了真正的我们想要保留的本地端语音信号以外,不可避免地还会包含有一定的噪声、双向对接状态下的回声等,而AGC既然是通过调整音频采样数据的增益来维持音量的稳定性,那么其要稳定的对象势必是尽可能去除了噪声和回声的本地端语音信号,这就是在音频3A链路中,应该把AGC放在AEC和ANS之后进行处理的原因所在,因为我们要进行音量自动增益控制的对象并不包含回声和噪声。

以上的噪声和回声分别在ANS和AEC环节处理后,在AGC自动增益控制的处理流程中,还包含一个VAD(语音活动检测)模块用于决定何时启动音频采样数据的增益调整。VAD模块的主要目标就是对麦克风连续采集的语音信号区分为语音段与非语音段(如静默或背景噪声),只在语音段才会激活AGC对音频数据的增益进行动态控制,非语音段抑制增益调整或维持固定增益,防止放大噪声,避免AGC的动态增益调整对非语音信号产生负面影响。
VAD模块对于语音段和非语音段的判决,以音频帧为单位,对音频帧内音频采样数据的均方根能量进行统计,与VAD模块维护的动态本地噪声的能量进行比较,若当前帧能量高于动态噪声本底+固定偏移(如+3dB),可判定为语音段候选,再结合状态机控制机制(如连续多帧高于阈值判定为语音段,连续多帧低于阈值判定为非语音段),给出语音段和非语音段的最终判决。
AGC的处理流程
1.音频采样数据的预处理
如上所述,AGC工作在Audio Codec的数字域,也就是对麦克风采集信号经过ADC以及其他音频处理模块处理后的数字采样序列中执行自动增益处理的流程。在该环节,首先对连续的音频采样数据进行切片处理,把连续的音频数据切分为固定采样数量的音频帧,后续的AGC处理是以音频帧为单位。
在AGC的分帧处理上,一般会采用50%重叠的方式进行处理,即当前音频帧的前50%采样与上一个音频帧的后50%采样相同,以平滑音频帧的边界效应,避免两个连续的音频帧增益不同造成的突变。
2.VAD检测
如上所述,VAD模块通过比较当前音频的帧能量与噪声本底的能量,判断当前音频帧处于语音段还是非语音段。
AGC的流程中一般仅在语音段触发AGC增益调整。
3. 自动增益的计算阶段
自动增益的计算阶段要依赖于AGC模块的几个提前预设值:
- 目标电平,也就是对于AGC模块的调整而言,期望AGC模块的输出能够达到的目标音量水平。
- 时间常数,表示增益调整的时间参数,用于控制增益调节的平滑度,避免声音音量忽大忽小。
在计算增益时,对当前音频帧的能量和目标电平进行比较,当当前帧能量高于目标电平时,应适当减小增益以避免音频采样数据叠加增益后过载;而如果当前帧能量低于目标电平,则增大增益提高音量的幅度。
针对信号的动态范围比较小(信号幅度的差异不大)的应用场景,一般就可以简单的选择线性增益调整模式:即根据当前音频帧的能量与目标电平的差异确定一个增益的大小,对所有的音频采样进行相同的增益调整。
而针对复杂信号环境(如突发噪声、多频段干扰),则需采用非线性增益的调整策略:
- 动态范围压缩(DRC)。DRC是一种通过非线性增益调整信号动态范围的技术,不仅可以用于语音信号的处理,也广泛应用于通信系统和智能设备领域中。DRC的工作大致依赖于三个参数:threshold_low、threshold_high和ratio。其工作逻辑大概为:当音频采样的幅度和能量低于threshold_low阈值的时候,DRC就会设置比较低的增益以抑制噪声;当音频采样的幅度和能量在threshold_low和threshold_high之间的时候,DRC按照前面计算出来的目标增益对该音频采样进行设置;而当音频采样的幅度和能量大于threshold_high时,就按照ratio的设置,对这个音频采样的增益进行适当压缩,以避免出现消顶的问题。
- 多频段增益控制。首先通过FFT运算执行频带分割,把信号分为低频、中频、高频子带;然后对每个子带单独计算并调整增益,这样可以避免整体调整所导致的频谱失衡问题,整个处理方式有点类似于EQ的工作流程了,对于不同频段设置不同的增益,或者抑制,或者增强。
此外,自动增益计算和调整的时间常数则主要包含两种类型的时间参数,用于实现增益和调整后语音幅度的平滑和自然变化:
- 启动时间(Attack Time):当音频信号的幅度突增时,快速降低增益(典型值20~100ms),防止出现瞬时过载的问题。
- 释放时间(Release Time):当信号幅度减弱时,则缓慢恢复增益(典型值100~2000ms)。
4.增益的应用阶段及其后处理
AGC处理的最后阶段,就是把计算阶段所计算出来的增益应用到当前音频帧的所有采样数据上。根据前一阶段采用线性或者非线性的增益计算策略,针对性的对音频采样设置一致或者不一致的增益。
此外,经过以上AGC处理以后的音频采样序列数据,还需要限制其幅值(如-1dBFS),防止DAC或扬声器过载;以及与前面阶段的AEC、ANS等音频处理模块反馈联动,实现对音频数据的稳定控制。
参考资料
- [音频自动增益控制 AGC 解决的问题及原理解析 - 知乎](https://zhuanlan.zhihu.com/p/605499691