漢明碼歷史 漢明碼(Hamming Code),是在電信領域的一種線性調試碼,以發明者理查德·衛斯里·漢明的名字命名。漢明碼在傳輸的消息流中插入驗證碼,當計算機存儲或移動數據時,可能會產生數據位錯誤,以偵測并更正單一比特錯誤。由于漢明編碼簡單,它們被廣泛應用于內存(RAM)和磁盤糾錯的編碼。漢明碼不僅可以用來檢測轉移數據時發送的錯誤,還可以用來修正作物。(漢明碼只能發現和修正一位錯誤,對于兩位及兩位以上的錯誤無法發現和糾正)。 1940年,漢明于貝爾實驗室(Bell Labs)工作,運用貝爾模型V(Bell Model V)電腦,一個周期時間在幾秒鐘內的機電繼電器機器。輸入端是依靠打孔卡(Punched Card),這不免有些讀取錯誤。在平日,特殊代碼將發現錯誤并閃燈(flash lights),使得操作者能夠糾正這個錯誤。在周末和下班期間,在沒有操作者的情況下,機器只會簡單地轉移到下一個工作。漢明在周末工作,他對于不可靠的讀卡機發生錯誤后,總是必須重新開始項目變得愈來愈沮喪。在接下來的幾年中,他為了解決調試的問題,開發了功能日益強大的調試算法。在1950年,他發表了今日所稱的漢明碼。現在漢明碼有著廣泛的應用。 漢明碼原理 設將要進行檢測的二進制源碼為n位,為使其具有糾錯能力,需要再加上k位的檢測位,組成n+k=m位的二進制。那么,新增加的檢測位數k應滿足:
這就是漢明碼不等式,規定所得到的m位編碼$2^k(k \geq 0 | 2^k < n+k)$位上插入特殊的校驗碼,其余位把源碼按順序放置。n位二進制和校驗碼位數k的關系: n k最小值
1 2
2~4 3
5~11 4
12~26 5
27~57 6
57~120 7
漢明碼編碼方式1編碼規則:在新的編碼的$2^{(k-1)} (k \geq 0)$位上填入0(即校驗位)。 在新的編碼的其余位把源碼按原順序填入校驗位的編碼方式為:第k位校驗碼從則從新的編碼的第$2^{(k-1)}$位開始,每計算$2^{(k-1)}$位的異或,跳$2^{(k-1)}$位,再計算下一組$2^{(k-1)}$位的異或,填入$2^{(k-1)}$位。 比如:第1位校驗碼位于新的編碼的第1位$2^{(1-1)}==1$(漢明碼從1位開始),計算1,3,5,7,9,11,13,15,…位的異或,填入新的編碼的第1位。第2位校驗碼位于新的編碼的第2位$2^{(2-1)}==2$,計算2,3,6,7,10,11,14,15,…位的異或,填入新的編碼的第2位。第3位校驗碼位于新的編碼的第4位$2^{(3-1)}==4$,計算4,5,6,7,12,13,14,15,20,21,22,23,…位的異或,填入新的編碼的第4位。第4位校驗碼位于新的編碼的第8位$2^{(4-1)}==8$,計算8-15,24-31,40-47,…位的異或,填入新的編碼的第8位。第5位校驗碼位于新的編碼的第16位$2^{(5-1)}==16$,計算16-31,48-63,80-95,…位的異或,填入新的編碼的第16位。
編碼示例: 以10101源碼為例,$n=5$,由公式$2^k-1 \geq n+k$得$k=4$,如下表所示編碼結果為001101011。 1 2 3 4 5 6 7 8 9
$2^{(1-1)}$校驗位 $2^{(1-1)}$校驗位 1 $2^{(1-1)}$校驗位 0 1 0 $2^{(1-1)}$校驗位 1
0 0 1 0 0 1 0 0 1
0(計算1,3,5,7,9位異或) 0(計算2,3,6,7位異或) 1 1(計算4,5,6,7位異或) 0 1 0 (計算8,9位異或) 1
計算校驗碼的第1位(1,3,5,7,9進行異或): 結果為0,所以漢明碼第2^0位為0,結果為0 _ 1 _ 0 10 _ 1 計算校驗碼的第2位(2,3,6,7進行異或): 結果為0,所以漢明碼第2^1位為0,結果為001 _ 0 10 _ 1 計算校驗碼的第3位(4,5,6,7進行異或): 結果為1,所以漢明碼第2^2位為0,結果為0011 0 10 _ 1 計算校驗碼的第4位(8, 9進行異或): 結果為0,所以漢明碼第2^3位為1,結果為001101011 所以最終編碼為001101011.
漢明碼編碼方式2通過k值將源碼分為$P_n$組,第1組為$2^0$,第2組為$2^1$,第3組為$2^2$,同理以此類推分組按照$2^{(k-1)}$。同時分組后插入的校驗碼的位置也是按照次規律插入,$2^0$位插入第1個校驗碼,即$P_1$組第1位,$2^1$位插入第2個校驗碼,即$P_2$組第1位,$2^2$位插入第3個校驗碼,即$P_3$組第1位,以此類推。 P1組包含(1(校驗碼),3,5,7,9,11...位)
P2組包含(2(校驗碼),3,6,7,10,11,14,15...位)
P3組包含(4(校驗碼),5,6,7,12,13,14,15...位)
...
同時也可以通過下表方式來劃分組。 編號 1 2 3 4 5 6 7 8
二進制 0001 0010 0011 0100 0110 0111 1000 1001 將編號轉成二進制從右向左,如果第1位是1,例如編號是1,3,5,7....的就分入P1組,如果第2位是1的,例如編號2,3,6,7,10...的就分入第P2組,以此類推將所有的編號分入相應的組中。 當分好組之后,P1組中第1位(校驗位)應使1,3,5,7,9,11...位中“1”的個數為偶數。P2組中第2位(校驗位)應使2,3,6,7,10,11,14,15...位中“1”的個數為偶數。P3組中第4位(校驗位)應使4,5,6,7,12,13,14,15...位中“1”的個數為偶數。漢明碼還存在配奇原則,與之相反。
編碼示例: 以10101源碼為例,$n=5$,由公式$2^k-1 \geq n+k$得$k=4$,如下表所示編碼結果為001101011,C1,C2,C3,C4為插入的校驗碼。 1 2 3 4 5 6 7 8 9
$2^{(1-1)}$校驗位 $2^{(1-1)}$校驗位 1 $2^{(1-1)}$校驗位 0 1 0 $2^{(1-1)}$校驗位 1
C1 C2 B1 C3 B2 B3 B4 C4 B5 如果按照配偶原則來配置漢明碼,則C1應使1,3,5,7,9位中“1”的個數為偶數;C2應使2,3,6,7位中“1”的個數為偶數;C3應使4,5,6,7位中“1”的個數為偶數;C4應使8,9位中的“1”的個數為偶數。所以10101源碼的漢明碼為001101011。 漢明碼的糾錯 根據以上說的漢明碼的配偶原則和配奇原則我們來看漢明碼的糾錯。設接收到的錯誤漢明碼(按配偶原則配置)是001101001,我們可以根據上述規律來確定出錯位。 序號 1 2 3 4 5 6 7 8 9
接收到的漢明碼 0 0 1 1 0 1 0 1 1 那么新的檢測位為: P1=1位^3位^5位^7位^9位,得到0。 P2=2位^3位^6位^7位,得到0。 P3=4位^5位^6位^7位,得到0。 P4=8位^9位,得到1。 根據P4P3P2P1構成的二進制是1000,將1000轉換成十進制為8,說明是第8位出錯,或者根據配偶原則的規律,其“1”的個數必須是偶數也能判斷出是第8位,所以第8位應將“1”改為“0”,那么正確的漢明碼應為001101011。 漢明碼屬于分組奇偶校驗,P4P3P2P1=0000,說明接收方生成的校驗位和收到的校驗位相同,否則不同說明出錯。由于分組時校驗位只參加一組奇偶校驗,有效信息參加至少兩組奇偶校驗,若果校驗位出錯,P4P3P2P1的某一位將為1,剛好對應位號8、4、2、1;若果有效信息出錯,將引起P4P3P2P1中至少兩位為1。
以上博文參考自:
|