⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fire_sys_encoder.m

📁 GSM信道编码设计
💻 M
字号:
%fire_coder
%g(x)=x^40+x^26+x^23+x^17+x^3+1=(x^23+1)(x^17+x^3+1)
%:p(x)=x^17+x^3+1
%:c=2b-1=2*12-1=23,b=12(burst error number)

%uu(x)=cc(x)*g(x)=uu(1)*x^223+uu(2)*x^222+...+uu(223)*x+uu(224)
%cc(x)=uu(x)/g(x)
%1.error mode: uu(x)/(x^c+1)
%2.error position: uu(x)/p(x)
%3.uu:buffer(224-bit length)


function [ccx,sysinfo]=fire_sys_encoder(uu)

uu=[uu];
feedback=0;
sysinfo=[];
ccx=[];

for i=185:224,
   uu(i)=rem(uu(i)+1,2);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%error mode:/(x^23+1)
%the result: error_mode_reg(1:23) //from left to right: low to high

c=23;
b=12;
error_mode_reg=zeros(1,23);
error_mode_gg=zeros(1,24);
error_mode_gg(24)=1;
error_mode_gg(1)=1;

%get the S0
for i=1:length(uu)
   feedback=error_mode_gg(24)*error_mode_reg(23);
   for j=23:-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
%S0(x)=error_mode_reg(23)*x^22+error_mode_reg(22)*x^21+...+error_mode_reg(1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%error pos:/(x^17+x^3+1) then *(x^15+x^13+x^6+x^4+x^3+x^2+1)/(x^17+x^3+1)
%the result: error_pos_reg(1:17) //from left to right: low to high

error_pos_reg=zeros(1,17);
error_pos_gg=zeros(1,18);
error_pos_gg(18)=1;
error_pos_gg(4)=1;
error_pos_gg(1)=1;

%get the S1(x)=uu(x)/(x^17+x^3+1)
for i=1:length(uu)
   feedback=error_pos_gg(18)*error_pos_reg(17);
   for j=17:-1:2
      error_pos_reg(j)=rem(error_pos_reg(j-1)+feedback*error_pos_gg(j),2);
   end
   error_pos_reg(1)=rem(uu(i)+feedback*error_pos_gg(1),2);
end


%S1(x)=error_pos_reg(17)*x^16+error_pos_reg(16)*x^15+...+error_pos_reg(2)*x+error_pos_reg(1)
%S1'(x)=S1(x)*(x^15+x^13+x^6+x^4+x^3+x^2+1)
ss1=[error_pos_reg(17:-1:1),zeros(1,15)];
qx_reg=zeros(1,16);
%:q(x)=qx_gg(16)*x^15+qx_gg(15)*x^14+...+qx_gg(2)*x+qx_gg(1)
qx_gg=zeros(1,16);
qx_gg(16)=1;
qx_gg(14)=1;
qx_gg(7)=1;
qx_gg(5)=1;
qx_gg(4)=1;
qx_gg(3)=1;
qx_gg(1)=1;
ss1_out=[];

for i=1:length(ss1)
   qx_reg(16)=ss1(i);
   ss1_out(i)=rem(qx_reg*qx_gg',2);
   for j=1:15
      qx_reg(j)=qx_reg(j+1);
   end
end
%S1'(x)=ss1_out(1)*x^(15+16)+ss1_out(2)*x^(30)+...+ss1_out(31)*x+ss1_out(32)

%S1'=S1'/(x^17+x^3+1)
error_pos_reg=zeros(1,17);
for i=1:length(ss1_out)
   feedback=error_pos_gg(18)*error_pos_reg(17);
   for j=17:-1:2
      error_pos_reg(j)=rem(error_pos_reg(j-1)+feedback*error_pos_gg(j),2);
   end
   error_pos_reg(1)=rem(ss1_out(i)+feedback*error_pos_gg(1),2);
end
%S1'(x)=error_pos_reg(17)*x^16+error_pos_reg(16)*x^15+...+error_pos_reg(1)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% whether S0(x)=0 and S1(x)=0
% if (S0(x)=0 and S1'(x)!=0) or (S0(x)!=0 and S1'(x)=0) then can not find error
% if S0(x)=0 and S1'(x)=0 then no error exist
if(error_mode_reg(1:23)==zeros(1,23))
   if(error_pos_reg(1:17)==zeros(1,17))
      sysinfo='System Information : There is no error in the code';
      break
   else
      sysinfo='System Information : Cannot detect the error!';
      break
   end
else
   if(error_pos_reg(1:17)==zeros(1,17))
      sysinfo='System Information : Cannot detect the error!';
      break
   end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%all-zero detector of S0: error_mode_reg(2:24) //from left to right: low to high
bc=0;	
count1=0;
while count1<23
   %detect the high (c-b) is zero-sequence
   if(error_mode_reg(b+1:c)==zeros(1,c-b))
      bc=0;
      break
   end
   
   bc=1;
   
   %loop for one time
   feedback=error_mode_gg(24)*error_mode_reg(23);
   
   for j=23:-1:2
      error_mode_reg(j)=rem(error_mode_reg(j-1)+feedback*error_mode_gg(j),2);
   end
   error_mode_reg(1)=feedback;
   count1=count1+1;
end

%bc=1 error can not be checked; bc=0 error can be checked
if(bc==1|count1==23)
   sysinfo='System Information : Cannot detect the error!';
   %stop the encoder
   break
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%all-zero detector of S1': error_pos_reg(2:18) //from left to right: low to high
%whether error_pos_reg(2:b+1)=error_mode_reg(2:b+1)
bc=1;
count2=0;
while count2<231
   %judge error_pos_reg(2:b+1)=error_mode_reg(2:b+1) or not
   if(error_pos_reg(1:b)==error_mode_reg(1:b))
      if(error_pos_reg(b+1:17)==zeros(1,17-b))
      	bc=0;
      	break
      end
   end
   
   bc=1;
   
   %loop for one time
   feedback=error_pos_gg(18)*error_pos_reg(17);
   for j=17:-1:2
      error_pos_reg(j)=rem(error_pos_reg(j-1)+feedback*error_pos_gg(j),2);
   end
   error_pos_reg(1)=feedback;
   count2=count2+1;
end

%bc=1 error can not be checked; bc=0 error can be checked
if(bc==1|count2>230)
   sysinfo='System Information : Cannot detect the error!';
   %stop the encoder
   break
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%get the count1 and count2, compute the error position
%i=[-count1*e*x+(230-count2)*c*y] mod (e*c)
%		e=13170, c=23
%		x=19, y=22795
error_position=mod((-count1)*131071*19+(230-count2)*23*22795,131071*23);

%E(x)=error_mode_reg(1)+error_mode_reg(2)*x+...+error_mode_reg(b)*x^(b-1)
%The error = x^error_position*E(x)
%uu(x)=uu(224)+uu(223)*x+uu(222)*x^2+...+uu(3)*x^221+uu(2)*x^222+uu(1)*x^223
%correct the code uu(x)+x^error_position*E(x)
for i=1:b
   j=224-error_position-i+1;
   if j>0,
      uu(j)=rem(uu(j)+error_mode_reg(i),2);
   end
end

ccx=uu(1:184);

⌨️ 快捷键说明

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