一种改进的自适应滤波LMS算法与仿真实现

一、综述
    自适应滤波是近30年以来发展起来的 一种最佳滤波方法。它是在维纳滤波,kalman滤波等线性滤波基础上发展起来的一种最佳滤波方法。由于它具有更强的适应性和更优的滤波性能。从而在工程实际中,尤其在信息处理技术中得到广泛的应用。自适应滤波的研究对象是具有不确定的系统或信息过程。“不确定”是指所研究的处理信息过程及其环境的数学模型不是完全确定的。其中包含一些未知因数和随机因数。任何一个实际的信息过程都具有不同程度的不确定性,这些不确定性有时表现在过程内部,有时表现在过程外部。从过程内部来讲,描述研究对象即信息动态过程的数学模型的结构和参数是我们事先不知道的。作为外部环境对信息过程的影响,可以等效地用扰动来表示,这些扰动通常是不可测的,它们可能是确定的,也可能是随机的。此外一些测量噪音也是以不同的途径影响信息过程。这些扰动和噪声的统计特性常常是未知的。面对这些客观存在的各种不确定性,如何综合处理信息过程,并使某一些指定的性能指标达到最优或近似最优,这就是自适应滤波所要解决的问题。

二、 自适应滤波器的基本原理
    所谓的自适应滤波,就是利用前一时刻以获得的滤波器参数的结果,自动的调节现时刻的滤波器参数,以适应信号和噪声未知的或随时间变化的统计特性,从而实现最优滤波。自适应滤波器实质上就是一种能调节其自身传输特性以达到最优的维纳滤波器。自适应滤波器不需要关于输入信号的先验知识,计算量小,特别适用于实时处理。由于无法预先知道信号和噪声的特性或者它们是随时间变化的,仅仅用FIR和IIR两种具有固定滤波系数的滤波器无法实现最优滤波。在这种情况下,必须设计自适应滤波器,以跟踪信号和噪声的变化。
自适应滤波器的特性变化是由自适应算法通过调整滤波器系数来实现的。一般而言,自适应滤波器由两部分组成,一是滤波器结构,二是调整滤波器系数的自适应算法。自适应滤波器的结构采用FIR或IIR结构均可,由于IIR滤波器存在稳定性问题,因此一般采用FIR滤波器作为自适应滤波器的结构。图1示出了自适应滤波器的一般结构。
    图1中,x(n)为输入信号,y(n)为输出信号,d(n)为参考信号或期望信号,e(n)则是d(n)和y(n)的误差信号。自适应滤波器的滤波器系数受误差信号e(n)控制,根据e(n)的值和自适应算法自动调整。

三、 最小均方(LMS)自适应算法的基本原理

    最小均方(LMS)自适应算法就是一种已期望响应和滤波输出信号之间误差的均方值最小为准的,依据输入信号在迭代过程中估计梯度矢量,并更新权系数以达到最优的自适应迭代算法。LMS算法是一种梯度最速下降方法,其显著的特点是它的简单性。这算法不需要计算相应的相关函数,也不需要进行矩阵运算。

令d(n)表示“期望输出信号”,定义误差信号e(n)为
e(n)=d(n)一y(n)=d(n)一x(n) Tw(n)=d(n)-w(n)Tx(n)  (1)
为了方便起见,将上述式子表示为向量形式,令信号矢量为:x(n)=[x1(n), x2(n),…, xM(n)]T。权矢量为:w(n)=[w1(n), w2(n),…, wM(n)]T。则上述式子表示为:
y(n)=wT(n)x(n)  (2)
误差序列可写为e(n)=d(n)-y(n)=d(n)-wT(n)x(n)  (3)
显然,自适应滤波器控制机理是用误差序列e(n)按照某种准则和算法对其系数

