0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CRC校验快速算法的原理及实现改进设计

电子设计 来源:单片机与嵌入式系统应用 作者:刘小汇 , 王飞雪 2020-09-14 17:42 次阅读

CRC(循环冗余校验码)编码是数字信号传输中用得较普遍的一种差错控制编码。它不但可以用于纠正独立的随机错误,也可以用于纠正突发错误。CRC校验通常是靠专用硬件电路来实现的,但很多系统为了降低成本,常常利用单片机微处理器编程来完成这一功能。因此,在器件处理能力有限的情况下,如何提高CRC 校验软件计算的速度,是开发者最为关心的问题。

1 整字节序列的CRC校验快速算法

文献[1]提出了一种针对整字节的CRC快速算法。它的基本思想是预先生成一个余式表,通过查表,利用递推原理进行快速计算。现以 CCITT(国际电话电报咨询委员会)建议的,用于基本型数据传输规程的生成多项式为例,简要介绍此先验算法的基本原理。

设M为由i个字节组成的8×i位二进制序列,用字节形式表示为

截取Mi的前个字节构成一个序列,即

这两个序列之间的关系可以表示为

其中是字节的二进制多项式表示形式,是将序列左移一个字节。

对于序列来说,有

其中,是商多项式,为一整数项;为最高次幂小于15的余数项。而对于Mi序列,

其中为整数项,因此对多项式取余即等效于对多项式取余,记做

这样就形成了递推关系。对于序列,已知就可知,已知就可知,最后就变成了求三字节序列的余式项的问题。

不失一般性,设三字节序列 ,那么

我们可以预先做好一个16×16的[a00]形式的余式表,通过查余式表可以很快知道,而是小于等于16位的二字节序列,除以的余式即为本身。(4)式中的加法运算为模2加(异或运算)。运用此算法就可很快求出整字节的CRC校验码。

2 任意长度序列的CRC校验快速算法

上述算法,只适用于信息长度为整字节的情形;但在实际应用中,往往会遇到计算非整字节的CRC校验码。一种解决方法是,在信息数据前补零,即将信息数据右移,使之成为整字节来计算,这对于信息数据序列不长的情况还是奏效的;但遇到长数据序列,若对每一个字节均进行移位操作,则计算量明显增加,这一缺点对于实时性要求高的系统来说尤其明显。下面以生成多项式为例,提出一种改进算法,可实现任意长度序列快速CRC校验运算。

设D为任意长度的二进制序列,记长度为k位,则k总可以表示成的形式。其中s≥0,且0≤p<8。这样,就可以将序列D按降幂形式写成 D(x)=xp[d1d2……ds-1ds]+m(x),dj(1≤j≤s)是位长为8的字节,m为序列D除掉整字节后余下的位,为非整字节。记序列 M(x)=[d1d2……ds-1ds],那么

M(x)为整字节序列,其余式RM(x)可用前面介绍的整字节CRC算法求出。因为生成多项式G(x)=x16+x12+x5+1的最高次幂为 16,所以序列D(x)的余式RD(x)为

其中 ,即形成两个余式的模2加(异或运算),m(x)的长度小于1字节,所以RM(x)是[a00]形式的余式,通过查余式表可以很快得到。

现在来讨论xpRM(x)的计算。RM(x)可以按照上述整字节的快速算法算出结果。因为RM(x)的位长为16,xpRM(x)相当于 RM(x)向左移p位,位长为(16+p)。

因为 0≤p<8

所以 16≤(16+p)<24

xpRM(x)可以看成一个3字节序列,定义

其中是2字节序列,长16位,小于生成多项式17位。它们除以生成多项式的余式即为本身,所以

是为样式的余式,可以由余式表直接获得,所以(1)式又可写为

这就是改进后的非整字节CRC校验快速算法。它不需要进行大量的数据移位对齐,比起整字节的算法,只增加了两次查表和两次异或运算,可见其运算量并没有显著增加。

值得提出的是,在文献[1]提出的整字节CRC校验快速算法中,推导递推公式(3)时,作者并没有考虑到序列用于计算CRC校验码时要先移16 位(生成多项式为时)。若读者按照此法,直接用序列来做运算,显然是不对的,必将导致错误结果。

3 适用于单片机或微处理器的算法流程

为了编程方便,我们将需处理的信息序列做以下变形。重写(4)式,在整字节部分的M(x)后补2字节的“0”,得到新数列

