过程
- 确定校验码位数r
- 确定校验码和数据的位置
- 求出校验码的值
- 检错并纠错
海明距离
衡量两个相同长度的字符串(通常是二进制数)之间有多少个位置的字符不同,需要改变多少个比特才能将一个字符串变成另一个
举例:
1011101
1001001
第1位:1 和 1 (相同)
第2位:0 和 0 (相同)
第3位:1 和 0 (不同)
第4位:1 和 1 (相同)
第5位:1 和 0 (不同)
第6位:0 和 0 (相同)
第7位:1 和 1 (相同)
这里有2位不同。所以,海明距离是2。
海明码
检错码
- 对于检错码,如果编码集的汉(海)明距离d=r+1,则该差错编码可以检测 r 位的差错编码集
也就是说,如果海明距离为2,可以检查出1位的差错,因为所有的编码距离都有两位的不同编码集 {0000,0101,1010,1111},只有四种情况,当出现了0001,则说明出现了错误,但是我们无法纠正,因为0001变成0000和0101,都只用变化1位
如果海明距离是1,则不能进行差错检测
纠错码
- 对于纠错码,如果编码集的汉明距离d=2r+1,则该差错编码可以纠正 r 位的差错
如果编码的海明距离是3,那么可以纠错1位的编码错误,编码集{000000,010101,101010,111111},如 100010 纠正为101010,纠正成离他最近的那个编码
基于概率最大化,没有办法100%进行纠错
步骤1:确定校验码位数r
信息有m位,冗余码有r位,校验码一共有2的r种取值 2 ≥ m + r + 1 推导:
-
m+r:总位数(数据位加上校验位)
-
总共有 m+r 个位置(因为每个位置都可能出现错误),加上一个零错误的情况,即
m+r+1种可能的状态。 -
校验位的所有状态 ≥ 数据的所有状态 -
每个校验位可以有两种状态(0 或 1),所以 r 个校验位可以表示 种不同的状态
-
所以为了确保可以唯一的表示m+r+1种状态,即包括所有可能的错误和无错误的状态,要满足≥ m+r+1
校验位可以通过特定的位置和组合检测错误的位置。
例:1101
信息为有4位, 2{^r}r{^r}r ≥ 4 + r + 1,只有当r = 3时,8 ≥ 8,则 r = 3
步骤2:确定校验码和数据的位置
- 校验码放在序号为2{^n}n{^n}n,的位置上,数据按顺序填上
- 校验码:1,2,4
- 则数据:3,5,6,7
- 得到:
1 1 0 _ 0 _ _
步骤3:求出校验码的值
- 4号 :100;负责1 * *的校验,负责4,5,6,7的校验
- 2号:010;负责* 1 *的校验,负责2,3,6,7的校验
- 1号:001;负责* * 1的校验,负责1,3,5,7的校验
- 采用偶校验,凑成偶数个1
- 比如1号,357加起来是1个1,那么1号值为1
- 比如2号,367加起来是2个1,那么2号值为0
- 比如4号,567加起来是2个1,那么4号值为0
- 得到完整的海明码
步骤4:检错并纠错
1 1 1000 17 6 5432 1- 若收到的值为
1 1 1000 1 - 数据部分是1110
- 4号校验码负责4,5,6,7的校验:0,1,1,1 —— ×
- 2号校验码负责2,3,6,7的校验:0,0,1,1 —— √
- 1号校验码负责1,3,5,7的校验:1,0,1,1 —— ×
- 根据偶校验,算出x4 = 1;x2 = 0 ; x1 = 1
- 则101 = 5,第五位错了