回声消除中的LMS和NLMS算法与MATLAB实现
自适应滤波是数字信号处理的核心技术之一,在科学和工业上有着广泛的应用领域。自适应滤波技术应用广泛,包括回波抵消、自适应均衡、自适应噪声抵消和自适应波束形成。回声对消是当今通信系统中普遍存在的现象。声回波引起的信号干扰会分散用户的注意力,降低通信质量。本文重点介绍了LMS和NLMS算法的使用,以减少这种不必要的回声,从而提高通信质量
关键词:自适应滤波器,自适应算法,回声消除
1 引言
当音频信号在真实环境中产生混响时,就会产生声学回声,从而导致原始信号加上信号[1]的衰减、延时图像。本文将重点研究通信系统中声学回波的产生。
自适应滤波器是一种动态滤波器,它不断地改变其特性以获得最优的输出。自适应滤波算法通过改变参数使期望输出d (n)与实际输出y (n)之间的差值最小化。该函数称为自适应算法的代价函数(loss)。图1显示了自适应回声抵消系统的框图。其中,滤波器H(n)表示声环境的脉冲响应,W(n)表示用来抵消回波信号的自适应滤波器。自适应滤波器的目标是使输出的y(n)与期望的d(n)(在回声环境中混响的信号)相等。在每次迭代中,误差信号e(n)=d (n)-y (n)被反馈回滤波器,滤波器的特性也随之改变。
自适应回声消除系统
自适应滤波器的目标是计算期望信号与自适应滤波器输出之间的差值e(n)。该误差信号反馈到自适应滤波器,并通过算法改变其系数,以最小化该差值的函数,即代价函数。在声回波消除的情况下,自适应滤波器的最优输出与不需要的回波信号等值。当自适应滤波器输出等于期望信号时,误差信号为零。在这种情况下,回显信号将被完全取消,远用户将不会听到他们的任何原始语音返回给他们。
2. 最小均方(LMS)算法
最小均方(LMS)算法是由Widrow和Hoff在1959年通过对模式识别的研究首次提出的。由此成为自适应滤波中应用最广泛的算法之一。LMS算法是一种基于随机梯度的自适应滤波算法,它利用滤波器权重的梯度来收敛到最优的维纳解[2-4]。由于其计算简单而广为人知并被广泛使用。正是这种简单性使它成为判断所有其他自适应滤波算法的基准。
随着LMS算法的每次迭代,自适应滤波器的滤波抽头(tap)权值按照如下公式进行更新。
$$公式1:w(n+1)=w(n)2\mu e(n)x(n)$$
这里x(n)是延时输入值的输入向量,$x(n)=[x_1(n)x_2(n)...x_N(n)]^T=[x(n)x(n-1)...x(n-N+1)]^T$。向量$w(n)=[w_0(n)w_1(n)w_2(n)...w_{N-1}(n)]^T$代表自适应FIR滤波器抽头(tap)权向量在时刻n的系数。参数μ被称为步长参数和小正的常数。此步长参数控制更新因子的影响。μ必须选择一个合适的值LMS算法的性能,如果该值太小自适应滤波器的收敛时间会太长;如果μ太大自适应滤波器变得不稳定,导致其输出发散[5 - 8]。
2.1 LMS算法的实现
LMS算法的每次迭代都需要三个不同的步骤,顺序如下:
1. FIR滤波器的输出y(n)用公式2计算。
$$公式2:y(n)=\sum_{i=0}^{N-1}w(n)x(n-1)=w^T(n)x(n)$$
2. 误差估计的值按公式3计算。
$$公式3:e(n)=d(n)-y(n)$$
3.更新FIR向量的抽头tap权值,为下一次迭代做准备,如公式4所示。
$$公式4:w(n+1)=w(n)+2\mu e(n)x(n)$$
LMS算法在自适应滤波中得到广泛应用的主要原因是其计算简单,比其他常用的自适应算法更易于实现。LMS算法每次迭代需要2N加法和2N + 1次乘法(N用于计算输出y(N)),另一个用于通过向量乘法计算标量[9]。
clear;
clc;
snr=; % 信噪比
order=; % 自适应滤波器的阶数为8
Hn =[0.8783 -0.5806 0.6537 -0.3223 0.6577 -0.0582 0.2895 -0.2710 0.1278 ... % ...表示换行的意思
-0.1508 0.0238 -0.1814 0.2519 -0.0396 0.0423 -0.0152 0.1664 -0.0245 ...
0.1463 -0.0770 0.1304 -0.0148 0.0054 -0.0381 0.0374 -0.0329 0.0313 ...
-0.0253 0.0552 -0.0369 0.0479 -0.0073 0.0305 -0.0138 0.0152 -0.0012 ...
0.0154 -0.0092 0.0177 -0.0161 0.0070 -0.0042 0.0051 -0.0131 0.0059 ...
-0.0041 0.0077 -0.0034 0.0074 -0.0014 0.0025 -0.0056 0.0028 -0.0005 ...
0.0033 -0.0000 0.0022 -0.0032 0.0012 -0.0020 0.0017 -0.0022 0.0004 -0.0011 ];
Hn=Hn(:order);
mu=0.5; % mu表示步长
N=; % 横坐标1000个采样点
Loop=; % 150次循环
EE_NLMS=zeros(N,); % 不同步长的初始化误差
for nn=:Loop % epoch=
% 权重初始化w
win_NLMS=zeros(,order); % NLMS四种步长测试,四个权重——
error_NLMS=zeros(,N)'; % 初始化误差
% 均匀分布的输入值
r=sign(rand(N,)-0.5); % shape=(,)的(,)均匀分布-0.5,sign(n)>=;<=-
% 输出:输入卷积Hn得到 输出
output=conv(r,Hn); % r卷积Hn,output长度=length(u)+length(v)-
output=awgn(output,snr,'measured'); % 将白高斯噪声添加到信号中 % N=,每个采样点
for i=order:N % i=:
input=r(i:-:i-order+); % 每次迭代取8个数据进行处理
e_NLMS = output(i)-win_NLMS*input;
win_NLMS=win_NLMS+e_NLMS*input'/(input'*input); % NLMS更新权重
error_NLMS(i)=error_NLMS(i)+e_NLMS^;
end EE_NLMS=EE_NLMS+error_NLMS; % 把总误差相加
end
% 对总误差求平均值
error_NLMS=EE_NLMS/Loop; figure;
error_NLMS=*log10(error_NLMS(order:N));
plot(error_NLMS,'r'); % 红色
axis tight; % 使用紧凑的坐标轴
legend('NLMS算法'); % 图例
title('NLMS算法误差曲线'); % 图标题
xlabel('样本'); % x轴标签
ylabel('误差/dB'); % y轴标签
grid on; % 网格线
3 归一化最小均方(NLMS)算法
LMS算法的主要缺点之一是每次迭代都有一个固定的步长参数。这需要在开始自适应滤波操作之前了解输入信号的统计信息。实际上,这是很难实现的。即使我们假设自适应回声抵消系统的唯一输入信号是语音,但仍有许多因素如信号输入功率和振幅会影响其性能[10-12]。
归一化最小均方算法(NLMS)是LMS算法的扩展,LMS算法通过计算最大步长值来绕过这个问题。步长值的计算公式如下
$$Step\ size = \frac{1}{dot\ product(input\ vector,\ input\ vector)}$$
这个步长与输入向量x(n)的系数的瞬时值的总期望能量的倒数成正比。输入样本的期望能量之和也等于输入向量与自身的点积,以及输入向量自相关矩阵的迹R[13-15]。
$$公式5:tr[R]=\sum_{i=0}^{N-1}E[x^2(n-i)]\\ \quad\quad =E[\sum_{i=0}^{N-1}x^2(n-i)]$$
NLMS算法的递归公式如式6所示
$$公式6:w(n+1)=w(n)+\frac{1}{x^T(n)x(n)}e(n)x(n)$$
3.1 NLMS算法的实现
NLMS算法已在Matlab中实现。由于步长参数是根据当前的输入值来选择的,因此NLMS算法在未知信号下具有更大的稳定性。该算法具有良好的收敛速度和相对简单的计算能力,是实时自适应回波抵消系统[16]的理想算法。
由于NLMS是标准LMS算法的扩展,因此NLMS算法的实际实现与LMS算法非常相似。NLMS算法的每次迭代都需要按照以下顺序执行这些步骤。
1. 计算了自适应滤波器的输出
$$公式7:y(n)=\sum_{i=0}^{N-1}w(n)x(n-i)=w^T(n)x(n)$$
2. 误差信号等于期望信号和滤波器输出之间的差值。
$$公式8:e(n)=d(n)-y(n)$$
3.计算了输入向量的步长值。
$$公式9:\mu(n)=\frac{1}{x^T(n)x(n)}$$
4. 滤波器抽头权重更新,为下一次迭代做准备。
$$公式10:w(n+1)=w(n)+\mu(n)e(n)x(n)$$
NLMS算法的每次迭代都需要3N+1次乘法,仅比标准LMS算法多N次。考虑到所获得的稳定性和回波衰减增益,这是一个可接受的增加。
clear;
clc;
snr=; % 信噪比
order=; % 自适应滤波器的阶数为8
% Hn是滤波器权重
Hn =[0.8783 -0.5806 0.6537 -0.3223 0.6577 -0.0582 0.2895 -0.2710 0.1278 ... % ...表示换行的意思
-0.1508 0.0238 -0.1814 0.2519 -0.0396 0.0423 -0.0152 0.1664 -0.0245 ...
0.1463 -0.0770 0.1304 -0.0148 0.0054 -0.0381 0.0374 -0.0329 0.0313 ...
-0.0253 0.0552 -0.0369 0.0479 -0.0073 0.0305 -0.0138 0.0152 -0.0012 ...
0.0154 -0.0092 0.0177 -0.0161 0.0070 -0.0042 0.0051 -0.0131 0.0059 ...
-0.0041 0.0077 -0.0034 0.0074 -0.0014 0.0025 -0.0056 0.0028 -0.0005 ...
0.0033 -0.0000 0.0022 -0.0032 0.0012 -0.0020 0.0017 -0.0022 0.0004 -0.0011 ];
Hn=Hn(:order);
mu=0.5; % mu表示步长
N=; % 横坐标1000个采样点
Loop=; % 150次循环
% 不同步长的初始化误差
EE_LMS = zeros(N,);
EE_NLMS=zeros(N,);
for nn=:Loop % epoch=
win_LMS = zeros(,order); % 权重初始化w
error_LMS=zeros(,N)'; % 初始化误差
% 均匀分布的语音数据输入
r=sign(rand(N,)-0.5); % shape=(,)的(,)均匀分布-0.5,sign(n)>=;<=-
% 输出:输入卷积Hn得到 输出
output=conv(r,Hn); % r卷积Hn,output长度=length(u)+length(v)-
output=awgn(output,snr,'measured'); % 真实输出=将白高斯噪声添加到信号中 % N=,每个采样点
for i=order:N % i=:
input=r(i:-:i-order+); % 每次迭代取8个数据进行处理
e_LMS = output(i)-win_LMS*input; mu=0.02; % 步长
win_LMS = win_LMS+*mu*e_LMS*input';
error_LMS(i)=error_LMS(i)+e_LMS^;
end
% 把总误差相加
EE_LMS = EE_LMS+error_LMS; end
% 对总误差求平均值
error_LMS = EE_LMS/Loop; figure;
error1_LMS=*log10(error_LMS(order:N));
plot(error1_LMS,'b.'); % 蓝色
axis tight; % 使用紧凑的坐标轴
legend('LMS算法'); % 图例
title('LMS算法误差曲线'); % 图标题
xlabel('样本'); % x轴标签
ylabel('误差/dB'); % y轴标签
grid on; % 网格线
4 LMS算法的结果
利用Matlab对LMS算法进行了仿真。图2显示的是通过麦克风从计算机系统收集到的输入语音信号。图3显示了从输入信号派生出的所需回波信号。图4显示了自适应滤波器的输出,它将减少输入信号的回波信号。图5显示了由滤波器输出信号计算出的均方误差信号。图6是由回波信号对误差信号的分割得到的衰减。
自适应滤波器为1025阶FIR滤波器。步长设置为0.02。MSE表明,随着算法的发展,代价函数的平均值逐渐减小。
5 NLMS算法的结果
用Matlab对NLMS算法进行了仿真。图7显示了输入信号。图8显示了所需的信号。图9显示了自适应滤波器输出。图10显示了均方误差。图11显示了衰减。
自适应滤波器为1025阶FIR滤波器。步长设置为0.1。
NLMS算法在均方误差和平均衰减方面优于LMS算法,其性能总结如表1所示。
6 结论
由于其简单性,LMS算法是最流行的自适应算法。然而,LMS算法存在收敛速度慢和数据依赖的问题。
NLMS算法是LMS算法的一个同样简单但更健壮的变体,它在简单性和性能之间表现出比LMS算法更好的平衡。由于其良好的性能,NLMS在实时应用中得到了广泛的应用。
7. 参考
文章翻译自论文《2011_adaptive algorithms for acoustic echo cancellation in speech processing》
[1]. Homana, I.; Topa, M.D.; Kirei, B.S.; “Echo cancelling using adaptive algorithms”, Design and Technology of Electronics Packages, (SIITME) 15th International Symposium., pp. 317-321, Sept.2009.
[2]. Paleologu, C.; Benesty, J.; Grant, S.L.; Osterwise, C.; “Variable step-size NLMS algorithms for echo cancellation” 2009 Conference Record of the forty-third Asilomar Conference on Signals, Systems and Computers., pp. 633-637, Nov 2009.
[3]. Soria, E.; Calpe, J.; Chambers, J.; Martinez, M.; Camps, G.; Guerrero, J.D.M.; “A novel approach to introducing adaptive filters based on the LMS algorithm and its variants”, IEEE Transactions, vol. 47, pp. 127-133, Feb 2008.
[4]. Tandon, A.; Ahmad, M.O.; Swamy, M.N.S.; “An efficient, low-complexity, normalized LMS algorithm for echo cancellation”, IEEE workshop on Circuits and Systems, 2004. NEWCAS 2004, pp. 161-164, June 2004.
[5]. Eneman, K.; Moonen, M.; “Iterated partitioned block frequency-domain adaptive filtering for acoustic echo cancellation,” IEEE Transactions on Speech and Audio Processing, vol. 11, pp. 143-158, March 2003.
[6]. Krishna, E.H.; Raghuram, M.; Madhav, K.V; Reddy, K.A; “Acoustic echo cancellation using a computationally efficient transform domain LMS adaptive filter,” 2010 10th International Conference on Information sciences signal processing and their applications (ISSPA), pp. 409-412, May 2010.
[7]. Lee, K.A.; Gan,W.S; “Improving convergence of the NLMS algorithm using constrained subband updates,” Signal Processing Letters IEEE, vol. 11, pp. 736-739, Sept. 2004.
[8]. S.C. Douglas, “Adaptive Filters Employing Partial Updates,” IEEE Trans.Circuits SYS.II, vol. 44, pp. 209-216, Mar 1997.
[9]. D.L. Duttweiler, “Proportionate Normalized Least Mean Square Adaptation in Echo Cancellers,” IEEE Trans. Speech Audio Processing, vol. 8, pp. 508-518, Sept. 2000.
[10]. E. Soria, J. Calpe, J. Guerrero, M. Martínez, and J. Espí, “An easy demonstration of the optimum value of the adaptation constant in the LMS algorithm,” IEEE Trans. Educ., vol. 41, pp. 83, Feb. 1998.
[11]. D. Morgan and S. Kratzer, “On a class of computationally efficient rapidly converging, generalized NLMS algorithms,” IEEE Signal Processing Lett., vol. 3, pp. 245–247, Aug. 1996.
[12]. G. Egelmeers, P. Sommen, and J. de Boer, “Realization of an acoustic echo canceller on a single DSP,” in Proc. Eur. Signal Processing Conf. (EUSIPCO96), Trieste, Italy, pp. 33–36, Sept. 1996.
[13]. J. Shynk, “Frequency-domain and multirate adaptive filtering,” IEEE Signal Processing Mag., vol. 9, pp. 15– 37, Jan. 1992.
[14]. Ahmed I. Sulyman and Azzedine Zerguine, "Echo Cancellation Using a Variable Step-Size NLMS Algorithm", Electrical and Computer Engineering Department Queen's University.
[15]. D. L. Duttweiler, “A twelve-channel digital echo canceller,” IEEE Trans. Commun., vol. 26, no. 5, pp. 647–653, May 1978.
[16]. J. Benesty, H. Rey, L. Rey Vega, and S. Tressens, “A nonparametric VSS NLMS algorithm,” IEEE Signal Process. Lett., vol. 13, pp. 581–584, Oct. 2006.
回声消除中的LMS和NLMS算法与MATLAB实现的更多相关文章
- LMS、NLMS最优步长理论分析与Speex回声消除可能的改进想法
一.回声消除算法模型 先来分析下自适应回声消除的主要组成部分,大体上可以把回声消除模型分为两个部分 横向滤波器结构 滤波器系数自适应与步长控制 横向滤波器用脉冲响应w(n)[有的地方也称为回声路径]与 ...
- webRTC中回声消除(AEC)模块编译时aec_rdft.c文件报错:
webRTC中回声消除(AEC)模块编译时aec_rdft.c文件报错. 原因是: 局部变量ip跟全局变量冲突的问题,可以将局部变量重新命名一下,就可以通过编译了. aec_rdft.c修改以后文件代 ...
- 声学回声消除(Acoustic Echo Cancellation)
回声就是声音信号经过一系列反射之后,又听到了自己讲话的声音,这就是回声.一些回声是必要的,比如剧院里的音乐回声以及延迟时间较短的房间回声:而大多数回声会造成负面影响,比如在有线或者无线通信时重复听到自 ...
- Speex回声消除代码分析
先说明下,这里的代码流程是修改过的Speex流程,但与Speex代码差异不大,应该不影响阅读. (1)用RemoveDCoffset函数进行去直流 (2)远端信号预加重后放入x[i+frame_s ...
- Speex回声消除原理深度解析
这里假设读者具有自适应滤波器的基础知识.Speex的AEC是以NLMS为基础,用MDF频域实现,最终推导出最优步长估计:残余回声与误差之比.最优步长等于残余回声方差与误差信号方差之比,这个结论可以记下 ...
- 回声消除(AEC)原理
一.前言 因为工作的关系,笔者从2004年开始接触回声消除(Echo Cancellation)技术,而后一直在某大型通讯企业从事与回声消除技术相关的工作,对回声消除这个看似神秘.高端和难以理解的技术 ...
- Flex Flash Player回声消除的最佳方法
Adobe Flash Player 已经成为音频和视频播放的非常流行的工具.实际上,目前大多数因特网视频均使用 Flash Player观看. Flash Player 通过将许多技术进行组合可以提 ...
- speex 回声消除的用法
speex 回声消除的用法 分类: speex AEC 回声消除 2012-11-13 11:24 1336人阅读 评论(0) 收藏 举报 speex的回声消息 就是speex_echo_cancel ...
- Flex回声消除的最佳方法
Adobe Flash Player 已经成为音频和视频播放的非常流行的工具.实际上,目前大多数因特网视频均使用 Flash Player观看. Flash Player 通过将许多技术进行组合可以提 ...
随机推荐
- Unix 线程改变创建进程中变量的值(2)
执行环境:Linux ubuntu 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 ...
- Canvas动画基础之碰撞检测
在Canvas中进行碰撞检测,大家往往直接采用游戏引擎(Cocos2d-JS.Egret)或物理引擎(Box2D)内置的碰撞检测功能,好奇的你有思考过它们的内部运行机制吗?下面将针对基本的碰撞检测技术 ...
- 8.Linux用户管理(上)
1.什么是用户? 能正常登陆系统的都算用户 windows系统和linux系统的用户有什么区别? 本质上没有区别, linux支持多个用户同一时刻登陆系统, 互相之间不影响 而windows只允许同一 ...
- 20.Linux进程管理-企业案例
1.管理进程状态 当程序运行为进程后,如果希望停止进程,怎么办呢? 那么此时我们可以使用linux的kill命令对进程发送关闭信号.当然除了kill.还有killall,pkill 1.使用kill ...
- 关于托福改革后的难度、评分和拼分,听听ETS的老师怎么说
“笔者有幸于几天前去到ETS位于普林斯顿的总部学习,聆听了他们关于托福考试的发展和变革的说明,在这里向大家汇报一下此行的收获.” 当从车上下来那一刻起,我们便被那辽阔的绿草地和宜人的风景所吸引,伴随着 ...
- 哈夫曼树C++实现详解
哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树. 这个定 ...
- Ubuntu svn 安装 Rabbitvcs
先添加源 sudo add-apt-repository ppa:rabbitvcs/ppa 必要的话在源清单里面也添加一下 sudo gedit /etc/apt/sources.list 内容是 ...
- float使用0xFF
1. float f = 0xFFFFFFFF; 这一句完全是错误的用法,它不会使f变量内存变为4个0xFF,因为0xFFFFFFFF根本就不是有效的float数值,编译器无从处理,如果用printf ...
- 构造函数语义学——Copy Constructor 的构造操作
前言 在三种情况下,会以一个 object 的内容作为另一个 class object 的初值: object明确初始化 class X{...}; X x; X xx = x; object 被当作 ...
- 汇编语言——物理地址=段地址x16+偏移地址,检测点2.2
一.为什么 物理地址=段地址x16+偏移地址? 刚开始学时,我都笨到不明白为什么是2的N次方,咱把物理地址就当数字,计算机中数字是由很多位0或1自由组合的, 而每一位上要么是0要么是1,只有这两种情况 ...