差错检验与纠正: 循环冗余校验与汉明码
对于信号传输过程种出现错误是很正常的,于是我们增加一些冗余码来检错或者纠错
我们提供了两种策略
- 添加只能使对方推测出有无错误的冗余信息,检错码
- 添加使对方推测出没有出错前的数据的冗余信息,纠错码
两种策略占据不同的生态位置,
高度可信的信道(光纤)使用检错码更合算,偶尔发生错误就重传
错误发生频繁的信道上(无线链路)使用纠错码更合算,以便接收方能够计算原来的数据
检错码
- 奇偶校验法
- 校验和
- 循环冗余校验(不清楚)
纠错码
- 汉明码
- 二进制卷积码
- 里德所罗门码
- 低密度奇偶校验码
纠错能力与检错能力
要想知道错了就要知道什么是正确的,所以我们都有合法代码集
①检错能力≥纠错能力
②需要知道的是出错过程中,1位错的概率为90%,出错位数越多,出现概率越小
③数据块总长度n,其中数据位长度m,校验位长度为r,n=m+r
码率=n/m 码率差别很大 有噪声的信道码率或许为1/2,光纤接近1
- {000,001,010,011,100,101,110,111}
任何一位错得到的是另一个合法代码,没有任何检错能力,更别说就错了 - {000,011,101,110}
需要两位变化才能变成另外的合法代码,可能会因为 111可以是{101,011}变两位,{000}变三位,但是根据②,我们只把它认为是变一位造成的,所以它能检一位错 - {000,111} 三倍冗余存储01
变三位才行,检1位错,纠1位错 - {0000,1111} 四倍冗余存储01
变四位才行,检2位错,纠1位错 - {0000,11111} 五倍冗余存储01
变五位才行,检2位错,纠2位错
上面任两组合法代码的差异的最少位数成为 编码的最小距离,比如编码距离为d,需要d个1位错才能将一个合法代码转变成另一个合法代码
L
−
1
=
D
+
C
(
D
≥
C
)
L
:
最
小
编
码
距
离
D
:
检
错
位
数
C
:
纠
错
位
数
L-1=D+C(D ≥C)\\ L:最小编码距离 \\ D:检错位数 \\ C:纠错位数 \\
L−1=D+C(D≥C)L:最小编码距离D:检错位数C:纠错位数
一丶奇偶校验法
奇校验:就是让原有数据序列中(包括你要加上的一位)1的个数为奇数
偶校验:就是让原有数据序列中(包括你要加上的一位)1的个数为偶数
下面设置最高位为校验位
奇校验 | 偶校验 | |
---|---|---|
1001101 | 11001101 | 01001101 |
因为变化一位会改变奇偶性,所以检测位也要改变,所以最小编码距离为2,只有检错力
二丶循环冗余
我们就要在数据后面添加上的冗余码称为帧检验序列 FCS (Frame Check Sequence),只有检错力
这里我也有误区:有些书上说CRC可以纠错,得到余数化为2进制,就是哪位错了,取反即可,各种书上写得不一样
在数据链路层传送的帧中,广泛使用了循环冗余检验 CRC 的检错技术,使用CRC获得FCS,下面演示CRC的用法
算术规则:
- 发送: 被除数原信息后根据生成多项式最高次添0,除数就是多项式每个幂的系数,进行就是不借位不退位,模2除法,也就是异或运行,得到余数作为FCS,余数为0就没有错
- 接收:接受信息 除以 多项式每个幂的系数,看余数
原理:复杂,可以暂时就理解为小学除法
注:且除数p越大,检测效果越好,越小可能有些错检测不出来
三丶汉明码
海明码是具有1位纠错能力的编码,重叠分组的奇偶校验方法,如下图的7位数据
2
k
≥
n
+
k
+
1
2^k≥n+k+1
2k≥n+k+1
n信息位数,k检错位数,1是没有错的情况,2k k个检错位组成的二进制编码能指出的错误状态
汉明码的产生
汉明码的纠错
分组简单的方法
1=1
2=2
3=1+2
4=4
5=1+4
6=2+4
7=1+2+4
有1的一组 :1 3 5 7
有2的一组 :2 3 6 7
有4的一组 :4 5 6 7
直接用眼睛看奇偶来添
检错就是发生错误组数共同拥有的那个(一个错误就是独有的)