如何使用汉明码纠正消息

时间:2009-04-16 18:20:58

标签: error-correction hamming-code

所以我想在今年夏天的项目中使用汉明码来纠正消息传输中的错误,但我无法弄清楚它是如何工作的。我在网上看了很多文章,但我真的不懂算法。任何人都可以用简单的方式解释它吗?

感谢。

3 个答案:

答案 0 :(得分:9)

关于Hamming distance

两个base-2值之间的汉明距离是它们不同的位数。因此,如果您发送A,但我收到B,则必须在传输中切换的位数是A和B之间的汉明距离。

当每个代码字中的位以某种方式单独传输时,汉明码很有用。我们不关心它们是串行还是并行,但它们不会组合成代表几位的模拟值,或者在编码后压缩/加密。

因此,每个比特是独立的(随机地以一些固定的概率),正确接收或翻转。假设传输相当可靠,则正确接收大多数位。因此,更有可能出现少量比特中的错误,并且不可能在大量比特中同时出现错误。

因此,汉明码通常旨在纠正1位错误,和/或检测2位错误(有关两种主要类型的详细信息,请参阅维基百科文章)。可以构建纠正/检测更大错误的代码,但AFAIK的使用不会那么多。

代码通过均匀地间隔“汉明空间”中的代码点来工作,在数学术语中,代码点是由相关字大小的所有值组成的度量空间,其中汉明距离作为度量。想象一下,每个代码点都被一些无效值的“缓冲区”所包围。如果收到的值不是代码点,则必须发生错误,因为只传输有效的代码点。

如果接收到缓冲区中的值,那么假设发生了1位错误,则传输的值必须与接收到的值相距1。但由于代码点是分散的,因此只有一个代码点可以关闭。因此它被“纠正”到该代码点,理由是1位错误比任何其他代码点产生接收值所需的更大错误更可能。在概率方面,您发送附近代码点的条件概率大于您发送任何其他代码点的条件概率,因为我收到了我所做的值。所以我猜你根据传输的可靠性和每个字的位数,发送了附近的信息。

如果收到的无效值与两个代码点等距,那么我不能说一个比另一个更可能是真值。所以我发现错误,但我无法纠正错误。

显然,SECDED汉明码不会纠正3位错误。接收到的值远离实际发送的值,而不是某个其他代码点,并且我错误地将其“纠正”为错误的值。因此,您需要足够可靠的传输而不关心它们,否则您也需要更高级别的错误检测(例如,整个消息的CRC)。

答案 1 :(得分:2)

具体来自Wikipedia,算法如下:

  1. 从1开始的位数:位1,2,3,4,5等
  2. 以二进制形式写入位数。 1,10,11,100,101等
  3. 所有位为2的幂位(在其位置的二进制形式中只有1位)是奇偶校验位。
  4. 所有其他位位置,其位置的二进制形式有两位或更多位,是数据位。
  5. 每个数据位包含在2个或更多奇偶校验位的唯一集合中,由其位位置的二进制形式确定。
    1. 奇偶校验位1覆盖所有位设置最低位的位:位1(奇偶校验位本身),3,5,7,9等。
    2. 奇偶校验位2覆盖所有具有第二个最低有效位的位位置:位2(奇偶校验位本身),3,6,7,10,11等。
    3. 奇偶校验位4覆盖所有具有第三个最低有效位的位位置:位4-7,12-15,20-23等。
    4. 奇偶校验位8覆盖所有具有第四个最低有效位的位位置:位8-15,24-31,40-47等。
    5. 通常,每个奇偶校验位覆盖奇偶校验位置的二进制AND和位位置非零的所有位。

答案 2 :(得分:0)

wikipedia article很好地解释了它。

如果您不了解算法的某个特定方面,那么您需要对问题进行重新措辞(或详细说明),以便有人可以解决您问题的特定部分。