📄 viterbi.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 + -