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)