递归最小二乘算法matlab代码实现
RLS迭代
Matlab实现
// RLS
clc;clear
Delta=[1 0.1 0.01 0.001];
Lamda=[1 0.9 0.5 0.1];
cishu = 1;
for cishu=1:4
dotnumber=10000;
u=wgn(dotnumber,1,0);
b=1;a=[1 -0.9];
u=filter(b,a,u);
u(dotnumber+1:end)=[];
noise=wgn(dotnumber,1,-60);
h=[-0.1 0.2 0.7 0.4 -0.2 -0.1 0.12 -0.25].';
wo=[h;zeros(4,1)];
d=filter(h,1,u);
d(dotnumber+1:end)=[];
d=d+noise;
len=12;
mu = 0.001;
w = zeros(len,1);
w_eror = zeros(dotnumber,1);
e = zeros(dotnumber,1);
vector_u = zeros(len,1);
vector_d = zeros(len,1);
% delta = 0.01; %固定delta
delta = Delta(cishu); %四次迭代,不同delta
P = 1/delta*eye(len);
lamda = 1; %固定delta
% lamda = Lamda(cishu); %四次迭代,不同delta
% Pi = zeros(1,len);
for n=1:dotnumber
vector_u = [u(n); vector_u(1:end-1)];
% vector_d = [d(n); vector_d(1:end-1)];
Pi = P * vector_u;
k = Pi/(lamda + vector_u'*Pi);
kesai = d(n) - w'*vector_u;
w = w + k*conj(kesai);
P = (1/lamda)*P - (1/lamda)*k*vector_u'*P;
w_error(n)=norm(w-wo)^2;
end
hold on
plot(10*log10(w_error))
title('lamda = 1')
%title('delta = 0.01')
xlabel('采样点')
ylabel('系数误差 (dB)');
%legend('RLS','LMS','AP');
legend('delta=1','delta=0.1','delta=0.01','delta=0.001');
%legend('lamda=1','lamda=0.9','lamda=0.5','lamda=0.1');
end