海明碼(漢明碼、Hamming Code)
阿新 • • 發佈:2018-12-01
#目錄
文章目錄
#簡介
海明碼又稱為漢明碼,英文名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|2
##第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|2
|所在位的標識|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|2
|所在位的標識|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”。