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 ?
LMS Equalizer fo SC_FDE
Started by ●December 10, 2008
Reply by ●December 11, 20082008-12-11
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 ?
Reply by ●December 12, 20082008-12-12
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 ? >