{ wi(n)},i=1,2,…,M进行调节的,最终使自适应滤波的目标(代价)函数最小化,达到最佳滤波状态。按照均方误差(MSE)准则所定义的代价函数是:
F(e(n)) = E[e2(n)] = E[d2(n)-2d(n)y(n)+y2(n)]  (4)
将式(2),(3)代入(4),目标函数可写成
F(e(n)) = [d2(n)]-2wTP+wTRw (5)
其中,R=E[x(n)xT(n)]是输入信号的自相关矩阵;P=E[d(n)x(n)]是期望信号与输入信号的互相关矢量。
由式(5)可见,自适应滤波器的代价函数是延迟线抽头系数的二次函数。当矩阵R和矢量P已知时,可以由权系数矢量w直接求其解。将式(5)对w求其偏导数,并令其等于零,同时假设R是非奇异的,由此可得代价函数最小的最佳滤波系数w*为
w*=R-1P (6)
这个解称为维纳解,即最佳滤波系数值。因为均方误差(MSE)函数是滤波系数w的二次方程,由此形成一个多维的超抛物面,这好像一个碗状曲面又具有唯一的碗底最小点,通常称之为自适应滤波器的误差性能曲面。当滤波器工作在平稳随机过程的环境下,这个误差性能曲面就具有固定边缘的恒定形状。自适应滤波系数的起始值{wi(0)},i=1,2,…,M是任意值,位于误差性能曲面上某一点,经过自适应调节过程,使对应于滤波系数变化的点移动,朝碗底最小点方向移动,最终到达碗底最小点,实现了最佳维纳滤波。
    自适应过程是在梯度矢量的负方向接连的校正滤波系数的,即在误差性能曲面的最陡下降法方向移动和逐步校正滤波系数,最终到达均方误差为最小的碗底最小点,获得最佳滤波或准最优工作状态。
    令代表n时刻的M×1维梯度矢量,M等于滤波器系数的数目;w(n)为自适应滤波器在n时刻的滤波系数或权矢量。按照最陡下降法调节滤波系数,则在n+1时刻的滤波系数或权矢量w(n+1)可以用下列简单递归关系来计算:

最陡下降法每次迭代都需要知道性能曲面上某点的梯度值,而实际上梯度只能根据观测数据进行估计。LMS算法是一种很有用且很简单的估计梯度的方法,这种算法自60年代初提出以后很快得到广泛应用,它的突出优点是计算量小、易于实现,且不要求脱线计算日。只要自适应线性组合器每次迭代运算时都知道输入信号和参考响应,那么,选用LMS算法就很合适的。
LMS算法的最核心思想是用平方误差代替均方误差。这样,

该式说明,LMS算法实际上是在每次迭代中使用很粗略的梯度估计值来代替精确值。不难预计,权系数的调整路径不可能准确地沿着理想的最陡下降的路径,因而权系数的调整过程是有“噪声”的。LMS算法按照式(9)调整权系数时不需要进行平方运算和统计平均运算,因而实现起来很简单。下一时刻权矢量w(n+1)等于当前权矢量w(n)加上一个修正量,该修正量等于误差信号e(n)的加权值,加权系数为2\mux(n),

它正比于当前的输入信号。值得注意的是,对权矢量的所有分量来说,误差信号e(n)是相同的,并且LMS算法得到的权矢量的期望值与最陡下降法得到的权矢量本身都服从相同的迭代计算规律,当收敛的必要条件满足时,随着迭代次数趋进于无穷,权矢量的期望值将趋近于最佳权矢量。
由上式可得到自适应LMS算法如同最陡下降法,利用时间n=0的滤波系数矢量为任意的起始值w(0),然后开始LMS算法的计算,其步骤如下:
a.由现在时刻n的滤波器滤波系数矢量估值 w(n),输入信号矢量x(n)及期望信号 d(n),计算误差信号:e(n)=d(n)-xT(n) w(n)  (10)
b.利用递归法计算滤波系数矢量的更新估值: 


c.将时间指数n增加1,回到第一步骤,重复上述计算步骤,一直到达稳定状态

c.将时间指数n增加1,回到第一步骤,重复上述计算步骤,一直到达稳定状态为止。
    由此可见,自适应LMS算法简单,它既不需要计算输入信号的相关函数,又不要求矩阵之逆。因而得到了广泛的应用。但是,由于LMS算法采用梯度矢量的瞬时估计,它有大的方差,以致不能获得最优滤波性能。

