function vitercode = viterb_decode(conv_data)
% end
% (n,k,N)=(2 1 3);
%% 参数
% n=2; k=1;% K=3;% m=K-1;
%% 接收序列信息
length_c =length(conv_data); % 接收到的码长
L_vd = length_c/2; % 未编码前的码长
viter_dec = zeros(1,L_vd); %存储最后的译码结果
%% a-->00; b-->10; c-->01; d-->11
% 状态存储路径
S0_route = zeros(1,length_c); %00
S1_route = zeros(1,length_c); %10
S2_route = zeros(1,length_c); %01
S3_route = zeros(1,length_c); %11
%每条路径汉明距离汉明距离累加和 & 存储每个状态累计汉明距离 临时变量
sum_Ha =0;
sum_Hb =0;
sum_Hc =0;
sum_Hd =0;
%%
for ii = 1:L_vd
%% 第一时刻
if ii ==1
% 每条路径值与接收信号的汉明距离计算 M2M3 =状态 a 00 b 10 c 01 d 11
d0 = Ham_distance(conv_data(ii),conv_data(ii+1),0,0); % 0/00 输入/输出 状态00
d3 = Ham_distance(conv_data(ii),conv_data(ii+1),1,1); % 1/11 01
% 汉明距离累加和 a 00 b 10 c 01 d 11
sum_Ha = d0;
sum_Hb = d3;
%% 第二时刻
elseif ii==2 % 2时刻 %状态转换 s0->s0 s0->s1 0/00 1/11; s1->s2 s1->s3 0/10 1/01
sum_H = [sum_Ha,sum_Hb,0,0];
d0 = Ham_distance(conv_data(2*ii-1),conv_data(2*ii),0,0); % 编码输出00
d1 = Ham_distance(conv_data(2*ii-1),conv_data(2*ii),0,1); % 编码输出01
d2 = Ham_distance(conv_data(2*ii-1),conv_data(2*ii),1,0); % 编码输出10
d3 = Ham_distance(conv_data(2*ii-1),conv_data(2*ii),1,1); % 编码输出11
% a-->00 b-->10 c-->01 d-->11
sum_Hc =sum_H(2) + d2; % 每条状态路径汉明距离汉明距离累加和
sum_Hd =sum_H(2) + d1;
sum_Hb =sum_H(1) + d3;
sum_Ha =sum_H(1) + d0;
S0_route(1:4) = [0 0 0 0]; %S0(a)->00 状态经过的路径
S1_route(1:4) = [0 0 1 0]; %S1(b)->10 状态经过的路径
S2_route(1:4) = [1 0 0 1]; %S2(c)->01 状态经过的路径
S3_route(1:4) = [1 0 1 1]; %S3(d)->11 状态经过的路径
%% 第三时刻开始选择新的路径
%% *******计算上一时刻到该时刻状态的汉明距离,到达每一个状态都有两条路径,理论每次选择汉明距离最小的
else
d0 = Ham_distance(conv_data(2*ii-1),conv_data(2*ii),0,0); % 编码输出00
d1 = Ham_distance(conv_data(2*ii-1),conv_data(2*ii),0,1); % 编码输出01
d2 = Ham_distance(conv_data(2*ii-1),conv_data(2*ii),1,0); % 编码输出10
d3 = Ham_distance(conv_data(2*ii-1),conv_data(2*ii),1,1); % 编码输出11
%% 临时变量保存原来的路径 & 累计汉明距离
S0_Temp = S0_route(1:2*ii-2);
S1_Temp = S1_route(1:2*ii-2);
S2_Temp = S2_route(1:2*ii-2);
S3_Temp = S3_route(1:2*ii-2);
sum_H = [sum_Ha,sum_Hb,sum_Hc,sum_Hd];
%% ******** 通过比较获得新的路径以及累计汉明距离**********
if sum_H(1) +d0 <= sum_H(3) +d3 % a=00 状态 对应路径汉明距离比较
sum_Ha = sum_H(1) + d0;
S0_route(1:2*ii) = [S0_Temp,0 0];
else
sum_Ha = sum_H(3) + d3;
S0_route(1:2*ii) = [S2_Temp,0 0];
end
%%
if sum_H(1) + d3 <= sum_H(3) + d0 % 10状态
sum_Hb = sum_H(1) +d3;
S1_route(1:2*ii) = [S0_Temp,1 0];
else
sum_Hb = sum_H(3) + d0;
S1_route(1:2*ii) = [S2_Temp,1 0];
end
%%
if sum_H(2) + d2 <= sum_H(4) +d1 % 01状态
sum_Hc = sum_H(2) + d2;
S2_route(1:2*ii) = [S1_Temp,0 1] ;
else
sum_Hc = sum_H(4) + d1;
S2_route(1:2*ii) = [S3_Temp,0 1];
end
%%
if sum_H(2) + d1 <= sum_H(4) +d2 % 11状态
sum_Hd = sum_H(2) + d1;
S3_route(1:2*ii) = [S1_Temp,1 1];
else
sum_Hd = sum_H(4) + d2;
S3_route(1:2*ii) = [S3_Temp,1 1];
end
end
end
%% 根据最优路径和状态转移图译码
for m = 1:L_vd
if m ==1
if ( S0_route(1)==0 )
viter_dec(1) =0;
else
viter_dec(1) =1;
end
elseif(m==2)
if S0_route(3)== 0
viter_dec(2) =0;
else
viter_dec(2) =1;
end
else
L1 = 2*m - 3;
R1 = 2*m - 2;
L2 = 2*m - 1;
R2 = 2*m;
if((S0_route(L1:R1)==[0 0]|S0_route(L1:R1)==[0 1]) & S0_route(L2:R2)==[0 0])
viter_dec(m) =0;
elseif ((S0_route(L1:R1)==[1 0]|S0_route(L1:R1)==[1 1]) & S0_route(L2:R2)==[0 1])
viter_dec(m)= 0;
else
viter_dec(m)=1;
end
end
end
vitercode = viter_dec;
end