function [m,e,lam,lam1,sq,sge,sgv,Nc,qq, lam_, lam1_]=rls_lvg_n(x,d,delta,ord,h1,h2,h3,N0,N1,Ka,Kb,lmax)
%
% F. Albu, "Improved Variable Forgetting Factor Recursive Least Square
% Algorithm", in Proc. of ICARCV 2012, Guangzhou, China, 5-7 December 2012, pp. 1789 - 1793
%
% If this code or parts of it are used in a scientific work, I would
% appreciate if the above reference and the following ones are cited.
%
% C. Stanciu, C. Paleologu, J. Benesty, T. Gänsler, S. Ciochina, and F. Albu,
% "Variable-Forgetting Factor RLS Algorithm for Stereophonic Acoustic Echo
% Cancellation with the Widely Linear Model", in Proc. of EUSIPCO 2012, Bucharest,
% Romania, pp. 1960-1964, 2012
%
% C. Paleologu, J. Benesty, S. Ciochina, A robust variable forgetting
% factor recursive least-squares algorithm for system identification, IEEE
% Signal Process. Lett., 15, pp. 597-600, 2008.
%
% Felix Albu
% Valahia University of Targoviste, Romania
% http://falbu.50webs.com
L1=length(h1);
L2=length(h2);
L3=length(h3);
N=length(x);
w=zeros(ord,1);
x1=zeros(ord,1);
m=zeros(N,1);
qq=zeros(N,1);
e=zeros(N,1);
P=delta^(-1)*eye(ord);
f=1-1/(Ka*ord);
ff=1-1/(8);
fl=1-1/(Kb*ord);
sge=zeros(N+1,1);
%sq=zeros(N+1,1);
sq=[10;zeros(N-1,1)];
lam=zeros(N,1);
lam1=zeros(N,1);
lam_=zeros(N,1);
lam1_=zeros(N,1);
sgv=zeros(N+1,1);
g=1.5;
%g=2.25;
R=[delta;zeros(N,1)];
R1=[1/delta;zeros(N,1)];
Nc=zeros(N,1);
constanta=10^(-8);
%h10 = waitbar(0,'Please wait new GVF-RLS-p1');
factor=0.01;
for n=1:N0
x1=[x(n);x1(1:ord-1)];
z=x1'*P;
q=z*x1;qq(n)=q;
sq(n+1)=ff*sq(n)+(1-ff)*q;
e(n)=d(n)-w'*x1;
sge(n+1)=f*sge(n)+(1-f)*e(n)^2;
sgv(n+1)=fl*sgv(n)+(1-fl)*e(n)^2;
lam1(n)=(sq(n+1))*sgv(n+1)/(constanta+abs(sge(n+1)-sgv(n+1)));
if sqrt(sge(n+1))<=g*sqrt(sgv(n+1))
lam(n)=lmax;
else
lam(n)=min(lmax,lam1(n));
end
kp=P*x1;
k=kp/(lam(n)+z*x1);
w=w+k*e(n);
R(n+1)=lam(n)*R(n)+x1'*x1/ord;
R1(n+1)=1/lam(n)*(R1(n)-1/(lam(n)+q)*(kp')*kp/ord);
Nc(n)=R(n+1)*R1(n+1);
P=1/lam(n)*(P-k*z);
m(n)=norm([w',zeros(1,L1-ord)]-h1)/norm(h1);
% waitbar(n/(N0),h10)
end
%close(h10)
%h20 = waitbar(0,'Please wait new GVF-RLS-p2');
for n=N0+1:N1
x1=[x(n);x1(1:ord-1)];
z=x1'*P;
q=z*x1;qq(n)=q;
sq(n+1)=ff*sq(n)+(1-ff)*q;
e(n)=d(n)-w'*x1;
sge(n+1)=f*sge(n)+(1-f)*e(n)^2;
sgv(n+1)=fl*sgv(n)+(1-fl)*e(n)^2;
lam1(n)=(sq(n+1))*sgv(n+1)/(constanta+abs(sge(n+1)-sgv(n+1)));
if sqrt(sge(n+1))<=g*sqrt(sgv(n+1))
lam(n)=lmax;
else
lam(n)=min(lmax,lam1(n));
end
kp=P*x1;
k=kp/(lam(n)+z*x1);
w=w+k*e(n);
R(n+1)=lam(n)*R(n)+x1'*x1/ord;
R1(n+1)=1/lam(n)*(R1(n)-1/(lam(n)+q)*(kp')*kp/ord);
Nc(n)=R(n+1)*R1(n+1);
P=1/lam(n)*(P-k*z);
m(n)=norm([w',zeros(1,L2-ord)]-h2)/norm(h2);
% waitbar((n-N0)/(N1-N0),h20)
end
%close(h20)
%h30 = waitbar(0,'Please wait new GVF-RLS-p3');
for n=N1+1:N
x1=[x(n);x1(1:ord-1)];
z=x1'*P;
q=z*x1;qq(n)=q;
sq(n+1)=ff*sq(n)+(1-ff)*q;
e(n)=d(n)-w'*x1;
sge(n+1)=f*sge(n)+(1-f)*e(n)^2;
sgv(n+1)=fl*sgv(n)+(1-fl)*e(n)^2;
lam1(n)=(sq(n+1))*sgv(n+1)/(constanta+abs(sge(n+1)-sgv(n+1)));
if sqrt(sge(n+1))<=g*sqrt(sgv(n+1))
lam(n)=lmax;
else
lam(n)=min(lmax,lam1(n));
end
kp=P*x1;
k=kp/(lam(n)+z*x1);
w=w+k*e(n);
R(n+1)=lam(n)*R(n)+x1'*x1/ord;
R1(n+1)=1/lam(n)*(R1(n)-1/(lam(n)+q)*(kp')*kp/ord);
Nc(n)=R(n+1)*R1(n+1);
P=1/lam(n)*(P-k*z);
m(n)=norm([w',zeros(1,L3-ord)]-h3)/norm(h3);
% waitbar((n-N1)/(N-N1),h30)
end
%close(h30)