% program that performs rls or lms algorithm
% can be used for channel equalization
% or for channel identification
function f=rls_lms(gcurr,ffcurr,over,lms_rls,eq_length,dec_delay,param1,param2);
% gcurr : input (possibly oversampled) data,
% row vector of length L
% ffcurr : desired decision points,
% row vector of length L/over (see below)
% over : 1 --> symbol spaced, 2 --> fractionally spaced
% For LTE can also be 8.
% lms_rls : 1 --> lms, 2 --> rls
% eq_length : equalizer filter length
% dec_delay : equalizer decision delay
% param1 : if lms - lte --> m of lms (default=0.375)
% if lms - dfe --> m1 of lms for feedforward part
% (default=0.575)
% if rls --> delta, initialization parameter
% for P matrix (default=0.001)
% param2 : if lms - dfe --> m2 of lms for feedback part
% (default=0.0175)
% if rls --> lamda, forgetting factor (default=0.999)
% f : output filter coefficients
training=min(length(ffcurr),length(gcurr));
g=zeros(eq_length,1)';
if lms_rls==1
if nargin < 7
m=0.375;
else
m=param1;
end
else
if nargin < 7
delta=0.001;
else
delta=param1;
end
if nargin < 8
lamda=0.999;
else
lamda=param2;
end
end
w=zeros(1,eq_length);
alg_error=[];
pe=(1/delta)*eye(eq_length);
if lms_rls==1,
for i=eq_length:over:over*training-10,
if over==1,
g=fliplr(gcurr(i-eq_length+1:i));
desired=ffcurr(i-dec_delay);
end
if over==2,
g=fliplr(gcurr(i-eq_length+1:i));
des_pos=fix((i-dec_delay)/over)+rem((i-dec_delay),over);
desired=ffcurr(des_pos);
end;
eq_out=w*g';
error=desired-eq_out;
alg_error=[alg_error error^2];
norm=g*g';
w=w+(m*error*g)/norm;
end;
else
for i=eq_length:over:over*training-10
if over==1,
g=fliplr(gcurr(i-eq_length+1:i));
desired=ffcurr(i-dec_delay);
end
if over==2,
g=fliplr(gcurr(i-eq_length+1:i));
des_pos=fix((i-dec_delay)/over)+rem((i-dec_delay),over);
desired=ffcurr(des_pos);
end;
if over==8,
g=fliplr(gcurr(i-eq_length+1:i));
des_pos=fix((i-dec_delay)/over)+1;
desired=ffcurr(des_pos);
end;
eq_out=w*g';
error=desired-eq_out;
alg_error=[alg_error error^2];
pi=pe*g';
ka=lamda+(g*pi);
kapa=pi/ka;
w=w+kapa'*error;
pet=kapa*pi';
pe=(1/lamda)*(pe-pet);
end
end
f=w;
hold off
plot(alg_error)
pause
return
end