理解海明碼

今天做題遇到了海明碼,網上相關知識很多,可惜大多都要把知識點看透才能明白海明碼到底是什麼,這裏我整理自己的學習過程和理解。

海明碼初步

首先海明碼是一種校檢碼,數位中包括數據位和校檢位,是奇偶校檢碼的升級。
假設讀者對奇偶校檢碼很熟悉,它只能指出某組數據是否出錯,但是無法確定出錯的位置。海明碼則通過多增加幾個奇偶校檢位,相互關聯,進而找出出錯的位置。當然以上分析都假定出錯只會發生一次,也就是說一組數據最多隻有一個地方出錯。
“互相關聯”是什麼意思?這東西很神奇,繼續往下看。

如果單純看教材,書本上首先映入眼簾的是,已知原始數據爲k位,求需要的海明校檢碼的位數r,直接給出公式k+r≤r^2-1。這太違背學習軌跡了。我們重頭來。
原始數據k位,海明碼r位,意味着一組數據是k+r位,重點:數據傳輸中出錯,並不一定是數據位裏的k位出錯,校檢位r位也有出錯的可能性,爲了能夠找到出錯的具體位置,我們首先羅列所有的情況
①數據沒有出錯。情況數 1
②數據出現1位錯誤。情況數 k+r
③有多位出現錯誤,不予考慮
可見一共有(k+r+1)種情況。
再考慮充當檢校的r位,它們的0/1組合,一共可以組成r^2種情況(00…0~11…1,r個2相乘)。所以爲了涵蓋上述的出錯情況,真正有意義的公式應該寫成
k+r+1≤r^2
這裏先放下不表。

其二,檢校位的擺放位置
從本質上來說隨便放哪裏都可以,但是爲了不同機器、軟件的兼容,以及生成、檢校算法實現的方便,採用如下方式插入檢校碼。

1 2 3 4 5 6 7 8 9 10 11 12
檢校1 檢校2 數據1 檢校3 數據2 數據3 數據4 檢校4 數據5 數據6 數據7 數據8

表格第一排是原始數據和檢校位合併後總數據位,從左到右升序,以1起頭。第二排是檢校位和(原始)數據位的擺放位置。
先找規律,開頭兩位都是檢校位,第i個檢校位,位於總位數(i-1)^2的位置處,如第4個檢校位,位於總數位的8。
其他空格的地方是(原始)數據位。

可以理解成,檢校位先固定了位置,(原始)數據再插入其中
原來是數據位“插”檢校位中,而不是一開始認爲的檢校位“插”數據位中,當然這只是一種理解方式。例如:
我需要傳輸1位數據,那就插到3號位,總數據位數爲3,檢校位數目2個。
我需要傳輸2位數據,那就插到3和5號位,總數據位數爲5,檢校位數目2個。
… …
我需要傳輸5位數據,那就插到3、5、6、7、9號位,總數據位數爲9,檢校位數目4個。
… …

其三,檢校位的值的確認
每個檢校位裏面填0還是1的問題。繼續看錶

1 2 3 4 5 6 7 8 9 10 11 12
檢校1 檢校2 數據1 檢校3 數據2 數據3 數據4 檢校4 數據5 數據6 數據7 數據8
檢校1子序列 O O O O O O
檢校2子序列 O O O O O O
檢校3子序列 O O O O O O
檢校4子序列 O O O O

對於檢校i位,它從自己開始,按照取i位數,跳i位數輪流的方式得到子序列,在子序列中,按照奇偶校驗的方式確定自己的值。

例如下面的數據,原數據爲101101,共5位,分別插入第3、5、6、7、9位中,組成一個9位的總數據。現在要確認檢校位的取值,假設爲奇校驗法。

1 2 3 4 5 6 7 8 9
檢校1 檢校2 數據1 檢校3 數據2 數據3 數據4 檢校4 數據5
1 ? 1 1 0 1

我們開始找每個檢校位對應的子序列
檢校1,從自己開始,取1跳1。即?1101,按奇校驗方式,檢校1=0。
檢校2,從自己開始,取2跳2。即?110,因此檢校2=1。
檢校3,從自己開始,取3跳3。即?11,因此檢校3=1。
檢校4,從自己開始,取4跳4。即?1,因此檢校4=0。
所以整個數據爲0111 1100 1

海明碼檢校方法

仔細看這張表。再結合上面以子序列確定對應檢校位的數字分析。

1 2 3 4 5 6 7 8 9 10 11 12
檢校1 檢校2 數據1 檢校3 數據2 數據3 數據4 檢校4 數據5 數據6 數據7 數據8
檢校1子序列 O O O O O O
檢校2子序列 O O O O O O
檢校3子序列 O O O O O O
檢校4子序列 O O O O

可以發現這樣的規律——
當總數據位1號出錯,“檢校1”的奇偶校驗能報告異常,例如上面的例子,傳輸數據“0111 1100 1”,接受爲“1111 1100 1”時,校驗1 的子序列此時爲“11101”,奇校驗異常(偶數個1)

其他具體分析略。結論:當總數位的i位出錯時,表中對應有圈圈的檢校位就會報錯,而且這種報錯方式是唯一的,例如當只有檢校2和3報錯時,那麼一定是6號數據出錯(也就是原始數據的第3位)

也就是說,這種報錯和出錯位置的是一一對應的,是不是對公式k+r+1≤r^2有了更深的理解呢?

海明碼只能檢測1位錯誤

大家先想想是不是這樣的。

例如1、2號位同時出錯,查表得,檢校1和2會同時報錯,這和單獨3號位出錯的報錯方法一致。導致系統認爲出錯的是3號位,因此1改0,0改1。

再比如5、7號位同時出錯,查表,這時檢校1和3會報錯,而檢校2因爲錯了兩次,錯錯得正,反而不報錯。最後系統認爲5號位出錯。

還好一般多位出錯的情況極其罕見。當然在通訊極其惡劣的場合,海明碼也沒得救。

(碎碎念:當時看書,覺得這東西真複雜,沒想到弄懂了也挺有趣的)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章