cyc_rach_decoder.m

来自「在MATLAB环境下的GSM信道编码,非常 不错」· M 代码 · 共 119 行

M
119
字号
%cyclic_coder
%g(x)=x^6+x^5+x^3+x^2+x+1
%
%u:buffer(18-bit length)

function [ccx,sysinfo]=cyc_rach_encoder(u,B)
%去BSIC信息及尾比特。
uu=zeros(1,20);
uu(1:8)=u(1:8);
uu(9:14)=mod(u(9:14)+B,2);
%以下译码程序。
uu=[uu];
feedback=0;
sysinfo=[];
ccx=[];



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%error mode:/g(x)
%the result:error_mode_reg(1:6) //from left to right: low to high

error_mode_reg=zeros(1,6);
error_mode_gg=zeros(1,7);
error_mode_gg(7)=1;
error_mode_gg(6)=1;
error_mode_gg(4)=1;
error_mode_gg(3)=1;
error_mode_gg(2)=1;
error_mode_gg(1)=1;
%get the S(x)//计算伴随式S(x)
for i=1:length(uu)
   feedback=error_mode_gg(7)*error_mode_reg(6);
   for j=6:-1:2
      error_mode_reg(j)=rem(error_mode_reg(j-1)+feedback*error_mode_gg(j),2);
   end
   error_mode_reg(1)=rem(uu(i)+feedback*error_mode_gg(1),2);
end
%S(x)=error_mode_reg(6)*x^5+error_mode_reg(5)*x^4+...+error_mode_reg(1)


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% whether S(x)=0//判断伴随式是否为0,如果为0则说明没有错误
% if S(x)=0 then no error exist
  
if(error_mode_reg(1:6)==zeros(1,6))
      sysinfo='System Information : There is no error in the code';
      ccx=uu(1:8);
      break
end  
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%all-zero detector of S: error_mode_reg(2:7) //from left to right: low to high
%//如果不全为0,则判断低5位是否全为0,如果不为0,则自循环移位,再判断低5位是否全为0,
%//如此往复,直到移位次数为14。
bc=0;	
count=0;
while count<14
   %detect the high 3-bit is zero-sequence
   if(error_mode_reg(4:6)==zeros(1,3))
      bc=0;
      break
   end
   
   bc=1;
   
   %loop for one time
   feedback=error_mode_gg(7)*error_mode_reg(6);
   
   for j=6:-1:2
      error_mode_reg(j)=rem(error_mode_reg(j-1)+feedback*error_mode_gg(j),2);
   end
   error_mode_reg(1)=feedback;
   count=count+1;
end

%bc=1 error can not be checked; bc=0 error can be checked
%//如果循环移位14次仍没有满足低5位为全0,则说明无法纠错!
if(bc==1|count==14)
   sysinfo='System Information : Cannot detect the error!';

   %stop the encoder
   break
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%get the count//根据移位次数和求得的错误图样,纠错。
%E(x)=error_mode_reg(1)+error_mode_reg(2)*x+error_mode_reg(3)*x^2
%The error = E(x)
%uu(x)=uu(14)+uu(13)*x+uu(12)*x^2+...+uu(3)*x^11+uu(2)*x^12+uu(1)*x^13
%correct the code uu(x)+E(x)
 if count>=6  
     for i=1:6
         j=count-i+1;
         uu(j)=rem(uu(j)+error_mode_reg(i),2);
     end
 end
 if count<6&count>0
     for i=1:count
         j=count-i+1;
         uu(j)=rem(uu(j)+error_mode_reg(i),2);
     end
      for i=1:6-count
          j=14-i+1;
          uu(j)=rem(uu(j)+error_mode_reg(count+i),2); 
      end
 end    
 if count==0
     for i=1:6
         j=14-i+1;
         uu(j)=rem(uu(j)+error_mode_reg(i),2);
         
     end
 end
  sysinfo='System Information : Errors have been corrcted';
ccx=uu(1:8);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?