其中,用取代M(x)做编程计算,算法流程如图1所示。

图1 算法流程图

结语

任意长度非整字节的CRC快速算法适用的范围很广,只需预先在内存中生成一个余式表,通过查余式表就可以快速计算。由于算法的每一步递推都是以字节为单位的,这样就比传统的以位为单位的算法要快上十几倍。数据序列的长度越长,其体现的优越性就越高。而且算法不要求用于计算的序列为整字节,任意位长均适用,在实际应用中效果显著。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620825
  • 微处理器
    +关注

    关注

    11

    文章

    2131

    浏览量

    81411
收藏 人收藏

    评论

    相关推荐

    CRC校验算法的研究与实现

    CRC校验算法的研究与实现
    发表于 08-06 11:09

    人脸检测算法及新的快速算法

    人脸检测算法及新的快速算法人脸识别设备凭借着便捷的应用,以及更加新潮的技术,俘获了不少人的好感。于是,它的应用也在日益的变得更加的广泛。由中国电子学会主办的全国图形图像技术应用大会,行业专家将介绍
    发表于 09-26 15:13

    转:循环冗余校验CRC算法入门引导

    写给嵌入式程序员的循环冗余校验CRC算法入门引导前言CRC校验(循环冗余校验)是数据通讯中最
    发表于 08-01 18:32

    如何提高CRC校验软件计算的速度?

    整字节序列的CRC校验快速算法是什么?任意长度序列的CRC校验快速算法是什么?适用于单片机或微处
    发表于 04-27 06:50

    基于iSCSI协议校验算法改进

    CRC 校验作为iSCSI 协议中使用最频繁的一种检错机制,其算法的优劣会直接影响协议的执行效率。文章在分析传统CRC算法低效率的基础上,引
    发表于 11-08 16:45 12次下载

    简单实用的单片机CRC快速算法

    摘要:提供两个实用的、能够在单片机上通过软件来实现CRC快速算法,其中一个适用于51系列等单片机,另一个适用于PIC单片机,这两种算法十分简单快捷。
    发表于 09-09 17:52 33次下载

    C51实现单片机CRC快速算法

    摘要:本文介绍了CRC的基本原理和计算方法,给出了利用C51实现单片机CRC快速算法关键字:CRC;C51;单片机;
    发表于 09-10 11:14 48次下载

    LTE系统的CRC校验算法及DSP实现

    通过对两种常用CRC校验算法的研究分析,为TD-LTE测试仪表系统选择了一种最优的CRC校验算法,并在TMS320C64xDSP中实现。将
    发表于 02-23 14:58 30次下载

    简单实用的单片机CRC快速算法

    本文提供两个实用的、能够在单片机上通过软件来实现CRC快速算法
    发表于 03-22 16:40 3次下载

    16位CRC校验原理与算法分析

    16位CRC校验原理与算法分析,感兴趣的小伙伴们可以看看。
    发表于 10-10 14:55 10次下载

    一种改进的增维型双边滤波的快速算法

    一种改进的增维型双边滤波的快速算法_李俊峰
    发表于 01-07 16:00 0次下载

    基于查表的无乘法DCT快速算法 Jpeg压缩算法中的DCT快速算法

    基于查表的无乘法DCT快速算法 Jpeg压缩算法中的DCT快速算法
    发表于 09-18 09:47 14次下载
    基于查表的无乘法DCT<b class='flag-5'>快速算法</b> Jpeg压缩<b class='flag-5'>算法</b>中的DCT<b class='flag-5'>快速算法</b>

    一种基于矩阵的并行CRC校验算法

    针对高速网络通信中高位宽并行数据的实时校验需求,提出了一种可单周期实现的、面向128位并行数据的循环冗余校验算法(Cyclic Redundancy Check,CRC )。该
    发表于 10-30 16:39 3次下载
    一种基于矩阵的并行<b class='flag-5'>CRC</b><b class='flag-5'>校验算法</b>

    CRC校验算法原理及c语言实现

    CRC校验算法原理及c语言实现
    发表于 11-30 10:04 9次下载

    CRC校验原理及实现

    作者:王超首发:电子电路开发学习目录前言CRC算法简介CRC计算CRC校验CRC计算的C语言
    发表于 01-26 17:37 28次下载
    <b class='flag-5'>CRC</b><b class='flag-5'>校验</b>原理及<b class='flag-5'>实现</b>