自适应rls

一、实验名称和实验目的

实验名称:RLS算法仿真

实验目的:

①利用MATLAB软件进行RLS算法仿真。

②考察RLS算法的收敛性。

              ⑴遗忘因子的变化对RLS算法收敛的影响。

              ⑵正则系数δ的变化对算法收敛的影响。

③与LMS算法进行性能比较。

二、实验内容:

 

图一线性预测框图

 

图二自适应噪声对消原理框图

 

 

三、RLS和LSL算法原理:

RLS算法实验原理:

(1)初始条件

 

 δ为小的正实数

(2)运算

    对n=1,2,……

1)取得  

2)更新增益矢量

    

    

3)更新滤波器参量

        

4)更新逆矩阵

        

LSL算法实验原理:

(1)初始化

        

(2)迭代运算

1)按时间n=1,2,……

        

        

        

2)按阶m=1,2,……M-1

    

    

    

    

    

        

 

四、实验结果分析:

 

1) 不同正则系数对算法收敛性的影响。

 

 

 

δ初值分别为0.008,0.002时的设置对算法收敛性几乎没有影响。

2)遗忘因子的变化对算法收敛性的影响。

 

 

 

 

由图越大,RLS算法的收敛速度越慢,但权系收敛后噪声越小δ初值设置对算法收敛性的影响。

 3)与LMS算法进行性能比较。

如下图所示为RLS算法与LMS算法权值系数收敛性的比较。

 

由图可知RLS比LMS具有更快的收敛速度,但是RLS权系数收敛后出现了较大的噪声。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

附录

clc;                        % 清除指令窗显示的内容;

clear all;                  % 清除MATLAB工作空间;

close all;                  % 关掉当前的图像窗口;

%%

% RLS算法 δ=0.008,遗忘因子λ=0.95

% 参数初始化

N  = 1024;

a1 = 1.558;%权矢量目标值a1

a2 = -0.81;%权矢量目标值a2

x(1) = 0;%初始值

x(2) = 0;%初始值

v = randn(N,1);

w = zeros(2,N);

g = zeros(2,N);

mu = zeros(1,N);

e = zeros(1,N);                         % 误差信号e(n)

Lambda = 0.95;                         % 指数加权因子λ(遗忘因子)

Delta  = 0.008;                         % 正则系数δ,取较小的实系数

C = eye(2)/Delta;                       % C(0)=I/δ

 

