Forums

LMS Equalizer fo SC_FDE

Started by adi_sharma1984 December 10, 2008
Hi All,
I am trying to simulate a SC-Frequency domain LMS equalizer.

Now since it is SC the detection has to be in time domain although the
channel estimation is in frequency domain so i follow these steps

1) Multiply data -> data_f (in frequency domain) with weights in frequency
domain
2} Convert data in time domain data_t by ifft and pass it through
detector.
3) compute the error (detector - data_t)
4) convert the error back in frequency domain (by fft or error)->err_f
5) update weighs by weights=weights+Mu*(data_f*conj(err_f)) where Mu is
step size
6) now multiply new weight with next set of data and repeat the process

Am i doing something wrong as error never decreases no matter what i do
and it increases rapidly with each run.

Any kind of help is highly appreciated as this is making me crazy.

Regards
Aditya


_____________________________________
Do you know a company who employs DSP engineers?  
Is it already listed at http://dsprelated.com/employers.php ?
hi all pleases see the sample matlab code i just created showing above
problem

________________________________________

close all
clear all
clc

z=zeros(1,256);
zd=0;
x1=[];
z3=[];
pak_loc=[];
pak_loc_1=[];
pak_dis=[];
map_bins=[];

%%%%%%%%%%%%%%%usr1%%%%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:50
%%%%%%%%%%%%%%%%%paking 32 bins left 32 bins right% center dc
zero%%%%%%%%%
x=(floor(2*rand(1,64))-.5)/(.5)+j*(floor(2*rand(1,64))-.5)/(.5);
x1=[x x1];

for n=97:128
    z(n)=x(n-96);
end
for n=130:161
    z(n)=x(n-97);
end
t=fftshift(z);
map_bins=[map_bins z];
dtd=fft(t,256);
%%%%%%%%%%%%%%subcarrier mapping%%%%%%%%%%%%%
subm_d=[];
subm_l=[];
subm_l=[dtd];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%256 point ifft of localized and
disterbuted%%%%%%%%%%%%%%%%%%%%%
iff_out_l=ifft(subm_l,256);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%cyclic prefix%%%%%%%%%
out_l_s=[];
 out_l_s=[iff_out_l(193:256) iff_out_l];   %%%%%%%%%one ofdm symbol with
cyclic prefix
%%%%%%%%%%%%%%%%%50 symbol packet%%%%%%%%%%%%% 1 symbol is 320 samples
long
pak_loc_1=[pak_loc_1 out_l_s];
end

%%%%%%%%%%%%%%%%%%%%preamble for usr1%%%%%%%%%%%%%%%%%%%%%%%%%%%
a= 1+j;
b=-1+j;
c=-1-j;
d= 1-j;

p_all=[d d c a d  d b d d d  a c a a c  a c c d b...
       d d c a d  d b d d d  a c a a c  a c c d b...
       d d c a d  d b d d d  a c a a c  a c c d b...
       a a d b a  a c a a a  b d b b d  b d d a c...
       c c b d c  c a c c c  d b d b b  d b b c a...
       0 ...
       c a b b c  a a a c a  d b d b b  b b d c c...
       b d a a b  d d d b d  c c c a a  a a c b b...
       a c d d a  c c c a c  b b b d d  d d b a a...
       c a b b c  a a a c a  d d d b b  b b d c c...
       d b c c d  b b b d b  a a a c c  c c a d d];
   
 ff_1=zeros(1,256);
 ff_2=zeros(1,256);
 d2=p_all(1:2:201);
 d1=p_all(1:4:201);
 ff_2(129+(-100:2:100))=sqrt(2)*d2;%%%%%long preamble
 
 usr1_pre=fft(ff_2,256);%%%%%%%%%%%%%fft of usr1
 
 ot1=[usr1_pre];
 
 i_ot1=ifft(ot1,256);
 
 c_iot1=[i_ot1(193:256) i_ot1];
 
 preamble_cp_usr1=c_iot1; %%%%%%%long preamble
 
 pak_usr1_preamble=[preamble_cp_usr1 pak_loc_1];
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 ci1=[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .5*j]; %%%%%%%%%%channel
 
 fil_ch_out=filter(ci1,1,pak_usr1_preamble);
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
 %%%%%%%%%%%%channel estimation
cp_long_pre=fil_ch_out(1:320);
long_pre=cp_long_pre(65:end);

ff_long_pre=fft(long_pre,256);
long_usr1=ff_long_pre;

ratio_usr1=long_usr1./usr1_pre;  %%%%ratio of recived preamble to the
known preamble

ratio_usr1=ratio_usr1(1:2:end);
%%%%interpolating
inter_r_us1=[];
for n=1:length(ratio_usr1)-1
    inter_r_us1=[inter_r_us1 ratio_usr1(n)
(ratio_usr1(n)+ratio_usr1(n+1))/2];
   
