检查 CRC 多项式的错误检测能力

Posted

技术标签:

【中文标题】检查 CRC 多项式的错误检测能力【英文标题】:Checking the error detection capabilities of CRC polynomials 【发布时间】:2016-12-27 03:56:12 【问题描述】:

我试图找出如何计算任意 CRC 多项式的错误检测能力。

我知道有多种错误检测功能可能(或可能不)适用于任意多项式:

    检测到单个位错误: 所有 CRC 都可以这样做,因为这只需要 CRC 宽度 >= 1。

    检测突发错误: 所有 CRC 都可以检测到大小等于其宽度的突发错误。

    检测奇数位错误: 具有偶数项的多项式(这意味着完整的二进制多项式中有偶数个 1 位)的 CRC 可以做到这一点。

    检测随机位错误(取决于帧大小): 我有一个现成的 C 算法,允许计算给定 HD 和多项式的最大帧大小。我没有完全理解它,但它确实有效。

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

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

上面说的对吗?

是否有额外的 CRC 错误检测功能?如果是,我如何检查(没有深厚的数学知识)任意 CRC 多项式是否支持它们?

【问题讨论】:

这个问题很有趣。对 cs.stackexchange.com 来说可能会更好 @Nayuki:你可能是对的。首先让我们看看这里发生了什么...... 【参考方案1】:

这个paper by Koopman and Chakravarty 着眼于 CRC 性能的几个度量,描述了许多多项式的度量和结果。简而言之,“好”多项式的定义取决于它所应用的消息的长度,这因应用而异。主要衡量标准是汉明距离,即为恢复相同的 CRC 必须更改的消息中的最小位数,以及在规定的低误码率下的性能。

【讨论】:

【参考方案2】:

g(x) = (x+l)*p(x) 的 n 位 CRC 可以检测到:

    长度小于或等于n的所有突发错误。

    影响奇数位的所有突发错误。

    所有长度等于 n + 1 的突发错误,概率为 (2^(n-1) - l)/2^n - 1

    所有长度大于 n + 1 的突发错误,概率为 (2^(n-1) - l)/2^n [CRC-32 多项式将检测所有长度大于 33 的突发错误,概率为 (2 ^32 - l)/2^32;这相当于99.99999998%的准确率]

【讨论】:

lg(x) 和概率公式中使用的是什么?它是最大或实际消息长度还是其他?

以上是关于检查 CRC 多项式的错误检测能力的主要内容,如果未能解决你的问题,请参考以下文章

CRC多项式转换二进制

计算机网络第六章——链路层

CRC校验的概念及具体实现

CRC校验

多项式如何转换二进制

crc32 — 计算一个字符串的 crc32 多项式?