我们常用的手机、消费类摄像头等产品的麦克风所采集的原始声音信号中往往包含了比较多的背景噪音,不仅影响用户录音和回放的使用体验,而且这些噪声数据还会降低音频编码的压缩效率,因此有必要对音频底噪进行抑制处理,这就是ANS(Auto Noise Suppression)功能的用武之地。
音频3A中对于环境噪音的控制,除了以上的自动噪声抑制ANS技术以外,还存在一个主动噪声消除ANC(Active Noise Cancellation)的环节。ANS与ANC的区别主要在于,前者是采用被动降噪的方式,分析环境噪声中频率成分针对性的对其滤波处理,尽可能保留清晰的语音部分,并提高音质;而后者常见于目前市场上非常流行的主动降噪耳机,针对环境中存在的噪音,对噪声声波的频率相位等分析,产生与噪声相位相反的声音信号来实现噪声抵消的效果。因此两者主要的区别就在于,ANS采用被动滤波的方式进行降噪,ANC则采用主动产生与噪声波形相位相反的方式来实现与噪声的相互抵消。一般而言,在消费类摄像头领域中,对于摄像头麦克风所采集声音数据的处理只会用到ANS,因此本文仅关注ANS方式的被动降噪处理机制。
1. 音频背景噪音的来源
一般来说,对于模拟系统来讲,噪声可产生于系统的各个环节之中,因此模拟系统更容易受到干扰而产生噪声,而对于数字设备而言,抗干扰和噪声的性能要好很多,噪声串入的薄弱环节总是设备中的A/D、D/A转换部分。在消费类电子领域,从成本等角度考虑,目前模拟音频元件和处理电路仍然是应用中的主流,所以该类型产品中因为各种干扰所造成的背景噪声等方面的声音质量劣化往往是产品开发中的难点所在。
总的来讲,消费类Camera产品的音频噪声主要来源于以下几个方面:
- • 设备电子元器件运行中的固有噪声。例如,电子元器件(电容、电阻等)在高频运行下本身就会产生细微的白噪声,这些噪声很容易被附近灵敏度高的麦克风拾取、放大后变得清晰可闻。
- • 电磁干扰。电路在高频开关切换的运行过程中,尤其设备内部空间中有无线通信电路功能运行时,所产生的高频电磁波辐射干扰,通过音频传输线路串入模拟音频信号之中,从而产生电磁干扰噪声。
- • 电源干扰和接地回路噪声。电源电路中的尖峰、脉冲、浪涌等,通过电源线路串入音频线路,以及不同电路部分的地线接地电位差导致电流环路,这些电源和接地方面的噪声会对音频的小模拟信号产生显著影响。
从以上音频噪声的来源总结可以看到,这些音频噪声大多数来源于硬件设备相关的设计和实现,其中部分噪声来源是可以优化的,例如通过优化电源接地设计,以及调整布局改善音频线路处理模块的电磁干扰状况,但是不可否认的是,消费类电子产品的结构和电子设计方面的局限性,会导致部分干扰因素无法从硬件层面完全解决。此时就要想办法利用Audio Codec中的音频增强功能甚至软件层面上的音频噪声过滤算法来提升音频采集的质量。
2. 噪声的典型分类及其处理
从总体上,音频背景噪声可以分为两类:平稳噪声和瞬时噪声。
平稳噪声的最大特点就是其统计特性((如均值、方差、频谱分布)不随时间变化。
- • 平稳噪声在时域上,振幅波动较小,呈现出规律性分布(如高斯分布)。
- • 在频域方面,其频谱连续且稳定,例如白噪声会覆盖全频带。
- • 比较典型的平稳噪声场景包括:高斯白噪声、电子设备的热噪声、量化噪声、持续的背景环境噪声(如空调声、风扇声等)。
瞬时噪声则是突发性强、持续时间短(毫秒至秒级)的噪声,其统计特性一般会随时间剧烈变化。
- • 在时域方面,瞬时噪声一般具有高幅值、短时间冲击的特性。
- • 在频域方面,其能量一般集中在高频或者特定的频段。
- • 典型的瞬时噪声包括脉冲噪声(敲击键盘声音、敲门声、开关)、机械冲击声、不规则的电磁干扰(如静电放电)等。
总的来讲,对于平稳噪声的处理,因为其统计特性及其频谱分布相对比较稳定,容易识别,因此可以根据噪声的频谱特性和具体的信号特征进行针对性抑制,相对容易处理。但是瞬时噪声在时域上突发性很强,而且频谱基本上总是和正常语音的频谱混叠在一起,很难进行抑制,因此技术上对于瞬时噪声如何有效的抑制缺乏好的解决方案
3. 典型音频降噪算法
下图是典型的音频降噪算法的处理流程图。无论是传统的信号处理算法,还是基于AI增强处理的思路,最终都是要对音频噪声的类型进行检测,对噪声模型进行建模,然后基于噪声的模型针对性的进行处理。
以下以两个常用的传统音频数字信号处理模式的音频降噪算法,即谱减法和自适应LMS滤波法对音频降噪的流程进行解释和说明。
3.1. 谱减法
谱减法是一种基于频域的噪声抑制技术,也就是通过对噪声频谱的估计和建模,在频域中从包含噪音的混合信号中减去噪声成分的处理方式。既然是基于频域的处理方式,那么总体的处理流程中,就不可避免地要使用FFT把时域中采集的音频采用数据序列转换成频域的频谱序列 ,在频域中进行处理后,再通过IFFT把处理后的信号转换回时域。这样的处理流程自然就涉及到加大的运算量。
谱减法的整体工作原理是,在语音静默段(也就是仅含噪声的时间里面)估计和建立噪声功率谱模板,然后从包含噪声信号在内的混合信号的功率谱中减去噪声模板的功率谱,从而达到只保留语音成分的目的。
基于谱减法进行音频噪声消除的工作流程大致如下:
- • 首先对音频在时域中的采样数据序列分片处理,分片的时长固定并与要计算FFT的点数相一致,例如在16KHz音频采样,进行512点FFT计算的情况下,以32ms为单位进行音频数据的分片,一个音频分片单位就是一个音频帧。
- • 对这个音频帧进行FFT计算,得到其频谱数据。
- • 通过一个独立的VAD检测模块,检测当前是否处于语音静默期。在当前处于语音静默期的情况下,基于当前通过FFT计算得到的频谱序列对噪声功率谱模板进行动态的更新,使之与当前的噪声频谱状态相一致。
- • 针对当前音频帧的频谱数据序列,在频域执行谱减运算:也就是把当前音频帧的频谱数据,与当前噪声功率谱模块的同频数据进行相减,在当前音频帧的频谱上减去噪声的功率谱,得到仅保留通话语音成分的频域数据。
- • 最后再通过IFFT把处理过的数据从频域转换回到时域,重新合并为音频数据序列,恢复为时域的连续音频采样信号。
3.2. 自适应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滤波算法处理的参考代码,可以配合理解以上的执行流程:
#define L 128 //阶数为128阶
#define FRAME_SIZE 256
#define MU 0.002f //μ为0.002f
float w[L]={0};// 滤波器系数
float x_history[L]={0};// 音频采样数据的历史缓冲区
voidprocess_frame(float*input,float*output){
for(int n =0; n < FRAME_SIZE; n++){
// 1. 更新输入历史(FIFO)
// 每次计算都把当前最新的音频采样数据放在x_history缓冲区的开头
memmove(x_history +1, x_history,(L-1)*sizeof(float));
x_history[0]= input[n];
// 2. 计算滤波器输出y
float y =0.0f;
for(int i =0; i < L; i++){
y += w[i]* x_history[i];
}
// 3. 计算误差e,实际上就是执行滤波处理
float e = input[n]- y;
// 4. 更新滤波器系数
for(int i =0; i < L; i++){
w[i]+= MU * e * x_history[i];
}
// 5. 输出降噪结果
output[n]= e;
}
}
LMS自适应滤波算法在应用中还经常会配合双麦克风来实现更好的降噪效果。主麦克风靠近人的嘴部用于采集人说话的声音,副麦克风远离嘴部并放在噪声源附近(如耳机外侧)用于采集环境噪声,工作的过程中用副麦克风采集的环境噪声数据训练和更新LMS滤波器的参数,然后对主麦克风的音频采样数据进行过滤。这种方式对对周期性噪声(发动机声、风扇声)的抑制效果极佳。
- • 当然,如果要使用主副麦克风的话,以上LMS过滤算法的执行流程和对应的代码,就需要增加一个参考音频信号(来自副麦克风)的采样序列,History和LMS滤波器的输出及其参数更新基于副麦克风的采样数据进行计算,对于主麦克风采样数据的过滤则使用主麦克风的采样数据减去LMS滤波器的输出即可。
从以上的谱减法和自适应LMS滤波算法的实现比较来看,谱减法要涉及到频域和时域之间的两次相互转换,因此数据的计算量是比较大的,但是对于一帧音频数据进行一次运算;而自适应LMS滤波算法是直接在时域中进行运算,但是针对每个采样都需要执行两次与滤波器阶数相同的浮点数运算,分别用于计算滤波器输出和更新滤波器的运行参数,所以如果滤波器阶数比较高的话,计算量也会比较可观。但是总的来说,后者对于计算资源的要求更低,更适合用于资源有限的嵌入式系统。