📄 viterbi_decoder.m
字号:
function[decoder_output,survivor_state,state_metric,state_squence]=...
viterbi_decoder(G,k,channel_output)
n=size(G,1);
L=size(G,2)/k;
number_of_states=2^((L-1)*k);
for j=0:(number_of_states-1)
for l=0:2^k-1
[next_state,branch_output]=nxt_stat(G,j,l,L,k);
input(j+1,next_state+1)=l;
nextstate(j+1,l+1)=next_state;
output(j+1,l+1)=branch_output;
end
end
state_metric_switch=zeros(number_of_states,2);
depth_of_trellis=length(channel_output)/n;
state_metric=zeros(number_of_states,depth_of_trellis);
survivor_state=zeros(number_of_states,depth_of_trellis+1);
channel_output_matrix=reshape(channel_output,n,depth_of_trellis);
for i=1:depth_of_trellis-L+1
flag=zeros(1,number_of_states);
if i<=L
step=2^(k*(L-i));
else
step=1;
end
for j=0:step:number_of_states-1
for l=0:2^k-1
branch_metric=metric(channel_output_matrix(:,i),...
de2bi(output(j+1,l+1,:),n,'left-msb'));
if ((state_metric_switch(nextstate(j+1,l+1)+1,2)>state_metric_switch...
(j+1,1)+branch_metric)|flag(nextstate(j+1,l+1)+1)==0);
state_metric_switch(nextstate(j+1,l+1)+1,2)=state_metric_switch...
(j+1,1)+branch_metric;
survivor_state(nextstate(j+1,l+1)+1,i+1)=j;
flag(nextstate(j+1,l+1)+1)=1;
end
end
end
state_metric_switch=state_metric_switch(:,2:-1:1);
state_metric(:,i)=state_metric_switch(:,1);
end
for i=depth_of_trellis-L+2:depth_of_trellis;
flag=zeros(1,number_of_states);
step=2^(k*(i-depth_of_trellis+L-2));
for j=0:number_of_states/step-1
branch_metric=metric(channel_output_matrix(:,i),de2bi(output...
(j+1,1,:),n,'left-msb'));
if((state_metric_switch(nextstate(j+1,1)+1,2)>state_metric_switch...
(j+1,1)+branch_metric)|flag(nextstate(j+1,1)+1)==0)
state_metric_switch(nextstate(j+1,1)+1,2)=state_metric_switch...
(j+1,1)+branch_metric;
survivor_state(nextstate(j+1,1)+1,i+1)=j;
flag(nextstate(j+1,1)+1)=1;
end
end
state_metric_switch=state_metric_switch(:,2:-1:1);
state_metric(:,i)=state_metric_switch(:,1);
end
state_sequence=zeros(1,depth_of_trellis+1);
state_sequence(1,depth_of_trellis+1)=0;
for i=1:depth_of_trellis;
state_sequence(1,depth_of_trellis+1-i)=survivor_state(state_sequence(1,depth_of_trellis+2-i)...
+1,depth_of_trellis-i+2);
end
decoder_output_matrix=zeros(k,depth_of_trellis-L+1);
for(i=1:depth_of_trellis-l+1)
dec_output_deci=input(state_sequence(1,i)+1,state_sequence(1,i+1)+1);
dec_output_bin=de2bi(dec_output_deci,k,'left-msb');
decorder_output_matrix(:,i)=dec_output_bin(1:1:k)';
end
decoder_output =reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));
cumulated_metric=state_metric_switch(1,1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -