漢明碼 Hamming code
漢明碼是一種線性調試碼,可以糾正一位錯誤;而擴展漢明碼可以檢測出兩位錯誤。
漢明碼編碼以及糾錯過程
編碼
對於給出的一串數碼,根據糾錯碼原理,我們知道對於n位的原串,至少需要使得糾錯碼位數k滿足:\(n+k \le 2^k - 1\)
以長度為11的數碼為例,則需要4位糾錯碼(不選擇12位的原因將在擴展漢明碼中解釋)
漢明碼的糾錯碼位於第\(2^{k},k=1,2,\dots\)處
如將11位數碼與四位糾錯碼的最終編碼為\(N_1,N_2,N_3,N_4,N_5,N_6,N_7,N_8,N_9,N_{10},N_{11},N_{12},N_{13},N_{14},N_{15}\)
並且在偶校驗方法時規則為:設該校驗位為\(2^i\),則\(該校驗位= \oplus^{n}_{k=1} N_{ 二進制碼展開含2^i的數}\)
(注:偶校驗即保證該組數據中1的個數為偶數)
直觀的表示在4*4的方格中則是
最后將0位空出,其余位依次排列,最后就得到了一組共11+4=15位的漢明碼。
糾錯
當接收到一份信息時,我們只需要4個計算校驗和,他們的形式與剛剛計算校驗碼類似,僅僅是將校驗位加入運算而已。
得到一個新的數碼{G_4,G_3,G_2,G_1},假定只會出現一位錯誤,那么校驗和為0000則可以認為沒有出錯。
當出現錯誤時,任何一位出現時,校驗碼將等於它的下標。
例如:
$ 100010011011011 $ 他的第三位是錯誤的
可以得到校驗碼為0011=3,這樣就可以糾正錯誤了。
漢明碼原理
不難看出,漢明碼的設計與二進制表示有着密切關系,將漢明碼就錯位設置在\(2^k\)處並且將每個就錯位都分配與之對應的一半的數碼,這樣就是為了在編碼改變時,能夠恰好影響對應的校驗和,從而校驗和的排列最后為\(G_1 2^1+G_2 2^2+ G_3 2^3+G_4 2^4=出錯位置下標\)
擴展漢明碼
在剛剛的漢明碼中,我們只能檢查並糾正一位錯誤,如果同時有兩位出錯,那么對於已有的漢明編碼來說,是無法分辨的。我們只能按照以往的規則,認為是一位出錯。
還記得剛剛沒有使用的第0位嗎,現在我們將這一位當做整個數串的總奇偶校驗位,可以達到檢測兩位錯誤的作用:
(假設均為偶校驗)
- 如未發生錯誤,漢明校驗位校驗和為0,總校驗和為0
- 如果發生一位錯誤,那么總校驗和為1
- 如果發生兩位錯誤,那么總校驗和為0
這樣我們就可以發現發生了兩位錯誤,更多的錯誤就超過了漢明碼的檢測及糾錯能力范圍了。
參考資料
三藍一棕賽高!
https://www.bilibili.com/video/BV1WK411N7kz
https://www.bilibili.com/video/BV1pV411y7E8