频带+噪声(星座图,调制信号)Receive.m]

function Code_in_bit=Receive(y);
%TCM信号的接受,采用viterbi算法
%下面程序是根据8状态编码网格图编写
%y=[-0.7071+0.7071i,0.7071-0.7071i,-0.0000-1.0000i,1.0000,-0.7071-0.7071i,0.7071+0.7071i];
figure(2)
hold on
grid on
title('发送信号(有噪声干扰)的星座图:')
Stars_plot(y);
hold off

seg=length(y)-2;
PM=0; %路径存储器
MM=zeros(1,8); %路径度量存储器

% d每列表示8个状态点与当前输入值的欧氏距离
for cycle1=1:(seg+2),
for cycle2=1:8,
d(cycle2,cycle1)=Eu_distance(y(cycle1),cycle2-1);
end
end

step=1;
MM(1)=MM(1)+d(0+1,1);
MM(2)=MM(2)+d(3+1,1);
MM(3)=MM(3)+d(4+1,1);
MM(4)=MM(4)+d(7+1,1);
PM(4,2)=0; %扩展PM维数
PM(1,:)=[0,0];
PM(2,:)=[0,1];
PM(3,:)=[0,2];
PM(4,:)=[0,3];

step=2;
TMM=MM; %先将前一级的路径度量值保存在TMM中
TPM=PM; %先将前一级的路径保存在TPM中
MM(1)=TMM(1)+d(0+1,2);
MM(2)=TMM(1)+d(3+1,2);
MM(3)=TMM(1)+d(4+1,2);
MM(4)=TMM(1)+d(7+1,2);
MM(5)=TMM(2)+d(0+1,2);
MM(6)=TMM(2)+d(3+1,2);
MM(7)=TMM(2)+d(4+1,2);
MM(8)=TMM(2)+d(7+1,2);
PM(8,3)=0;
PM(1,:)=[TPM(1,:),0];
PM(2,:)=[TPM(1,:),1];
PM(3,:)=[TPM(1,:),2];
PM(4,:)=[TPM(1,:),3];
PM(5,:)=[TPM(2,:),4];
PM(6,:)=[TPM(2,:),5];
PM(7,:)=[TPM(2,:),6];
PM(8,:)=[TPM(2,:),7];
if(MM(1)>TMM(3)+d(2+1,2)),
MM(1)=TMM(3)+d(2+1,2);
PM(1,:)=[TPM(3,:),0];
end
if(MM(2)>TMM(3)+d(1+1,2)),
MM(2)=TMM(3)+d(1+1,2);
PM(2,:)=[TPM(3,:),1];
end
if(MM(3)>TMM(3)+d(6+1,2)),
MM(3)=TMM(3)+d(6+1,2);
PM(3,:)=[TPM(3,:),2];
end
if(MM(4)>TMM(3)+d(5+1,2)),
MM(4)=TMM(3)+d(5+1,2);
PM(4,:)=[TPM(3,:),3];
end %%%%%%%%%%%
if(MM(5)>TMM(4)+d(2+1,2)),
MM(5)=TMM(4)+d(2+1,2);
PM(5,:)=[TPM(4,:),4];
end
if(MM(6)>TMM(4)+d(1+1,2)),
MM(6)=TMM(4)+d(1+1,2);
PM(6,:)=[TPM(4,:),5];
end
if(MM(7)>TMM(4)+d(6+1,2)),
MM(7)=TMM(4)+d(6+1,2);
PM(7,:)=[TPM(4,:),6];
end
if(MM(8)>TMM(4)+d(5+1,2)),
MM(8)=TMM(4)+d(5+1,2);
PM(8,:)=[TPM(4,:),7];
end

