哪一个是更好的CRC方案



假设我必须对大约120位长的消息进行错误检查。我有两个校验和方案的替代方案:

  1. 将消息拆分为5个24位字符串,并在每个字符串上附加一个CRC8字段

  2. 用CRC32字段附加整个消息

哪种方案的错误检测概率更高,为什么?让我们假设没有关于错误模式分布的先验知识。


更新:

如果系统具有自然故障模式,即接收的清除位而不是设置位(即"1"是Tx-ed,但"0"是Rx-ed),而没有发生相反的情况,该怎么办?

在这种情况下,假设有效数据具有"0"s和"1"s的均匀分布,则错误位的长突发的概率要小得多,因此最长突发将由消息中最长的"1"秒字符串绑定。

您必须对错误模式做出一些假设。如果在所有可能的错误上有一个均匀的分布,那么五个8位CRC将检测到比一个32位CRC更多的错误,因为前者有40位冗余。

然而,我可以构建许多欺骗8位CRC的24位错误模式,并使用其中五个模式的任意组合来在所有8位CRC上都不会出现错误。然而,几乎所有这些都将被32位CRC捕获。

Philip Koopman的一篇好论文对几个CRC进行了评估,主要集中在它们的汉明距离上。正如Mark Adler所指出的,错误分布在CRC选择中起着重要作用(例如,突发错误检测是CRC的可变特性之一),CRC数据的长度也是如此。

CRC的汉明距离表示数据中100%可检测的最大错误数。

参考: 嵌入式网络的循环冗余码(CRC)多项式选择:https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.5.5027&rep=rep1&type=pdf

8位与32位CRC

例如,0x97 8位CRC多项式具有高达119位的HD=4数据字(比您所需的24位字多),这意味着它可以100%检测长度为119位或以下的数据的4位(或以下)错误。

在32位侧,32位CRC 0x9d7f97d6提供高达223位(大于5*24=120位)的HD=9数据字。这意味着它将检测到由223位或更少组成的数据的9位(或更少)错误中的100%。

理论上,5x 8位CRC能够100%检测到5个块中4*4=16个均匀分布的位翻转(每个24位块有4个错误)。另一方面,32位CRC将只能100%检测到每120位块的9位翻转。

错误分布

知道了所有这些,唯一缺少的就是错误分布模式。有了它,您将能够对使用的最佳CRC方法做出明智的决定。你似乎说长时间的错误是不可能的,但没有提到确切的最大长度。如果这个长度真的达到了9位,那么CRC32可能会更好。如果你期望偶尔,<4位错误,两者都可以,尽管5x8位将消耗更多带宽(40位而不是32位)。如果是这种情况,32位CRC甚至可能被高估,较小的CRC16甚至CRC9可以提供足够的检测能力。

在hamming窗口之外,CRC将无法捕获所有可能的错误。数据长度越大,CRC性能就越差。

当然是CRC32。它将检测五个段之间的排序错误,并为您提供224的错误检测。

相关内容

  • 没有找到相关文章

最新更新