for n=3:N

    x(n) = v(n) + a1*x(n-1) + a2*x(n-2);

    X = [x(n-1);x(n-2)];

    W = w(:,n-1);

    e(n)  = x(n)-X'*W;

    mu(n) = X'*C*X;                     % 更新增益矢量

    g(:,n)= C*X/(Lambda + mu(n));       % 更新增益矢量

    W = W + g(:,n)*e(n);                % 更新滤波器参量

    w(:,n) = W;

    C = (C-g(:,n)*X'*C)/Lambda;         % 更新逆矩阵

end

RLS1_w = w;

 

%%

% RLS算法 δ=0.001,遗忘因子=0.95

% 参数初始化

N  = 1024;

a1 = 1.558;%权矢量目标值a1

a2 = -0.81;%权矢量目标值a2

x(1) = 0;%初始值

x(2) = 0;%初始值

v = randn(N,1);

w = zeros(2,N);

g = zeros(2,N);

mu = zeros(1,N);

e = zeros(1,N);                         % 误差信号e(n)

Lambda = 0.95;                         % 指数加权因子λ(遗忘因子)

Delta  = 0.002;                         % 正则系数δ,取较小的实系数

C = eye(2)/Delta;                       % C(0)=I/δ

 

for n=3:N

    x(n) = v(n) + a1*x(n-1) + a2*x(n-2);

    X = [x(n-1);x(n-2)];

    W = w(:,n-1);

    e(n)  = x(n)-X'*W;

    mu(n) = X'*C*X;                     % 更新增益矢量

    g(:,n)= C*X/(Lambda + mu(n));       % 更新增益矢量

    W = W + g(:,n)*e(n);                % 更新滤波器参量

    w(:,n) = W;

    C = (C-g(:,n)*X'*C)/Lambda;         % 更新逆矩阵

end

RLS2_w = w;

 

%%

% RLS算法 δ=0.008,遗忘因子=0.85

% 参数初始化

N  = 1024;

a1 = 1.558;%权矢量目标值a1

a2 = -0.81;%权矢量目标值a2

x(1) = 0;%初始值

x(2) = 0;%初始值

v = randn(N,1);

w = zeros(2,N);

g = zeros(2,N);

mu = zeros(1,N);

e = zeros(1,N);                         % 误差信号e(n)

Lambda = 0.85;                         % 指数加权因子λ(遗忘因子)

Delta  = 0.008;                         % 正则系数δ,取较小的实系数

C = eye(2)/Delta;                       % C(0)=I/δ

 

for n=3:N

    x(n) = v(n) + a1*x(n-1) + a2*x(n-2);

    X = [x(n-1);x(n-2)];

    W = w(:,n-1);

    e(n)  = x(n)-X'*W;

    mu(n) = X'*C*X;                     % 更新增益矢量

    g(:,n)= C*X/(Lambda + mu(n));       % 更新增益矢量

    W = W + g(:,n)*e(n);                % 更新滤波器参量

    w(:,n) = W;

    C = (C-g(:,n)*X'*C)/Lambda;         % 更新逆矩阵

end

RLS3_w = w;

 

 

% 作图

figure(1);                              % 产生第一个图形界面;

plot([1,N],[a1,a1],'k');hold on;                 % 绘制权矢量目标值a1水平线,以便比较滤波效果;

% plot([1,N],[a2,a2],'g');hold on;                 % 绘制权矢量目标值a2水平线,以便比较滤波效果;

plot(RLS1_w(1,1:N),'-b');hold on;

plot(RLS2_w(1,1:N),'-r');

xlabel('迭代次数n');ylabel('权矢量');    % x轴、y轴标题

title('RLS算法权w1同λ因子不同δ');

legend('权矢量目标值a1水平线','正则系数δ=0.008','正则系数δ=0.002');

grid;

 

figure(2);

% plot([1,N],[a1,a1],'k');hold on;                 % 绘制权矢量目标值a1水平线,以便比较滤波效果;

plot([1,N],[a2,a2],'k');hold on;                 % 绘制权矢量目标值a2水平线,以便比较滤波效果;

plot(RLS1_w(2,1:N),'-b');hold on;

plot(RLS2_w(2,1:N),'-r');

xlabel('迭代次数n');ylabel('权矢量');    % x轴、y轴标题

title('RLS算法权w2同λ因子不同δ');

legend('权矢量目标值a2水平线','正则系数δ=0.008','正则系数δ=0.002');

grid;

 

figure(3);

plot([1,N],[a1,a1],'k');hold on;                 % 绘制权矢量目标值a1水平线,以便比较滤波效果;

% plot([1,N],[a2,a2],'k');hold on;                 % 绘制权矢量目标值a2水平线,以便比较滤波效果;

plot(RLS1_w(1,1:N),'-b');hold on;

plot(RLS3_w(1,1:N),'-r');

xlabel('迭代次数n');ylabel('权矢量');    % x轴、y轴标题

title('RLS算法权w1同正则系数δ不同遗忘因子');

legend('权矢量目标值a1水平线','遗忘因子λ=0.95','遗忘因子λ=0.85');

grid;

 

figure(4);

% plot([1,N],[a1,a1],'k');hold on;                 % 绘制权矢量目标值a1水平线,以便比较滤波效果;

plot([1,N],[a2,a2],'k');hold on;                 % 绘制权矢量目标值a2水平线,以便比较滤波效果;

plot(RLS1_w(2,1:N),'-b');hold on;

plot(RLS3_w(2,1:N),'-r');

xlabel('迭代次数n');ylabel('权矢量');    % x轴、y轴标题

title('RLS算法权w2同正则系数δ不同遗忘因子λ');

legend('权矢量目标值a2水平线','λ=0.95','λ=0.85');

grid;

 

 

%RLS算法与LMS算法的比较

 

clc;                        % 清除指令窗显示的内容;

clear all;                  % 清除MATLAB工作空间;

close all;                  % 关掉当前的图像窗口;

 

%%

%LMS算法

%由二阶AR模型产生预测信号

N=10000;

x(1)=0;

x(2)=0;

v=randn(1,N);

for n=3:N

    x(n)=1.558*x(n-1)-0.81*x(n-2)+v(n);

end

 

%LMS滤波器(u=0.0004,w1(2)=w2(2)=w1(3)=w2(3)=0)

%初始化

u=0.0004;%步长因子

%权初值

w1(2)=0;

w2(2)=0;

w1(3)=0;

w2(3)=0;

%预测

for n=3:N-1

    y(n)=w1(n)*x(n-1)+w2(n)*x(n-2);%滤波器输出表达式

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

    w1(n+1)=w1(n)+2*u*e(n)*x(n-1);%权矢量更新

    w2(n+1)=w2(n)+2*u*e(n)*x(n-2);%权矢量更新

end

LMS_W1 = w1;

LMS_W2 = w2;

 

%%

% RLS算法 δ=0.008,遗忘因子=0.95

% 参数初始化

N  = 10000;

a1 = 1.558;%权矢量目标值a1

a2 = -0.81;%权矢量目标值a2

x(1) = 0;%初始值

x(2) = 0;%初始值

v = randn(N,1);

w = zeros(2,N);

g = zeros(2,N);

mu = zeros(1,N);

e = zeros(1,N);                         % 误差信号e(n)

Lambda = 0.95;                         % 指数加权因子λ(遗忘因子)

Delta  = 0.008;                         % 正则系数δ,取较小的实系数

C = eye(2)/Delta;                       % C(0)=I/δ

 

for n=3:N

    x(n) = v(n) + a1*x(n-1) + a2*x(n-2);

    X = [x(n-1);x(n-2)];

    W = w(:,n-1);

    e(n)  = x(n)-X'*W;

    mu(n) = X'*C*X;                     % 更新增益矢量

    g(:,n)= C*X/(Lambda + mu(n));       % 更新增益矢量

    W = W + g(:,n)*e(n);                % 更新滤波器参量

    w(:,n) = W;

    C = (C-g(:,n)*X'*C)/Lambda;         % 更新逆矩阵

end

RLS_w = w;

 

%%

%作图

figure(1);                              % 产生第一个图形界面;

plot([1,N],[a1,a1],'k');hold on;                 % 绘制权矢量目标值a1水平线,以便比较滤波效果;

% plot([1,N],[a2,a2],'g');hold on;                 % 绘制权矢量目标值a2水平线,以便比较滤波效果;

plot(RLS_w(1,1:N),'-b');hold on;

plot(LMS_W1(1:N),'-r');

xlabel('迭代次数n');ylabel('权矢量');    % x轴、y轴标题

title('RLS算法权w1与LMS算法权w1调整曲线图比较');

legend('权矢量目标值a1水平线','RLS算法权w1','LMS算法权w1');

grid;

 

figure(2);

% plot([1,N],[a1,a1],'k');hold on;                 % 绘制权矢量目标值a1水平线,以便比较滤波效果;

plot([1,N],[a2,a2],'k');hold on;                 % 绘制权矢量目标值a2水平线,以便比较滤波效果;

plot(RLS_w(2,1:N),'-b');hold on;

plot(LMS_W2(1:N),'-r');

xlabel('迭代次数n');ylabel('权矢量');    % x轴、y轴标题

title('RLS算法权w2与LMS算法权w2调整曲线图比较');

legend('权矢量目标值a2水平线','RLS算法权w2','LMS算法权w2');

grid;

 

 

%LSL算法

clc;                            % 清除指令窗显示的内容;

clear all;                      % 清除MATLAB工作空间;

close all;                      % 关掉当前的图像窗口;

 

% 参数初始化

N  = 1024;                      % 迭代次数;

a1 = 1.558;                     % 滤波器参数;

a2 = -0.81;                     % 滤波器参数;

x(1) = 0;

x(2) = 0;

v  = randn(1,N);                % 高斯白噪声;

 

kf = zeros(3,N);                % 前向反射系数矩阵;

kb = zeros(3,N);                % 后向反射系数矩阵;

w1 = zeros(1,N);                % 型号模型参数a1的估计值;

w2 = zeros(1,N);                % 型号模型参数a2的估计值;

ef = zeros(3,N);                % 前向预测误差矩阵;

eb = zeros(3,N);                % 后项预测误差矩阵;

delta = zeros(3,N);             % 前后向预测误差相关系数DELTA矩阵;

gamma = ones(3,N);              % 初始化角参量;

de = 1;                        % 初始预测误差剩余;

epsilonf = de * ones(3,N);      % 初始化前向预测误差剩余;

epsilonb = de * ones(3,N);      % 初始化后向预测误差剩余;

 

% LSL算法二阶线性预测

for n=3:N   

    x(n)    = a1*x(n-1) + a2*x(n-2) + v(n);

    eb(1,n) = x(n);

    ef(1,n) = x(n);

    epsilonb(1,n) = epsilonf(1,n-1) + x(n)^2;

    epsilonf(1,n) = epsilonf(1,n-1) + x(n)^2;

    gamma(1,n)=1;

    for k=2:3

        % 更新前后向预测误差相关系数;

        delta(k,n) =delta(k,n-1) + eb(k-1,n-1)*ef(k-1,n)/gamma(k-1,n-1);

        % 更新前向预测误差;

        ef(k,n)    =ef(k-1,n)  - delta(k,n)*eb(k-1,n-1)/epsilonb(k-1,n);

        % 更新后向预测误差;

        eb(k,n)    =eb(k-1,n-1)- delta(k,n)*ef(k-1,n)/epsilonf(k-1,n);

        % 更新前向预测误差剩余;

        epsilonf(k,n) = epsilonf(k-1,n)   - delta(k,n)^2/epsilonb(k-1,n-1);

        % 更新后向预测误差剩余;

        epsilonb(k,n) = epsilonb(k-1,n-1) - delta(k,n)^2/epsilonf(k-1,n);

        % 更新角参量;

        gamma(k,n-1)  = gamma(k-1,n-1) - eb(k-1,n-1)^2/epsilonb(k-1,n-1);

        % 更新前向反射系数;

        kf(k,n) = delta(k,n)/epsilonf(k-1,n);

        % 更新后项反射系数;

        kb(k,n) = delta(k,n)/epsilonb(k-1,n-1);

    end

    w1(n) = kb(2,n)-kf(2,n)*kb(3,n);    % 计算型号模型参数a1的估计值;

    w2(n) = kb(3,n);                    % 计算型号模型参数a2的估计值;

end

 

% 结果输出

figure(1);                              % 产生第一个图形界面;

plot([1:N],w1,'r',[1:N],w2,'b')         % 绘制a1,a2估计值更新曲线;

hold;                                   % 保留当前图形和它的轴,使此后图形叠放在当前图形上;

plot([1,N],[a1,a1],'c')                 % 绘制a1水平线,以便比较预测效果;

plot([1,N],[a2,a2],'g')                 % 绘制a2水平线,以便比较预测效果;

axis([0,N,-1,2]);                       % 限定x轴、y轴显示范围

xlabel('迭代次数');ylabel('权矢量');     % x轴、y轴标题

grid;title(['LSL算法估计信号模型参数(\delta=',num2str(de),')']);    

                                        % 图像标题

h = legend('w1','w2',['a_1:',num2str(a1)],['a_2:',num2str(a2)]);

set(h,'Location','East');               % 添加图例于右侧中部

     

      

 

lLSL算法与LMS算法的比较

 

clear;

close all

N=1024;

M=3;

a1=1.558;

a2=-0.81;

kf=zeros(M,N);

kb=zeros(M,N);

w1=zeros(1,N);

w2=zeros(1,N);

ef=zeros(M,N);

eb=zeros(M,N);

delta=zeros(M,N);

dd=1.00;

epf=dd*ones(M,N);

epb=dd*ones(M,N);

gma=ones(M,N);

u=0.002;

x= randn(1,N);

xu(1)=x(1);

xu(2)=a1*xu(1)+x(2);

for n=3:N

    xu(n)=x(n)+a1*xu(n-1)+a2*xu(n-2);

end

 

for n=2:N

   eb(1,n)=xu(n-1);

   ef(1,n)=xu(n-1);

   epb(1,n)=epf(1,n-1)+xu(n-1)^2;

   epf(1,n)=epf(1,n-1)+xu(n-1)^2;

   gma(1,n)=1;

   

   for m=2:3

       delta(m,n)=delta(m,n-1)+eb(m-1,n-1)*ef(m-1,n)/gma(m-1,n);

       ef(m,n)=ef(m-1,n)-delta(m,n)*eb(m-1,n-1)/epb(m-1,n-1);

       eb(m,n)=eb(m-1,n-1)-delta(m,n)*ef(m-1,n)/epf(m-1,n);

       epf(m,n)=epf(m-1,n)-delta(m,n)^2/epb(m-1,n-1);

       epb(m,n)=epb(m-1,n-1)-delta(m,n)^2/epf(m-1,n);

       gma(m,n-1)=gma(m-1,n-1)-eb(m-1,n-1)^2/epb(m-1,n-1);

       kf(m,n)=delta(m,n)/epf(m-1,n);

       kb(m,n)=delta(m,n)/epb(m-1,n-1);

   end

     w1(n)=kb(2,n)-kf(2,n)*kb(3,n);

     w2(n)=kb(3,n);

end

 

        

 

wt1=zeros(1,N);

wt2=zeros(1,N);

e=zeros(1,N);

for n=3:N-1

    y(n)=wt1(n)*xu(n-1)+wt2(n)*xu(n-2);

    e(n)=xu(n)-y(n);

    wt1(n+1)=wt1(n)+2*u*e(n)*xu(n-1);

    wt2(n+1)=wt2(n)+2*u*e(n)*xu(n-2);

end

 

 

plot(w1,'r')

hold on

plot(w2,'b')

plot(wt1,'m')

plot(wt2,'k')

grid;

legend('LSL算法w1(n)','LSL算法w2(n)','LMS算法w1(n)','LMS算法w2(n)')

hold off

axis([0,1024,-2,2])

title('LSL和LMS权系数变化曲线比较')

xlabel('n');

ylabel('w(n)');

 

      

你可能感兴趣的:(自适应实验)