首页 > 解决方案 > CRC 方法无法检测到哪些错误?

问题描述

让我们假设一个 16 位 CRC 多项式 x¹⁶+x¹²+x⁵+1 = 0x11021。该多项式可以:

  1. 检测所有单位错误(与数据大小无关)。
  2. 检测所有高达 16 位宽度的突发错误(与数据大小无关)。
  3. 检测所有奇数位错误(因为它有 4 个多项式项;与数据大小无关)。
  4. 检测高达 32571 位数据大小的 3 位错误 (HD4)。

考虑到以上几点是对的......CRC无法检测到什么样的错误。?

标签: crc

解决方案


  1. 这应该是检测所有最多 16 位的单个突发错误。

  2. 0x11021 是 2 个“素数”多项式 0xf01f 和 0x3 的乘积。0x3 因素是检测所有奇数位错误的原因(它是奇偶校验因素)。

  3. 由于检测到所有奇数位错误,因此该语句变为检测所有 2 位错误,最大数据大小为 32751 位或消息大小为 32767 位,其中包括附加到数据位的 16 位 CRC。对于蛮力方法,使用除第一位是一位之外的所有零位的位串,然后计算该串上​​的 CRC,直到 CRC 只有一个位作为最高有效位。这可以通过从 0x8000 的 CRC 开始并循环它直到它再次循环回到 0x8000 来模拟,这将需要 32767 个循环。因此,如果 bit[0] 和 bit[32768] == 1(所有其他位 == 0),则计算出的 CRC 将为零,即无法检测到 2 个错误位。

CRC 无法检测到哪些错误?

多个突发错误,其中突发的总距离跨越超过 16 位,本质上是一个长度超过 16 位的单个突发错误。

4 个或更多随机分布的误码的某些模式将无法被检测到。如下表所示,未检测到错误的可能性相当低。随着误码数量的增加,故障率会增加,但除非您有很多误码,否则它仍然很低。随机位模式将通过 CRC16 检查大约 1/65536 的时间,但这在正常的消息发送/接收序列中是不寻常的。

48 bit data, 16 bit crc, => 64 bit message
2^64 - 1 possible error patterns
       84 of        635376 possible patterns of  4 error bits fail
     2430 of      74974368 possible patterns of  6 error bits fail
   133001 of    4426165368 possible patterns of  8 error bits fail
  4621021 of  151473214816 possible patterns of 10 error bits fail   
100246083 of 3284214703056 possible patterns of 12 error bits fail

推荐阅读