for step=3:seg,
TMM=MM; %先将前一级的路径度量值保存在TMM中
TPM=PM; %先将前一级的路径保存在TPM中
MM(1)=TMM(1)+d(0+1,step);
MM(2)=TMM(1)+d(3+1,step);
MM(3)=TMM(1)+d(4+1,step);
MM(4)=TMM(1)+d(7+1,step);
MM(5)=TMM(2)+d(0+1,step);
MM(6)=TMM(2)+d(3+1,step);
MM(7)=TMM(2)+d(4+1,step);
MM(8)=TMM(2)+d(7+1,step);
PM(8,step+1)=0;
PM(1,:)=[TPM(1,:),0];
PM(2,:)=[TPM(1,:),1];
PM(3,:)=[TPM(1,:),2];
PM(4,:)=[TPM(1,:),3];
PM(5,:)=[TPM(2,:),4];
PM(6,:)=[TPM(2,:),5];
PM(7,:)=[TPM(2,:),6];
PM(8,:)=[TPM(2,:),7];
%%%state 0
if(MM(1)>TMM(3)+d(2+1,step)),
MM(1)=TMM(3)+d(2+1,step);
PM(1,:)=[TPM(3,:),0];
end
if(MM(1)>TMM(5)+d(4+1,step)),
MM(1)=TMM(5)+d(4+1,step);
PM(1,:)=[TPM(5,:),0];
end
if(MM(1)>TMM(7)+d(6+1,st

ep)),
MM(1)=TMM(7)+d(6+1,step);
PM(1,:)=[TPM(7,:),0];
end
%%%state 1
if(MM(2)>TMM(3)+d(1+1,step)),
MM(2)=TMM(3)+d(1+1,step);
PM(2,:)=[TPM(3,:),1];
end
if(MM(2)>TMM(5)+d(7+1,step)),
MM(2)=TMM(5)+d(7+1,step);
PM(2,:)=[TPM(5,:),1];
end
if(MM(2)>TMM(7)+d(5+1,step)),
MM(2)=TMM(7)+d(5+1,step);
PM(2,:)=[TPM(7,:),1];
end
%%%state 2
if(MM(3)>TMM(3)+d(6+1,step)),
MM(3)=TMM(3)+d(6+1,step);
PM(3,:)=[TPM(3,:),2];
end
if(MM(3)>TMM(5)+d(0+1,step)),
MM(3)=TMM(5)+d(0+1,step);
PM(3,:)=[TPM(5,:),2];
end
if(MM(3)>TMM(7)+d(2+1,step)),
MM(3)=TMM(7)+d(2+1,step);
PM(3,:)=[TPM(7,:),2];
end
%%%state 3
if(MM(4)>TMM(3)+d(5+1,step)),
MM(4)=TMM(3)+d(5+1,step);
PM(4,:)=[TPM(3,:),3];
end
if(MM(4)>TMM(5)+d(3+1,step)),
MM(4)=TMM(5)+d(3+1,step);
PM(4,:)=[TPM(5,:),3];
end
if(MM(4)>TMM(7)+d(1+1,step)),
MM(4)=TMM(7)+d(1+1,step);
PM(4,:)=[TPM(7,:),3];
end
%%%state 4
if(MM(5)>TMM(4)+d(2+1,step)),
MM(5)=TMM(4)+d(2+1,step);
PM(5,:)=[TPM(4,:),4];
end
if(MM(5)>TMM(6)+d(4+1,step)),
MM(5)=TMM(6)+d(4+1,step);
PM(5,:)=[TPM(6,:),4];
end
if(MM(5)>TMM(8)+d(6+1,step)),
MM(5)=TMM(8)+d(6+1,step);
PM(5,:)=[TPM(8,:),4];
end
%%%state 5
if(MM(6)>TMM(4)+d(1+1,step)),
MM(6)=TMM(4)+d(1+1,step);
PM(6,:)=[TPM(4,:),5];
end
if(MM(6)>TMM(6)+d(7+1,step)),
MM(6)=TMM(6)+d(7+1,step);
PM(6,:)=[TPM(6,:),5];
end
if(MM(6)>TMM(8)+d(5+1,step)),
MM(6)=TMM(8)+d(5+1,step);
PM(6,:)=[TPM(8,:),5];
end
%%%state 6
if(MM(7)>TMM(4)+d(6+1,step)),
MM(7)=TMM(4)+d(6+1,step);
PM(7,:)=[TPM(4,:),6];
end
if(MM(7)>TMM(6)+d(0+1,step)),
MM(7)=TMM(6)+d(0+1,step);
PM(7,:)=[TPM(6,:),6];
end
if(MM(7)>TMM(8)+d(2+1,step)),
MM(7)=TMM(8)+d(2+1,step);
PM(7,:)=[TPM(8,:),6];
end
%%%state 7
if(MM(8)>TMM(4)+d(5+1,step)),
MM(8)=TMM(4)+d(5+1,step);
PM(8,:)=[TPM(4,:),7];
end
if(MM(8)>TMM(6)+d(3+1,step)),
MM(8)=TMM(6)+d(3+1,step);
PM(8,:)=[TPM(6,:),7];
end
if(MM(8)>TMM(8)+d(1+1,step)),
MM(8)=TMM(8)+d(1+1,step);
PM(8,:)=[TPM(8,:),7];
end
end

step=seg+1;
TMM=MM; %先将前一级的路径度量值保存在TMM中
TPM=PM; %先将前一级的路径保存在TPM中
PM(8,step+1)=0;
%%%state 0
MM(1)=TMM(1)+d(0+1,step);
PM(1,:)=[TPM(1,:),0];
if(MM(1)>TMM(3)+d(2+1,step)),
MM(1)=TMM(3)+d(2+1,step);
PM(1,:)=[TPM(3,:),0];
end
if(MM(1)>TMM(5)+d(4+1,step)),
MM(1)=TMM(5)+d(4+1,step);
PM(1,:)=[TPM(5

,:),0];
end
if(MM(1)>TMM(7)+d(6+1,step)),
MM(1)=TMM(7)+d(6+1,step);
PM(1,:)=[TPM(7,:),0];
end
%%%state 4
MM(5)=TMM(2)+d(0+1,step);
PM(5,:)=[TPM(2,:),4];
if(MM(5)>TMM(4)+d(2+1,step)),
MM(5)=TMM(4)+d(2+1,step);
PM(5,:)=[TPM(4,:),4];
end
if(MM(5)>TMM(6)+d(4+1,step)),
MM(5)=TMM(6)+d(4+1,step);
PM(5,:)=[TPM(6,:),4];
end
if(MM(5)>TMM(8)+d(6+1,step)),
MM(5)=TMM(8)+d(6+1,step);
PM(5,:)=[TPM(8,:),4];
end

step=seg+2;
TMM=MM; %先将前一级的路径度量值保存在TMM中
TPM=PM; %先将前一级的路径保存在TPM中
PM(8,step+1)=0;
%%%state 0
MM(1)=TMM(1)+d(0+1,step);
PM(1,:)=[TPM(1,:),0];
if(MM(1)>TMM(5)+d(4+1,step)),
MM(1)=TMM(5)+d(4+1,step);
PM(1,:)=[TPM(5,:),0];
end

Suvival_path=PM(1,:); %PM第一行值即为幸存路径
Code_in_bit=Decoder(Suvival_path);

相关文档
最新文档