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

📄 viterbi_decoder.m

📁 matlab实现viterbi译码
💻 M
字号:
function [decoder_output,survior_state,state_metric,state_sequence]=viterbi_decoder(G,k,channel_output)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%decoder_output是解码输出
%survivor_state保存了每次选择的幸存路径
%state_metric保存了第i行第j个状态的度量
%state_sequence是得到的最佳路径
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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,1,L,k);
               input(j+1,next_state+1)=1;
               nextstate(j+1,1+1)=next_state;
               output(j+1,1+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,1+1,:),n,'left-msb'));
                        if((state_metric_switch(nextstate(j+1,1+1)+1,2)>state_metric_switch(j+1,1)+branch_metric)|...
                                                flag(nextstate(j+1,1+1)+1)==0)
                                 state_metric_switch(nextstate(j+1,1+1)+1,2)=state_metric_switch(j+1,1)+branch_metric;
                                 survivor_state(nextstate(j+1,1+1)+1,i+1)=j;
                                 flag(nextstate(j+1,1+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(l,depth_of_trellis+1-i)=survivor_state(state_sequence(l,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');
      decoder_output_matrix(:,i)=dec_output_bin(1:1:k)';
end
decoder_output=reshape(decoder_output_matrix,1,k*(depth_of_trellis-L+1));
cumluated_metric=state_metric_switch(1,1);                         %最终得到的最佳路径的度量
%需调用的自编函数nxt_stat源代码如下:
function [next_state,branch_output]=nxt_stat(G,current_state,input,L,k)
%根据当前状态和输入,求得下一状态及输出均为十进制表示
binary_state=de2bi(current_state,k*(L-1),'left-msb');
binary_input=de2bi(input,k,'left-msb');
next_state_binary=[binary_input,binary_state(1:k*(L-2))];
next_state=bi2de(next_state_binary,'left-msb');
branch_output_binary=rem([binary_input,binary_state]*G',2);
branch_output=bi2de(branch_output_binary,'left-msb');
%需调用的自编函数metric源代码如下:
function distance=metric(x,y)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%计算两个二进制序列的汉明距离
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if length(x)~=length(y)
      errordlg('序列长度不匹配!');
end
distance=0;
for i=1:length(x);
      if x(i)==y(i)
              D=0;
      else
              D=1;
      end
      distance=distance+D;
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -