实际通信链路都不是理想的,比特在传输过程中可能会产生差错,1可能会变成0,0也可能会变成1,这就是比特差错。比特差错是传输差错中的一种,本节仅讨论比特差错。
通常利用编码技术进行差错控制,主要有两类:自动重传请求 ARQ和前向纠错FEC。在ARQ方式中,接收端检测出差错时,就设法通知发送端重发,直到接收到正确的码字为止。在 FEC 方式中,接收端不但能发现差错,而且能确定比特串的错误位置,从而加以纠正。因此,差错控制又可分为检错编码和纠错编码。
检错编码
检错编码都采用冗余编码技术,其核心思想是在有效数据(信息位)被发送前,先按某种关系附加一定的冗余位,构成一 个符合某一规则的码字后再发送 ,当要发送的有效数据变化时,相应的冗余位也随之变化,使得得码字遵从不变的规则。接收端根据收到的码字是否仍符合原规则来判断是否出错。常见的检错编扁码有奇偶校验码和循环冗余码。
奇偶校验码
奇偶校验码是奇校验码和偶校验码的统称,是一种最基本的检错码。它由n-1位信息元和1位校验元组成。如果是奇校验码,那么在附加一个校验元后, 码长为 n 的码字中“1”的个数为奇数;如果是偶校验码,那么在附加一个校验元以后,码长为n的码字中“1”的个数为偶数。它又分为垂直奇偶校验、水平奇偶校验和水平垂直奇偶校验
循环冗余码
循环冗余码(CRC)又称多项式码,任何一个由二进制数位串组成的代码都可以与一个只含有0和1两个系数的多项式建立一一对应关系。一个k位帧可以视为从 Xk-1 到 X0 的k次多项式的系数序列,这个多项式的阶数为k-1,高位是 Xk-1 项的系数,下一位是 Xk-2 的系数,以此类推。例如,1110011有7位,表示成多项式是X6+ X5 + X4 + X1+1,而多项式X5 + X4 + X2 + X1对应的位串是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(即2rM+FCS),共有m+r位。
下面再举个例子:
纠错编码
在数据通信的过程中,解决差错问题的一种大方法是在每个要发送的数据块上附加足够的冗余信息,使接收方能够推导出发送方实际送出的应该该是什么样的比特串。最常见的纠错编码是海明码,其实现原理是在有效信息位中加入几个校验位形成海明码,并把海明码的每个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化,这不但可以发现错位,而且能指出错位的位置,为自动纠错提供依据。
现以数据码 1010 为例,讲述海明码的编码原理和过程
- 明确海明码的位数
设n为有效信息的位数,k为校验位的位数,则信息位n和校验位k应满足
n + k < = 2 k − 1 n+k<=2^k-1 n+k<=