生成多项式就是用来把要进行防错处理的二进制码流进行转换生成校验码,然后接收方会收到原始的二进制码流和校验码,按照与发送方相同的多项式再次进行转换生成校验码,与发来的校验码进行比较。如果一致则说明接收到的二进制码流是正确的;反之则说明接收到的二进制码流包含错误。
定义
若一个循环码的所有码字多项式都是一个次数最低的非零首一多项式 g(x)的倍式,则称g(x)生成该码,并称g(x)为该码的生成元或生成多项式。
生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。在发送方,利用生成多项式对信息多项式做模2除生成校验码。在接收方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。
应满足以下条件:
A、生成多项式的最高位和最低位必须为1。
B、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。
C、不同位发生错误时,应该使余数不同。
D、对余数继续做除,应使余数循环。
位数
生成多项式位数 =CRC校验码位数 +1。注意有些生成多项式的简记式中将生成多项式的最高位1省略了。
推论
(1)生成多项式的比特数越大,其差错检测能力越强;漏检错误率越低。
(2) 生成多项式比特数相同的情况下,差错检测能力相同;漏检错误率范围大致相同,但是对于不同的信道误码率,又有不同的漏检错误率。
生成原则
若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得
V(x)=A(x)g(x)=xRm(x)+r(x);
其中: m(x)为K次原始的信息多项式, r(x)为R-1次校验多项式(即CRC校验和),
g(x)称为生成多项式:
g(x)=g0+g1x1+ g2x2+...+g(R-1)x(R-1)+gRxR
发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。
结合系统的具体特点及要求,提出一种生成多项式的选取方法,其主要设计思想有以下两个方面:
(1) 首先,为了确保选取的生成多项式校验性能是最优的,考察在具体嵌入式网络系统中传输数据帧最大长度的情况下,码重最大,漏检率最低的生成多项式。
(2)其次,为了确保选取的生成多项式有较广的使用范围和良好的可移植性,分别考察小于和大于最大数据帧长度的情况,生成多项式的码重及漏检率的情况。
在这里要注意的是严格按照这两个方面的优先次序考虑,在保证自身应用环境中最优检错性能的前提下考察其扩展性和可移植性。
对于最小距离相同的生成多项式,要首先选取可检测数据长度最大的生成多项式;对于较短的数据帧,如果要提高生成多项式的最小距离,必须以不影响该生成多项式对于长数据帧的校验性能为前提;对于一些现行的协议,随着网络的不断发展,也会对协议进行修正,同时也会要求增加传输数据帧的长度,因此在选择生成多项式时要考虑将来的可扩展性,使生成多项式传输较长数据帧时也能有较好的校验性能。
生成方法
借助于模2除法则,其余数为校验字段。
例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1
假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001
x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;
采用模2除法则: 得余数为: 1010(即校验字段为:1010)
发送方:发出的传输字段为: 1 0 1 1 0 0 1 1010
信息字段 校验字段
接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)
如果能够除尽,则正确,
给出余数(1010)的计算步骤:
除法没有数学上的含义,而是采用计算机的模二除法,即除数和被除数做异或运算。进行异或运算时除数和被除数最高位对齐,按位异或。
10110010000
^11001
--------------------------
01111010000
1111010000
^11001
-------------------------
0011110000
11110000
^11001
--------------------------
00111000
111000
^11001
-------------------
001010
则四位CRC校验码就为:1010。
利用CRC进行检错的过程可简单描述为:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。
生成步骤
1、将X的最高次幂为R的生成多项式转换成对应的R+1位二进制数。
2、将信息码左移R位,相当于对应的信息多项式*。
3、用生成多项式(二进制数)对信息码做除,得到R位的余数(注意:这里的二进制做除法得到的余数其实是模2除法得到的余数,并不等于其对应十进制数做除法得到的余数)。
4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。
【例】假设使用的生成多项式是=。4位的原始报文为1010,求编码后的报文。
解:
1、将生成多项式=转换成对应的二进制除数1011。
2、此题生成多项式有4位(R+1)(注意:4位的生成多项式计算所得的校验码为3位,R为校验码位数),要把原始报文左移3(R)位变成1010 000
3、用生成多项式对应的二进制数对左移3位后的原始报文进行模2除(高位对齐),相当于按位异或:
1010000
1011
------------------
0001000
0001011
------------------
0000011
得到的余位011,所以最终编码为:1010 011
举例
名称 生成多项式 简记式* 应用举例
CRC-4 x4+x+1 3 ITU G.704
CRC-8 x8+x5+x4+1 31 DS18B20
CRC-12 x12+x11+x3+x2+x+1 80F
CRC-16 x16+x15+x2+1 8005 IBM SDLC
CRC-ITU** x16+x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS,ZigBee
CRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802 LAN/FDDI,IEEE 1394,PPP-FCS
CRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP
生成多项式的最高幂次项系数是固定的1,故在简记式中,将最高的1统一去掉了,如04C11DB7实际上是104C11DB7。
备注:
(1)生成多项式是标准规定的
(2)CRC校验码是基于将位串看作是系数为0或1的多项式,一个k位的数据流可以看作是关于x的从k-1阶到0阶的k-1次多项式的系数序列。采用此编码,发送方和接收方必须事先商定一个生成多项式,其高位和低位必须是1。要计算m位的帧M(x)的校验和,基本思想是将校验和加在帧的末尾,使这个带校验和的帧的多项式能被除尽。当接收方收到加有校验和的帧时,用去除它,如果有余数,则CRC校验错误,只有没有余数的校验才是正确的。