CRC校验原理及推导过程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.1 伽罗华域 (2 )
在伽罗华域 (2 )中的元素由 (2)上的本原多项式构造,域中的元素两两运算之后 例如当 = 4,本原多项式为: ( ) = + + 1, (2 )中的元素集合
CRC 校验原理及推导过程
1 代数引论
参考文献[1]对伽罗华域、线性码、循环码、缩短循环码进行了很好的论述。

的结果依然是该域中的元素,域中运算是基于模 2 的。

4 4
{0,1, , 2, 3,⋯, 14
},转换为十六进制数依次对应为{0,1,2,4,8,3,6, , ,5, ,7, , , ,9},转换为 多项式依次对应为 {0,1, , 2, 3, + 1, 2 + , 3 + 2, 3 + + 1, 2 + 1, 3 + , 2 + + 1, 3 + 2 + , 3 +。

于是: 15
= ∙ 14 = ∙ (1 + 3) = + 4 = + 1 + = 1
7 + 5 = ( 2 + ) + ( 3 + + 1) = 3 + 2 + 1 = 13
1.2 模运算法则
模运算与基本四则运算有些相似,但是除法例外。

其规则如下
(a+b) % p = (a % p + b % p) % p (1-1) (a-b) % p = (a % p - b % p) % p
(1-2) (a × b) % p = ((a % p ) × (b % p ))% p (1-3) a b % p = ((a % p)b ) %p
(1-4)
结合率:
((a+b) % p+c) % p = (a+(b+c) % p) % p (1-5)
((a × b) % p × c)% p = (a × (b × c) % p) % p
(1-6)
交换率:
(a+b) % p = (b+a) % p (1-7) (a × b) % p = (b × a) % p
(1-8)
分配率:
((a +b)% p × c) % p = ((a × c) % p + (b × c) % p) % p (1-9)
一个长度为 ,有2 个码字的分组码,当且仅当其2 个码字构成 (2)域上
1.3 线性分组码和循环码
所有 维向量组成的向量空间的一个 维子空间是被称为( , )线性码。

线性码的码字由 位消息部分和( ‒ )位冗余校验部分组成。

循环码事线性分组码的一个重要的子类,其有两个引入注目的原因:一是 通过带反馈连接的移位寄存器(一般称为线性时序电路),其编码和校正计算 能够很容易的实现;二是由于其具有固有的代数机构,都能找到很多种实用的 方法进行译码。

一个( , ) 线性码 C ,如果每个码字的循环移位后的数仍是 C 的码字,则成 为其为循环码。

给定一个( , )循环码的生成多项式
g (x ) = ‒

+ ‒ ‒ 1 ‒ ‒ 1 + ⋯ 1 + 1,假设待编码的消息为
u = ( ‒ 1, ‒ 2,⋯ 1,u 0),则相应的消息多项式为:
u ( ) = ‒ 1
‒ 1
+ ‒ 2 ‒ 2 + ⋯ + 1 + u 0
(1-10)
用 ‒
乘以u ( ),得到次数不大于( ‒ 1)的多项式为:
‒ u ( ) = ‒ 1 ‒ 1 + ‒ 2 ‒ 2 + ⋯ + 1 ‒ ‒ 1 + u 0 ‒ 11)
用生成多项式
g (x )除 ‒ u ( )得到:
(1-
‒ u ( ) = ( ) ( ) + v ( )
(1-12)
其中, ( )和v ( )分别为商式和余式。

由于g (x )的最高次数为( ‒ ),则 ( )的次数必不大于( ‒ - 1)。

从而有
( ) = ‒ ‒ 1 ‒ ‒ 1 + ⋯ + 1 + 0
整理得到次数不大于( ‒ 1)的多项式: ‒ u ( ) + ( )
(1-13)
= ( ) ( ) = ‒ 1
‒ 1
+ ‒ 2 ‒ 2 + ⋯ + 1 ‒ ‒ 1 + u 0 ‒
+ ‒ ‒ 1 ‒ ‒ 1
+ ⋯ + 1 + 0
(1-14)
该多项式能被多项式g (x )整除。

相应的完整码字为:( ‒ 1, ‒ 2,⋯ 1,u 0, ‒ ‒ 1,⋯ 1, )
(1-
15)
1.4 缩短的循环码
在系统设计中,如不能找到一个具有合适的自然长度的或者信息位数目的
码字,缩短码是一种有效的解决方案。

对一个(,)循环码,其中信息位的高位均为零的码字共有2‒个,构成
了的线性子码。

若从这些码字中删除这个零信息位,将得到2‒个长度为
n‒的向量,这些向量组成了(‒,‒)线性码。

这种码被称为缩短循环码,
但不是循环码。

缩短循环码的纠错能力与差错检测能力至少与原码相同。

1.5冗余码
所用符号数或信号码元数比表示信息所必需的数目多的代码叫冗余码。

1.6循环冗余检验
循环冗余检验英文名称为Cyclical Redundancy Check,简称CRC。

它是利用多项式除法及余数的原理来做错误检测的。

它将要发送的数据比特序列当作一个信息多项式u()的系数,发送时去除以约定的生成多项式g(x),得到一个余数多项式v(),将余数多项式加到信息多项式之后发送到接收端,接收端同样用g(x)去除接收到的接收多项式r(),进行计算,然后把计算结果与由生成多项式g(x)决定的固定序列比较,来检测传输错误。

由此可以看出其同时具有循环码和冗余码的特征,所以这种错误检测方法叫循环冗余校验,编码叫循环冗余校验码,即如式1-15所示。

理论上可以证明循环冗余校验码的检错能力有以下特点:
(1)可检测出所有奇数位错。

(2)可检测出所有双比特的错。

(3)可检测出所有小于、等于校验位长度的突发错。

2CRC码编码
在1.3节《线性分组码和循环码》中得到算式1-15的计算过程就是循环冗余校验码的编码步骤,归纳起来有以下三步骤:
第1步预先用‒乘以信息多项式u(),得到‒u();
第2步用生成多项式g(x)去除‒u(),获得余式v();
第3步整合余式v()和‒u(),获得码多项式‒u()+()。

对于一个(,)循环码,生成多项式
g(x)=‒+‒‒1‒‒1+⋯+11+1,编码电路有两种方式:
一,信息位由高位到低位的顺序从循环移位寄存器体左侧依次输入,信息位完全进入循环体后继续输入n‒‒1个0,最后循环体中寄存器的值就是余式码字;
以 CRC4 为例,其生成多项式为:g (x ) = +
+ 1,当信息多项式
g 0
g 1
g n -k -1
Din
+
D + D 1
+ +
D n -k -1
图 1 左侧串行输入循环移位寄存器体
二,信息位由高位到低位的顺序从循环移位寄存器体右侧依次输入,信息 位完全进入循环体后寄存器的值就是余式码字。

g 0
g 1
g n -k -1
D + D 1
+ + D n -k -1
+
Din
图 2 右侧串行输入循环移位寄存器体
注:1,移位寄存器循环体中余式码字低位在左侧,高位在右侧。

4 u = (101011)时用两种方法计算得到得余式码字是一样的: = (0100),编码 后完整地码字为:(1010110100)。

图三所示的两种计算余式码字的方法对应于 数字电路中 D 触发器、加法器、乘法器的组成的循环体结构分别为图 1、图 2 所示。

其中 = u (
),
方法一 方法二 10011
0001
1
00000 00110 10000 11100 10011 01111 00000 11110 10011 0110110000 01010 10000 0100
0 1
1
00010
0 0100
图 3 信息位为单比特两种方法比较
3 CRC 码校验
3.1 CRC 码校验的基本原理
所有的 CRC 校验都是基于以下这个等式:
( + ) = 0
(3-1)
u ( ) = ‒ ‒ 1
‒ ‒ 1 + ⋯ + 1 + u
0,
= ‒ ,
=‒1‒1+⋯+1+0,
息字段多项式的最高次幂, 取决于k 的值即 = 2 , 是信息字段长度,G 是生 g (x ) = ‒

+ ‒ ‒ 1 ‒ ‒ 1 + ⋯ 1 + 1。

M 是信息字段(Message )多项式,R 是校验字段(Remainder )多项式,r 是校验字段多项式的最高次幂(也就是校验字段的长度,CRC-32 对应的 ‒ k , 依次类推), ‒ 是信息字段加上冗余校验码后多项式的最高次幂,k ‒ 是信
k 成(Generator)多项式。

由此可见 CRC32 信息字段最大比特数为232
- 32,除此之 外的信息字段编码就是缩短的 CRC32 编码。

发送端 M 和 G (对某一种确定的 CRC 校验,其 G 是固定的)是已知的,CRC 计算就是 为了求出校验字段 R ;接收端 M ,R ,G 都是已知的,主要的操作都是 为了验证等式是否成立,方法有很多种。

下表展示了用于被用于一些常用的 CRC 标准的生成多项式,Hex 列表示
生成多项式对应的十六进制,MSB (most significant bit ,可以理解为最左边 的一位)省略,因为该位总是为 1:
表一 几种典型 CRC 生成多项式
3.2 发送端和接收端的具体处理方法
参考文献[2]对 CRC 校验码的接收端有具体处理的描述,缺少中间推导过程。

CRC 校验码在工程应用过程中相比数学计算稍微有些变化:
1, 在发送端对全 0 数据包的编码处理。

数学计算中,当信息字段全部为 0 时的得到的余式码字也是全零的,但是 在工程应用中,当非 0 信息字段在编码后发送给接收端,在线路传输中出现干 扰或者是其他情况的错误,导致接收端收到的全零数据,即信息字段和余式字
在接收侧收到的完整码字多项式: = + 用多项式G 对 取模为:
段都为 0。

如果在发送端不做特殊处理,在接收端就检验不出来这样的错误数 据包。

于是,在通信传输时,很多协议规定在发送端对 CRC 编码时定义一个 Key 寄存器,对 CRC 编码进行初始化,定义一个不为 0 的初值,Key 寄存器通常 被设置为全 1。

结合图 1、图 2 来说,就是在信息输入给循环体之前,其 D 触发 器的值为 1。

2, 对接收端收到的数据包中拖尾 0 数据的处理。

接收端接收到信息字段和余式字段,计算出数据包的余式码字,并与余式 字段做比较,就能检测出错误。

更简单的做法是,接收端对接收 到的所有数据 求余式(包括信息字段和余式字段),如果没有传输错误所得的余式一定为
0。

但是,余式为 0 并不一定能够说明数据包没有改变,如果数据包在余式字段 后有 0 增加或者删除的情况出现,就无法被检测出来。

为了更好的理解公式的推导过程,需要用到 1.2 节中的几个关于取模运算 法则。

接收端如何才能识别无差错的传输呢?我们知道在发送侧满足:
( + ) = 0
(3-1)
如果用R 表示 R 对 1 取反,我们得到:
(Mx + ) mod G = (Mx + (x ‒ 1 + x ‒ 2
+ ⋯ + 1 ‒ ))
= (( ‒ ) + x ‒ 1 + x ‒ 2
+ ⋯ + 1)
= (( + ) + x ‒ 1 + x ‒ 2
+ ⋯ + 1)
= (((M + ) mod G ) + (( ‒ 1 + ‒ 2
+ ⋯ + 1) ))
= (0 + (( ‒ 1 + ‒ 2
+ ⋯ + 1) ))
= (( ‒ 1 + ‒ 2 + ⋯ + 1) )
= ( ‒ 1 + ‒ 2 + ⋯ + 1)
因此,在发送端发出来的无差错的传输的校验序列应该是:
( ‒ 1 + ‒ 2 + ⋯ + 1)
'
'
(3-2)
(3-3)
(')=((+))
=((+(‒1+‒2+⋯+1‒)))
=((+(‒1+‒2+⋯+1+)))
=((++(‒1+‒2+⋯+1)))
=(((++(‒1+‒2+⋯+1))))
=(((‒1+‒2+⋯+1)))
=((‒1+‒2+⋯+1))
因此,在接收端计算出的无差错的传输的校验和应该是:
((‒1+‒2+⋯+1))(3-4)
对于给定的生成多项式G,上式是一个常数,对CRC-32而言,该值成为余式多项式为:
31+30+26+25+24+18+15+14+12+11+10+8+6+5
+4+3++1
(3-5)
余式值用十六进制表示:C704DD7B。

到此,关于通信用的CRC校验实现原理除了通信过程中比特流顺序之外,基本上是理顺,使得知其然也知其所以然。

参考文献[1] 《纠错码原理》
参考文献[2] 《CYCLIC REDUNDANCY CHECK》。

相关文档
最新文档