代码的意思是:比如编码出来的是500个码字,代码需要实现每次解码100个,解码完前面100个再解码后面100个,高手帮我改改
function dec=Hviterbi_zp(cod)
%根据(2,1,3)卷积编码
n=2;%一个码组bit位数
k=1;%一个码组中信息位位数
N=3;%约束码组个数
temp=1
M=size(cod,2)/100;%将数据截取为M份,每份一百个
%g1=[1 1 1],默认输出码元1的生成矩阵,根据不同的(n,k,N)应修改状态
%转移矩阵和输出矩阵
%g2=[1 0 1],默认输出码元2的生成矩阵,根据不同的(n,k,N)应修改状态
%转移矩阵和输出矩阵
L=length(cod)/n;%实际信息位位数
stanum=2^(N-1);%对于k=1的情况来说,译码器的状态个数
%状态定义
a=0;b=1;c=2;d=3;
nextstatematrix=[a b;%四个状态a->0,b->1,c->2,d->3;
c d;%nextstatematrix矩阵存储状态转移表,其中
a b;%第1-4行为现态a,b,c,d状态,
c d];%第1-2列分别输入0,1
outputmatrix=[0 3;%outputmatrix矩阵存储输出表格。
2 1;%第1-4行为现态a,b,c,d状态,
3 0;%第1-2列分别输入0,1
1 2];
survpath=zeros(stanum,50);%stanum行,100列矩阵,存储幸存路径
newsurvpath=zeros(stanum,50);%用于转移赋值,更新survpath
acvalue=zeros(1,stanum);%acvalue数组,存储于survpath对应路径的
%累计误差值
newacvalue=zeros(1,stanum);%用于更新累加值
curvalue=zeros(2,stanum);%统计每步状态转移得到的各条路径的误差值
%因为默认(2,1,3),故每条路径可延生出两条
%路径,取行数2故
%初始前两步状态转移的处理
survpath(1,1:2)=[0 0];%输入的0 0 的路径
survpath(2,1:2)=[0 1];%输入的0 1 的路径
survpath(3,1:2)=[1 0];%输入的1 0 的路径
survpath(4,1:2)=[1 1];%输入的1 1 的路径
preacvalue=0;
%循环计算幸存路径
for total=1:M %总循环次数
%初始状态为a
switch temp
case 1
acvalue(1)=preacvalue+HMdist([0 0 0 0],cod([1 2 3 4]+(total-1)*100));%输入的0 0 的路径误差
acvalue(2)=preacvalue+HMdist([0 0 1 1],cod([1 2 3 4]+(total-1)*100));%输入的0 1 的路径误差
acvalue(3)=preacvalue+HMdist([1 1 1 0],cod([1 2 3 4]+(total-1)*100));%输入的1 0 的路径误差
acvalue(4)=preacvalue+HMdist([1 1 0 1],cod([1 2 3 4]+(total-1)*100));%输入的1 1 的路径误差
%初始状态为b
case 2
acvalue(1)=preacvalue+HMdist([1 0 1 1],cod([1 2 3 4]+(total-1)*100));%输入的0 0 的路径误差
acvalue(2)=preacvalue+HMdist([1 0 0 0],cod([1 2 3 4]+(total-1)*100));%输入的0 1 的路径误差
acvalue(3)=preacvalue+HMdist([0 1 0 1],cod([1 2 3 4]+(total-1)*100));%输入的1 0 的路径误差
acvalue(4)=preacvalue+HMdist([0 1 1 0],cod([1 2 3 4]+(total-1)*100));%输入的1 1 的路径误差
%初始状态为c
case 3
acvalue(1)=preacvalue+HMdist([1 1 0 0],cod([1 2 3 4]+(total-1)*100));%输入的0 0 的路径误差
acvalue(2)=preacvalue+HMdist([1 1 1 1],cod([1 2 3 4]+(total-1)*100));%输入的0 1 的路径误差
acvalue(3)=preacvalue+HMdist([0 0 1 0],cod([1 2 3 4]+(total-1)*100));%输入的1 0 的路径误差
acvalue(4)=preacvalue+HMdist([0 0 0 1],cod([1 2 3 4]+(total-1)*100));%输入的1 1 的路径误差
%初始状态为d
case 4
acvalue(1)=preacvalue+HMdist([0 1 1 1],cod([1 2 3 4]+(total-1)*100));%输入的0 0 的路径误差
acvalue(2)=preacvalue+HMdist([0 1 0 0],cod([1 2 3 4]+(total-1)*100));%输入的0 1 的路径误差
acvalue(3)=preacvalue+HMdist([1 0 0 1],cod([1 2 3 4]+(total-1)*100));%输入的1 0 的路径误差
acvalue(4)=preacvalue+HMdist([1 0 1 0],cod([1 2 3 4]+(total-1)*100));%输入的1 1 的路径误差
otherwise
;
end
for i=3:50 %信息码组个数
for j=1:stanum %路径个数
switch j
case 1 %到达状态a的路径
curvalue(1,1)=HMdist([0 0],cod([2*i-1+(total-1)*100 2*i+(total-1)*100])); %a->a路径,从路径1而来
curvalue(2,1)=HMdist([1 1],cod([2*i-1+(total-1)*100 2*i+(total-1)*100])); %c->a路径,从路径3而来
if(acvalue(1)+curvalue(1,1)a误差 < 路径3 + c->a误差
newsurvpath(1,1:i)=[survpath(1,1:i-1) 0]; %路径选择a->a
newacvalue(1)=acvalue(1)+curvalue(1,1); %路径1误差累加值累加
else
newsurvpath(1,1:i)=[survpath(3,1:i-1) 0]; %路径选择c->a
newacvalue(1)=acvalue(3)+curvalue(2,1); %路径1误差累加值累加
end
case 2 %到达状态b的路径
curvalue(1,2)=HMdist([1 1],cod([2*i-1+(total-1)*100 2*i+(total-1)*100])); %a->b路径,从路径1而来
curvalue(2,2)=HMdist([0 0],cod([2*i-1+(total-1)*100 2*i+(total-1)*100])); %c->b路径,从路径3而来
if(acvalue(1)+curvalue(1,2)b误差 < 路径3 + c->b误差
newsurvpath(2,1:i)=[survpath(1,1:i-1) 1]; %路径选择a->b
newacvalue(2)=acvalue(1)+curvalue(1,2); %路径2误差累加值累加
else
newsurvpath(2,1:i)=[survpath(3,1:i-1) 1]; %路径选择c->b
newacvalue(2)=acvalue(3)+curvalue(2,2); %路径2误差累加值累加
end
case 3 %到达状态c的路径
curvalue(1,3)=HMdist([1 0],cod([2*i-1+(total-1)*100 2*i+(total-1)*100])); %b->c路径,从路径2而来
curvalue(2,3)=HMdist([0 1],cod([2*i-1+(total-1)*100 2*i+(total-1)*100])); %d->c路径,从路径4而来
if(acvalue(2)+curvalue(1,3)c误差 < 路径4 + d->c误差
newsurvpath(3,1:i)=[survpath(2,1:i-1) 0]; %路径选择b->c
newacvalue(3)=acvalue(2)+curvalue(1,3); %路径3误差累加值累加
else
newsurvpath(3,1:i)=[survpath(4,1:i-1) 0]; %路径选择d->c
newacvalue(3)=acvalue(4)+curvalue(2,3); %路径3误差累加值累加
end
case 4 %到达状态d的路径
curvalue(1,4)=HMdist([1 0],cod([2*i-1+(total-1)*100 2*i+(total-1)*100])); %d->d路径,从路径4而来
curvalue(2,4)=HMdist([0 1],cod([2*i-1+(total-1)*100 2*i+(total-1)*100])); %b->d路径,从路径2而来
if(acvalue(4)+curvalue(1,4)d误差 < 路径2 + b->d误差
newsurvpath(4,1:i)=[survpath(4,1:i-1) 1]; %路径选择d->d
newacvalue(4)=acvalue(4)+curvalue(1,4); %路径4误差累加值累加
else
newsurvpath(4,1:i)=[survpath(2,1:i-1) 1]; %路径选择c->d
newacvalue(4)=acvalue(2)+curvalue(2,4); %路径4误差累加值累加
end
otherwise
;
end
end
survpath(:,1:i)=newsurvpath(:,1:i); %更新路径
acvalue=newacvalue; %更新累加值
end
%找出最小误差对应的路径
if(acvalue(1)==min(acvalue))
dec(((total-1)*50+1):50*total)=survpath(1,:);
temp=1 %每一段解码的最后状态,标记
preacvalue=acvalue(1);
else if(acvalue(2)==min(acvalue))
dec(((total-1)*50+1):50*total)=survpath(2,:);
temp=2
preacvalue=acvalue(2);
else if(acvalue(3)==min(acvalue))
dec(((total-1)*50+1):50*total)=survpath(3,:);
temp=3
preacvalue=acvalue(3);
else
dec(((total-1)*50+1):50*total)=survpath(4,:);
temp=4
preacvalue=acvalue(4);
end
end
end
% acvalue=zeros(1,stanum);%acvalue数组,存储于survpath对应路径的
% %累计误差值
% newacvalue=zeros(1,stanum);%用于更新累加值
% curvalue=zeros(2,stanum);%统计每步状态转移得到的各条路径的误差值
% %因为默认(2,1,3),故每条路径可延生出两条
% %路径,取行数2故
end