⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 viterbi_decoder.m

📁 一个对接收信号进行硬判决VITERBI译码的函数
💻 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 + -