目录
一、前言
理论直接网上找几篇结合看即可。
二、matlab代码
%%
%对于(n,k,d)线性分组码:
%①检测 l 个随机错误,则要求码的最小距离 d ≥ l+1。
%②纠正 t 个随机错误,则要求码的最小距离 d ≥ 2t+1。
%③纠正 t 个同时检测 e 个随机错误(e ≥ t),则要求码的最小距离 d ≥ t+l+1。
clear all;close all;clc;
%2^r必须>=(n+1);
k=2;r=3;n=k+r;
%信息码m,1*k的向量。共2^k种可能。
%注意m是所有可能的信息码的集合,一行代表一种信息码。
m=[
0 0
0 1
1 0
1 1
];
%生成矩阵g:k行k列单位阵i_k 拼上 k行r列的冗余信息p_kr =k*n矩阵
i_k=eye(k);
p_kr=[
0 1 1
1 1 0
];%任意定好
g=[i_k,p_kr];
%校验矩阵h:k行r列的冗余信息转置为r行k列 拼上 r行r列的单位阵 =r*n矩阵
i_r=eye(r);
q_rk=p_kr.';
h=[q_rk,i_r];
h1=gen2par(g);%自带函数
%验证g*ht或h*gt为0
h_t=h.';
g_t=g.';
gh_t=g*h_t;
hg_t=h*g_t;
gh_t_t=gh_t.';
hg_t_t=hg_t.';
%信息码m编码后得到的码字c,即可用码组
c=m*g;
c=rem(c,2);
%自带函数对比
c1=encode(m,n,k,'linear/binary',g);
%打印
for i=1:1:4
msg=m(i,:);
c2=encode(msg,n,k,'linear/binary',g);
disp(['The code of ' num2str(msg) ' is ' num2str(c2)]);
end
%每两个码字相加之后得到的向量其实还是另外一个码字,
%而两个码字相加后新码字中"1”的个数其实就是它们之间的汉明距离,
%所以最小码距dmin就是所有码中1最少的个数。
%伴随式s
s0_val=0:2^r-1;
str0=dec2bin(s0_val);
[x,y]=size(str0);
s0=zeros(x,y);
for i=1:x
for j=1:y
s0(i,j)=str2num(str0(i,j));
end
end
%错误图样,即陪集首e_vector
e_s=mod(round(s0/h_t),2);
%从e_s里挑陪集首而不是直接用e_s,因为有很多错好几bit的,不是集'首'
%存疑,是否直接按eye然后11,101,1001顺序来就行了而不需要在e_s找这一步?
%或者说,把e_s全部转到集'首'来
e_vector=zeros(2^r,n);
e_vector(1,:)=[0 0 0 0 0];%其实是c1,e1没错
%e_vector(2:n+1,:)=eye(n);
e_vector(2,:)=[1 0 0 0 0];
e_vector(3,:)=[0 1 0 0 0];
e_vector(4,:)=[0 0 1 0 0];
e_vector(5,:)=[0 0 0 1 0];
e_vector(6,:)=[0 0 0 0 1];
e_vector(7,:)=[1 1 0 0 0];
e_vector(8,:)=[1 0 1 0 0];
%伴随式s
s=mod(e_vector*h_t,2);
%不可用码组vector_other
vector_other0=zeros(2^n-2^k,5);
vector_all=[c;vector_other0];
for i=2:8
%异或 或者 相加再mod2
vector_all(i*4-3,:)=e_vector(i,:);
vector_all(i*4-2,:)=bitxor(e_vector(i,:),c(2,:));
vector_all(i*4-1,:)=bitxor(e_vector(i,:),c(3,:));
vector_all(i*4-0,:)=bitxor(e_vector(i,:),c(4,:));
end
vector_other(:,:)=vector_all(5:end,:);
%验证每组可用码、禁用码伴随式都相同
s_all=mod(vector_all*h_t,2);
%校验
%无污染校验结果为0
check=rem(c*h_t,2);
%有污染校验结果
e=[
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
];
r=rem(c+e,2);
check_error0=rem(r*h_t,2);
check_error1=rem(e*h_t,2);
%n种1bit错误
e_2=eye(n);
check_error2=rem(e_2*h_t,2);
%所有可能的错误共2^n种,验证纠错能力
e_val=0:2^n-1;
str=dec2bin(e_val);
[x,y]=size(str);
e_3=zeros(x,y);
for i=1:x
for j=1:y
e_3(i,j)=str2num(str(i,j));
end
end
check_error3=rem(e_3*h_t,2);
%%
%其他博主的代码
clear all;close all;clc;
% 给出生成矩阵G和接收到的码组R
G=[1 0 0 1 0 1;
0 1 0 1 1 0;
0 0 1 0 1 1];
I=[0 0 0;0 0 1;0 1 0;0 1 1;1 0 0;1 0 1;1 1 0;1 1 1];
C=rem(I*G,2);
% R=input('请输入接收到的码组R:');
R=[1 1 0 1 1 1];
[a,b]=size(R);
% 构造8个错误向量E,生成监督矩阵H
E=[0 0 0 0 0 0;1 0 0 0 0 0;
0 1 0 0 0 0;0 0 1 0 0 0;
0 0 0 1 0 0;0 0 0 0 1 0;0 0 0 0 0 1];
H=gen2par(G);
% 计算伴随式S
S=rem(R*H',2);
% 输出伴随式S
disp('所得伴随式为:S=');
disp(S);
% 根据伴随式S计算每个码字的错误位置
i=1;
for i=1:1:a
M(i,1)=S(i,1).*4+S(i,2).*2+S(i,3);
end
% 根据错误位置修改码字,纠正错误
for i=1:1:a
switch(M(i,1))
case 0
A(i,:)=R(i,:)+E(1,:);
case 5
A(i,:)=R(i,:)+E(2,:);
case 6
A(i,:)=R(i,:)+E(3,:);
case 3
A(i,:)=R(i,:)+E(4,:);
case 4
A(i,:)=R(i,:)+E(5,:);
case 2
A(i,:)=R(i,:)+E(6,:);
case 1
A(i,:)=R(i,:)+E(7,:);
end
end
% 根据错误位置提示纠错结果
for i=1:1:a
switch(M(i,1))
case 0
disp('没有出现错误!');
case 1
disp('注意:第1位出现一个错误!请纠正!');
case 2
disp('注意:第2位出现一个错误!请纠正!');
case 4
disp('注意:第3位出现一个错误!请纠正!');
case 3
disp('注意:第4位出现一个错误!请纠正!');
case 6
disp('注意:第5位出现一个错误!请纠正!');
case 5
disp('注意:第6位出现一个错误!请纠正!');
end
end
% 对纠错后的码字A进行检验
A=rem(A,2);
% 输出检纠错后的码字A
disp('检纠错后的码组A=');
disp(A);
% 对码字进行译码,得到信息序列I
j=1;
while j<=3
I(:,j)=A(:,j);
j=j+1;
end
% 输出译出的信息序列I
disp('译出的信息序列I=');
disp(I);