汉明代码如何工作?

时间:2008-12-23 10:42:57

标签: communication hamming-code

传输数据时,汉明码显然允许您重新创建已损坏的数据(纠错码)。

这是如何工作的,如果有的话有什么限制?

是否有更好的纠错解决方案(与重传相对)?是否存在转播更好的情况?

6 个答案:

答案 0 :(得分:37)

让我们试着解释一下:

我们有一个3位数字。可能性可以表示为立方体,其中每个位表示轴。八个可能性就在角落里。

000 --------001
 | \         | \
 | 100---------101
 |  |        |  |
 |  |        |  |
010-|-------011 |
   \|          \|
   110---------111

每个缺陷(例如101被读为100)都会导致立方体上的一条线移位。

如果我们使用两位用于数据而第三位用于奇偶校验(例如偶数奇偶校验)。我们失去了4个数据点。但它的优势在于我们可以检测到单个位失败(将1的偶数转换为奇数1)。 奇数用*标记。我们看到每个奇数(错误传输)的单词都被偶数(正确传输)的单词逼入。因此,如果我们收到100,我们可以肯定它是错误的。

但是(单位失败)正确的表示可能是000,101或110.所以我们可以检测出错误但我们无法检测到错误:

 000 -------*001
  | \         | \
  |*100---------101
  |  |        |  |
  |  |        |  |
*010-|-------011 |
    \|          \|
    110--------*111

这称为一位错误检测代码。

如果我们使用另一位进行检查,则删除一个数据。我们留下了1个数据位和2个“校验位”。 在这种情况下,假设000和111是有效数据表示而其他六个不是。现在我们有一个有趣的情况,如果在运输过程中一个位被破坏。 如果我们发送000并接收010,我们看到010有一个有效的邻居(000)和两个无效的邻居(110和011)。所以现在我们知道我们打算发送000并且能够纠正:

 000 -------*001
  | \         | \
  |*100--------*101
  |  |        |  |
  |  |        |  |
*010-|------*011 |
    \|          \|
   *110---------111

这称为一位纠错码。

请注意,一位纠错码也是一个两位错误检测码。

更普遍地说。

如果你有n个校验位,你有一个n位错误检测代码。 如果你有2n个校验位,你就有一个n位纠错码。

当然,您应该订购“有效”代码,以便它们不会相互接壤。

答案 1 :(得分:13)

这是真正的高级概述。

Suppose that every time I send a message, I send thrie copies of the text.
Suppose that every time I send z message, I send three copies of the teyt.
Suppose that every tyme I send a message, I send three copies if the tezt.

通过比较字符并在每个位置进行简单多数投票,您可以纠正单个错误字符。然而,这种方案的成本(必须发送的数据量)很高,并且它不会捕获不同副本的相应位置中两个错误的不太可能但可能的情况(如上面例子的最后一个字。)

汉明码(以及其他类型的纠错码,如Reed-Solomon)基于计算额外数据的公式(而不是简单的复制)。添加的位取决于数据位的组合,其方式是,当在接收端重复计算时,复制中的错误会产生可检测的变化模式。

为了便于说明,让我们从简单的奇数奇偶校验开始,添加一个位以确保消息中的总位数是奇数。因此,消息10110110变为101101100(五个1,不需要额外的1),消息10010110变为100101101(四个1,需要额外1个)。如果您收到101101101的消息,并且看到有6个1,则表示存在错误,但不知道在哪里。假设我们添加了更多的奇偶校验位,每个奇偶校验位仅依赖于消息的部分,如下所示,通过复制所考虑的位并使用' - '忽略位:

10110110
1-1-0-1- => 0
-0-1-1-0 =>  1
10--01-- =>   1
--11--10 =>    0
1011---- =>     0
----0110 =>      1

所以完整的消息是10110110011001。现在假设传输错误改变了消息中的第三位,因此它读取10010110011001。当接收器重新运行错误检查计算时,它无法匹配:

10010110
1-0-0-1- => 1*
-0-1-1-0 =>  1
10--01-- =>   1
--01--10 =>    1*
1001---- =>     1*
----0110 =>      1

且无法匹配的校验位正是受第三个数据位影响的校验位。这是一种真实,强大的纠错方案;它只是一个草图,用于说明冗余构建如何帮助确定错误的确切性质。

答案 2 :(得分:5)

您会找到有关其工作方式的详细信息here

有关错误核心代码的更多常规信息,请here

答案 3 :(得分:3)

有关汉明代码的信息可用herehere

至于适用性,this解释了原因:

  1. 像Hamming这样的纠错码适用于不能请求重传的单工通道。

  2. 错误检测和重传通常是首选,因为它更有效。

  3. 为了进行比较,请考虑具有每位错误率的通道。设块大小为1000位。

    要纠正单个错误(通过汉明码),每个块需要10个校验位。要传输1000个块,需要10,000个校验位(开销)。 要检测单个错误,每个块的单个奇偶校验位就足够了。为了传输1000个块,只需要重传一个exter块(由于每比特的错误率),仅产生2001(= 1000 + 1001)比特的开销。

答案 4 :(得分:0)

汉明码是一种数学技巧,用于纠正串行传输中最多4个丢失的位。它也被用于支持现代存储芯片中的“奇偶校验位”。

限制在于可以恢复的位数,不超过4.如果丢失的位数超过4位,则需要重新传输。

不同的情况需要不同的纠错技术。其中一些技术列在这里的其他帖子中。

答案 5 :(得分:0)

@GameCat以及2位错误检测代码。

在这种情况下,假设111已更改为100.然后我们可以确定有2位错误,我们知道这是因为111和100之间的距离是2位,000和100的距离是1位。因此,如果我们知道存在2位错误,我们可以确定什么是正确的值。