softdecoder9.m

来自「用于通讯仿真的viterbi算法完整实现方案.用途广泛.」· M 代码 · 共 50 行

M
50
字号
function data_out=softdecoder9(data_enc,dlt,slt)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%  译码  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[m,n,frames]=size(data_enc);%%%%%% m 编码长度 n 每比特数据表示的编码数 %%%%%%%%%%%%%%
[s,level,foo]=size(dlt);    %%%%%%%%%%%%%  s 表示状态数 %%%%%%%%%%%%%%%%

metric(1,2:s)=realmax;  %%%%%%%%%%%%% 这个矩阵存储每条路径的距离 %%%%%%%%%%%%%

for k=1:frames   %%%%%%%%%%%%%  fames   解码帧数 %%%%%%%%%%%%%%%
for l=1:m
    for j=1:s
        
        %%%%%%%%%%%%%    寻找导致这一状态的前一状态   %%%%%%%%%%%%%%%%%%%
        [s_pre,foo]=find(slt==j);
        %%%%%%%%%%%%%      将状态转移分区    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%        
        pos=mod(j-1,level)+1;
        %%%%%%%%%%%%%       取可能传送的数据    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        data_test=dlt(s_pre,pos,:);
        data_test=reshape(data_test,[level,n]);
        %%%%%%%%%%%%%%       计算可数据与接收数据的距离    %%%%%%%%%%%%%%%%%
        metric_d=softbrmet(data_enc(l,:,k),data_test);
        %%%%%%%%%%%%%%%%%%%%%   将data_test的距离值加到前一状态上    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        metric_md=metric(l,s_pre)+metric_d;
        
        %%%%%%%%%%%%%%%   算出最小距离,并找到最可能导致当前状态的前一状态  %%%%%%%
        [metric_max,metric_pos]=min(metric_md); 
        
        %%%%%%%%%%%%%%%%  将这个最小距离加到metric矩阵上  %%%%%%%%%
        metric(l+1,j)=metric_max;
        
        %%%%%%%%%%%%%%%  创建一个用于存储状态的矩阵  %%%%%%%%%
        vit_state(l+1,j)=s_pre(metric_pos);
        
        %%%%%%%%%%% 创建一个存储可能传送数据的矩阵  %%%%%%%%
        vit_data(l+1,j)=pos-1;
             
    end
end

[foo,state_best]=max(metric(end,:));

state_possible(m+1)=state_best;

%%%%%%%%%%%  回溯 %%%%%%%%%%%%%%%%%%%%%
    for l=m:-1:1
        state_possible(l)=vit_state(l+1,state_possible(l+1));
        data_possible(l)=vit_data(l+1,state_possible(l+1));
    end
data_out(k,1:m-8)=data_possible(1:m-8);
end

⌨️ 快捷键说明

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