CRC校验模块
CRC循环校验是在网络传输中经常使用的一种校验方式,循环码具有经循环后仍然是循环码中的一个码字的特征,也正是由于这一特征,循环码的编码和译码过程相比于其他的线性编码其复杂程度也更低。本章节提到的乘除加减运算均为 域上的运算,在研究循环编码时,我们把码字矢量
看做一个多项式
这一多项式也被成为码字多项式。那么对应的当我们对 循环向右位移一次得到的码字多项式
对比两个码字多项式我们可以发现
对于 域中减法和加法发都是都是不产生进位借位的加减法,也就是异或运算。所以有
这也就意味着
循环码有诸多在通讯编码中十分有用的性质,根据循环码的这些性质总结出如下定理:
在一个二元(n,k)循环码中,存在位移次数为n-k的码字多项式 ,使得每个码字多项式都是g(x)的倍式;反之,每个次数不大于n-1的而且为 倍式的多项式均对应一个码字多项式。
我们把g(x)也称为生成多项式,将待编码的信息码u(x)看做次数为k的多项式,g(x)为最高次为r,由以上定理可得u(x)×g(x) 则可以得到一个次数为n=k+r的码字多项式。CRC循环校验码的目的就是通过,CRC校验码字与信息码字相结合,整体成为循环码中的一个码字多项式。但是,这也存在一个问题,虽然通过信息码字与生成多项式相乘可以得到,但这样生成的循环码将原有的信息码打乱了,即在传输过程中将原本要传输的信息打乱,这是我们不可接受的,我们希望生成的码字多项式具备在保留原本要传输的信息加上一些校验码作为一次传输过程中要传输的数据,这样做能够减少传输过程中额外的开销并保留原本的传输信息。因此对于一个消息多项式m(x) ,我们先用x的n-k次乘m(x),然后用生成多项式g(x)除x的n-k次乘m(x) 得到 ,m(x)乘x的n-k次=a(x)g(x)+b(x)其中a(x) 为商式,b(x)为余式。且 一定是一个次数不大于n-k-1 的多项数,由此我们可以得到如下的一个码字多项式
其中 就相当于我们的校验多项式。也就是在传输时需要额外传输的CRC校验码。
在实现上述编码过程时,我们可以发现循环编码需要将消息多项数 乘,生成多项式 除 得到余式 ,得到最终的循环编码 。我们可以使用线性反馈位移寄存器电路来实现上述过程。
LFSR(liner feedback shif register)
线性反馈位移寄存器通常分为两种:一种是外反馈式的LFSR,一种是内反馈的LFSR他们的基本结构如下:
以内反馈电路为例,图(b)中实现了 g(x)=x4+x3+x+1的长除过程的电路。在计算开始时,四个寄存器值清零,随着寄存器的工作,从输入端将消息序列多的高位系数进行输入,前四次寄存器输出均为0,这个过程相当于实现了将消息序列m(x)乘x的n-k次的操作,在多项式中可以将x的阶数视作时钟周期的推移,当四个周期循环过去后,消息序列m(x)进入到寄存器中,此时寄存器的输出实质上是长除过程商式的高位输出。当输出0时,意味着商0,此时根据图中的反馈回路可知0与寄存器里的值异或还是它本身,意味着寄存器右移即长除过程中的移位过程,当输出1时,相应位置的反馈回路我们可以将之看做模二的减法,也就是将寄存器里的值减去了商1乘g(x)的值,这也就对应了长除法中商1时被除数中减去相应的值。当消息序列通过寄存器后,我们可以知道,相应的寄存器输出就是商式的结果。而此时寄存器里的值就是g(x)除m(x)乘x的n-k次得到的余数,也就是余式b(x)。从而得到了我们所需要的CRC校验值。以信息码为x5+x3+x+1 为例,其长除过程如下所示:
从寄存器0101的状态进行推算,右移一次输出1,相应的得到的寄存器值为0111,再右移一次,输出1得到的值为0110。可知最终商式为x+1 ,余式为 x2+x ,与长除法结果保持一致。由此可见,寄存器的状态转移正是长除法中余式中相应的4位值,移位寄存器正是实现了模二长除法的长除过程。位移寄存器也正因此适合用于实现CRC循环码的编码过程,CRC的解码过程即码字多项式除生成多项式g(x)的过程,亦即g(x)一定是码字多项式的因式,也就是说得到的余式为0表明传输过程没有发生错误。值得注意的是,并非任何多项式都可以用作生成码字多项式,若g(x)为n-k次的多项式,它必须是xn+1的因式才能够使用g(x)生多项式来生成(n,k)循环码。而xn+1的因式往往并非只有一种,对应其生成的循环码也相应的有性能优劣之分,在这方面,许多编码理论家都进行了大量的研究,并且将相应的生成多项式应用在了许多种不同标准的传输协议中。如CRC-1奇偶校验;CRC-5生成多项式为 和CRC-16生成多项式为 应用在USB2.0中进行校验等。