一文读懂回声消除(AEC)
moboyou 2025-05-11 17:21 8 浏览
数字信号处理系列文章,理论+实践,持续更新,欢迎关注@平凡的兵 一起共成长
音频领域有3A问题,所谓3A,是指声学回声消除(AEC, Acoustic Echo Cancel)、背景噪声抑制(ANS, Automatic Noise Suppression)、自动增益控制(AGC, Automatic Gain Control),今天聊一聊AEC。
什么是AEC
从通讯回音产生的原因看,可以分为声学回音(Acoustic Echo)和线路回音(Line Echo),相应的回声消除技术就叫声学回声消除(Acoustic Echo Cancellation,AEC)和线路回声消除(Line Echo Cancellation, LEC), 声学回音是由于在免提或者会议应用中,扬声器的声音多次反馈到麦克风引起的;线路回音是由于物理电子线路的二四线匹配耦合引起的,本讲只讨论声学回声(包括线性回声信号和非线性回声信号)。
远端讲话者(A)的声音信号再传输给近端(B)后,在近端设备的扬声器播放出来,经过一系列声学反射,被近端设备的麦克风拾取,又传输给远端(A)的现象。声学回声将导致远端讲话者A在很短时间内,又听到了自己刚才的讲话声音。声学回声的产生过程如图所示。
使用 AEC 技术后,两端声音传输过程改变为如下图所示,进而从底层保证会议场景下声音的干净度。
数学化表示如下图。
远端信号x, 从听筒或喇叭spk播出,并经过空间传播,被麦克风mic接收,近端说话信号也进入麦克风mic,这样麦克风接收到的就是两个信号的叠加,即d。自适应滤波器w对x进行处理获得y(回声信号),d和y的差值作为误差e,传递给自适应滤波器,进行滤波器系数迭代更新。
AEC性能评价指标
指标1:ERLE(Echo Return Loss Enhancement,回声返回衰减增益):
ERLE值越大,则表明回声抵消效果越好。由于双讲或只有近端单讲时,e(n)中包含近端语音,导致很多情况下e(n)的能量远大于回声y(n)的能量,从而ERLE为负值,同时也无法衡量回声部分的消除情况。
对于优秀的回声消除器,ERLE增益必须不低于6dB。
指标2:SupperFactor(能量衰减因子)
AEC后输出能量与对应远端麦克风信号能量的比值。
指标3:Cohde(输出信号e(n)与麦克风信号d(n)的频谱相关性)
该值越接近1,说明输出信号中保留的麦克风信号频谱越多。考虑到麦克风信号d(n)主要由回声信号y(n)和近端语音v(n)构成,因此只有近端单讲情况下cohde的值才能接近1,双讲情况下cohde的值在0.5~0.9(取决于回声信号在该帧的占比),当cohde接近0时说明输出信号几乎不包含任何近端语音和回声的频谱成分。其计算公式如下:
指标4:Cohxe(输出信号e(n)与远端参考信号x(n)的频谱相关性)
该值越接近0,说明输出信号中残留的远端参考信号频谱越少,回声消除越彻底,其计算公式如下:
不同通话状态对应的参数指标:
(1)近端单讲(最大程度保持输出与麦克风信号一致):
Cohde:越接近1说明输出与麦克风信号越相似,越接近0说明两者差异越大,近端单讲时理想值为1。
Cohxe:越接近1说明输出与远端参考信号越相似,越接近0说明两者差异越大,即残留的远端参考信号频谱成分越少,理想值为0。
SuppFactor:越接近1说明输出与麦克风信号的能量越接近,越接近0说明AEC造成能量衰落越严重,近端单讲时理想值为1。
(2)远端单讲(最大程度抑制回声):
ERLE:值越大越好,则表明残留回声的能量相对值越小,回声抵消效果越好。
Cohde:越接近1说明输出与麦克风信号越相似,越接近0说明两者差异越大,远端单讲时理想值为0。
Cohxe:越接近1说明输出与远端参考信号越相似,越接近0说明两者差异越大,即残留的远端参考信号频谱成分越少,理想值为0。
SuppFactor:越接近1说明输出与麦克风信号的能量越接近,越接近0说明AEC造成能量衰落越严重,远端单讲时理想值为0。
(3)双讲(尽量抑制回声同时保留近端语音)
Cohde:越接近1说明输出与麦克风信号越相似,保留的近端语音频谱成分也越多;越接近0说明两者差异越大,保留的近端语音频谱成分也越少,双讲时理想值为0.5~0.9(取决于回声信号在该帧的占比)。
Cohxe:越接近1说明输出与远端参考信号越相似,越接近0说明两者差异越大,即残留的远端参考信号频谱成分越少,双讲时理想值为0。
SuppFactor:越接近1说明输出与麦克风信号的能量越接近,越接近0说明AEC造成能量衰落越严重,双讲时理想值为1。
AEC技术原理
典型回声消除技术框架如下图。
远端信号x从听筒或喇叭spk播出,并经过空间传播,被麦克风mic接收,近端说话信号也进入麦克风mic,这样麦克风接收到的就是两个信号的叠加,即d。自适应滤波器w对x进行处理获得y(回声信号),d和y的差值作为误差,传递给自适应滤波器,进行滤波器系数迭代更新。
远端参考信号(上图far-end signal)经过自适应滤波器w
远端参考信号经过空间传播(即经过Room Impulse Response)得到x'
目标误差
其实,自适应滤波器的作用就是来抵消房间冲击响应对x的影响,以误差最小为目标。
具体算法:
(1)LMS(least mean square)
LMS是最广泛应用的自适应滤波算法,以MSE误差为目标函数,以梯度下降为优化算法。NLMS是使用输入的功率对步长进行归一化的方法,可以取得更好的收敛性能。
算法复杂度:
LMS: (2M+1次乘法和2M次加法) * 序列长度
NLMS: (3M+1次乘法和3M次加法) * 序列长度
(2)Block LMS
LMS算法对输入数据是串行处理的,可以通过将输入数据分段并行处理,类似深度学习领域的mini-batch操作, 并且利用频域FFT来做快速卷积,大大减少计算复杂度。
首先需要将串行的LMS算法转变为分块处理,也就是Block LMS(BLMS)。 每次迭代,输入数据被分成长度为L的块进行处理。和LMS使用瞬时梯度来进行滤波器参数更新不同,BLMS使用L点的平均梯度来进行参数更新。 对第k块数据,BLMS算法递推公式为:
(3)Fast Block LMS
思想是利用FFT进行助攻加速,称作Fast Block LMS,或Frequency Domain Adaptive Filter。对于长度为M的滤波器,一般采用2M点的FFT(M点补零),且使用overlap-and-save的快速卷积方法。
算法复杂度
10MlogM +26M
(4)Partitioned Fast Block LMS
对滤波器的时长进行分割,达到降低时延的目的。又称Multidelay block filter(MDF)。
如果将长度为M的滤波器等分成长度为B的小段,M=P*B。则卷积的结果可以分解为个P卷积叠加。
双讲检测
存在远近端同时讲话场景,针对该场景,要进行双讲检查。
自适应滤波器有三种工作模式(通过DTD双讲检测):
- 远端语音存在,近端语音不存在:滤波、自适应滤波器系数更新
- 远端语音存在,近端语音存在:滤波
- 远端语音不存在:什么都不用做
Webrtc中的回声消除模块,已包含:双讲检测技术(语音活动检测,区分希腊佛中是否存在双端讲话)、自适应滤波技术(主要性能指标:跟踪性能、抗冲激性、鲁棒性和计算复杂性)、后处理(消除自适应滤波器的输出误差)。
双滤波器结构与双讲检测:
Speex 除了使用MDF作自适应滤波,还是用了双滤波器结构(Two-Path Method)。 双滤波器结构包括一个迭代更新的自适应Background Filter, 和一个非自适应的Foreground Filter。在自适应滤波器性能变坏、甚至发散时, AEC使用Foreground Filter的结果,并且重置Background Filter。 在Background Filter 性能变好时,将其参数下载到Foregound Filter。
这种双滤波器结构,可以实现隐式的双讲检测。 在双讲的情况下,Background Filter无法收敛,其更新结果不会保存下来,也就实现了区分双讲和非双讲的目标。
上图就是典型的双滤波器AEC结构,其核心就是将Background Filter下载到Foregound Filter的判决标准。一般而言,可以有着几方面的考虑:
Speex AEC使用的判决准则,可以从代码里面提炼出来,跟以上提到的几点不完全一样,是用Foreground Filter和Background Filter输出的残留功率之差来进行判别,
其中是Foreground Filter与麦克风信号之差的功率,是Background Filter与麦克风信号之差的功率, Dbf是两个Filter输出信号之差的平方。 于是判别公式可以写成
代码地址:
https://github.com/wavesaudio/Speex-AEC-matlab/blob/master/speex_mdf.m
% Logic for updating the foreground filter */
% For two time windows, compute the mean of the energy difference,
as well as the variance */
VAR1_UPDATE = .5;
VAR2_UPDATE = .25;
VAR_BACKTRACK = 4;
MIN_LEAK = .005;
st.Davg1 = .6*st.Davg1 + .4*(Sff-See);
st.Davg2 = .85*st.Davg2 + .15*(Sff-See);
st.Dvar1 = .36*st.Dvar1 + .16*Sff*Dbf;
st.Dvar2 = .7225*st.Dvar2 + .0225*Sff*Dbf;
update_foreground = 0;
% Check if we have a statistically significant reduction in the residual echo */
% Note that this is *not* Gaussian, so we need to be careful about the longer tail */
if (Sff-See)*abs(Sff-See) > (Sff*Dbf)
update_foreground = 1;
elseif (st.Davg1* abs(st.Davg1) > (VAR1_UPDATE*st.Dvar1))
update_foreground = 1;
elseif (st.Davg2* abs(st.Davg2) > (VAR2_UPDATE*(st.Dvar2)))
update_foreground = 1;
end
如果Background Filter过于发散,则应该重置,可将其重置为Foreground Filter。 其MATLAB代码如下:
% Do we update? */
if (update_foreground)
st.Davg1 = 0;
st.Davg2 = 0;
st.Dvar1 = 0;
st.Dvar2 = 0;
st.foreground = st.W;
% Apply a smooth transition so as to not introduce blocking artifacts */
for chan = 1:C
st.e(st.frame_size+1:N, chan) = (st.window(st.frame_size+1:N) .* st.e(st.frame_size+1:N, chan)) + (st.window(1:st.frame_size) .* st.y(st.frame_size+1:N, chan));
end
else
reset_background=0;
% Otherwise, check if the background filter is significantly worse */
if (-(Sff-See)*abs(Sff-See)> VAR_BACKTRACK*(Sff*Dbf))
reset_background = 1;
end
if ((-st.Davg1 * abs(st.Davg1))> (VAR_BACKTRACK*st.Dvar1))
reset_background = 1;
end
if ((-st.Davg2* abs(st.Davg2))> (VAR_BACKTRACK*st.Dvar2))
reset_background = 1;
end
if (reset_background)
% Copy foreground filter to background filter */
st.W = st.foreground;
% We also need to copy the output so as to get correct adaptation */
for chan = 1:C
st.y(st.frame_size+1:N, chan) = st.e(st.frame_size+1:N, chan);
st.e(1:st.frame_size, chan) = st.input(:, chan) - st.y(st.frame_size+1:N, chan);
end
See = Sff;
st.Davg1 = 0;
st.Davg2 = 0;
st.Dvar1 = 0;
st.Dvar2 = 0;
end
end
自适应滤波器步长优化
上述讲解的滤波器步长固定,其实也可以将步长作为参数,把固定步长优化成可变步长,并且通过当前的各段信号,推导出最优步长。
主要是基于论文On Adjusting the Learning Rate in Frequency Domain Echo Cancellation With Double-Talk.
下面摘录其中的主要结论。 最优步长等于残余回声方差与误差信号方差之比
为了计算残留回声的功率,定义泄漏因子, 取值在0~1之间
泄漏因子通过递归平均更新:
残留回声消除 Residual Echo Cancellation
自适应滤波器不能百分百消除回声,AEC的输出信号含有残留的回声信号,这个时候就需要一个Post-Filter,进行残留回声消除(Residual Echo Cancellation)。可以采用信号处理方法,也可以采用深度学习方法。
参考资料
[1] https://www.sohu.com/a/645659372_120122487
[2] https://blog.csdn.net/qq_44085437/article/details/123504211
[3] Speex回声消除,简书
- 上一篇:要安装Matlab,配什么电脑好?
- 下一篇:Matlab自带的彩蛋命令
相关推荐
- cvpr 2024|注意力校准用于解缠结的文本到图像个性化
-
AttentionCalibrationforDisentangledText-to-ImagePersonalization研究背景近年来,大规模文本到图像(T2I)模型取得了显著进展,能...
- 1080P的显示,4K的享受?NVIDIA DSR游戏实测!
-
游戏玩家对画质的要求越来越高,因此每到新一代显卡推出的时候,除了游戏性能的提升之外,也会采用提升画质的新技术。NVIDIA最新的Geforce900系列显卡也不例外,一起推出的DSR技术号称可以在1...
- 「学习OpenCV4」OpenCV线性滤波与非线性滤波总结
-
本文分享内容来自图书《学习OpenCV4:基于Python的算法实战》,该书内容如下:第1章OpenCV快速入门;第2章图像读写模块imgcodecs;第3章核心库模块core;第4章...
- 增益映射耦合局部正则化的图像重构算法
-
朱莉(西安科技大学计算机学院,陕西西安710054)摘要:针对当前的图像重构方法在对多帧超分辨率图像复原时,存在明显的模糊效应与振铃效应的不足,提出增益映射控制耦合局部正则化的图像重构算法。首...
- 图像处理——5种常见的平滑滤波
-
平滑滤波是一种简单又常见的图像处理操作。平滑图像的目的有很多,但通常都是为了减少噪声和伪影。在OpenCV中共有5种平滑滤波操作,分别是以下几种:测试代码如下:#include<iostream...
- C# 图像处理技术——简单的滤波去噪
-
在C#中,可以使用System.Drawing命名空间中的类来进行图像处理和滤波去噪操作。以下是一个示例代码,演示如何使用平均滤波器进行简单的去噪处理:usingSystem.Drawing;us...
- Java,OpenCV,图像模糊,归一化均值滤波,中值滤波器,高斯模糊
-
图像模糊图像模糊是图像处理中最简单和常用的操作之一,其主要目的之一是给图像预处理的时候降低图像噪声。图像模糊方法可以总结如下:1、归一化均值滤波器(API为blur())2、高斯滤波器(API为Ga...
- 带频偏校准的GMSK解调器设计与实现
-
郑婧怡1,高绍全1,姜汉钧1,张春1,王志华1,2,贾雯2(1.清华大学微电子所,北京100084;2.深圳清华大学研究院,广东深圳518055)摘要:提出了一种在零中频低功耗蓝牙接收机中使用...
- 图像滤波去噪方法及应用场景
-
在图像处理中,不同滤波方法针对不同类型的噪声和场景具有特定优势。以下是三种常见滤波器的特点和应用场景总结:1.高斯滤波(GaussianFilter)原理:基于高斯函数的加权平均,对邻域像素进行平...
- 多体系统动力学仿真软件(DAP)
-
多体系统动力学仿真软件(DAP)-北京西交智众软件科技有限公司–DAP软件简介DAP(DynamicsAnalysisPlatform)软件,源自西南交通大学沈志云院士带队轨道交通运载系统全国...
- 精品博文图文详解Xilinx ISE14.7 安装教程
-
在软件安装之前,得准备好软件安装包,可从Xilinx官网上下载:http://china.xilinx.com/support/download/index.html/content/xilinx/z...
- 酷睿 Ultra 5 和 Ultra 7,或者i5和i7差距多大?
-
#我来唠家常#提到ultra,我觉得看这个题目,应该主打轻薄本,或者设计本。分两个问题看:ultra7或者i7的优势,ultra相对老款处理器的优势Ultra7的最大优势是:多了2个大核心,这两个大...
- 直流-直流(DC-DC)变换电路
-
直流-直流(DC-DC)变换电路,可以将一种直流电源经过变换电路后输出另一种具有不同输出特性的直流电源,可以是一种固定电压或可调电压的直流电。按照电路拓扑结构的不同,DC-DC变换电路可以分成两种形式...
- Energies CL致命错误
-
期刊基础信息·刊号:ISSN1996-1073·全称:Energies·影响因子:3.2·分区:Q2(能源与燃料类)·版面费:2200瑞士法郎·年发文量:约4500篇CoverLett...
- 基于心电脉搏信号的无创血压算法研究
-
洋洋,陈小惠(南京邮电大学自动化学院,江苏南京210023)摘要:针对人体血压无创检测问题,提出了一种基于心电信号(Electrocardiogram,ECG)与光电容积脉搏波(Photople...
- 一周热门
- 最近发表
- 标签列表
-
- curseforge官网网址 (16)
- 外键约束 oracle (36)
- oracle的row number (32)
- 唯一索引 oracle (34)
- oracle in 表变量 (28)
- oracle导出dmp导出 (28)
- oracle 数据导出导入 (16)
- oracle两个表 (20)
- oracle 数据库 使用 (12)
- 启动oracle的监听服务 (13)
- oracle 数据库 字符集 (20)
- powerdesigner oracle (13)
- oracle修改端口 (15)
- 左连接 oracle (15)
- oracle 标准版 (13)
- oracle 转义字符 (14)
- asp 连接 oracle (12)
- oracle安装补丁 (19)
- matlab三维图 (12)
- matlab归一化 (16)
- matlab求解方程 (13)
- matlab坐标轴刻度设置 (12)
- matlab脚本 (14)
- matlab求逆 (12)
- matlab多项式拟合 (13)