d.下面给出了LMS算法的MATLAB主要程序段

wl=0;         %权系数初值

w2=0;

e=zeros(1,length(x));

y=0;

u=0.05;

for i=1:1000    %LMS算法

y=wl x1(i)+w2 x2(i);

e(i)=x(i)-y;

wl=wl+2*u*e(i)*xl(i);

w2=w2+2*u*e(i)*x2(i);

若不希望用与估计输入信号矢量有关的相关矩阵来加快LMS算法的收敛速度,那么可用变步长方法来缩短其自适应收敛过程,其中一个主要的方法是归一化LMS算法(NLMS算法),NLMS使得算法对输入信号较大的情况下避免梯度噪声放大的干扰,因而具有更好的收敛性能。

归一化LMS 算法可以看作是时变步长参数的LMS算法。算法的指导思想是:时刻根据滤波器的输入x(n)来时刻调整算法的步长μ(n),x(n)与稳态误差成正比,μ(n)则与稳态误差成反比,随着输入x(n)的逐渐增大,滤波器的稳态误差也会逐渐增大,此时需要通过调整步长μ(n)来减小稳态误差。归一化LMS 算法是通过输入向量x(n)的平方欧氏范数对步长μ进行“归一化”。归一化LMS 算法的变步长μ的公式为:

法的初始步长μ1,随着输入的增大,变步长μ(n)逐渐的减小,算法的稳态误差也相应逐步减小,具有很好的跟踪收敛效果。可见归一化LMS 算法与变步长LMS算法相比,具有更快的收敛速度与更小的稳态误差。

下面给出了NLMS算法的MATLAB主要程序段

for i=1:100000                 %NLMS算法

    y=w1*x1(i)+w2*x2(i);

     r(i)=x(i)*x(i)';            %自相关矩阵

     fai=.0001; %修正参数,为防止x(i)*x(i)'过小导致步长值太大而设置的

     e(i)=x(i)-y;

     error(i)=s(i)-e(i);

     ee=error(i)^2;

    if ee>0.0005;

        ee=0.0005;

   end    

    mu=xuanze(mu,ee);

    w1=w1+mu*e(i)*x1(i)/(r(i)+fai);  %NLMS变步长

    w2=w2+mu*e(i)*x2(i)/(r(i)+fai);  %NLMS变步长

 end

五、 变步长LMS自适应滤波算法原理

    收敛速度、时变系统的跟踪能力及稳态失调是衡量自适应滤波算法优劣的三个最主要的技术指标。由于LMS算法的加权矢量w(n)具有随机性,使得LMS算法在E[w(n)]收敛到最佳值w*后,加权矢量w(n)继续按公式(12)变化,其修正量2μe(n)x(n)不为零而是其修正量2μe(n)x(n)不为零而是继续随机起伏,从而使得LMS算法的E[w(n)]收敛到w*后,均方误差ξ将大于维纳误差ξmin。同时,由于输入端不可避免地存在干扰噪声,LMS算法将产生参数失调噪声。干扰噪声Vn越大,所引起的失调噪声就越大。步长因子μ值对E[wi(n)]的收敛过程有着很大的影响,值必须满足收敛条件。此外,在收敛范围内,μ值越大,E[wi(n)]收敛越快。但μ过大时,过度过程将出现振荡,MSE也会变大;减小μ值可以减小自适应滤波算法的稳态失调噪声,提高算法的精确度。然而,步长因子μ的减小将降低算法的收敛速度和跟踪速度。因此,固定步长的自适应滤波算法在收敛速度、时变系统跟踪速度与收敛精度方面对步长因子μ的要求是相互矛盾的。
    变步长NLMS算法在很大程度上减少了基本LMS算法在收敛过程中对梯度噪声的放大作用。在训练均衡器抽头系数时,如果在算法简单的同时要求获得较佳的MSE和较快的收敛速度,NLMS将是一种比较好的选择。为了进一步提高性能,这种变步长的更新算法改进了NLMS算法,计算量增加很少,但是能显著地提高收敛速度,并且收敛后能达到更小且稳定的MSE。这种算法的步长迭代更新方程如下:

