📄 convolutiondecode.m
字号:
% decode with soft-input viterbi algorithm 硬判决
% //k=4,r=1/2
%输入数据为软信息,并且数据为均值为1的BPSK调制,如果均值为MEAN,那么62,63,103,104行应做相应修改
function [x,y]=convolutiondecode(indata,MEAN) %MEAN没用到 (2,1,3) 卷积码的译码
x=zeros(1,length(indata)/2);
y=zeros(1,length(indata));
decode_out=zeros(1,length(indata)/2);
code_out=zeros(1,length(indata));
p=zeros(8,2);
c=zeros(8,2,2);
flag=zeros(1,8); %//记录往上走还是向下走
survivor=zeros(8,14,3);
survivor2=zeros(8,14,3); % //幸存路径
PM1=zeros(1,8); % //路径度量
PM2=zeros(1,8); % //幸存路径度量
BM=zeros(8,2); %//当前分支路径度量
in=zeros(1,8);
% //inicialize the state,p(a,b)=nextState,a=1,2..8 are OrignalStates,b=1:inputdata 0,b=2:inputdata 1
p(1,1)=1;p(1,2)=2;%s1=000,s2=100,s3=010,s4=110,s5=001,s6=101,s7=011,s8=111.s=indata,shift1,shift2
p(2,1)=3;p(2,2)=4;
p(3,1)=5;p(3,2)=6;
p(4,1)=7;p(4,2)=8;
p(5,1)=1;p(5,2)=2;
p(6,1)=3;p(6,2)=4;
p(7,1)=5;p(7,2)=6;
p(8,1)=7;p(8,2)=8;
in(5)=1;
in(6)=1;
in(7)=1;
in(8)=1;
c(1,1,1)=0;c(1,1,2)=0;%c(a,b,c)=encodeOutput,a=state;b=inputBit,1;0,2:1;c=1:Output_first,c=2,Output_second.
c(1,2,1)=1;c(1,2,2)=1;
c(2,1,1)=0;c(2,1,2)=1;
c(2,2,1)=1;c(2,2,2)=0;
c(3,1,1)=1;c(3,1,2)=1;
c(3,2,1)=0;c(3,2,2)=0;
c(4,1,1)=1;c(4,1,2)=0;
c(4,2,1)=0;c(4,2,2)=1;
c(5,1,1)=1;c(5,1,2)=1;
c(5,2,1)=0;c(5,2,2)=0;
c(6,1,1)=1;c(6,1,2)=0;
c(6,2,1)=0;c(6,2,2)=1;
c(7,1,1)=0;c(7,1,2)=0;
c(7,2,1)=1;c(7,2,2)=1;
c(8,1,1)=0;c(8,1,2)=1;
c(8,2,1)=1;c(8,2,2)=0;
% //inicialize the state
MAX=1000;
PM1(1)=MAX;
PM1(2)=0;
PM1(3)=0;
PM1(4)=0;
PM1(5)=0;
PM1(6)=0;
PM1(7)=0;
PM1(8)=0;
% //length is the uncoded data number
for k=1:14 %indata中的第K个数据
for i=1:8
BM(i,1)=indata(2*k-1)*(2*c(i,1,1)-1)*MEAN+indata(2*k)*(2*c(i,1,2)-1)*MEAN;%BM(i,1)=indata(2*k-1)*(2*c(i,1,1)-1)+indata(2*k)*(2*c(i,1,2)-1);
BM(i,2)=indata(2*k-1)*(2*c(i,2,1)-1)*MEAN+indata(2*k)*(2*c(i,2,2)-1)*MEAN;%BM(i,2)=indata(2*k-1)*(2*c(i,2,1)-1)+indata(2*k)*(2*c(i,2,2)-1);
if PM1(p(i,1))+BM(i,1)>PM1(p(i,2))+BM(i,2)
PM2(i)=PM1(p(i,1))+BM(i,1);
flag(i)=1;
else
PM2(i)=PM1(p(i,2))+BM(i,2);
flag(i)=2;
end
% //survivor2[i]=survivor[p[i][flag[i]]];
for j=1:14
survivor2(i,j,1)=survivor(p(i,flag(i)),j,1);
survivor2(i,j,2)=survivor(p(i,flag(i)),j,2);
survivor2(i,j,3)=survivor(p(i,flag(i)),j,3);%decode_output
end
for temp=k:-1:2
survivor2(i,temp,1)=survivor2(i,temp-1,1);
survivor2(i,temp,2)=survivor2(i,temp-1,2);
survivor2(i,temp,3)=survivor2(i,temp-1,3);
end
survivor2(i,1,1)=c(i,flag(i),1);
survivor2(i,1,2)=c(i,flag(i),2);
survivor2(i,1,3)=in(i);
end
% //survivor[i]=survivor2[i];
for i=1:8
for j=1:14
survivor(i,j,1)=survivor2(i,j,1);
survivor(i,j,2)=survivor2(i,j,2);
survivor(i,j,3)=survivor2(i,j,3);
end
PM1(i)=PM2(i);
end
end
point=1;%第一轮结束
for k=15:length(indata)/2
for i=1:8
BM(i,1)=indata(2*k-1)*(2*c(i,1,1)-1)*MEAN+indata(2*k)*(2*c(i,1,2)-1)*MEAN;%BM(i,1)=indata(2*k-1)*(2*c(i,1,1)-1)+indata(2*k)*(2*c(i,1,2)-1);
BM(i,2)=indata(2*k-1)*(2*c(i,2,1)-1)*MEAN+indata(2*k)*(2*c(i,2,2)-1)*MEAN;%BM(i,2)=indata(2*k-1)*(2*c(i,2,1)-1)+indata(2*k)*(2*c(i,2,2)-1);
if (PM1(p(i,1))+BM(i,1))>(PM1(p(i,2))+BM(i,2))
PM2(i)=PM1(p(i,1))+BM(i,1);
flag(i)=1;
else
PM2(i)=PM1(p(i,2))+BM(i,2);
flag(i)=2;
end
% //survivor2[i]=survivor[p[i][flag[i]]];
for j=1:14
survivor2(i,j,1)=survivor(p(i,flag(i)),j,1);
survivor2(i,j,2)=survivor(p(i,flag(i)),j,2);
survivor2(i,j,3)=survivor(p(i,flag(i)),j,3);
end
end
maxpath=maxposition(PM2); %从8条路径中找出最大似然的一条,maxpath=1,2,...8 %此调用函数找不到
% output data
code_out(point)=survivor2(maxpath,14,1);
decode_out(k-14)=survivor2(maxpath,14,3);
point=point+1;
code_out(point)=survivor2(maxpath,14,2);
point=point+1;
%point=point+1;
for i=1:8
for temp=14:-1:2
survivor2(i,temp,1)=survivor2(i,temp-1,1);
survivor2(i,temp,2)=survivor2(i,temp-1,2);
survivor2(i,temp,3)=survivor2(i,temp-1,3);
end
survivor2(i,1,1)=c(i,flag(i),1);
survivor2(i,1,2)=c(i,flag(i),2);
survivor2(i,1,3)=in(i);
%//survivor[i]=survivor2[i];
for j=1:14
survivor(i,j,1)=survivor2(i,j,1);
survivor(i,j,2)=survivor2(i,j,2);
survivor(i,j,3)=survivor2(i,j,3);
end
PM1(i)=PM2(i);
end
if mod(k,30)==0
for i=1:8
PM1(i)=PM1(i)-20;
end
end
end
for k=14:-1:1
code_out(point)=survivor2(maxpath,k,1);
decode_out(length(indata)/2-k+1)=survivor2(maxpath,k,3);
point=point+1;
code_out(point)=survivor2(maxpath,k,2);
point=point+1;
%y(point)=survivor2(maxpath,k,3);
%point=point+1;
end
x=decode_out;
y=code_out;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -