海明码(汉明码、Hamming Code)

#目录

文章目录


#简介
海明码又称为汉明码,英文名Hamming Code。是差错控制中的纠错码。
#编码概述
海明码是在原数据中的一些固定位置,插入一位奇(或偶)校验位,虽然使原数据变长,但可使其拥有纠错能力。
能侦测并更正单一个比特的错误,若有两个或两个以上比特的数据出错,或者出错的是校验位,则不能侦测和更正。
#编码示例
以二进制串10110为例,以偶校验将其编码为海明码。
##第1步:校验位的位置
生成的海明码中,位置为2的幂位均为校验位,用表格表示如下:
|海明码中的位置|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|
|–|
|是否为2的幂|2 0|21||2 2||||23||||||||2^4||
##第2步:数据位的位置
除去校验位,全部都是数据位。
在第1步的表格中,我们标出数据位:
|海明码中的位置|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|
|–|
|是否为2的幂|2 0|21|数据|2 2|数据|数据|数据|23|数据|数据|数据|数据|数据|数据|数据|2^4|数据|
##第3步:填入数据位
将例子中的数据(二进制串10110)填入海明码。同时,为了方便识别,我们为每一位都增加标识,其中,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|21|数据|2 2|数据|数据|数据|23|数据|数据|数据|数据|数据|数据|数据|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|
观察上表可发现一个比较直观的规律:位置为R的检验位,是从第R位开始,检验R位,跳过R位,再检验R位,在跳过R位,以此类推。
例如上表中检验位为4,即表中R4,是从第4位开始,检验4、5、6、7共4位,然后跳过8、9、10、11共4位,再检验12、13、14、15共4位。
##第5步:计算出校验位
接下来,计算出校验位并填入,就能得到海明码了,计算过程如下表:
|海明码中的位置|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|
|–|
|是否为2的幂|2 0|21|数据|2 2|数据|数据|数据|23|数据|数据|数据|数据|数据|数据|数据|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 = 偶校验(R1, 1, 0, 1, 0) = 0
R2 = 偶校验(R2, 1, 1, 1) = 1
R4 = 偶校验(R4, 0, 1, 1) = 0
R8 = 偶校验(R8, 0) = 0
R16 = 数据太短,当用到D17位置时,才需要R16
将计算结果填入表中:
|海明码中的位置|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|
|–|
|是否为2的幂|2 0|21|数据|2 2|数据|数据|数据|23|数据|数据|数据|数据|数据|数据|数据|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,则将1和8相加,得到9。
最后,结果9,即为出错的比特所在的位置,将该错误的比特取反就能更正错误。
#侦测和更正示例
假设编码示例中生成的海明码“0110 0110 0”,在传输中出错,最后一位(标识D9)出错,错误的海明码为“0110 0110 1”
##第1步:检测校验位
该海明码使用教研方式是偶校验,所以我们检验校验位时,也要使用偶校验。
R1 = 偶校验(R1, 1, 0, 1, 0) = 0,出错
R2 = 偶校验(R2, 1, 1, 1) = 1,正确
R4 = 偶校验(R4, 0, 1, 1) = 0,正确
R8 = 偶校验(R8, 0) = 0,出错
##第2步:确定出错比特的位置
将出错的校验位的位置相加:
R1的位置是1 + R8的位置是8 = 9
所得的结果即为出错的比特所在的位置。
##第3步:更正错误
将第9位取反,就能更正错误。
错误的海明码为“0110 0110 1”,更正第9位后为“0110 0110 0”。

猜你喜欢

转载自blog.csdn.net/Never_Satisfied/article/details/81988928