实际通信链路都不是理想的,比特在传输过程中可能会产生差错,1可能会变成0,0也可能会变成1,这就是
比特差错
。比特差错是传输差错中的一种,本节仅讨论比特差错。
通常利用编码技术进行差错控制,主要有两类:
自动重传请求 ARQ
和
前向纠错FEC
。在ARQ方式中,接收端检测出差错时,就设法通知发送端重发,直到接收到正确的码字为止。在 FEC 方式中,接收端不但能发现差错,而且能确定比特串的错误位置,从而加以纠正。因此,差错控制又可分为
检错编码
和
纠错编码
。
检错编码
检错编码都采用
冗余编码技术
,其核心思想是在有效数据(信息位)被发送前,先按某种关系附加一定的冗余位,构成一 个符合某一规则的码字后再发送 ,当要发送的有效数据变化时,相应的冗余位也随之变化,使得得码字遵从不变的规则。接收端根据收到的码字是否仍符合原规则来判断是否出错。常见的检错编扁码有
奇偶校验码
和
循环冗余码
。
奇偶校验码
奇偶校验码是
奇校验码
和
偶校验码
的统称,是一种最基本的检错码。它由n-1位信息元和1位校验元组成。
如果是奇校验码,那么在附加一个校验元后, 码长为 n 的码字中“1”的个数为奇数;如果是偶校验码,那么在附加一个校验元以后,码长为n的码字中“1”的个数为偶数
。它又分为垂直奇偶校验、水平奇偶校验和水平垂直奇偶校验
循环冗余码
循环冗余码(CRC)又称多项式码,任何一个由二进制数位串组成的代码都可以与一个只含有0和1两个系数的多项式建立一一对应关系。一个k位帧可以视为从 X
k-1
到 X
0
的k次多项式的系数序列,这个多项式的阶数为k-1,高位是 X
k-1
项的系数,下一位是 X
k-2
的系数,以此类推。例如,1110011有7位,表示成多项式是X
6
+ X
5
+ X
4
+ X
1
+1,而多项式X
5
+ X
4
+ X
2
+ X
1
对应的位串是110110,其运算过程如下:
给定一个m bit的帧或报文,发送器生成一个r bit的序列,称为帧检验序列(FCS)。这样所形成的帧将由m+r比特组成。发送方和接收方事先商定一个多项式G(x)(
最高位和最低位必须为1
),使这个带检验码的帧刚好能被预先确定的多项式 G(x)整除。接收方用相同的多项式去除收到的帧,如果无余数,那么认为无差错。
假设一个帧有m位,其对应的多项式为 M(x),则计算冗余码的步骤如下:
-
加 0
。假设 G(x)的阶为r,在帧的低位端加上
r个0
。 -
模2除
。利用模2除法,用 G(x)对应的数据串去除第一步中计算出的数据串,得到的余数即为冗余码(共r位,前面的0不可省略)。
多项式以2为模运算。按照模2运算规则,加法不进位,减法不借位,它刚好是
异或操作
。乘除法类似于二进制的运算,只是在做加减法时按模2规则进行。
冗余码的计算举例:设G(x)=1101(即r=3),待传送数据M=101001(即m=6),经模2除法运算后的结果是:商Q=110101(这个商没什么用),余数R=001。所以发送出去的数据为101001001(即2
r
M+FCS),共有m+r位。
下面再举个例子
:
纠错编码
在数据通信的过程中,解决差错问题的一种大方法是在每个要发送的数据块上附加足够的冗余信息,使接收方能够推导出发送方实际送出的应该该是什么样的比特串。
最常见的纠错编码是海明码
,其实现原理是在有效信息位中加入几个校验位形成海明码,并把海明码的每个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化,这不但可以发现错位,而且能指出错位的位置,为自动纠错提供依据。
现以数据码 1010 为例,讲述海明码的编码原理和过程
-
明确海明码的位数
设n为有效信息的位数,k为校验位的位数,则信息位n和校验位k应满足
n
+
k
<
=
2
k
−
1
n+k<=2^k-1
n
+
k
<=
2
k
−
1
(若要检测两位错,则需要增加一位校验位,即k+1位)
如1010,那么n为4,所以
4
+
3
=
7
<
=
2
3
−
1
4+3=7<=2^3-1
4
+
3
=
7
<=
2
3
−
1
成立,则n、k有效。设
-
信息位为D
1
D
2
D
3
D
4
(1010)共4位, -
校验位为P
1
P
2
P
3
,共3位, -
对应的海明码为H
7
H
6
H
5
H
4
H
3
H
2
H
1
-
确定校验位的分布
规定校验位P
i
再海明位号为2
i-1
的位置上,其余位为信息位,因此有:
P
1
的海明位号为2
1-1
=2
0
=1
P
2
的海明位号为2
2-1
=2
1
=2
P
3
的海明位号为2
3-1
=2
2
=4
将信息位按原来的顺序插入,则海明码各位的分布是:
H
7
H
6
H
5
H
4
H
3
H
2
H
1
D
4
D
3
D
2
P
3
D
1
P
2
P
1
H_7 \quad H_6 \quad H_5 \quad H_4 \quad H_3 \quad H_2 \quad H_1 \\[5mm] D_4 \quad D_3 \quad D_2 \quad P_3 \quad D_1 \quad P_2 \quad P_1
H
7
H
6
H
5
H
4
H
3
H
2
H
1
D
4
D
3
D
2
P
3
D
1
P
2
P
1
-
分组以形成校验关系
每个数据位用多个校验位进行校验,但要满足条件:
被校验数据位的海明位号等于校验该数据位的各校验位海明位号之和
,另外,校验位不需要再被校验。
说明 |
H i |
P 1 (H 1 ) |
P 2 (H 2 ) |
P 3 (H 3 ) |
---|---|---|---|---|
D 1 放在H 3 上由P 1 P 2 校验 |
3 | 1 | 2 | |
D 2 放在H 5 上由P 1 P 2 校验 |
5 | 1 | 4 | |
D 3 放在H 6 上由P 1 P 2 校验 |
6 | 2 | 4 | |
D 4 放在H 7 上由P 3 P 2 P 1 校验 |
7 | 1 | 2 | 4 |
-
校验位取值
校验位P
i
的值为第i组(由该校验位校验的数据位)
所有位求异或
。
根据上一步的分组中有:
P
1
= D
1
⊕ D
2
⊕ D
4
= 0 ⊕ 1 ⊕ 1 = 0
P
2
= D
1
⊕ D
3
⊕ D
4
= 0 ⊕ 0 ⊕ 1 = 1
P
3
= D
2
⊕ D
3
⊕ D
4
= 1 ⊕ 0 ⊕ 1 = 0
所以,1 0 1 0对应的海明码为1 0 1
0
0
1
0
(标记为校验位,其他为信息位)
-
海明码校验原理
每个校验组分布利用校验位和参与形成的信息位进行奇偶校验检查,构成k个校验方程:
S
1
=P
1
⊕ D
1
⊕ D
2
⊕ D
4
= 0 ⊕ 0 ⊕ 1 ⊕ 1 = 0
S
2
=P
2
⊕ D
1
⊕ D
2
⊕ D
4
= 1 ⊕ 0 ⊕ 1 ⊕ 1 = 0
S
3
=P
3
⊕ D
1
⊕ D
2
⊕ D
4
= 0 ⊕ 0 ⊕ 1 ⊕ 1 = 0
若S
3
S
2
S
1
的值为“000”,则说明无错,否则说明出错,且
这个数就是错误位上的错误位上的位号
,如S
3
S
2
S
1
= 001,则说明第一位出错,即H
1
出错,直接将该位取反就达到了纠错的目的。