📄 viterbi.m
字号:
function decov_out=viterbi(G,k,channel_out)
L=size(G,2)/k;
n=size(G,1);
org_state=2^((L-1)*k);
state_matrix(1:org_state,1:org_state)=inf;
input_matrix(1:org_state,1:org_state)=inf;
for i=0:org_state-1
bi_org=binary(i,(L-1)*k);
for j=0:2^k-1
bi_in=binary(j,k) ;
[memory_con,next_state]=change(bi_org,bi_in,L);
out=rem(memory_con*G',2);
de_out=deci2(out);
state_matrix(i+1,next_state+1)=de_out+1;
input_matrix(i+1,next_state+1)=j;
end
end;
depth=length(channel_out)/n;
channel_out_matrix=reshape(channel_out,n,depth);
state_net(1:org_state,1:depth)=inf;
route_net(1:org_state,1:depth)=inf;
for i=1:depth,
if i<=L
step=2^((L-i)*k);
else
step=1;
end;
for j=0:ceil(step/2):org_state-1;
flag(1:org_state)=inf;
for s=0:step:org_state-1
bj=binary(state_matrix(s+1,j+1)-1,n);
distance=0;
for t=1:n
if bj==inf
distance=inf;
break;
end
distance=distance+metric(channel_out_matrix(t,i),bj(t));
end
if i==1
flag(s+1)=distance;
else
flag(s+1)=distance+state_net(s+1,i-1);
end
end
[state_distance,state_point]=min(flag);
state_net(j+1,i)=state_distance;
route_net(j+1,i)=state_point;
end
end
[min_metric,min_point]=min(state_net(:,depth));
min_out(depth+1)=min_point;
for i=depth+1:-1:1
if i==1
break;
else
min_out(i-1)=route_net(min_out(i),i-1);
end
end
j=1;
for i=1:depth,
date=input_matrix(min_out(i),min_out(i+1));
decov_out(j:j+k-1)=binary(date,k);
j=j+k;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -