viterbi matlab,viterbi解码

代码的意思是:比如编码出来的是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值