目录
1.差错类型
- 单个位差错
在一个单个位差错中,数据单元中仅有一位发生变化。 - 突发性差错
意味着在数据单元中有两位及两位以上的位发生变化。
注意:突发性差错的差错并不意味在连续位上出现。突发性差错的长度从第一个差错位到最后一个差错位的长度计算。 - 冗余
为了检错或纠正差错,我们需要发送除了数据外的额外(冗余)位。
2.前向纠错和重传
前向纠错是接收方通过使用冗余位尝试推测报文的方法。
重传纠错是接收方检测到有差错要求发送方重传的技术。
3.编码
可以把编码分为两大类:块编码和卷积编码。卷积编码在本书中没有讨论。
3.1 块编码
在块编码中,我们把报文划分成块,每个块有k位,称为数据字。并在此基础上增加r位冗余位,使其构成n=k+r位的码字。
k位数据字共有
2
k
2^k
2k种组合,n位码字共有
2
n
2^n
2n种组合。那么这就意味着有
2
n
−
2
k
2^n-2^k
2n−2k个码字承载的数据字是无用的。我们称这些码字为无效或非法码。
块编码的差错检测需要满足以下两个条件:
- 接收方有(或者能够找到)有效码字表。
- 原来的码字转变为无效码字。
如果满足以上两个条件,那么只要码字在有效码表中查到对应无效码字,那么就直接丢弃。如果出现发生了差错,但是差错依旧是一个有效码字,这是我们无法检测出数据差错。
注:差错检测码是根据某些类型的差错而设计的,因此只能检测到这些类型的差错,其他类型的差错无法被检测到。
4.纠错的概念和方法
4.1 纠错
纠错相较于差错检测,不仅要知道发生了错误,还需要知道错误发生的位置。
4.2 汉明距离
用于差错控制编码的一个核心概念就是汉明距离。**两个相同长度字的汉明距离是对应位不同的数量。**我们用 d ( x , y ) d(x,y) d(x,y)表示两个字x和y之间的汉明距离。如果我们对两个字进行异或操作并统计1的个数,就可以得到两个字的汉明距离。注意:汉明距离大于0。
4.3 最小汉明距离
虽然汉明距离是处理检错和纠错的核心概念,但是由于设计编码的度量是最小汉明距离。在一组字中,最小汉明距离是所有可能对中的最小汉明距离。为了求出这个值,我们需要计算所有可能对的汉明距离并取得最小值。
以下讲解三个概念:
- 三个参数
码字长度n,数据字长度k,以及最小汉明距离 d m i n d_{min} dmin。编码方案C写成 C ( n , k ) C(n,k) C(n,k)和一个单独的 d m i n d_{min} dmin表达式。 - 汉明距离与差错
汉明距离的大小就是发生错误的位的个数。 - 检错的最小距离
为了我们能够检测出最多s个差错,那么我们两个有效码字之间的最小汉明距离应该是s+1,这样接收到的无效码字才不会和有效码字匹配。
换而言之,如果两个有效码字之间的最小汉明距离如果是s,那么只有小于s个数量的差错才能被检测出来。 - 纠错的最小距离
与检错不同,纠错还需要将无效码字更正为有效码字。这就需要有一个决策机制能够判断该无效码字应该是哪个有效码字发生t位错误导致的。并且这个无效码字只有可能是该有效码字发生t位错误导致的。如果有两个有效码字产生同样的无效码字,那么我们将无法判断最终应该是哪个有效码字。
综上所述,这里 d m i n > 2 t d_{min}>2t dmin>2t也可以说 d m i n = 2 t + 1 d_{min}=2t+1 dmin=2t+1,因为d永远是整数。
5.线性块编码
在线性块编码中,任两个有效码字的异或生成另一个有效码字。
5.1 线性块编码的距离
可以简单求出,最小汉明距离是非零码字中1的个数。
5.2 简单奇偶校验码
简单奇偶校验码编码是n=k+1、
d
m
i
n
=
2
d_{min}=2
dmin=2的单个位检错码。
在发送方:1的个数是偶数个则为0,否则为1。
在接收方:1的个数是偶数个则接收,否则丢弃。
5.3 两维奇偶校验码
在这种校验码下,所有同长度数据字组成一个二维数组,行和列分别生成一组校验位,通过这两组校验位对错误进行定位。
这种纠错方式可以检测所有三位以下错误。三位及以上有可能被检测出来。
5.4 汉明码
书中只讨论了单个位纠错的纠错编码。
书中汉明码的
d
m
i
n
=
3
d_{min}=3
dmin=3。假设校验位
m
≥
3
m\ge3
m≥3。所以
n
=
2
m
−
1
∧
k
=
n
−
m
n=2^m-1 \land k=n-m
n=2m−1∧k=n−m。
书中讨论的汉明码,如果在传输中发生两个错误,那么生成的数据字可能不是正确的数据字。
性能:
由于在单个码字中,只能纠正一个错误,所以为了检测帧中的长度为N的突发性错误,可以将帧分为N个码字,然后按表组织,一次发送一列。这样就可以把长度为N的突发性差错分解成单个位差错进行纠错。
6.循环冗余编码
6.1 循环冗余编码(CRC)
在编码器中,数据字有k位,码字有n位,冗余位是n-k位。n位结果传递给生成器。生成器使用长度为n-k+1长度的除数(除数是提前双方约定好的)。生成器用除数除增加后的数据字(模2除法)。除法的商被丢弃,余数加到数据字上生成码字。
译码器将n位数据全部传给校验器,如果校正子全为0则接收,否则丢弃。
6.2 循环冗余编码的纠错能力
6.2.1 多项式
在讲解冗余编码的纠错能力之前,先引入多项式概念。
若干个0和1组成的模式可以表示为以0和1为系数的多项式。每一项的幂次表示位所在的位置,系数表示位的值。
这样有一个显而易见的好处,就是当一长串中如果0元素比较多,那么我们就没有必要写一长串01串,而只用一个较为简单的多项式表达即可。如:1000000000000001~(
x
15
+
1
x^{15}+1
x15+1)。
- 多项式的次数
多项式的次数是多项式中的最高次幂。 - 多项式加减法
由于是模2运算,加法和减法的结果相同。所以x+x=0,x-x=0。这就意味着此处的多项式加减法运算只是单纯的消除合并。 - 项乘法和除法
符合一般的多项式运算法则。 - 两个多项式相乘
除了加减法的运算遵循第2条,其他都满足一般多项式运算规则。
注:循环编码中的除数通常称为生成多项式或简称为生成器。
6.2.2 检错能力分析
我们定义如下多项式:
数据字:
d
(
x
)
d(x)
d(x);码字:
c
(
x
)
c(x)
c(x);生成多项式:
g
(
x
)
g(x)
g(x);校正子:
s
(
x
)
s(x)
s(x);差错:
e
(
x
)
e(x)
e(x)
- 如果 s ( x ) ! = 0 s(x)!=0 s(x)!=0,一位或多为被破坏
- 如果 s ( x ) = = 0 s(x)==0 s(x)==0,
a. 没有位被破坏
b. 有一些位被破坏,但是译码器无法检测到
在分析中,我们首先知道:接受码字=
c
(
x
)
+
e
(
x
)
c(x)+e(x)
c(x)+e(x)。
在此基础上,校验子等于接受码字除以
g
(
x
)
g(x)
g(x),所以得到:
s
(
x
)
=
c
(
x
)
g
(
x
)
+
e
(
x
)
g
(
x
)
s(x)=\frac{c(x)}{g(x)}+\frac{e(x)}{g(x)}
s(x)=g(x)c(x)+g(x)e(x)
根据码字定义,我们知道第一项没有余数,所以s(x)的值取决于第二项。为了能够检测出不同类型的错误,我们需要让e(x)和g(x)之间满足不同类型的关系。
在循环编码中,那些可以被g(x)整除的差错无法被捕捉到。
- 单个位差错
单个为差错时 e ( x ) = x i e(x)=x^i e(x)=xi。如果 g ( x ) g(x) g(x)至少有两项且 x 0 x^0 x0的系数不为0,那么就意味着所有的单个位差错都可以被捕捉到。 - 两个独立的单个位差错
两个独立的单个位差错时 e ( x ) = x i + x j = x i ( x j − i + 1 ) e(x)=x^i+x^j=x^i(x^{j-i}+1) e(x)=xi+xj=xi(xj−i+1)。如果 g ( x ) g(x) g(x)多于一项且一项为 x 0 x^0 x0, x i x^i xi就不会被整除。只要 ( x j − i + 1 ) (x^{j-i}+1) (xj−i+1),即 ( x t + 1 ) , ∀ t ∈ [ 2 , n − 1 ] (x^t+1),\forall t \in [2,n-1] (xt+1),∀t∈[2,n−1](注:n是码字的长度)不被g(x)整除,那么就意味着所有的两个独立的单个位差错都可以被捕捉到。 - 奇数个差错
包含因子x+1的 g ( x ) g(x) g(x)可以检测到所有的奇数个差错。 - 突发性差错
假设生成多项式最高次幂为r,突发性差错长度为L。
- 所有 L ≤ r L \le r L≤r的突发性差错都会被检测到。
- 所有 L = r + 1 L=r+1 L=r+1的突发性差错有 1 − ( 1 2 ) r − 1 1-(\frac12)^{r-1} 1−(21)r−1的概率被检测到。
- 所有 L > r + 1 L \gt r+1 L>r+1的突发性差错有 1 − ( 1 2 ) r 1-(\frac12)^{r} 1−(21)r的概率被检测到。
6.2.3 总结
高性能多项式应该有以下特性:
- 至少两项
- 具有 x 0 x^0 x0项
- 应该不能整除 x t + 1 ∀ t ∈ [ 2 , n − 1 ] x^t+1\quad\forall t\in[2,n-1] xt+1∀t∈[2,n−1]
- 应该有因子 x + 1 x+1 x+1
7.校验和及其计算方法
7.1 校验和及其概念
假设要发送几个数字,那么这组数字之和的反码称之为校验和。
校验和的思路很简单,先求解出发送方要发送的数据总和,并将总和求反作为校验和发送到接收方。如果接收方收到的所有数字之和取反后为0,那么说明收到的数据没有问题,舍弃校验和接收数据,否则丢弃数据。
计算步骤:
- 为发送的数据求和
- 为和划定长度(长度为4),即将超出的部分移到数字右边,加到该部分上。
- 为结果取反
7.2 因特网校验和
传统上,因特网使用16位校验和。
发送方:
- 报文被划分为16位字
- 校验和字的值设为0
- 所有字包括校验和使用反码运算相加
- 对这个和求反变成校验和
- 校验和随数据一起发送
接收方:
- 报文(包括校验和)被划分为16位字
- 用反码加法将所有字相加
- 对该和求反生成新的校验和
- 如果校验和为0,接受报文;否则丢弃报文
注意:运算时注意自己的使用的进制,不要搞混。