存储器(9)存储器的校验
一、合法编码
- {000,001,010,011,100,101,110,111} 检0位错、纠0位错
- {000,011,101,110} 检1位错,纠0位错
- {000,111} 检1位错,纠1位错
- {0000,1111} 检2位错,纠1位错
- {00000,11111} 检2位错,纠2位错
编码的最小距离:任意两组合法代码之间二进制位数的最小差异
编码的纠错,检错能力和编码的最小距离有关
L-1 = D + C
L:编码的最小距离
D:检测错误的位数
C:纠正错误的位数、
汉明码:
一、汉明码的配置
汉明码采用分组 奇偶校验:
- 奇校验:校验位 + 数据位使得代码当中的数据1的个数为奇数个
- 偶校验:校验位 + 数据位使得代码当中的数据1的个数为偶数个
分组奇校验举例:
00100011 100100011 分组校验:10010 00011
汉明码的分组是一种非划分方式:即存在一些数据位是交叉存在某些组中的
组成汉明码三要素:
- 需要增添多少位检测位: 2^k >= n+ k+ 1 :检测位编码至少要包含n位数据位和k位检测位,再加上一个没有出错的情况
- 检测位的位置:2^i(i = 0, 1, 2, 3, 4, 5……)
- 检测位的取值:由所在小组中承担的奇偶校验任务有关
例子:0101按“偶校验”配置的汉明码
解析:n=4, 根据 2^k ≥ n + k +1 得 k=3
第1,2,3组的校验位分别安排在1,2,4位上,由于偶校验要求每一组的1的个数为偶数
可以得到 C1 = 0, C2 = 1, C4 = 0
所以 0101的汉明码为 0100101
按配偶原则配置0011的汉明码
同理 0011的汉明码为1000011
二、汉明码的纠错:
纠错过程中形成新的检测位 Pi , 如增添 3 位 (k = 3),新的检测位为 P4 P2 P1。
P1对 1, 3, 5, 7进行异或得到;P2对 2, 3, 6, 7进行异或得到;P4对 4, 5, 6, 7进行异或得到
- 当由偶校验配置得到汉明码时,不出错时,为0, 出错时,为1
- 当由奇校验配置得到汉明码时,不出错时,为1, 出错时,为0
例:已知接收到的汉明码为 0100111 (按配偶原则配置)试问要求传送的信息是什么?
解析:首先确定新增3位检测位P1, P2, P4;
P1 = 0(无错); P2 =1(有错); P4 = 1(有错)
则最终得到编码位 P4P2P1 = 110, 可以确定第6位有错,纠正为0100101
所以要求传送的信息为0101(原来为0111)
同上,汉明码为0101101,写出纠错过程
P4 = 1; P2 = 0; P1 = 0; P4P2P1 = 100(第四位为检测位发生错误,可不纠正)
三、总结
汉明码可以做到一位纠错,一位校验。其本身利用的是交叉分组,然后每一组设置一个奇偶校验位,这样做的好处是,校验位的编码可以定位错误的存在
如何分组:第i组中,对应位数(第k个数)的二进制编码,从左开始第i位为1,如
- 第一组: 1——001 3——011 5——101 7——111 左数第1位为1
- 第二组: 2——010 3——011 6——110 7——111 左数第2位为1
- 第三组: 4——100 5——101 6——110 7——111 左数第3位为1
(注意到如111,三位均为1,这个时候,7在三组中均被包含)
校验位由于只和它负责的单独一个组有关,不包含在别的组中,因此,其必须置于第2^i(i=0, 1,2 ……)位
纠错过程本质上就是将第i组的数据位进行异或运算,然后根据得到的新的检测位获得新的编码,从而确定错误的位数,很有趣的一点在于,这个编码确定的检测位位置与二进制编码的分组原则本质上是一致的
(有一个问题:如果最终发现检测位出错了,那是不是意味着通过检测位进行的纠错过程本身也有问题,但是计算过程中好像就直接忽略掉了而默认数据没有问题,就离谱)