Viterbi译码及matlab代码(二)

来源:互联网 发布:网络科学导论 汪小帆 编辑:程序博客网 时间:2024/05/18 19:46

1、相关定义

称距离为度量,累计距离为累计度量,分支距离为分支度量
称到达每步的累计度量最小的那个路径为幸存路径
称全局最优路径为最大似然路径

2、算法
每一步:用前一状态的幸存路径(Fa,Fb,Fc,Fd)和本步的分支路径(S0,S1,S2,S3)计算出到达每个状态的累计度量,
保留幸存路径,从第一步开始执行此过程,到最后一步得到最优路径复杂度。

每步需要比较8条路径(每状态两条),计算量与步数成正比。

close all;clear all; clc;
%卷积编码器g1=111,g2=101
%x为输入的待译码序列
x=[1 1 1 0 1 1 0 0 1 1 0 0 1 1];
a=size(x);       %输入序列的长度
s=a(2)/2;        %译码后的m序列长度为x的一半
m=zeros(1,s);     %最终结果存放
ma=zeros(1,s+1);  %存放Fa路径的
mb=zeros(1,s+1);  %存放Fb路径的
mc=zeros(1,s+1);  %存放Fc路径的
md=zeros(1,s+1);  %存放Fd路径的
tempma=zeros(1,s+1);%每个时刻的最小路径值
tempmb=zeros(1,s+1);%每个时刻的最小路径值
tempmc=zeros(1,s+1);%每个时刻的最小路径值
tempmd=zeros(1,s+1);%每个时刻的最小路径值


Fa=0;
Fb=0;
Fc=0;
Fd=0;
for i=1:s
% for i=1:3
    if i==1 %接收到的序列为11
        d0=dis(x(1),x(2),0,0);%0-->00-->00 编码器输出00 0+0+0=0 0+0=0
        d3=dis(x(1),x(2),1,1);%1-->10-->00 编码器输出00 1+0+0=1 1+0=1
        
        Fa=Fa+d0;
        Fb=Fb+d3;
        
        ma(i)=0;
        mb(i)=0;
        mc(i)=0;
        md(i)=0;
        continue;
    elseif i==2 %接收到的序列为10
        d0=dis(x(3),x(4),0,0);%d0=1
        d1=dis(x(3),x(4),0,1);%d1=2
        d2=dis(x(3),x(4),1,0);%d2=0
        d3=dis(x(3),x(4),1,1);%d3=1
        %注意下面的顺序,不能错,否则会产生数据相关,要么加中间变量。
        Fc=Fb+d2;   %0-->10-->01 0+1+0=1(高位) 0+0=0(低位) 编码器输出为:10
        Fd=Fb+d1;   %1-->10-->11 1+1+0=0 1+0=1 编码器出书为:01
        Fb=Fa+d3;
        Fa=Fa+d0;   
        
        ma(i)=0;
        mb(i)=0;
        mc(i)=2;
        md(i)=2;
        continue; 
    elseif i>2
        d0=dis(x(2*i-1),x(2*i),0,0);
        d1=dis(x(2*i-1),x(2*i),0,1);
        d2=dis(x(2*i-1),x(2*i),1,0);
        d3=dis(x(2*i-1),x(2*i),1,1);
        %下面开始进行加比较选,选F值小的路径
        tempa=Fa;
        tempb=Fb;
        tempc=Fc;
        tempd=Fd;
        if Fa+d0<Fc+d3 %到达00状态的两条路径比较大小
            tempa=Fa+d0; %0-->00-->00 编码器输出00 0+0+0=0 0+0=0
            tempma=ma;
            tempma(i)=0
        else
            tempa=Fc+d3;%0-->01-->00 编码器输出11  0+0+1=1 0+1=1
            tempma=mc;
            tempma(i)=1
        end
        
        if Fa+d3<Fc+d0 %到达10状态的两条路径比较大小
            tempb=Fa+d3;%1-->00-->10 编码器输出11  1+0+0=1 1+0=1
            tempmb=ma;
            tempmb(i)=0;
        else
            tempb=Fc+d0;%1-->01-->10 编码器输出00  1+0+1=0 1+1=0
            tempmb=mc;
            tempmb(i)=1;
        end
        
        if Fb+d2<Fd+d1 %到达01状态的两条路径比较大小
            tempc=Fb+d2;%0-->10-->01  编码器输出10  0+1+0=1 0+0=0  
            tempmc=mb;
            tempmc(i)=2;
        else
            tempc=Fd+d1;%0-->11-->01  编码器输出01  0+1+1=0 0+1=1
            tempmc=md;
            tempmc(i)=3;
        end
        
        if Fb+d1<Fd+d2 %到达11状态的两条路径比较大小
            tempd=Fb+d1;%1-->10-->11 编码器输出01  1+1+0=0 1+0=1
            tempmd=mb;
            tempmd(i)=2;
        else
            tempd=Fd+d2;%1-->11-->11 编码器输出10  1+1+1=1 1+1=0
            tempmd=md;
            tempmd(i)=3;
        end
        Fa=tempa
        Fb=tempb
        Fc=tempc
        Fd=tempd
        
        ma=tempma
        mb=tempmb;
        mc=tempmc;
        md=tempmd;
    end
end
%最后F取最小值的那条路径为最优路径,
%同时标记那个数组的最后一个元素为相应的数字
%并将最后的路径算出来


%下面的程序没看明白,难过
temp=min([Fa,Fb,Fc,Fd]);
    if Fa==temp
        ma(6)=0;
        ma
        for t=1:5
            if ma(t)<ma(t+1)
                m(t)=1;
            elseif (ma(t)==ma(t+1)) && (ma(t)==3)
                m(t)=1;
            else
                m(t)=0;
            end
        end
    elseif Fb==temp
        mb(6)=2;
        for t=1:5
            if mb(t)<mb(t+1)
                m(t)=1;
            elseif (mb(t)==mb(t+1)) && (mb(t)==3)
                m(t)=1;
            else
                m(t)=0;
            end
        end
    elseif Fc==temp
        mc(6)=1
        for t=1:5
            if mc(t)<mc(t+1)
                m(t)=1;
            elseif (mc(t)==mc(t+1)) && (mc(t)==3)
                m(t)=1;
            else
                m(t)=0;
            end
        end
    elseif Fd==temp
        md(6)=3
        for t=1:5
            if md(t)<md(t+1)
                m(t)=1;
            elseif (md(t)==md(t+1)) && (md(t)==3)
                m(t)=1;
            else
                m(t)=0;
            end
        end
    end


   %子函数:计算(m,n)到(g,h)的汉明距离
    function d=dis(m,n,g,h)
         d=xor(m,g)+xor(n,h);

0 0
原创粉丝点击