end
inter_r_us1=[inter_r_us1 ratio_usr1(128) ratio_usr1(128)];

ch1_fr=fft(ci1,256);

figure(1)
hold on
 plot(abs(log(inter_r_us1)),'linewidth',4)
 plot(abs(log(ch1_fr)),'xg')
 hold off
 title('channel in green to estimated channel in blue')
 axis([1 256 -2 2])

 %%%%%%%%%%%%%%lms_equil%%%%%%%%%%%%%%%%
 l8=320;
 data=fil_ch_out(321:end);
 w=ones(1,256)./inter_r_us1; %%%%w=estimated channel
 errtt=[];
 for n=1:50
     dat=data((n-1)*l8+1:n*l8);
     dat1=dat(65:end);
     dat_f=fft(dat1,256);
     
     eq_dat_f=dat_f.*w;
     
     dat_t=ifft(eq_dat_f,256);
     
     figure(2)
     plot(dat_t,'x')
     %%%%%%%%%%%%%%%detector
     detc=[];
 for n=1:256
   dc_tmp=dat_t(n);%%%%%%%%%%%%%input to detector
   sinng=sign(real(dc_tmp));
   if sinng==1
   if real(dc_tmp)<0.5
       rl_tmp=0;
   else
        rl_tmp=1;
   end
   else
       if real(dc_tmp)>-0.5
          rl_tmp=0 ;
       else
           rl_tmp=-1;
       end
   end
   sinng=sign(imag(dc_tmp));
   if sinng==1
   if imag(dc_tmp)<0.5
       ig_tmp=0;
   else
        ig_tmp=1;
   end
   else
       if imag(dc_tmp)>-0.5
          ig_tmp=0 ;
       else
           ig_tmp=-1;
       end
   end
    tmp_d=rl_tmp+i*ig_tmp;
   detc=[detc tmp_d]; %%%%%%%%%%%%%%%%output of detector
 end
 figure(3)
 plot(detc,'x')
 title('detector plot')
 axis([-2 2 -2 2])
 
 err_t=detc-dat_t; %%%%error of detector to data in time domain
 
 err_f=fft(err_t,256);%%%%%error back in freq domain
 errtt=[errtt  err_f];
 figure(4)
 subplot(2,1,1)
 plot(abs(err_t));
 subplot(2,1,2)
 plot(abs(err_f));
 w_up=(dat_f.*conj(err_f)); %%%new weights in freq domain
 w=w+0.01*(w_up);%%%%weights update  lms algrothim
 end
 figure(5)
 plot(abs(errtt))
 
 ___________________________________
 
 
 
 
 
 
 
 
 
 
 
 
 

