打印
[应用方案]

CRC循环冗余算法原理

[复制链接]
1757|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gejigeji521|  楼主 | 2016-3-22 22:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。

算法原理
假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k位的值,对应g(x)中x^k的系数。将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。
h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等。
g(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。比如将11001与10101做xor运算:
明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。
经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。
通过示例,可以发现一些规律,依据这些规律调整算法:

1. 每次迭代,根据gk的首位决定b,b是与gk进行运算的二进制码。若gk的首位是1,则b=h;若gk的首位是0,则b=0,或者跳过此次迭代,上面的例子中就是碰到0后直接跳到后面的非零位。

2. 每次迭代,gk的首位将会被移出,所以只需考虑第2位后计算即可。这样就可以舍弃h的首位,将b取h的后m位。比如CRC-8的h是111010101,b只需是11010101。
3. 每次迭代,受到影响的是gk的前m位,所以构建一个m位的寄存器S,此寄存器储存gk的前m位。每次迭代计算前先将S的首位抛弃,将寄存器左移一位,同时将g的后一位加入寄存器。若使用此种方法,计算步骤如下:
※蓝色表示寄存器S的首位,是需要移出的,b根据S的首位选择0或者h。黄色是需要移入寄存器的位。S'是经过位移后的S。
查表法
同样是上面的那个例子,将数据按每4位组成1个block,这样g就被分成6个block。

下面的表展示了4次迭代计算步骤,灰色背景的位是保存在寄存器中的。
经4次迭代,B1被移出寄存器。被移出的部分,不我们关心的,我们关心的是这4次迭代对B2和B3产生了什么影响。注意表中红色的部分,先作如下定义:

   B23 = 00111010
   b1 = 00000000
   b2 = 01010100
   b3 = 10101010
   b4 = 11010101
   b' = b1 xor b2 xor b3 xor b4
4次迭代对B2和B3来说,实际上就是让它们与b1,b2,b3,b4做了xor计算,既:
   B23 xor b1 xor b2 xor b3 xor b4
可以证明xor运算满足交换律和结合律,于是:
   B23 xor b1 xor b2 xor b3 xor b4 = B23 xor (b1 xor b2 xor b3 xor b4) = B23 xor b'
b1是由B1的第1位决定的,b2是由B1迭代1次后的第2位决定(既是由B1的第1和第2位决定),同理,b3和b4都是由B1决定。通过B1就可以计算出b'。另外,B1由4位组成,其一共2^4有种可能值。于是我们就可以想到一种更快捷的算法,事先将b'所有可能的值,16个值可以看成一个表;这样就可以不必进行那4次迭代,而是用B1查表得到b'值,将B1移出,B3移入,与b'计算,然后是下一次迭代。

可看到每次迭代,寄存器中的数据以4位为单位移入和移出,关键是通过寄存器前4位查表获得
,这样的算法可以大大提高运算速度。
上面的方法是半字节查表法,另外还有单字节和双字节查表法,原理都是一样的——事先计算出2^8或2^16个b'的可能值,迭代中使用寄存器前8位或16位查表获得b'。
反向算法
之前讨论的算法可以称为正向CRC算法,意思是将g左边的位看作是高位,右边的位看作低位。G的右边加m个0,然后迭代计算是从高位开始,逐步将低位加入到寄存器中。在实际的数据传送过程中,是一边接收数据,一边计算CRC码,正向算法将新接收的数据看作低位。
逆向算法顾名思义就是将左边的数据看作低位,右边的数据看作高位。这样的话需要在g的左边加m个0,h也要逆向,例如正向CRC-16算法h=0x4c11db8,逆向CRC-16算法h=0xedb88320。b的选择0还是h,由寄存器中右边第1位决定,而不是左边第1位。寄存器仍旧是向左位移,就是说迭代变成从低位到高位。


沙发
mintspring| | 2016-3-22 23:30 | 只看该作者
汉明码算法应该是比CRC更高级的算法,如果CRC中,同时两个位错了,那么肯定就检测不出来了

使用特权

评论回复
板凳
734774645| | 2016-3-23 09:35 | 只看该作者
CRC,全称Cyclic Redundancy Code,意为循环冗余码校验。它是利用除法及余数的原理来作错误侦测的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。

使用特权

评论回复
地板
芙蓉洞| | 2016-3-23 20:23 | 只看该作者
处理这些算法得用到M4的核了吧

使用特权

评论回复
5
hotpower| | 2016-6-21 15:37 | 只看该作者
http://www.21ic.com/tools/HotWC3_V1.22.html

使用特权

评论回复
6
稳稳の幸福| | 2016-6-30 16:47 | 只看该作者
菜农大叔的那个算法不错,自动生成代码。

使用特权

评论回复
7
gejigeji521|  楼主 | 2016-6-30 22:38 | 只看该作者
只会奇偶校验肯定不行,必须要会这个CRC教研。

使用特权

评论回复
8
yiyigirl2014| | 2016-6-30 23:59 | 只看该作者
循环冗余校验同其他差错检测方式一样,通过在要传输的k比特数据D后添加(n-k)比特冗余位(又称帧检验序列,Frame Check Sequence,FCS)F形成n比特的传输帧T,再将其发送出去。

使用特权

评论回复
9
ideafor| | 2016-7-3 21:48 | 只看该作者
adc采集的数据能用这个算法使得数据平滑吗

使用特权

评论回复
10
gejigeji521|  楼主 | 2016-7-12 20:01 | 只看该作者
CRC(Cyclic Redundancy Check,循环冗余校验)算法出现时间较长,应用也十分
广泛,尤其是通讯领域,现在应用最多的就是 CRC32 算法,它产生一个 4 字节(32 位)的校
验值,一般是以 8 位十六进制数,如 FA 12 CD 45 等。CRC 算法的优点在于简便、速度快,
严格的来说,CRC 更应该被称为数据校验算法,但其功能与数据摘要算法类似,因此也作为测
试的可选算法。
在 WinRAR、WinZIP 等软件中,也是以 CRC32 作为文件校验算法的。一般常见的简单
文件校验(Simple File Verify – SFV)也是以 CRC32 算法为基础,它通过该算法生成
一个后缀名为.SFV 的文本文件,这样可以任何时候可以将文件内容 CRC32 运算的结果
与 .SFV 文件中的值对比来确定此文件的完整性。 与 SFV 相关工具软件有很多, 如 MagicSFV
MooSFV 等。
CRC 最重要的特点是就是检错能力极强,开销小,易于用编码器及检测电路实现。从其检
错能力来看,它所不能发现的错误的几率仅为 0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因
而,在数据存储和数据通讯领域,CRC 无处不在:著名的通讯协议 X.25 的 FCS(帧检错序列)采用的是 CRC-CCITT,ARJ、LHA 等
压缩工具软件采用的是 CRC32,磁盘驱动器的读写采用了 CRC16,通用的图像存储格式 GIF、TIFF 等也都用 CRC 作为检错手段。

使用特权

评论回复
11
gejigeji521|  楼主 | 2016-7-12 20:02 | 只看该作者
CRC 校验的基本思想是利用线性编码理论,在发送端根据要传送的 k 位二进制码序列,以一定的规则产生一个校验用的监督码 r
位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和 CRC 码之间所遵循的规
则进行检验,以确定传送中是否出错。
16 位的 CRC 码产生的规则是先将要发送的二进制序列数左移 16 位后,再除以一个多项式,最后所得到的余数既是 CRC 码。
假设数据传输过程中需要发送 15 位的二进制信息 g=101001110100001,这串二进制码可表示为代数多项式 g(x) = x^14 +
x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中 g 中第 k 位的值,对应 g(x)中 x^k 的系数。将 g(x)乘以 x^m,即将 g 后加 m 个
0,然后除以 m 阶多项式 h(x),得到的(m-1)阶余项 r(x)对应的二进制码 r 就是 CRC 编码。
h(x)可以自由选择或者使用国际通行标准,一般按照 h(x)的阶数 m,将 CRC 算法称为 CRC-m,比如 CRC-32、CRC-64 等。国
际通行标准可以参看 http://en.wikipedia.org/wiki/Cyclic_redundancy_check
g(x)和 h(x)的除运算,可以通过 g 和 h 做 xor(异或)运算。比如将 11001 与 10101 做 xor 运算如下表 23.1.1。
表 23.1.1 g(x)与 h(x)异或运算结果
g 1 1 0 0 1
h 1 0 1 0 1
结果 0 1 1 0 0
明白了 xor 运算法则后,举一个例子使用 CRC-8 算法求 101001110100001 的校验码如下表 23.1.2。CRC-8 标准的 h(x) =
x^8 + x^7 + x^6 + x^4 + x^2 + 1,即 h 是 9 位的二进制串 111010101。
表 23.1.2 CRC-8 校验码的迭代运算过程

使用特权

评论回复
12
gejigeji521|  楼主 | 2016-7-12 20:03 | 只看该作者
g0
h
10100111010000100000000
111010101
g1
h
01001101110000100000000
111010101
g2
h
0111000100000100000000
111010101
g3
h
000010001000100000000
111010101

g4
h
01100010000000000
111010101
g5
h
0010111010000000
111010101
g6
h
01010000100000
111010101
g7
h
0100101110000
111010101

g8
h
011111011000
111010101
r 00010001100

经过迭代运算后,最终得到的 r 是 10001100,这就是 CRC 校验码

使用特权

评论回复
13
gejigeji521|  楼主 | 2016-7-12 20:05 | 只看该作者
标准
在国际标准中,根据生成多项式 G(x)的不同,CRC 又可分为以下几种标准:
CRC-8 码: G(x)=x^8+x^5+x^4+1
CRC-16 码: G(x)=x^16+x^15+x^2+1
CRC-CCITT 码: G(x)=x^16+x^12+x^5+1
CRC-32 码: G(x)=x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1
CRC-12 码通常用来传送 6bit 字符串。CRC-16 及 CRC-CCITT 码则用是来传送 8bit 字符,其中 CRC-16 为美国采用,而
CRC-CCITT 为欧洲国家所采用。CRC-32 码大都被采用在一种称为 Point-to-Point 的同步传输中。下面以最常用的 CRC-16 为例
来说明其生成过程。
CRC-16 码由两个字节构成,在开始时 CRC 寄存器的每一位都预置为 1,然后把 CRC 寄存器与 8-bit 的数据进行异或,之后对
CRC 寄存器从高到低进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移出 CRC 寄存器)如果为 1,则把寄
存器与预定义的多项式码进行异或,如果 LSB 为零,则无需进行异或。重复上述的由高至低的移位 8 次,第一个 8-bit 数据处理完
毕,用此时 CRC 寄存器的值与下一个 8bit 数据异或并进行如前一个数据相同的 8 次移位。所有的字符处理完成后 CRC 寄存器内的值
即为最终的 CRC 值。
 计算过程
1) 设置 CRC 寄存器,并给其赋值 FFFF(hex)。
2) 将数据的第一个 8 位字符与 16 位 CRC 寄存器的低 8 位进行异或,并把结果存入 CRC 寄存器。
3) CRC 寄存器向右移一位,MSB 补零,移出并检查 LSB。
4) 如果 LSB 为 0,重复第三步;若 LSB 为 1,CRC 寄存器与多项式码相异或。
5) 重复第 3 与第 4 步直到 8 次移位全部完成。此时一个 8-bit 数据处理完毕。
6) 重复第 2 至第 5 步直到所有数据全部处理完成。
7) 最终 CRC 寄存器的内容即为 CRC 值。
生成步骤
1) 将 x 的最高幂次为 R 的生成多项式 G(x)转换成对应的 R+1 位二进制数。
2) 将信息码左移 R 位,相当与对应的信息多项式 C(x)*2R。
3) 用生成多项式(二进制数)对信息码做模 2 除法,得到 R 位的余数。
4) 将余数拼到信息码左移后空出的位置,得到完整的 CRC 码。


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

2301

帖子

8

粉丝