(7,4)汉明码编码译码及计算最小码距——基于MATLAB编程
编码
A=[1 1 1 0; 0 1 1 1; 1 1 0 1] %A 可随便写四个不为0的列向量,是为了生成一致校验矩阵
H=[A eye(3)] %校验矩阵
G=[eye(4) A’] % 生成矩阵
K=[0 0 0 0;0 0 0 1;0 0 1 0;0 0 1 1; 0 1 0 0;0 1 0 1;0 1 1 0;0 1 1 1 ;1 0 0 0;1 0 0 1;1 0 1 0;1 0 1 1;1 1 0 0;1 1 0 1; 1 1 1 0; 1 1 1 1] %信息位矩阵
C=mod(K*G,2) % 将信息位矩阵与生成矩阵相乘可得码书 mod为取余运算,使得计算结果只有0和1
译码
此处约定为已接收到的码字为R,R可任意更改,当R与码书中的码字只相差1位,即产生了一位错误时,以下程序可对R进行检错,并纠正一位错误 (程序承接上文编码程序)
error=0
c=0 % c用作记录接受到的R 错误的位置
R=[1 1 0 1 0 1 1] %接收到的码字 可任意设置 也可设为一输入
s=mod(H*R’,2) % 伴随矩阵
if s==[0 0 0]
disp(‘未产生错误’)
else
for i=1:7
if s==H(:,i) % 将产生的伴随矩阵和H的每一列进行比较,看S和H的第几列相等,得到此列数,赋予error
error=i;
break;
end
end
if error==0
disp(‘无法纠错’)
else
c=error %错误位置
a=R(error)
R(error)=mod(a+1,2) % 将错误位置的符号纠正,即0纠正为1,1纠正为0
end
end
计算最小码距
d=7 %最小码距初始化
for i=1:16
if C(i,:)==[0 0 0 0 0 0 0]; % C矩阵为码书 排除码书中的全零码字
else
if d>(C(i,:)[1 1 1 1 1 1 1]’) %此运算得到每个码字中1的个数
d=(C(i,:)[1 1 1 1 1 1 1]’) %通过不断的比较,使得d为最小码距
end
end
end
最终输出d即为最小码距
参考文献: 清华大学出版社 《信息论与编码》 冯桂 周林 著
具体原理可在书中相关章节找到