_____________________________________
Do you know a company who employs DSP engineers?  
Is it already listed at http://dsprelated.com/employers.php ?
Hi all please help
> >hi all pleases see the sample matlab code i just created showing above >problem > >________________________________________ > >close all >clear all >clc > >z=zeros(1,256); >zd=0; >x1=[]; >z3=[]; >pak_loc=[]; >pak_loc_1=[]; >pak_dis=[]; >map_bins=[]; > >%%%%%%%%%%%%%%%usr1%%%%%%%%%%%%%%%%%%%%%%%%%%% >for k=1:50 >%%%%%%%%%%%%%%%%%paking 32 bins left 32 bins right% center dc >zero%%%%%%%%% >x=(floor(2*rand(1,64))-.5)/(.5)+j*(floor(2*rand(1,64))-.5)/(.5); >x1=[x x1]; > >for n=97:128 > z(n)=x(n-96); >end >for n=130:161 > z(n)=x(n-97); >end >t=fftshift(z); >map_bins=[map_bins z]; >dtd=fft(t,256); >%%%%%%%%%%%%%%subcarrier mapping%%%%%%%%%%%%% >subm_d=[]; >subm_l=[]; >subm_l=[dtd]; >%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% >%%%%%%%%%%%256 point ifft of localized and >disterbuted%%%%%%%%%%%%%%%%%%%%% >iff_out_l=ifft(subm_l,256); >%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% >%%%%%%%%%%cyclic prefix%%%%%%%%% >out_l_s=[]; > out_l_s=[iff_out_l(193:256) iff_out_l]; %%%%%%%%%one ofdm symbol with >cyclic prefix >%%%%%%%%%%%%%%%%%50 symbol packet%%%%%%%%%%%%% 1 symbol is 320 samples >long >pak_loc_1=[pak_loc_1 out_l_s]; >end > >%%%%%%%%%%%%%%%%%%%%preamble for usr1%%%%%%%%%%%%%%%%%%%%%%%%%%% >a= 1+j; >b=-1+j; >c=-1-j; >d= 1-j; > >p_all=[d d c a d d b d d d a c a a c a c c d b... > d d c a d d b d d d a c a a c a c c d b... > d d c a d d b d d d a c a a c a c c d b... > a a d b a a c a a a b d b b d b d d a c... > c c b d c c a c c c d b d b b d b b c a... > 0 ... > c a b b c a a a c a d b d b b b b d c c... > b d a a b d d d b d c c c a a a a c b b... > a c d d a c c c a c b b b d d d d b a a... > c a b b c a a a c a d d d b b b b d c c... > d b c c d b b b d b a a a c c c c a d d]; > > ff_1=zeros(1,256); > ff_2=zeros(1,256); > d2=p_all(1:2:201); > d1=p_all(1:4:201); > ff_2(129+(-100:2:100))=sqrt(2)*d2;%%%%%long preamble > > usr1_pre=fft(ff_2,256);%%%%%%%%%%%%%fft of usr1 > > ot1=[usr1_pre]; > > i_ot1=ifft(ot1,256); > > c_iot1=[i_ot1(193:256) i_ot1]; > > preamble_cp_usr1=c_iot1; %%%%%%%long preamble > > pak_usr1_preamble=[preamble_cp_usr1 pak_loc_1]; > %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% > ci1=[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .5*j]; %%%%%%%%%%channel > > fil_ch_out=filter(ci1,1,pak_usr1_preamble); > %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% > > %%%%%%%%%%%%channel estimation >cp_long_pre=fil_ch_out(1:320); >long_pre=cp_long_pre(65:end); > >ff_long_pre=fft(long_pre,256); >long_usr1=ff_long_pre; > >ratio_usr1=long_usr1./usr1_pre; %%%%ratio of recived preamble to the >known preamble > >ratio_usr1=ratio_usr1(1:2:end); >%%%%interpolating >inter_r_us1=[]; >for n=1:length(ratio_usr1)-1 > inter_r_us1=[inter_r_us1 ratio_usr1(n) >(ratio_usr1(n)+ratio_usr1(n+1))/2]; > >end >inter_r_us1=[inter_r_us1 ratio_usr1(128) ratio_usr1(128)]; > >ch1_fr=fft(ci1,256); > >figure(1) >hold on > plot(abs(log(inter_r_us1)),'linewidth',4) > plot(abs(log(ch1_fr)),'xg') > hold off > title('channel in green to estimated channel in blue') > axis([1 256 -2 2]) > > %%%%%%%%%%%%%%lms_equil%%%%%%%%%%%%%%%% > l8=320; > data=fil_ch_out(321:end); > w=ones(1,256)./inter_r_us1; %%%%w=estimated channel > errtt=[]; > for n=1:50 > dat=data((n-1)*l8+1:n*l8); > dat1=dat(65:end); > dat_f=fft(dat1,256); > > eq_dat_f=dat_f.*w; > > dat_t=ifft(eq_dat_f,256); > > figure(2) > plot(dat_t,'x') > %%%%%%%%%%%%%%%detector > detc=[]; > for n=1:256 > dc_tmp=dat_t(n);%%%%%%%%%%%%%input to detector > sinng=sign(real(dc_tmp)); > if sinng==1 > if real(dc_tmp)<0.5 > rl_tmp=0; > else > rl_tmp=1; > end > else > if real(dc_tmp)>-0.5 > rl_tmp=0 ; > else > rl_tmp=-1; > end > end > sinng=sign(imag(dc_tmp)); > if sinng==1 > if imag(dc_tmp)<0.5 > ig_tmp=0; > else > ig_tmp=1; > end > else > if imag(dc_tmp)>-0.5 > ig_tmp=0 ; > else > ig_tmp=-1; > end > end > tmp_d=rl_tmp+i*ig_tmp; > detc=[detc tmp_d]; %%%%%%%%%%%%%%%%output of detector > end > figure(3) > plot(detc,'x') > title('detector plot') > axis([-2 2 -2 2]) > > err_t=detc-dat_t; %%%%error of detector to data in time domain > > err_f=fft(err_t,256);%%%%%error back in freq domain > errtt=[errtt err_f]; > figure(4) > subplot(2,1,1) > plot(abs(err_t)); > subplot(2,1,2) > plot(abs(err_f)); > w_up=(dat_f.*conj(err_f)); %%%new weights in freq domain > w=w+0.01*(w_up);%%%%weights update lms algrothim > end > figure(5) > plot(abs(errtt)) > > ___________________________________ > > > > > > > > > > > > > > >_____________________________________ >Do you know a company who employs DSP engineers? >Is it already listed at http://dsprelated.com/employers.php ? >