简介
海明码又称为汉明码,英文名Hamming Code。是差错控制中的纠错码。
编码
概述
海明码是在原数据中的一些固定位置,插入一个0(或1),以进行奇(或偶)校验位,虽然使原数据变长,但可使其拥有纠错能力。
能侦测并更正一个比特的错误;若有两个比特出错,则只能侦测,不能更正;若有三个或更多的比特出错,则不能侦测,更不能更正。
示例
以二进制串10110为例,以偶校验将其编码为海明码。
第1步:校验位的位置
生成的海明码中,位置为2的幂位均为校验位,用表格表示如下:
海明码中的位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
位置为2的幂 | 2^0 | 2^1 | 2^2 | 2^3 | 2^4 |
第2步:数据位的位置
除去校验位,全部都是数据位。
在第1步的表格中,我们标出数据位:
海明码中的位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
是否为2的幂 | 2^0 | 2^1 | 数据 | 2^2 | 数据 | 数据 | 数据 | 2^3 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 2^4 | 数据 |
第3步:填入数据位
将例子中的数据(二进制串10110)填入海明码。同时,为了方便识别,我们将校验位标为R,数据位标为D,即R1、R2、R4、R8、R16……,为校验位;D3、D5、D6、D7、D9……,为数据位。
继续完善表格:
海明码中的位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
是否为2的幂 | 2^0 | 2^1 | 数据 | 2^2 | 数据 | 数据 | 数据 | 2^3 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 2^4 | 数据 |
所在位的标识 | R1 | R2 | D3 | R4 | D5 | D6 | D7 | R8 | D9 | D10 | D11 | D12 | D13 | D14 | D15 | R16 | D17 |
海明码的值 | 1 | 0 | 1 | 1 | 0 |
第4步:如何计算出校验位的值
通过偶校验算出海明码中校验位的值,下表显示了各校验位的值如何计算:
海明码中的位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
所在位的标识 | R1 | R2 | D3 | R4 | D5 | D6 | D7 | R8 | D9 | D10 | D11 | D12 | D13 | D14 | D15 | R16 | D17 |
参与R1校验 | X | X | X | X | X | X | X | X | X | ||||||||
参与R2校验 | X | X | X | X | X | X | X | X | |||||||||
参与R4校验 | X | X | X | X | X | X | X | X | |||||||||
参与R8校验 | X | X | X | X | X | X | X | X | |||||||||
参与R16校验 | X | X |
所在位置的规律如下:
位置为Rx的检验位,是从第x位开始(即从Rx开始),检验x位,跳过x位,再检验x位,再跳过x位,以此类推。
例如上表中,位置为R4的检验位:
是从第4位开始(即从R4开始);
检验4位(检验4、5、6、7共4位);
跳过4位(跳过8、9、10、11共4位);
检验4位(检验12、13、14、15共4位),以此类推。
第5步:计算出校验位的值
最后,根据第4步计算出校验位的值并填入,就能得到海明码了,计算过程如下:
海明码中的位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
是否为2的幂 | 2^0 | 2^1 | 数据 | 2^2 | 数据 | 数据 | 数据 | 2^3 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 2^4 | 数据 |
所在位的标识 | R1 | R2 | D3 | R4 | D5 | D6 | D7 | R8 | D9 | D10 | D11 | D12 | D13 | D14 | D15 | R16 | D17 |
海明码的值 | R1 | R2 | 1 | R4 | 0 | 1 | 1 | R8 | 0 | R16 |
偶校验(R1, 1, 0, 1, 0) → R1 = 0
偶校验(R2, 1, 1, 1) → R2 = 1
偶校验(R4, 0, 1, 1) → R4 = 0
偶校验(R8, 0) → R8 = 0
R16 = 数据太短,当用到D17位置时,才需要R16
将计算结果填入表中:
海明码中的位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
是否为2的幂 | 2^0 | 2^1 | 数据 | 2^2 | 数据 | 数据 | 数据 | 2^3 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 数据 | 2^4 | 数据 |
所在位的标识 | R1 | R2 | D3 | R4 | D5 | D6 | D7 | R8 | D9 | D10 | D11 | D12 | D13 | D14 | D15 | R16 | D17 |
所在位的值 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
得到的海明码为“0110 0110 0”。
侦测和更正
概述
首先,按照编码的方式(奇或偶校验),依次检测校验位R1、R2、R4、R8……,然后,将出错的校验位的位置相加,比如发现R1、R8出现错误,则将1和8相加,得到9,即为位置D9的比特出错,最后,将该错误的比特取反就能更正错误。
示例
假设编码示例中生成的海明码“0110 0110 0”,在传输中出错,导致最后一位(标识D9)出错,所以我们现在接收到的海明码为“0110 0110 1”。
海明码中的位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
所在位的标识 | R1 | R2 | D3 | R4 | D5 | D6 | D7 | R8 | D9 | D10 | D11 | D12 | D13 | D14 | D15 | R16 | D17 |
正确的海明码 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | ||||||||
接收的海明码 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 |
第1步:检测校验位
该海明码使用的校验方式是偶校验,所以我们检查校验位时,也要使用偶校验。
根据接收到的海明码,计算校验位的值:
偶校验(R1, 1, 0, 1, 1) → R1 = 1,出错
偶校验(R2, 1, 1, 1) → R2 = 1,正确
偶校验(R4, 0, 1, 1) → R4 = 0,正确
偶校验(R8, 1) → R8 = 1,出错
第2步:确定出错比特的位置
将出错的校验位的位置相加:
出错比特的位置 = R1的位置 + R8的位置 = 1 + 8 = 9
第3步:更正错误
将第9位取反,就能更正错误。
错误的海明码为“0110 0110 1”,更正第9位后为“0110 0110 0”。
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。如稿件版权单位或个人不想在本网发布,可与本网联系,本网视情况可立即将其撤除。