定了最大可能的收敛速度,μmin 保证了较小的稳态误差。与固定步长的算法相比,变步长算法的优越性在于:自适应算法的开始阶段时,误差e(n)比较大,根据式(14)步长μ(n)也相应地大,从而得到较快的收敛速度。当误差逐渐减小时,μ(n)变小,因此稳态误差也很小。与固定步长LMS算法相比,变步长的LMS 算法不仅有收敛快,稳态误差小的优点,而且在相同信噪比的环境中仍能保持较好的性能。

下面给出了变步长LMS算法的MATLAB主要程序段

(a)

function [mu]=xuanze(mu,ee)  %定义变步长功能函数

mumax=0.20;                  %步长上界

mumin=0.00001;               %步长下界

a=0.99;r=0.0008;             %步长变化参数

if mu>mumax                  %设置步长上下界

    mu=mumax;

elseif mu<mumin

    mu=mumin;

else

    mu=a*mu+r*ee;           %步长变化

end;

(b)

w1=0;                       %权系数初值

w2=0;

e=zeros(1,length(x));

error=zeros(1,length(x));

y=0;

mu=0;                

for i=1:100000                 %LMS算法

    y=w1*x1(i)+w2*x2(i);

    e(i)=x(i)-y;

     error(i)=s(i)-e(i);

    ee=error(i)^2;

    if ee>0.0005;

        ee=0.0005;

    end

    mu=xuanze(mu,ee);         %调用函数

    w1=w1+mu*e(i)*x1(i);

    w2=w2+mu*e(i)*x2(i);   

end

  • Matlab仿真结果分析

仿真条件:

  1. 自适应滤波器的阶数N=2;
  2. 参考输入信号x(n)=15*sin(0.15*pi*t)为标准正炫函数;
  3. 主输入端干扰以Vn为与x(n)不相关的随机噪声信号;
  4. 输入信号比snr=10;

在仿真过程中采用正弦信号作为有用信号,均值为零。信噪比为10db的高斯白噪声作为叠加的噪声信号。基于LMS算法,步长设置为0.000009。基于变步长lms算法,步长变化参数a=0.99;r=0.0008,步长上界定义为mumax=0.20;步长下界mumin=0.00001。nlms修正参数fai=0.0001。输出波形图如下:

由上面图得知:

    从图3 lms算法可以看出噪声成功从正炫信号中滤除,与图4比较明显看到,变步长lms算法的收敛速度比恒定步长lms算法快,而且稳态误差也是较小的,可见变步长lms算法的性能有明显提高。从图6中可以看出与固定步长LMS 算法和变步长LMS 算法相比,NLMS算法能有效地调节步长,收敛快,稳态误差小,较好地解决了收敛速度和稳态误差间的矛盾,为算法在实际中应用提供了更大的控制灵活性,并且改进算法还具有很强的鲁棒性,因此算法性能有明显改善。

  • 附录

%lms自适应噪声对消器

clear all

clc              

t=0:1/1000:100-1/1000;

s=15*sin(0.15*pi*t);

snr=10;

s_power=var(s);              %var函数: 返回方差值

linear_snr=10^(snr/10);   %s/n

factor=sqrt(s_power/linear_snr); % 噪声功率

noise=randn(1,length(s))*factor; %随机生成噪声功率谱

%noise=wgn(1,length(s),factor);

x=s+noise;                   %由SNR计算随机噪声

x1=noise;                    %噪声源输入

x2=noise;

%x3=noise;

w1=0;                       %权系数初值

w2=0;

%w3=0;

e=zeros(1,length(x)); %初始化误差矩阵

error=zeros(1,length(x)); %初始化

y=0;

%mu=0;

mu=0.000009;                 

for i=1:100000                 %LMS算法

    y=w1*x1(i)+w2*x2(i);%+w3*x3(i);

    e(i)=x(i)-y;

    error(i)=s(i)-e(i);

 %   ee=error^2;

 %   mu=xuanze(mu,ee);

    w1=w1+mu*e(i)*x1(i);

    w2=w2+mu*e(i)*x2(i);

  %  w3=w3+mu*e(i)*x3(i);

