关于海明码编码方式的学习

前言

机组课的海明(汉明)码学的不太行,课本直接不提,老师课件内容和维基百科和各种博客都有些出入,高位低位换来换去的,有些迷糊,重新学习一下(本片以《计算机组成原理》唐朔飞版为主)

简介

在电信领域中,汉明码(英语:hamming code),也称为海明码,是(7,4)汉明码推广得到的一种线性纠错码,由理查德·卫斯里·汉明于1950年发明。

用数学术语来说,汉明码是一种二元线性码。对于所有整数 r ≥ 2,存在一个分组长度 n = 2r − 1、k = 2r − r − 1 编码。因此汉明码的码率为 R = k / n = 1 − r / (2r − 1),对于最小距离为3、分组长度为 2r − 1 的码来说是最高的。汉明码的奇偶检验矩阵的是通过列出所有长度为 r 的非零列向量构成的。

海明码本质是一种多重奇偶校验码,可检测以为错误

编码

确定校验位的个数

2^k^ >= k+n+1

其中,k为校验位的个数;n为原数据位个数

确定校验位置:2的幂次数(1,2,4,8……)

计算校验位

P1=D3$\bigoplus$ D5$\bigoplus$ D7

P2=D3$\bigoplus$ D6$\bigoplus$ D7

P4=D5$\bigoplus$ D6$\bigoplus$ D7

(直接计1的个数,1的个数为奇数则为1,个数为偶数则为0)

确定各个校验位的检测位数:

P1可理解为倒数第一位是1的二进制数,如112(3),1012(5),1112(7)

P2为倒数第二位是1的二进制数,如112(3),1102(6),1112(7)

P4位倒数第三位是1的二进制数,如1012(5),1102(6),1112(7)

通用方法

参见汉明码 - 维基百科,自由的百科全书 (wikipedia.org)

例 写出1100的海明码

确定k的位数。n=4,则k=3

(为了应试,直接记原码与校验码位数关系1->2;2~4->3;5~11->4)

确定校验码位置,即1,2,4

计算

P1=1$\bigoplus$1$\bigoplus$0(3,5,7)

P2=1$\bigoplus$0$\bigoplus$0(3,6,7)

P3=1$\bigoplus$0$\bigoplus$0(5,6,7)

得P1=0 P2=1 P3=1

则D4=0 D2=1 D1=1

补全

位置 D1 D2 D3 D4 D5 D6 D7
1 1 1 0 1 0 0

纠错 定义校验位Si

S1=D1$\bigoplus$D3$\bigoplus$ D5$\bigoplus$ D7

S2=D2$\bigoplus$D3$\bigoplus$ D6$\bigoplus$ D7

S3=D4$\bigoplus$D5$\bigoplus$ D6$\bigoplus$ D7

若S3 S2 S1为000,则无错误;若S3 S2 S1为001,则第一位错误,同理如下

S3 S2 S1 000 001 010 011 100 101 110 111 错误位置 无 1 2 3 4 5 6 7 检测出错误位翻转即可