CRC校验和如何确定出现错误的位置?

3
我知道如何计算CRC校验和,也知道CRC校验和可以检测k-1位错误(k是校验和的长度)。但我想知道的是校验和如何幸运地成为错误位的位置。
我知道海明码;海明码的设计是使“校验和”给出错误的位置。然而,我没有看到任何解释为什么CRC校验和给出错误位位置的帖子。
我阅读了this;它解释说“为了证明接收器可以纠正此错误,我们只需要证明残差可以与任何其他不同的单比特错误区分开来。”
这证明了我们可以将残差映射到位错误的位置,但并没有解释为什么它恰好是自然顺序。通过自然顺序,我指的是10表示位置2,11表示位置3。

维基百科 似乎没有解释这个问题,著名的 CRC错误检测算法无痛指南 也不起作用。

有人能解释或提供一些参考资料吗?


1
“工程师的错误编码手册”是我使用过的一本教材,作者是A.D. Houghton。但是请准备好理解一些不那么简单的数学知识,以便找到您正在寻找的答案。 - laune
这并不是那么简单的:有些循环冗余校验码可以检测到这个问题,而其他一些则可以检测到那个问题,有些允许在一定范围内进行恢复。此外,数据的长度受到CRC宽度的限制。 - laune
2个回答

2

@jwodder感谢您让我的帖子更易读。 @Plo_Koon感谢您提供这么多相关信息,但我担心您没有回答我的问题:为什么CRC的余数(或剩余)可以指示错误位的位置。 @laune谢谢您分享参考资料。

我继续搜索并看到《黑客的乐趣》中的CRC章节,看到了一个参考文献,于是我找到了Andrew S. Tanenbaum的《计算机网络》第5版,SEC. 3.2 ERROR DETECTION AND CORRECTION,然后我恍然大悟。

我在这里发布我的理解,希望能帮助那些不明白为什么CRC余数可以指示单个位错误位置的人。

让我们假设正确的消息应该接收为T(x),而我们实际接收到的是T(x)+E(x)。 E(x)中每个1位对应一个被反转的位。然后我们将其除以G(x)(生成器),也就是说,我们计算

[T(x) + E(x)]/G(x)

T(x)/G(x) 等于 0,因此我们得到的残差是 E(x)/G(x)

如果 G(x) 包含两个或更多项(可能是 @laune 提到的“某些允许恢复(在限制范围内)”),那么它将无法被 E(x) 整除。

这就是为什么在进行 CRC 计算时,我们会得到恰好在残余项中的位置!


0
在检测或纠正错误的过程中,冗余是一个核心概念。为了能够检测或纠正错误,我们需要在数据中发送一些额外的比特位。这些冗余比特位由发送端添加,并由接收端去除。它们的存在可以让接收端检测或纠正损坏的比特位。在传输中包含额外信息以进行错误检测的概念是一个很好的方法。但是,与其重复整个数据流,我们可以在每个单元的末尾附加一个较短的比特位组。这种技术被称为冗余,因为额外的比特位对于信息来说是多余的:一旦确定了传输的准确性,它们就会被丢弃。
图8显示了使用冗余比特位来检查数据单元准确性的过程。一旦生成数据流,它经过一个设备进行分析,并添加一个适当编码的冗余检查。现在扩大了数个比特位的数据单元通过链路传输到接收端。接收端通过一个检查函数对整个流进行检查。如果接收到的流满足检查标准,则接受数据单元的数据部分,并丢弃冗余比特位。 循环冗余校验(CRC) 最强大的冗余检查技术是循环冗余校验(CRC)。CRC基于多项式算术,特别是在GF(2)(具有两个元素的伽罗瓦域)中计算将一个多项式除以另一个的余数。与基于加法的奇偶校验不同,CRC基于二进制除法。在CRC中,不是通过添加位来实现所需的奇偶校验,而是将一系列冗余位(称为CRC或CRC余数)附加到数据单元的末尾,使得生成的数据单元恰好可以被第二个预定的二进制数整除。在目的地处,传入的数据单元被同样的数字除以。如果在此步骤中没有余数,则认为数据单元完好无损,因此被接受。余数表示数据单元在传输过程中已经损坏,因此必须被拒绝。CRC使用的冗余位是通过将数据单元除以预定的除数来派生的;余数即为CRC。为了有效,CRC必须具备两个特点:它必须比除数少一个位,并将其附加到数据字符串的末尾必须使得生成的位序列恰好可以被除数整除。CRC错误检测的理论和应用都很简单。唯一的复杂性在于推导CRC。

CRC的性能

CRC是一种非常有效的错误检测方法。如果按照先前提到的规则选择除数,则: 1.CRC可以检测影响奇数位的所有突发错误。 2.CRC可以检测所有长度小于或等于多项式次数的突发错误。 3.CRC可以以非常高的概率检测长度大于多项式次数的突发错误。

错误的纠正

纠错比检测更困难。 在错误检测中,我们只是查看是否发生了任何错误。答案是简单的是或否。我们甚至不关心错误的数量。对于我们来说,单比特错误与突发错误相同。在错误纠正中,我们需要知道已损坏的位数以及更重要的是它们在消息中的位置。错误的数量和消息的大小是重要因素。如果我们需要在8位数据单元中纠正一个错误,则需要考虑八个可能的错误位置;如果我们需要在相同大小的数据单元中纠正两个错误,则需要考虑28种可能性。您可以想象接收器在1000位数据单元中查找10个错误时的困难。

为了计算纠错码所需的冗余位数r,以纠正给定数量的数据位m,我们必须找到mr之间的关系。使用m位数据和添加到它们的r位冗余,生成代码的长度为m + r。如果可传输单元中的总位数为m + r,则r必须能够指示至少m+r+1个不同状态。其中一个状态表示无误差,m + r个状态表示每个m + r位置上的错误位置。

因此,r位必须能够发现m+r+1个状态:而r位可以指示2^r个不同状态。因此,2^r必须等于或大于m+r+1

2^r=>m+r+1

例如,如果m的值为7(如7位ASCII码),可以满足此方程的最小r值为4:
2^4=>7+4+1
海明码
海明提供了一个实用的解决方案。海明码可应用于任何长度的数据单元,并使用上述数据和冗余位之间的关系。例如,7位ASCII码需要4个冗余位,可以将其添加到数据单元的末尾或与原始数据位交错。在图17中,这些位被放置在位置1、2、4和8(11位序列中是2的幂次位置)。

请点击以下链接查看信息和示例(所有以上信息都来自一个链接): 1, 2, 3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接