本程序卷积码译码为(2 1 2)形式
%u=randi([0,1],1,5);
u=[1 1 0 1 1];
x=2;
y=2;
r=try_convol(u,x,y);%
n_delay=2;%两个延时器
k=1; %单输入
G=[1 1 1;1 0 1]; %该212码的结构
u_l=length(r)/2-2;
%输入――初态――次状态――输出矩阵
s_c=[0 0 0 0 0 0 0;%第一位为输入数据,第二到五为初试状态和次状态,最后两位为输出数据
1 0 0 1 0 1 1;
0 1 0 0 1 1 0;
1 1 0 1 1 0 1;
0 0 1 0 0 1 1;
1 0 1 1 0 0 0;
0 1 1 0 1 0 1;
1 1 1 1 1 1 0];
%当前寄存器状态+输出量
c0=[0 0 0 0 0];%第一位为寄存器状态,两个延时器的状态共四位,后面四位为第一次到达所有状态的输出数据
c1=[2,0 0 1 1];
c2=[1,1 1 1 0];
c3=[3 1 1 0 1];
for j=1:u_l-2 %从第一次达到所有状态开始,所以减2
c5=c0; %避免赋值的时候覆盖,四位状态有8种输出可能
c6=c1;
c7=c2;
c8=c3;
for x=0:3 %x指末状态,共四种
switch(x)
case 0 %如果末状态是0,则能根据上表得出他有两种初试情况可以达到,并且输出输出量
c0=[c0,0,0]; %增加输出量
c2=[c2,1,1];
l_c0=length(c0);%获取增加后的长度
d_c0=sum(abs(r(1:4+2*j)-c0(2:l_c0)));%计算汉明距离
d_c2=sum(abs(r(1:4+2*j)-c2(2:l_c0)));
if d_c0>d_c2 %判决汉明距离,留下短的,若果一样随便去
c0=[0,c2(2:l_c0)];
else
c0=[0,c0(2:l_c0)];
end
case 1
c1=[c1,1,0];
c3=[c3,0,1];
l_c1=length(c1);
d_c1=sum(abs(r(1:4+2*j)-c1(2:l_c1)));
d_c3=sum(abs(r(1:4+2*j)-c3(2:l_c1)));
if d_c1>d_c3
c2=[1,c3(2:l_c1)];
else
c2=[1,c1(2:l_c1)];
end
case 2
c5=[c5,1,1];
c7=[c7,0,0];
l_c2=length(c5);