文档库 最新最全的文档下载
当前位置:文档库 › viterbi译码matlab代码

viterbi译码matlab代码

function Viterbi=viterbi()
%卷积编码器g1=111,g2=101
%x为输入的待译码序列
x=[1,0,1,0,0,1,0,0,0,1,0,1,1,1];
%x=[1,1,0,1,0,1,1,0,0,1]
%x=[1,1,1,0,0,0,1,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
if i==1
d0=dis(x(1),x(2),0,0);
d3=dis(x(1),x(2),1,1);
Fa=Fa+d0
Fb=Fb+d3
ma(i)=0;
mb(i)=0;
mc(i)=0;
md(i)=0;
continue;
elseif i==2
d0=dis(x(3),x(4),0,0);
d1=dis(x(3),x(4),0,1);
d2=dis(x(3),x(4),1,0);
d3=dis(x(3),x(4),1,1);
%注意下面的顺序,不能错,否则会产生数据相关,要么加中间变量。
Fc=Fb+d2
Fd=Fb+d1
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+d0tempa=Fa+d0;
tempma=ma;
tempma(i)=0;
else
tempa=Fc+d3;
tempma=mc;
tempma(i)=1;
end

if Fa+d3tempb=Fa+d3;
tempmb=ma;
tempmb(i)=0;
else
tempb=Fc+d0;
tempmb=mc;
tempmb(i)=1;
end

if Fb+d2tempc=Fb+d2;
tempmc=mb;
tempmc(i)=2;
else
tempc=Fd+d1;
tempmc=md;
tempmc(i)=3;
end

if Fb+d1tempd=Fb+d1;
tempmd=mb;
tempmd(i)=2;
else
tempd=Fd+d2;
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;
for t=1:5
if ma(t)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)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)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)m(t)=1;
elseif (md(t)==md(t+1)) && (md(t)==3)
m(t)=1;
else
m(t)=0;
end
end
end

m

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

相关文档
相关文档 最新文档