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

📄 viterbi.m

📁 在matlab下输入guide命令后打开main_main.gig 实现卷积编码
💻 M
字号:
%维特比译码,以(2,1,3)卷积码为例,算法过程参考通原书P142
%u=(10111);

clear;
close all;
L=5;% 输入信息组长度
m=2;%  寄存器节数
y=zeros(1,2*L);%收到的码字
y=[1,0,1,0,0,0,0,1,1,1];%假设接收到的码字
u_viterbi=zeros(1,L);%译码结果
d0=0;%di储存汉明距离
d1=0;
d2=0;
d3=0;
s0=0;s1=1;s2=2;s3=3;%代表4状态
u0=zeros(1,L);%存储估值
u1=zeros(1,L);%存储估值
u2=zeros(1,L);%存储估值
u3=zeros(1,L);%存储估值

%%=========================================================================
%%=========================================================================
%(1)从l=m=2开始,使网格图充满状态,将路径存储器和路径度量存储器从l=0到l=m=2,进行初始化
l=1;
aa=[y(l),y(l+1)];%y的前2个值
[a,u]=schang(s0,s0);
d0=length(find(aa~=a));%d0
u0(l)=u;      %u0
%----------------
[a,u]=schang(s0,s1);
d1=length(find(aa~=a));
u1(l)=u;
%==========================================================================
%==========================================================================
%(2)从l=3开始循环
l=l+1;   %l=2
dd0=d0;dd1=d1;%先储存前一步的的汉明距离
k0=u0;k1=u1;%先储存前一步的的译码结果

aa=[y(2*l-1),y(2*l)];%y的前2个值
[a,u]=schang(s0,s0);
d0=d0+length(find(aa~=a));
u0(l)=u; 
%--------------------
[a,u]=schang(s0,s1);
d1=dd0+length(find(aa~=a));
u1=k0;
u1(l)=u;
%--------------------
[a,u]=schang(s1,s2);
d2=dd1+length(find(aa~=a));
u2=k1;
u2(l)=u;
%--------------------
[a,u]=schang(s1,s3);
d3=dd1+length(find(aa~=a));
u3=k1;
u3(l)=u;
%====================================
l=l+1;
for loop=l:L
    aa=[y(2*loop-1),y(2*loop)];%对应的接收码字
    k0=u0;k1=u1;k2=u2;k3=u3;
    dd0=d0;dd1=d1;dd2=d2;dd3=d3;
    %------------对于s0的情况
    [a1,b1]=schang(s0,s0);
    [a2,b2]=schang(s2,s0); 
    if (d0+length(find(aa~=a1)))<=(d2+length(find(aa~=a2)))
        d0=dd0+length(find(aa~=a1));
        
        u0(loop)=b1;
    else
        d0=dd2+length(find(aa~=a2));
        u0=k2;
        u0(loop)=b2;
    end
    %------------对于s1的情况
    [a1,b1]=schang(s0,s1);
    [a2,b2]=schang(s2,s1); 
    if (dd0+length(find(aa~=a1)))<=(dd2+length(find(aa~=a2)))
        d1=dd0+length(find(aa~=a1));
        u1=k0;
        u1(loop)=b1;
    else
        d1=dd2+length(find(aa~=a2));
        u1=k2;
        u1(loop)=b2;
    end
    %------------对于s2的情况
    [a1,b1]=schang(s1,s2);
    [a2,b2]=schang(s3,s2); 
    if(dd1+length(find(aa~=a1)))<=(dd3+length(find(aa~=a2)))
        d2=dd1+length(find(aa~=a1));
        u2=k1;
        u2(loop)=b1;
    else
        d2=dd3+length(find(aa~=a2));
        u2=k3;
        u2(loop)=b2;
    end
     %------------对于s3的情况
    [a1,b1]=schang(s1,s3);
    [a2,b2]=schang(s3,s3); 
    if (dd1+length(find(aa~=a1)))<=(dd3+length(find(aa~=a2)))
        d3=dd1+length(find(aa~=a1));
        u3=k1;
        u3(loop)=b1;
    else
        d3=dd3+length(find(aa~=a2));
        u3(loop)=b2;
    end
end
%==========================================================================
%==========================================================================
%找最小汉明距离对应的译码结果作为输出译码结果。。
d_last=[d0,d1,d2,d3];
d_min=min(d_last);
switch d_min
    case d0
        u_viterbi=u0;
    case d1
        u_viterbi=u1;
    case d2
        u_viterbi=u2;
    otherwise
        u_viterbi=u3;
end

⌨️ 快捷键说明

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