end

figure(1)

subplot(4,1,1)

plot(t,s);

title('纯正弦信号')

subplot(4,1,2)

plot(t,x);

title('带噪声正弦信号')

axis([0 100 -30 30]);

subplot(4,1,3)

plot(t,noise);

title('噪声信号')

axis([0 100 -30 30]);

subplot(4,1,4)

plot(t,e);

title('自适应噪声对消器')

axis([0 100 -30 30]);

wu=error;

figure(2)

subplot(3,1,1);

plot(wu);

title('定步长LMS算法收敛过程')

%变步长lms自适应噪声对消器

clear all

clc              

t=0:1/1000:100-1/1000;

s=15*sin(0.15*pi*t);

snr=10;

s_power=var(s);              %var函数: 返回方差值

linear_snr=10^(snr/10);

factor=sqrt(s_power/linear_snr);

noise=randn(1,length(s))*factor;

x=s+noise;                   %由SNR计算随机噪声

x1=noise;                    %噪声源输入

x2=noise;

w1=0;                       %权系数初值

w2=0;

e=zeros(1,length(x));

error=zeros(1,length(x));

y=0;

mu=0;

%mu=0.05;                 

for i=1:100000                 %LMS算法

    y=w1*x1(i)+w2*x2(i);

    e(i)=x(i)-y;

     error(i)=s(i)-e(i);

    ee=error(i)^2;

    if ee>0.0005;

        ee=0.0005;

    end

    mu=xuanze(mu,ee);

    w1=w1+mu*e(i)*x1(i);

    w2=w2+mu*e(i)*x2(i);   

end

figure(3)

subplot(4,1,1)

plot(t,s);

title('纯正弦信号')

subplot(4,1,2)

plot(t,x);

title('带噪声正弦信号')

axis([0 100 -30 30]);

subplot(4,1,3)

plot(t,noise);

title('噪声信号')

axis([0 100 -30 30]);

subplot(4,1,4)

plot(t,e);

title('自适应噪声对消器')

axis([0 100 -30 30]);

wu=error;

figure(2)

subplot(3,1,2);

plot(wu);

title('变步长LMS算法收敛过程')

%nlms自适应噪声对消器

clear all

clc              

t=0:1/1000:100-1/1000;

s=15*sin(0.15*pi*t);

snr=10;

s_power=var(s);              %var函数: 返回方差值

linear_snr=10^(snr/10);

factor=sqrt(s_power/linear_snr);

noise=randn(1,length(s))*factor;

x=s+noise;                   %由SNR计算随机噪声

x1=noise;                    %噪声源输入

x2=noise;

w1=0;                       %权系数初值

w2=0;

e=zeros(1,length(x));

error=zeros(1,length(x));

y=0;

mu=0;

%mu=0.05;                 

for i=1:100000                 %LMS算法

    y=w1*x1(i)+w2*x2(i);

     r(i)=x(i)*x(i)';         %自相关矩阵

     fai=.0001;               %修正参数,为防止x(i)*x(i)'过小导致步长值太大而设置的

     e(i)=x(i)-y;

     error(i)=s(i)-e(i);

     ee=error(i)^2;

    if ee>0.0005;

        ee=0.0005;

   end    

    mu=xuanze(mu,ee);

    w1=w1+mu*e(i)*x1(i)/(r(i)+fai);

    w2=w2+mu*e(i)*x2(i)/(r(i)+fai);   

end

figure(4)

subplot(4,1,1)

plot(t,s);

title('纯正弦信号')

subplot(4,1,2)

plot(t,x);

title('带噪声正弦信号')

axis([0 100 -30 30]);

subplot(4,1,3)

plot(t,noise);

title('噪声信号')

axis([0 100 -30 30]);

subplot(4,1,4)

plot(t,e);

title('自适应噪声对消器')

axis([0 100 -30 30]);

wu=error;

figure(2)

subplot(3,1,3);

plot(wu);

title('NLMS算法收敛过程')

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

通信与雷达信号处理实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值