%**********************************************************************
%————————————汉明码的编码与译码——————————————
%**********************************************************************
%%%%%%%%%%%%%%%一骑绝尘 荣誉出品 如有雷同 万分荣幸!!!%%%%%%%%%%%%%%%
%**********************************************************************
%========================给出监督矩阵和生成矩阵========================
H=[1 1 1 0 1 0 0 ;0 1 1 1 0 1 0;1 1 0 1 0 0 1];
G=[1 0 0 0 1 0 1;0 1 0 0 1 1 1;0 0 1 0 1 1 0;0 0 0 1 0 1 1];
%**********************************************************************
%=============================打印提示=================================
disp('选择功能:');
disp('0——汉明码码字查阅');
disp('1——汉明码编码');
t=input('输入0或1:');
%**********************************************************************
%===================选择“1”,对输入序列进行编码======================
if t==1
a=input('输入信息元序列:');
c=mod(a*G,2); %编码的码字c
x1=zeros(1,5);
for i=1:4
x1(i)=a(i);
end
x2=zeros(1,8);
for i=1:7
x2(i)=c(i);
end
%-------------------------------打印编码序列--------------------------------
disp('编码后序列为:');
disp(c);
%------------------------显示信息元序列和编码器输出序列---------------------
figure(1);
subplot(2,1,1)
stairs(x1,'r');
title('信息元序列');
axis([0 8 -1 2]);
grid on;
subplot(2,1,2)
stairs(x2,'r');
title('编码器输出序列');
axis([0 8 -1 2]);
grid on;
%**************************************************************************
%============================下面模拟接收端译码============================
disp('设定错误置:(0—7)【”0”表示没有错误】');
j=input('输入误码位置j=');
if j==0
R=c; %没有错误
%------------------------------模拟误码------------------------------------
else
R=c;
R(j)=mod(R(j)+1,2); %第j位取反
end
x3=zeros(1,8);
for i=1:7
x3(i)=R(i);
end
%----------------------------打印发送、接收序列-----------------------------
disp('发送序列:');
disp(c);
disp('接收序列:');
disp(R);
%------------------------------汉明码纠错功能-------------------------------
S=mod(R*H',2); %计算R的伴随式
m=0;
for i=1:1:7
if S==H(:,i)'
m=1;
E=dec2bin(2^(7-i),7); %计算R的错误图样
fprintf('错误出现在第%1.0f位\n',i);
break;
end
end
if m==0
disp('接收到的码字无错误。');
E=dec2bin(0,7);
else
b=mod(R-E,2); %计算原发送码序列
x4=zeros(1,8);
for i=1:7
x4(i)=b(i);
end
%------------------------------打印纠错后的序列-----------------------
disp('纠错后序列:');
disp(b);
%---------------显示发送序列、接收序列、和纠错后的序列----------------
figure(2);
subplot(3,1,1)
stairs(x2,'r');
title('发送序列');
axis([0 8 -1 2]);
grid on;
subplot(3,1,2)
stairs(x3);
title('接收序列');
axis([0 8 -1 2]);
grid on;
subplot(3,1,3)
stairs(x4,'r');
title('纠错后序列');
axis([0 8 -1 2]);
grid on;
end
%*********************************************************************
%=====================选择“0”,查看系统码字=========================
else
disp('(7,4)汉明系统码为:');
for i=0:1:15
a=dec2bin(i,4);
c=mod(a*G,2);
disp(a) ;
disp('对应码字为:');
disp(c);
end
end
%**********************************************************************
评论0