CRC算法的应用理论研究
2011-08-07欧海文李起瑞胡晓波赵静
欧海文 李起瑞, 胡晓波 赵静
1 西安电子科技大学通信工程学院 陕西 710071
2 北京电子科技学院 北京 100070
3 北京中电华大电子设计有限责任公司 北京 100102
0 引言
在通信领域,由于数据在传输和存储过程中受到各种干扰,使信号码元发生变化,所以需要进行数据校验以确保数据的完整性。循环冗余校验CRC(Cyclic Redundancy Code)由于其具有检错效率高、原理简单、易于实现的特点得到了广泛的应用。
1 CRC算法基本原理
CRC校验码由分组线性码的分支而来,其应用主要为二元码组,由一个生成多项式(最高次幂为 r)产生,r次的生成多项式可产生r位的冗余码,所有码字的运算是封闭的。
设每个信号码元的序列为m={mn-1mn-2…m1m0}用多项式表示为:

CRC编码步骤可归纳如下:
设生成多项式g(x)的最高次幂为r,上式两端乘以xr得:

用 g(x)模 2 除xrm(x),得商Q(x)和余式r(x):

编出的码为:

可得输出码序列为:

接收方校验数据有两种方法:
(1) 对原始数据采用与发送方同样的生成CRC校验码的方法生成r'(x),然后与r(x)比较,相等则校验通过,否则认为数据传输出现差错。
(2) 对接收的数据计算m'(x)≡0modg(x)是否成立,成立则校验通过,否则认为数据传输出现差错。
2 CRC的INTI和XOROUT值
定义 1:函数CRC(INIT,m)表示以INIT为寄存器初始值,输入数据为 m计算 CRC校验值,默认CRC(m)=CRC(0,m)。
性质1:∀m∈{0,1}r,CRC(m,m)=0
性质2:∀mi∈{0,1}r,∀ai∈{0,1}∀

性质3:∀m,a∈{0,1}r,CRC(m,a)=CRC(a,m)
CRC算法虽然选择相同的生成多项式,但开始时寄存器中设置的初始值不同得到的CRC结果也不同。初始值对CRC算法的结构性能没有任何影响,可以任意设置,通常为了使得传输数据最前面的 0能够正确传输,会将 INIT设置为0xFFFF同时,出于相同的目的会在CRC计算完成后将寄存器中的结果异或上一个XOROUT=0x FFFF值,然后结果输出,函数表示为:CRC(m)=CRC(INIT,m)⊕XOROUT 。……
