9.4.1 CEBus PL Chirp f=[0:359]/359*1.75e5+0.75e5; %f=4e5; t=[0:359]/359*1e-4; chirp1=sin(2*pi*f.*t); chirp=3.5*[chirp1(131:360) chirp1(1:130)]; figure(1) plot(t,chirp) xlabel('Time (Sec.)') ylabel('Magnitude') F=fft(chirp); figure(2) py=10*log10((abs(F(1:100))).^2/360/10/0.001/3.6e6*2); plot([1:100]/360*3.6e6, py) grid xlabel('Frequency (Hz)') ylabel('PSD (dBm/Hz)') 9.4.2 GF Representation Calculation %Primitive Polynomial %pp=[1 0 1 1]; %pp=[1 0 0 1 1]; %pp=[1 0 0 1 0 1]; %pp=[1 0 0 0 0 1 1]; %pp=[1 0 0 0 1 0 0 1]; pp=[1 0 0 0 1 1 1 0 1]; m=length(pp)-1; bpr=zeros(2^m,m+1); %Binary presentation %Up to mth power for i=2:m+1 bpr(i,m+3-i)=1; end %Larger than mth power for i=m+2:2^m for j=1:m bpr(i,j)=bpr(i-1,j+1); end bpr(i,m+1)=0; if bpr(i,1)==1 bpr(i,:)=xor(bpr(i,:),pp); end end %Binary to decimal b2d=zeros(2^m,1); for i=1:2^m for j=1:m b2d(i)=b2d(i)+bpr(i,j+1)*2^(m-j); end end %Log table [xx,ppr]=sort(b2d(2:2^m)); ppr=ppr-1; %Inverse log table dpr=b2d(3:2^m); 9.4.3 RS Generator Polynomial Calculation %Generator Polynomial %Initialize ppr and dpr tables rsprp %GF size n=8; %Polynomial order m=16; %Initialization gp=-1*ones(1,m+1); %Set up for m=1 gp(1)=0; gp(2)=1; %Multiplication loop for i=2:m gpp=gp; for j=1:i co1=p2bin(gpp(j+1),n,bpr); co2=p2bin(gpp(j)+i,n,bpr); gp(j+1)=b2pw(xor(co1,co2),n,ppr); end end function b=p2bin(p,n,bpr); if p>-1; p=mod(p,2^n-1); end b=bpr(p+2,:); function p=b2pw(b,n,ppr); d=0; for i=2:n+1 d=d+b(i)*2^(n-i+1) end if d==0; p=-1 else p=ppr(d) end 9.4.4 RS Encoder %GF size n=8; %Random bits mx=ceil(rand(8,239)-0.5); %Initialize code words cw=zeros(8,16); %Get generator polynomial gpoly %Encoding for i=1:239 %Calculate register feedback value rf=xor(cw(:,1),mx(:,i)); if sum(rf)>0 %Power representation prf=b2pw8(rf,n,ppr); for j=1:15 cw(:,j)=xor(p2bin8(gp(j+1)+prf,n,bpr),cw(:,j+1)); end cw(:,16)=p2bin8(gp(17)+prf,n,bpr); else for j=1:15 cw(:,j)=cw(:,j+1); end cw(:,16)=zeros(8,1); end end %Find the power form for i=1:239 mxp(i)=b2pw8(mx(:,i),8,ppr); end for i=1:16 cwp(i)=b2pw8(cw(:,i),8,ppr); end function p=b2pw8(b,n,ppr); b=[0 b']'; p=b2pw(b,n,ppr); function b=p2bin8(p,n,bpr); b=p2bin(p,n,bpr); b=b(2:9)'; 9.4.5 RS Decoder %Received word rc=[mx cw]; %Calculate Syndrom synd=zeros(8,16); for i=1:16 for j=1:255 if sum(rc(:,j))~=0 pp=b2pw8(rc(:,j),8,ppr)+i*(255-j); bpp=p2bin8(pp,8,bpr); synd(:,i)=xor(synd(:,i),bpp); end end end clear rts clear txp %Check if there is error to run the rest of the decoding algorithm if sum(sum(synd))~=0 %Find the error locator polynomial tx=zeros(8,2); tx(8,2)=1; L=0; cnp=zeros(8,1); cnp(8,1)=1; delt=synd(:,1); if sum(delt)~=0 cnp=[[0 0 0 0 0 0 0 1]' delt]; L=1; tx=p2bin8(255-b2pw8(delt,8,ppr),8,bpr); end tx=[zeros(8,1) tx]; for i=2:m delt=synd(:,i); for j=1:L cnpp=b2pw8(cnp(:,j+1),8,ppr); syndp=b2pw8(synd(:,i-j),8,ppr); cnpsynd=p2bin8(cnpp+syndp,8,bpr); delt=xor(delt,cnpsynd); end if sum(delt)~=0 deltp=b2pw8(delt,8,ppr); [txa,txb]=size(tx); deltmtx=zeros(txa,txb); for k=1:txb txp(k)=b2pw8(tx(:,k),8,ppr); if txp(k)~=-1 deltmtx(:,k)=p2bin8(deltp+txp(k),8,bpr); end end cnppr=cnp; [cnpa,cnpb]=size(cnp); if cnpb<txb cnpe=[cnp zeros(8,txb-cnpb)]; else cnpe=cnp; end cnp=xor(cnpe,deltmtx); if 2*L<i L=i-L; clear tx for k=1:cnpb cnpprp=b2pw8(cnppr(:,k),8,ppr); cnpddelt=cnpprp-deltp; if cnpddelt<0 cnpddelt=cnpddelt+255; end tx(:,k)=p2bin8(cnpddelt,8,bpr); end end end tx=[zeros(8,1) tx]; end %Find roots and error locators [cnpa,cnpb]=size(cnp); for i=1:cnpb cnpw(i)=b2pw8(cnp(:,i),8,ppr); end rtcnt=0; for i=0:254 cns=[0 0 0 0 0 0 0 1]'; for j=2:cnpb cns=xor(cns,p2bin8(cnpw(j)+i*(j-1),8,bpr)); end if sum(cns)==0 rtcnt=rtcnt+1; rts(rtcnt)=i; end end %Form the z(x) polynomial zx=[0 0 0 0 0 0 0 1]'; for i=1:length(rts) zcoe=xor(synd(:,i),cnp(:,i+1)); for j=2:i pcnsy=b2pw8(synd(:,j-1),8,ppr)+b2pw8(cnp(:,i-j+2),8,ppr); zcoe=xor(zcoe,p2bin8(pcnsy,8,bpr)); end zx=[zx zcoe]; end clear zxp [zxa,zxb]=size(zx); for i=1:zxb zxp(i)=b2pw8(zx(:,i),8,ppr); end %Find Error values clear er for i=1:length(rts) zxb=[0 0 0 0 0 0 0 1]'; for j=1:length(zxp)-1 zxc=zxp(j+1)+rts(i)*j; zxcb=p2bin8(zxc,8,bpr); zxb=xor(zxb,zxcb); end zxbp=b2pw8(zxb,8,ppr); pbb=0; for j=1:length(rts) if j~=i rtsrtsm=rts(i)-rts(j); if rtsrtsm<0 rtsrtsm=rtsrtsm+255; end blr=xor([0 0 0 0 0 0 0 1]',p2bin8(rtsrtsm,8,bpr)); pbb=pbb+b2pw8(blr,8,ppr); end end er(i)=zxbp-pbb; for j=1:3 if er(i)<0 er(i)=er(i)+255; end end end rts er end 9.4.6 Convolution Encoder %Random bits mx=ceil(rand(1,500)-0.5); %Initialize delay line dline=zeros(1,7); for i=1:500 dline(2:7)=dline(1:6); dline(1)=mx(i); xy((i-1)*2+1)=xor(xor(xor(dline(1),dline(2)),xor(dline(3),dline(4))),dline(7)); xy(i*2)=xor(xor(xor(dline(1),dline(3)),xor(dline(4),dline(6))),dline(7)); end %Punctuation for i=1:166 xyp((i-1)*4+1)=xy((i-1)*6+1); xyp((i-1)*4+2)=xy((i-1)*6+2); xyp((i-1)*4+3)=xy((i-1)*6+4); xyp(i*4)=xy((i-1)*6+5); end 9.4.7 Viterbi Decoder %Generating a lookup table for i=1:64 bn=dec2bin(i-1,6); zb(2:6)=bn(1:5); zb(1)='0'; ob(2:6)=bn(1:5); ob(1)='1'; for j=1:6 bnd(j)=bin2dec(bn(j)); end obd=1; zb1=xor(xor(bnd(1),xor(bnd(2),bnd(3))),bnd(6)); zb2=xor(xor(bnd(2),xor(bnd(3),bnd(5))),bnd(6)); tbl(1,i)=zb1*2+zb2; tbl(2,i)=bin2dec(zb); ob1=xor(xor(xor(obd,bnd(1)),xor(bnd(2),bnd(3))),bnd(6)); ob2=xor(xor(xor(obd,bnd(2)),xor(bnd(3),bnd(5))),bnd(6)); tbl(3,i)=ob1*2+ob2; tbl(4,i)=bin2dec(ob); end %Decoding psta=zeros(1,4); psum=zeros(1,4); blenth=2; %Start with zero state to form 4 paths %First stage in1=xy(1); in2=xy(2); zout=tbl(1,1); znxtst=tbl(2,1); oout=tbl(3,1); onxtst=tbl(4,1); zoutb=dec2bin(zout,2); zout1=bin2dec(zoutb(1)); zout2=bin2dec(zoutb(2)); ooutb=dec2bin(oout,2); oout1=bin2dec(ooutb(1)); oout2=bin2dec(ooutb(2)); weiz=xor(zout1,in1)+xor(zout2,in2); weio=xor(oout1,in1)+xor(oout2,in2); psta(1)=znxtst; psta(2)=znxtst; psta(3)=onxtst; psta(4)=onxtst; psum(1)=weiz; psum(2)=weiz; psum(3)=weio; psum(4)=weio; pbits(1,1)=0; pbits(1,2)=0; pbits(1,3)=1; pbits(1,4)=1; %Second stage in1=xy(3); in2=xy(4); zout=tbl(1,psta(1)+1); znxtst=tbl(2,psta(1)+1); oout=tbl(3,psta(1)+1); onxtst=tbl(4,psta(1)+1); zoutb=dec2bin(zout,2); zout1=bin2dec(zoutb(1)); zout2=bin2dec(zoutb(2)); ooutb=dec2bin(oout,2); oout1=bin2dec(ooutb(1)); oout2=bin2dec(ooutb(2)); weiz=xor(zout1,in1)+xor(zout2,in2); weio=xor(oout1,in1)+xor(oout2,in2); psta(1)=znxtst; psta(2)=onxtst; psum(1)=psum(1)+weiz; psum(2)=psum(2)+weio; pbits(2,1)=0; pbits(2,2)=1; zout=tbl(1,psta(3)+1); znxtst=tbl(2,psta(3)+1); oout=tbl(3,psta(3)+1); onxtst=tbl(4,psta(3)+1); zoutb=dec2bin(zout,2); zout1=bin2dec(zoutb(1)); zout2=bin2dec(zoutb(2)); ooutb=dec2bin(oout,2); oout1=bin2dec(ooutb(1)); oout2=bin2dec(ooutb(2)); weiz=xor(zout1,in1)+xor(zout2,in2); weio=xor(oout1,in1)+xor(oout2,in2); psta(3)=znxtst; psta(4)=onxtst; psum(3)=psum(3)+weiz; psum(4)=psum(4)+weio; pbits(2,3)=0; pbits(2,4)=1; %Rest stages for i=3:500 in1=xy((i-1)*2+1); in2=xy(i*2); for j=1:4 zout=tbl(1,psta(j)+1); znxtst(j)=tbl(2,psta(j)+1); oout=tbl(3,psta(j)+1); onxtst(j)=tbl(4,psta(j)+1); zoutb=dec2bin(zout,2); zout1=bin2dec(zoutb(1)); zout2=bin2dec(zoutb(2)); ooutb=dec2bin(oout,2); oout1=bin2dec(ooutb(1)); oout2=bin2dec(ooutb(2)); weiz=xor(zout1,in1)+xor(zout2,in2); weio=xor(oout1,in1)+xor(oout2,in2); psumz(j)=psum(j)+weiz; psumo(j)=psum(j)+weio; end [ssum,indx]=sort([psumz psumo]); for j=1:4 if indx(j)<5 psum(j)=psumz(indx(j)); tbits(1:blenth,j)=pbits(:,indx(j)); tbits(blenth+1,j)=0; psta(j)=znxtst(indx(j)); else psum(j)=psumo(indx(j)-4); tbits(1:blenth,j)=pbits(:,indx(j)-4); tbits(blenth+1,j)=1; psta(j)=onxtst(indx(j)-4); end end blenth=blenth+1; pbits=tbits; end |