📄 fire_sys_encoder.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 + -