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 + -
显示快捷键?