【问题标题】:How can the CRC checksum give the position where the error occured?CRC校验和如何给出错误发生的位置?
【发布时间】:2014-09-10 21:33:32
【问题描述】:

我知道如何计算 CRC 校验和,并且我知道 CRC 校验和可以检测 k-1 位错误(k 是校验和的长度)。但我很好奇的是校验和怎么能这么幸运地成为错误位的位置。

我知道汉明码;汉明码的设计是为了让“校验和”给出错误的位置。然而我还没有看到任何解释为什么 CRC 校验和给出错误位位置的帖子。

我读过this; 它解释说“为了证明接收器可以纠正这个错误,我们只 必须证明可以将残差与任何其他明显的单比特错误区分开来。”

这证明我们可以将残差映射到误码位置,但不能解释为什么它恰好是自然顺序。自然顺序我的意思是10表示位置2,11表示位置3。

Wikipedia 似乎没有解释这一点,著名的A Painless Guide to CRC Error Detection Algorithms 也没有做到这一点。

谁能解释或提供一些参考资料?

【问题讨论】:

  • “工程师的错误编码手册”/A.D. Houghton 是我使用的一本教科书。但是要准备好被要求理解一些不那么简单的数学才能找到你正在寻找的答案。
  • 事情没那么简单:一些 CRC 可以检测到这一点,另一些可以检测到那个,有些允许恢复(在限制范围内)。此外,数据的长度受 CRC 宽度的限制。

标签: algorithm crc


【解决方案1】:

检测或纠正错误的核心概念是 冗余。为了能够检测或纠正错误,我们需要 用我们的数据发送一些额外的位。这些冗余位 由发送方添加,由接收方删除。他们的 存在允许接收器检测或纠正损坏的 位。包含额外信息的概念 用于错误检测的传输是一个很好的选择。但不是 重复整个数据流,一组较短的位 可以附加到每个单元的末尾。这种技术是 称为冗余,因为额外的位是冗余的 信息:一旦准确,它们就会被丢弃 的传输已确定。 图 8 显示了使用冗余位的过程 检查数据单元的准确性。一旦数据流有 生成后,它通过一个分析它的设备 并添加适当编码的冗余检查。这 数据单元,现在被多次点击放大,通过链路传输到接收器。接收器将整个流通过 一个检查功能。如果接收到的命中流通过 检查标准,数据单元的数据部分是 接受并丢弃冗余位。

循环冗余校验 (CRC)

最强大的冗余检查 技术是循环冗余校验(CRC)。 CRC 基于多项式算术,特别是基于计算 在 GF(2) 中除以一个多项式的余数(具有两个元素的伽罗瓦域) 由另一个。 与基于加法的奇偶校验不同。 CRC是基于 二进制除法。在 CRC 中,而不是添加位来实现 所需的奇偶校验,冗余位序列,称为 CRC 或 CRC 余数,附加到数据单元的末尾 这样得到的数据单元就可以完全被a整除 第二,预定的二进制数。在其目的地, 传入的数据单元除以相同的数字。如果此时 步骤没有剩余的数据单元被假定为 完好无损,因此被接受。余数表明 数据单元在运输过程中被损坏,因此 必须被拒绝。 CRC使用的冗余位是通过除法得出的 数据单元由一个预定的除数;剩下的是 CRC。为了有效,CRC 必须具有两个品质: 它必须 比除数少一位,并附加它 到数据字符串的末尾必须使结果位 序列完全可以被除数整除。 CRC错误的理论与应用 检测很简单。唯一的复杂性在于 导出 CRC。

CRC 的性能

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

更正错误

纠错比检测更难。 在错误检测中,我们只查看是否有任何错误 已经发生了。答案很简单,是或否。我们不是 甚至对错误的数量感兴趣。单位错误是 对我们来说和突发错误一样。在纠错中,我们 需要知道损坏的确切位数 更重要的是,它们在消息中的位置。这 错误的数量和消息的大小是 重要因素。如果我们需要纠正一个错误 一个 8 位数据单元,我们需要考虑 8 个可能的错误 地点;如果我们需要纠正一个数据单元中的两个错误 同样大小,我们需要考虑28种可能性。你可以 想象一下接收者很难在数据中找到 10 个错误 单位为 1000 位。

计算冗余位数r需要 更正给定数量的数据位m。我们必须找到一个 mr 之间的关系。带有m 位数据和r 位 添加到它们的冗余,结果的长度 代码是m + r。如果传输表中的总位数 单位是m + r。那么r 必须至少能够表明 m+r+1 不同的状态。其中,一种状态意味着没有错误, 和m + r 状态指示每个错误的位置 m + r 的位置。

所以m+r+1 状态必须可以被r bits: 和r 发现 位可以指示2^r 不同的状态。因此2^r 必须是 等于或大于m+r+1

2^r=>m+r+1

例如,如果 m 的值为 7(如 7 位 ASCII 代码),可以满足这个方程的最小r值是 4:

2^4=>7+4+1

汉明码

Hamming 提供了一个实用的解决方案。汉明码 可以应用于任何长度的数据单元,并使用 讨论的数据和冗余位之间的关系 更多。例如,一个 7 位的 ASCII 码需要 4 可以在数据末尾添加 10 的冗余位 单元或穿插原始数据位。在图 17 中, 这些位被放置在位置 1、2、4 和 8( 2 次幂的 11 位序列中的位置。

有关信息和示例,请参阅此链接(以上所有信息均来自 1 个链接): 1, 2, 3.

【讨论】:

    【解决方案2】:

    @jwodder 感谢您让我的帖子更具可读性。 @Plo_Koon 感谢提供这么多相关信息,但恐怕你没有回答我的问题:为什么CRC的残差(或提醒)可以指示错误位的位置。 @laune 感谢您分享参考资料。

    我继续搜索并看到 CRC chapter of hacker's delight 并看到了一个参考,所以我找到了 Tanenbaum, Andrew S. Computer Networks 5th edition,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 计算时会准确地得到残差中的位置!

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2018-09-20
      • 1970-01-01
      • 2010-11-22
      • 2014-05-11
      • 2020-08-19
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      相关资源
      最近更新 更多