通过CRC的单比特错误检测(循环冗余校验)

时间:2018-12-29 12:35:18

标签: networking crc data-link-layer

我正在研究与基于CRC生成器的单位错误检测有关的一些问题,并试图分析哪个生成器检测到单位错误,而哪些未检测到。

假设,如果我有一个CRC生成多项式,如x 4 + x 2 。现在,我想知道是否保证检测到一位错误?

根据参考文献12,我总结了以下几点:-

1)如果误差多项式x k 的k = 1,2,3,则余数将为x,x 2 ,x 3 在分别用生成多项式x 4 + x 2 进行多项式除法的情况下,并根据参考,如果生成项具有多个项且x 的系数0 为1,则可以捕获所有单位错误。但是,这并不是说如果x 0 的系数不为1,则无法检测到单个位错误。据说“在循环代码中,无法捕获那些可以被g(x)整除的e(x)错误。”

2)我必须检查E(x)/ g(x)的其余部分,其中E(x)(假设它是x k ),其中k = 1,2,3 ,...是误差多项式,g(x)是生成多项式。如果余数为零,那么我将无法检测到错误;当余数为非零时,我将可以检测到错误。

所以,据我所知,生成多项式x 4 + x 2 保证了基于上述两点的单位错误检测。请确认我是否正确与否。

1 个答案:

答案 0 :(得分:2)

  

如果x 0 的系数不为1,则无法检测到单个错误?

如果x 0 的系数不为1,则与将CRC多项式左移1(或更多)位(乘以x的某个幂)相同。将CRC多项式向左移1个或更多位不会影响它检测错误的能力,它只会在代码字的末尾附加1个或多个零位。

  

生成多项式x 4 + x 2 保证检测到单位错误

正确。 x 4 + x 2 是x 2 + 1左移两位,x 4 + x 2 =(x 2 )(x 2 + 1)=(x 2 )(x +1)(x + 1),并且由于x 2 +1可以检测到任何一位错误,因此x 4 + x 2 也可以。同样,在(x +1)项(其中两个)中,它添加了偶数奇偶校验,并且可以检测到任何奇数个误码。


通常,所有CRC多项式都可以检测单个位错误,而与消息长度无关。所有CRC多项式都有一个“周期”周期:如果使用CRC多项式作为Linear Feedback Shift Register的基础,且初始值为000 ... 0001,则在经过固定的循环次数后,它将循环返回到000 ... 0001。 CRC的最简单失败是出现2位错误,其中2位之间的距离等于循环周期。假设8位CRC(9位多项式)的周期为255,则2位错误(一位在[0]处,一位在[255])将导致CRC = 0,并且无法检测到,不会发生单个位错误,它将继续经历所有周期,其中一个周期都不包含值0。如果周期为n个周期,则如果消息中的位数达到2个位,则不会出错+ CRC <= n。所有CRC多项式都是任意多项式时间(x +1)的乘积,可以检测到任何奇数个误码(因为x +1本质上增加了偶校验)。


将CRC多项式向左移z位意味着每个码字将具有z尾随零位。在某些情况下会这样做。假设您有一个快速的32位CRC算法。若要将该算法用于16位CRC,则将17位CRC多项式向左移16位,以便最低有效非零项为x 16 。使用32位CRC算法进行计算后,会将32位CRC右移16位以产生16位CRC。