Viterbi Decoder
Viterbi Decoder
m=1;
for i=1:2:size(r,2)
for j=1:8
h_dist(j,m)=norm(r(i:i+1)-s_out(j,:))^2;
end
m=m+1;
end
h_dist(1,1)=inf;
% path metric %
dist=trellis(h_dist,d,h);
%state transition%
s_path=path(dist,h,h_dist,state_matrix,s_m);
ts=1;
for i=1:h+1
state(1,ts:ts+1)=dec2bin(s_path(i),2);
if ts~=h+1
state(1,ts+2)=' ';
ts=ts+3;
end
end
%regenrated input%
re_code=regenerate(s_path,h);
function[d]=trellis(h_dist,d,h)
for i=1:h
x=1;
for j=1:4
if j==3 || j==4
x=2;
elseif j==1 || j==2
x=1;
end
v1=d(x,i)+h_dist(j,i);
v2=d(x+2,i)+h_dist(j+4,i);
d(j,i+1)=min(v1,v2);
end
end
function [state] = path(dist,h,hamming,state,s_m)
x=1;
j=1;
for i=h:-1:1
if j==3 || j==4
x=2;
elseif j==1 || j==2
x=1;
end
v1=dist(x,i)+hamming(j,i);
v2=dist(x+2,i)+hamming(j+4,i);
if v1~=v2
ad=min(v1,v2);
if ad==v1
b=x;
elseif ad==v2
b=x+2;
end
else
if dist(x,i)>dist(x+2,i)
b=x+2;
else
end
end
b=x;
end
state(1,i)=s_m(b);
j=b;
function[way]=regenerate(path,h)
for i=1:h
if path(i)==0
if path(i+1)==0
way(i)=0;
elseif path(i+1)==2
way(i)=1;
end
elseif path(i)==2
if path(i+1)==1
way(i)=0;
elseif path(i+1)==3
way(i)=1;
end
elseif path(i)==1
if path(i+1)==0
way(i)=0;
elseif path(i+1)==2
way(i)=1;
end
elseif path(i)==3
if path(i+1)==1
way(i)=0;
elseif path(i+1)==3
way(i)=1;
end
end
end