CRC原理详解


1.1 什么是CRC校验?

CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

1.2.1 CRC校验原理

其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。

1.2.2 CRC原理介绍

1.2.2.1发送端

在发送端先将数据分组,每组k个数据。假定要传送的数据是M

在数据M后面添加供差错检测的n位冗余码,然后构成一帧发送出去,一共发送(k+n)位。 虽然添加n位冗余码增大了数据传送的开销,但是可以进行差错检测,当传输可能出现差错时,付出这种代价是值得的。

冗余码可以用下面的方法得出:

A用二进制模2运算进行2^n*M(相当于M左移n)的运算。意思就是在M后面补n0。现在M就变成了k+n位。

BM除以收发双方事先商定的长度为n+1的除数P

C得到的余数R,这个R就是FCS(帧检验序列)。将这个FCS序列加到M上然后发出去。

1.2.2.2接受端

A、在接受端把接受到的数据以帧为单位进行CRC校验

B、把收到的每一个帧都除以同样的除数P,然后检查余数R

C、如果余数R0,如果在传输过程中没有差错。

D、如果出现误码,那么余数R为零的概率是非常小的。

总结:在接收端对接收到的每一帧进行CRC检验后,若余数R为,则表示这个帧没有错,就接受。若R不为0,则判定这个帧出错,就丢弃。

1.3 2除法

2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。

例:M=101001,P=1101,n=3

在发送端:

①M=(2^n*M);

则:M=101001000

M除以P

得到余数R也就是FCS,将FCS加到M上,就得到了要发送的帧。

M=101001000+FCS=101001001

1.4 CRC校验码计算示例

现假设选择的CRC生成多项式为GX= X4 + X3 + 1,要求出二进制序列10110011CRC校验码。下面是具体的计算过程:

①将多项式转化为二进制序列,由GX= X4 + X3 + 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001

②多项式的位数位5,则在数据帧的后面加上5-10除数是n位,就加n-10,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。

③将计算出来的CRC校验码添加在原始帧的后面,真正的数据帧为101100110100,再把这个数据帧发送到接收端。

④接收端收到数据帧后,用上面选定的除数,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。

 

参考文献:

[3GPP TS 38.212] R15

https://blog.csdn.net/d_leo/article/details/73572373

https://blog.csdn.net/xinyuan510214/article/details/80104356


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM