回声消除中的LMS和NLMS算法与MATLAB实现
⾃适应滤波是数字信号处理的核⼼技术之⼀,在科学和⼯业上有着⼴泛的应⽤领域。⾃适应滤波技术应⽤⼴泛,包括回波抵消、⾃适应均衡、⾃适应噪声抵消和⾃适应波束形成。回声对消是当今通信系统中普遍存在的现象。声回波引起的信号⼲扰会分散⽤户的注意⼒,降低通信质量。本⽂重点介绍了LMS和NLMS算法的使⽤,以减少这种不必要的回声,从⽽提⾼通信质量
关键词:⾃适应滤波器,⾃适应算法,回声消除
1 引⾔
幻想⼩说 www.7wx
当⾳频信号在真实环境中产⽣混响时,就会产⽣声学回声,从⽽导致原始信号加上信号[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=20; % 信噪⽐
order=8; % ⾃适应滤波器的阶数为8
Hn =[0.8783 -0.58060.6537 -0.32230.6577 -0.05820.2895 -0.27100.1278 ... % ...表⽰换⾏的意思
胆结石排石方法-0.15080.0238 -0.18140.2519 -0.03960.0423 -0.01520.1664 -0.0245 ...
0.1463 -0.07700.1304 -0.01480.0054 -0.03810.0374 -0.03290.0313 ...
-0.02530.0552 -0.03690.0479 -0.00730.0305 -0.01380.0152 -0.0012 ...
0.0154 -0.00920.0177 -0.01610.0070 -0.00420.0051 -0.01310.0059 ...
-0.00410.0077 -0.00340.0074 -0.00140.0025 -0.00560.0028 -0.0005 ...
0.0033 -0.00000.0022 -0.00320.0012 -0.00200.0017 -0.00220.0004 -0.001100];
Hn=Hn(1:order);
mu=0.5; % mu表⽰步长
N=1000; % 横坐标1000个采样点
Loop=150; % 150次循环
EE_NLMS=zeros(N,1); % 不同步长的初始化误差
for nn=1:Loop % epoch=150
鸡血藤的副作用和禁忌% 权重初始化w
win_NLMS=zeros(1,order); % NLMS四种步长测试,四个权重——1
error_NLMS=zeros(1,N)'; % 初始化误差
% 均匀分布的输⼊值
r=sign(rand(N,1)-0.5); % shape=(1000,1)的(0,1)均匀分布-0.5,sign(n)>0=1;<0=-1
% 输出:输⼊卷积Hn得到输出
output=conv(r,Hn); % r卷积Hn,output长度=length(u)+length(v)-1
output=awgn(output,snr,'measured'); % 将⽩⾼斯噪声添加到信号中
% N=1000,每个采样点
for i=order:N % i=8:1000
input=r(i:-1:i-order+1); % 每次迭代取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^2;
end
EE_NLMS=EE_NLMS+error_NLMS; % 把总误差相加
end
% 对总误差求平均值
error_NLMS=EE_NLMS/Loop;
figure;
error_NLMS=10*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=20; % 信噪⽐
order=8; % ⾃适应滤波器的阶数为8
% Hn是滤波器权重
Hn =[0.8783 -0.58060.6537 -0.32230.6577 -0.05820.2895 -0.27100.1278 ... % ...表⽰换⾏的意思
-0.15080.0238 -0.18140.2519 -0.03960.0423 -0.01520.1664 -0.0245 ...
0.1463 -0.07700.1304 -0.01480.0054 -0.03810.0374 -0.03290.0313 ...
-0.02530.0552 -0.03690.0479 -0.00730.0305 -0.01380.0152 -0.0012 ...
0.0154 -0.00920.0177 -0.01610.0070 -0.00420.0051 -0.01310.0059 ...
-0.00410.0077 -0.00340.0074 -0.00140.0025 -0.00560.0028 -0.0005 ...
0.0033 -0.00000.0022 -0.00320.0012 -0.00200.0017 -0.00220.0004 -0.001100];
Hn=Hn(1:order);
mu=0.5; % mu表⽰步长
N=1000; % 横坐标1000个采样点
Loop=150; % 150次循环
% 不同步长的初始化误差
EE_LMS = zeros(N,1);
EE_NLMS=zeros(N,1);
for nn=1:Loop % epoch=150
win_LMS = zeros(1,order); % 权重初始化w
error_LMS=zeros(1,N)'; % 初始化误差
% 均匀分布的语⾳数据输⼊
r=sign(rand(N,1)-0.5); % shape=(1000,1)的(0,1)均匀分布-0.5,sign(n)>0=1;<0=-1
% 输出:输⼊卷积Hn得到输出
output=conv(r,Hn); % r卷积Hn,output长度=length(u)+length(v)-1
output=awgn(output,snr,'measured'); % 真实输出=将⽩⾼斯噪声添加到信号中
% N=1000,每个采样点
for i=order:N % i=8:1000
input=r(i:-1:i-order+1); % 每次迭代取8个数据进⾏处理
e_LMS = output(i)-win_LMS*input;
mu=0.02; % 步长
win_LMS = win_LMS+2*mu*e_LMS*input';
error_LMS(i)=error_LMS(i)+e_LMS^2;
end
% 把总误差相加
EE_LMS = EE_LMS+error_LMS;
end
% 对总误差求平均值
error_LMS = EE_LMS/Loop;
figure;
error1_LMS=10*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。