漢明碼是Richard Hamming于1950年提出的。是目前廣泛采用的一種有效的校驗碼,其中,主存的ECC(Error Correcting Code)采用的就是類似的校驗碼。
基本原理
將有效的信息按某種規律分成若干組,每組安排一個校驗位,做奇偶測試,就能提供多位檢錯信息,以指出最大可能是哪位出錯,從而將其糾正。實質上,漢明校驗碼是一種多重校驗。
----摘自百度百科
這個分組的思想有點不是很理解。
在有效信息位種中加入幾個校驗位形成漢明碼,使碼距比較均勻的增大,并把漢明碼的每一個二進制位分配到幾個奇偶校驗組中。
以下使用P代表校驗位,H代表漢明碼,D代表原始信息位,N位信息位的位數,K位校驗位的位數。
則N與K的關系為2^(K-1) >=N+K+1
,如下表:
N | K |
---|---|
1~3 | 4 |
4~10 | 5 |
11~25 | 6 |
26~56 | 7 |
57~119 | 8 |
分組原則
- 信息位和校驗位之和為m,每個校驗位Pi在漢明碼中被分到位號為2^(i-1)的位置上,其余各位為信息位
- 漢明碼每一位Hi有多個校驗位校驗,其關系是被校驗的每一位位號等于校驗它的各校驗位的位號之和,即漢明碼的實質是參與校驗的各校驗位權之和。 這句話理解起來有點別扭,看下面例子。
- 在增大碼距時,應使所有編碼的碼距盡量均勻地增大,以保證對所有代碼的檢測能力平衡的提高
例子
編碼
假設原始數據信息位的位數為8,那么他需要的K值位5,即需要有5個校驗位,組成的漢明碼的位數為13.再根據校驗位的分配原則,組成的漢明碼如下:
|位|13| 12| 11 |10| 9| 8| 7 |6| 5| 4| 3| 2| 1|
|-|-|-|-|-|-|-|-|-|-|-|-|-|
|漢明碼|P5| D8| D7| D6 | D5| P4| D4| D3| D2| P3| D1| P2| P1|
P5本來應該是放在第16位的,但是由于生成的漢明碼位數為13所以它就被挪到的第13位了。
那么怎么確定校驗呢?最初也困擾我許久。
先看一個表格:
其中H的下標代表在漢明碼中的位置,也是P4P3P2P1組成的-十進制數
P5 | P4 | P3 | P2 | P1 | H | |
---|---|---|---|---|---|---|
0 | 0 | 0 | 1 | H1 | P1 | |
0 | 0 | 1 | 0 | H2 | P2 | |
0 | 0 | 1 | 1 | H3 | D1 | |
0 | 1 | 0 | 0 | H4 | P3 | |
0 | 1 | 0 | 1 | H5 | D2 | |
0 | 1 | 1 | 0 | H6 | D3 | |
0 | 1 | 1 | 1 | H7 | D4 | |
1 | 0 | 0 | 0 | H8 | P4 | |
1 | 0 | 0 | 1 | H9 | D5 | |
1 | 0 | 1 | 0 | H10 | D6 | |
1 | 0 | 1 | 1 | H11 | D7 | |
1 | 1 | 0 | 0 | H12 | D8 | |
1 | 1 | 0 | 1 | H13 | P5 |
校驗位Pi的偶校驗結果就是:
P1 = D1 ^ D2 ^ D4 ^ D5 ^ D7
P2 = D1 ^ D3 ^ D4 ^ D6 ^ D7
P3 = D2 ^ D3 ^ D4 ^ D8
P4 = D5 ^ D6 ^ D7 ^D8
如果是奇校驗的話上面的結果取反就是了。
那么還有P5呢?上面的結果中,D4,D7出現了3次,而D1,D2,D3,D5,D6,D8僅出現了2次,為了使其各個信息位在校驗中均勻的出現校驗,從而定義P5 = D1 ^ D2 ^ D3 ^ D5 ^ D6 ^D8
,這樣,每一位信息位都均勻的出現在3個Pi值得形成關系中,當任意一位信息位變化的時候都會引起3個P值得變化,即合法漢明碼的碼距為4 (前面都懂,這個碼距為4有點想不明白)
這就是編碼了。
現在再來看看這句話
漢明碼每一位Hi有多個校驗位校驗,其關系是被校驗的每一位位號等于校驗它的各校驗位的位號之和,即漢明碼的實質是參與校驗的各校驗位權之和。
P1,P2,P3,P4,P5的位數分別為1,2,4,8,13
D1的漢明碼位數為3,3 = 2 + 1所以D1會被P1,P2兩個校驗位所校驗。
漢明碼的信息位 | 漢明碼的位數 | 被校驗位 | 說明 |
---|---|---|---|
D1 | 3 = 1 + 2 | P1,P2 | D1信息位會被校驗位P1,P2所校驗。 |
D2 | 5 = 1 + 4 | P1,P3 | |
D3 | 6 = 2 + 4 | P2,P3 | |
D4 | 7 = 1 + 2 +4 | P1,P2,P3 | |
D5 | 9 = 1+ 8 | P1,P4 | |
D6 | 10 = 2 + 8 | P2,P4 | |
D7 | 11 = 1 + 2 +8 | P1,P2,P4 | |
D8 | 12 = 4 + 8 | P3,P4 |
根據偶校驗結果以及上應該就清楚了。
校驗
將收到的漢明碼進行偶校驗(當然也可以進行奇校驗,前提是前面編碼的時候使用的是奇校驗)
S1 = P1 ^ D1 ^ D2 ^ D4 ^ D5 ^ D7
S2 = P2 ^ D1 ^ D3 ^ D4 ^ D6 ^ D7
S3 = P3 ^ D2 ^ D3 ^ D4 ^ D8
S4 = P4 ^ D5 ^ D6 ^ D7 ^D8
S5 = P5 ^ D1 ^ D2 ^ D3 ^ D5 ^ D6 ^D8
漢明碼出錯情況:
記錄 S = S5 S4 S3 S2 S1
- S為00000時代表無錯
- 有一位不為0,表明某一校驗位出錯或者三位漢明碼(信息位和校驗位)同時出錯
- 兩位不為0,表明兩位漢明碼同時出錯,此時只能發現錯誤無法確定錯誤的位置
- 3位不為0,表明一位信息位出錯或者3位校驗位同時出錯
- 4/5位不為0,表明出錯情況嚴重,系統可能出現故障,應檢查系統硬件的正確性
以上結果分析基于偶校驗。
|漢明碼||P5| D8| D7| D6 | D5| P4| D4| D3| D2| P3| D1| P2| P1|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|出錯位號||H13| H12| H11 |H10|H9| H8| H7 |H6| H5| H4| H3| H2|H1|
||S5|1|1|0|1|1|0|0|1|1|0|1|0|0|
||S4|0|1|1|1|1|1|0|0|0|0|0|0|0|
||S3|0|1|0|0|0|0|1|1|1|1|0|0|0|
||S2|0|0|1|1|0|0|1|1|0|0|1|1|0|
||S1|0|0|1|0|1|0|1|0|1|0|1|0|1|