差错控制
传输中的差错由噪声引起。一类称为热噪声,是信道所固有的、持续的,并且随机的。另一类是外界环境造成的短暂的冲击噪声。热噪声可以通过提升信噪比降低干扰。而后者不可以通过提升信号幅度来避免干扰,带来差错。
通常采用编码技术来进行差错控制,主要有两类:自动重传请求(ARQ)和前向控制(FEC)。在ARQ方式中,接收端只进检错,而不进行纠错。而在FEC方式中,不仅进行检错,还可以检测出二进制数码错误位置,并加以纠正。常见的检错编码有奇偶校验码和循环冗余校验码。海明码是常用的纠错编码。
奇偶校验码
包含奇校验和偶校验。由n-1位信息元和1位校验元组成,属于冗余编码技术。如果是奇校验,在添加一个校验码之后,码长为n的码字中1的个数为奇数个。在偶校验中,添加1位校验码之后,码字中1的个数为偶数个。
循环冗余校验码(CRC)
又称多项式码。将一个由二进制数位串组成的代码和一个仅有0和1两个系数的多项式建立一一对应关系。例如:1110011有7位,其对应的多项式为 X 6 + X 5 + X 4 + X + 1 X^6+X^5+X^4+X+1 X6+X5+X4+X+1,而多项式 X 5 + X 4 + X 2 + X X^5+X^4+X^2+X X5+X4+X2+X对应的二进制码串为110110.
CRC检错过程为:发送端发送一个m bit的帧,并生成一个r bit的序列,称为帧检验序列。发送方和接受方事先约定一个多项式 G ( x ) G(x) G(x),使这个带检验码的帧正好被 G ( x ) G(x) G(x)整除。从而进行检验。
帧检验序列的计算过程为:假设一帧有m位,其对应的多项式为 M ( x ) M(x) M(x)。
- 加0操作。假设约定好的多项式 G ( x ) G(x) G(x)的阶为 r r r,在待发送的m帧后面加上 r r r个0.
- 模2除法操作。利用模2除法,用 G ( x ) G(x) G(x)去除(1)中得到的数据串,得到的余数即为帧检验序列,共 r r r位,前面的0不可省略。(PS:模2运算加减法满足异或操作,乘除法类似二进制运算)
帧检验序列(冗余码)的计算举例:设
G
(
x
)
=
1101
G(x)=1101
G(x)=1101(即
r
=
3
r=3
r=3),待传送数据
M
=
101001
M=101001
M=101001(即
m
=
6
m=6
m=6),经模2除法运算后的结果是:商
Q
=
110101
Q=110101
Q=110101(没有实际用途),余数为
R
=
001
R=001
R=001。所以发送出去的数据为101001001.
海明码
海明码可以发现双比特错误,但只能纠正单比特错误。海明码将码字内的位从左至右依次编号,编号为2的幂的位为校验位,其余位填入要传输的m位数据。将编号为k的数据位改写成2的幂的和,例如11=1+2+8,29=1+4+8+16。编号为k的数据仅由扩展式中所示编号的位检测。
m个信息位插入
r
r
r个校验位组成m+r位码字,他们必须满足的关系是
2
r
≥
m
+
r
+
1
2^{r} \geq m+r+1
2r≥m+r+1.以典型的4位数据编码为例,海明码加入3个校验位。
数据位:1位 2位 3位 4位 5位 6位 7位
代码:
P
1
P
2
D
1
P
3
D
2
D
3
D
4
P_{1} P_{2} D_{1} P_{3} D_{2} D_{3} D_{4}
P1P2D1P3D2D3D4
其中
P
P
P为校验位,
D
D
D为数据位。
以数据码1101为例。此时 D 1 = 1 , D 2 = 1 , D 3 = 0 , D 4 = 1 D_{1}=1,D_{2}=1,D_{3}=0,D_{4}=1 D1=1,D2=1,D3=0,D4=1。对于7位码字的编号为(4位数据,3位检验):1位=1,2位=2,3位=1+2,4位=4,5位=1+4,6位=2+4,7位=1+2+4。因此, P 1 P_{1} P1所检验的位数为1,3,5,7(码字编号中对应数字1的)。另 P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 = 0 P_{1} \oplus D_{1} \oplus D_{2} \oplus D_{4}=0 P1⊕D1⊕D2⊕D4=0,求得 P 1 = 1 P_{1}=1 P1=1; P 2 P_{2} P2所检验的数据位为2,3,6,7(码字编号中对应数字2的)。令 P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 = 0 P_{2} \oplus D_{1} \oplus D_{3} \oplus D_{4} =0 P2⊕D1⊕D3⊕D4=0,得 P 2 = 0 P_{2}=0 P2=0; P 3 P_{3} P3检验的数据位为4,5,6,7(码字编号中对应数字4的)。令 P 3 ⊕ D 4 ⊕ D 5 ⊕ D 6 ⊕ D 7 = 0 P_{3} \oplus D_{4} \oplus D_{5} \oplus D_{6} \oplus D_{7}=0 P3⊕D4⊕D5⊕D6⊕D7=0,得 P 3 = 0 P_{3}=0 P3=0.因此海明码的编码结果为:1010101.(PS: ⊕ \oplus ⊕表示异或运算)
纠错过程:接受方接受到的正确码字应为1010101。当受到干扰接收到的码字为1010111。 D 1 D_{1} D1位由0变为1。检测时, P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 = 0 P_{1} \oplus D_{1} \oplus D_{2} \oplus D_{4}=0 P1⊕D1⊕D2⊕D4=0,第一位纠错码正确。 P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 = 1 P_{2} \oplus D_{1} \oplus D_{3} \oplus D_{4} =1 P2⊕D1⊕D3⊕D4=1,第二位纠错码为1,有错误。 P 3 ⊕ D 4 ⊕ D 5 ⊕ D 6 ⊕ D 7 = 1 P_{3} \oplus D_{4} \oplus D_{5} \oplus D_{6} \oplus D_{7}=1 P3⊕D4⊕D5⊕D6⊕D7=1,第三位纠错码为1,有错误。三个纠错码从高到低排列为110,对应的十进制为6,即为第六位数据发生错误,也就是 D 1 D_{1} D1位,取反即可。