一、实验名称和实验目的
实验目的:
①利用MATLAB软件进行RLS算法仿真。
②考察RLS算法的收敛性。
⑴遗忘因子的变化对RLS算法收敛的影响。
⑵正则系数δ的变化对算法收敛的影响。
③与LMS算法进行性能比较。
二、实验内容:
图二自适应噪声对消原理框图
RLS算法实验原理:
(1)初始条件
δ为小的正实数
(2)运算
对n=1,2,……
1)取得
2)更新增益矢量
3)更新滤波器参量
4)更新逆矩阵
(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)');