海明碼全解讀

本文轉自https://blog.51cto.com/winda/1068000

  • part A

  • 海明糾錯碼

        海明碼(Hamming Code)是一個可以有多個校驗位,具有檢測並糾正一位錯誤代碼的糾錯碼,所以它也僅用於信道特性比較好的環境中,如以太局域網中,因爲如果信道特性不好的情況下,出現的錯誤通常不是一位。

        海明碼的檢錯、糾錯基本思想是將有效信息按某種規律分成若干組,每組安排一個校驗位進行奇偶性測試,然後產生多位檢測信息,並從中得出具體的出錯位置,最後通過對錯誤位取反(也是原來是1就變成0,原來是0就變成1)來將其糾正。

        要採用海明碼糾錯,需要按以下步驟來進行:計算校驗位數→確定校驗碼位置→確定校驗碼→實現校驗和糾錯。下面來具體介紹這幾個步驟。本文先介紹除最後一個步驟的其它幾個步驟。

    1.    計算校驗位數

        要使用海明碼糾錯,首先就要確定發送的數據所需要要的校驗碼(也就是“海明碼”)位數(也稱“校驗碼長度”)。它是這樣的規定的:假設用N表示添加了校驗碼位後整個信息的二進制位數,用K代表其中有效信息位數,r表示添加的校驗碼位,它們之間的關係應滿足:N=Kr≤2r1

        如K=5,則要求2r-r≥5+1=6,根據計算可以得知r的最小值爲4,也就是要校驗5位信息碼,則要插入4位校驗碼。如果信息碼是8位,則要求2r-r≥8+1=9,根據計算可以得知r的最小值也爲4。根據經驗總結,得出信息碼和校驗碼位數之間的關係如表5-1所示。

    表5-1   信息碼位數與校驗碼位數之間的關係

    信息碼位數

    1

    2~4

    5~11

    12~26

    27~57

    58~120

    121~247

    校驗碼位數

    2

    3

    4

    5

    6

    7

    8

    2.確定校驗碼位置

        上一步我們確定了對應信息中要插入的校驗碼位數,但這還不夠,因爲這些校驗碼不是直接附加在信息碼的前面、後面或中間的,而是分開插入到不同的位置。但不用擔心,校驗碼的位置很容易確定的,那就是校驗碼必須是在2n次方位置,如第1、2、4、8、16、32,……位(對應20、21、22、23、24、25,……,是從最左邊的位數起的),這樣一來就知道了信息碼的分佈位置,也就是非2n次方位置,如第3、5、6、7、9、10、11、12、13,……位(是從最左邊的位數起的)。

        舉一個例子,假設現有一個8位信息碼,即b1、b2、b3、b4、b5、b6、b7、b8,由表5-1得知,它需要插入4位校驗碼,即p1、p2、p3、p4,也就是整個經過編碼後的數據碼(稱之爲“碼字”)共有12位。根據以上介紹的校驗碼位置分佈規則可以得出,這12位編碼後的數據就是p1、p2、b1、p3、b2、b3、b4、p4、b5、b6、b7、b8。

        現假設原來的8位信息碼爲10011101,因現在還沒有求出各位校驗碼值,現在這些校驗碼位都用“?”表示,最終的碼字爲:??10011101

    3.    確定校驗碼

    經過前面的兩步,我們已經確定了所需的校驗碼位數和這些校驗碼的插入位置,但這還不夠,還得確定各個校驗碼值。這些校驗碼的值不是隨意的,每個校驗位的值代表了代碼字中部分數據位的奇偶性(最終要根據是採用奇校驗,還是偶校驗來確定),其所在位置決定了要校驗的比特位序列。總的原則是:第i位校驗碼從當前位開始,每次連續校驗i(這裏是數值i,不是第i位,下同)位後再跳過i位,然後再連續校驗i位,再跳過i位,以此類推。最後根據所採用的是奇校驗,還是偶校驗即可得出第i位校驗碼的值。

        1)計算方法

        校驗碼的具體計算方法如下:

        p1(第1個校驗位,也是整個碼字的第1位)的校驗規則是:從當前位數起,校驗1位,然後跳過1位,再校驗1位,再跳過1位,……。這樣就可得出p1校驗碼位可以校驗的碼字位包括:第1位(也就是p1本身)、第3位、第5位、第7位、第9位、第11位、第13位、第15位,……。然後根據所採用的是奇校驗,還是偶校驗,最終可以確定該校驗位的值。

        p2(第2個校驗位,也是整個碼字的第2位)的校驗規則是:從當前位數起,連續校驗2位,然後跳過2位,再連續校驗2位,再跳過2位,……。這樣就可得出p2校驗碼位可以校驗的碼字位包括:第2位(也就是p2本身)、第3位,第6位、第7位,第10位、第11位,第14位、第15位,……。同樣根據所採用的是奇校驗,還是偶校驗,最終可以確定該校驗位的值。

        p3(第3個校驗位,也是整個碼字的第4位)的校驗規則是:從當前位數起,連續校驗4位,然後跳過4位,再連續校驗4位,再跳過4位,……。這樣就可得出p4校驗碼位可以校驗的碼字位包括:第4位(也就是p4本身)、第5位、第6位、第7位,第12位、第13位、第14位、第15位,第20位、第21位、第22位、第23位,……。同樣根據所採用的是奇校驗,還是偶校驗,最終可以確定該校驗位的值。

        p4(第4個校驗位,也是整個碼字的第8位)的校驗規則是:從當前位數起,連續校驗8位,然後跳過8位,再連續校驗8位,再跳過8位,……。這樣就可得出p4校驗碼位可以校驗的碼字位包括:第8位(也就是p4本身)、第9位、第10位、第11位、第12位、第13位、第14位、第15位,第24位、第25位、第26位、第27位、第28位、第29位、第30位、第31位,……。同樣根據所採用的是奇校驗,還是偶校驗,最終可以確定該校驗位的值。

    ……

        我們把以上這些校驗碼所校驗的位分成對應的組,它們在接收端的校驗結果(通過對各校驗位進行邏輯“異或運算”得出)對應表示爲G1、G2、G3、G4,……,正常情況下均爲0。

        2)校驗碼計算示例

        同樣舉上面的例子來說明,碼字爲??10011101

        先求第1個“?”(也就是p1,第1位)的值,因爲整個碼字長度爲12(包括信息碼長和校驗碼長),所以可以得出本示例中p1校驗碼校驗的位數是1、3、5、7、9、11共6位。這6位中除了第1位(也就是p1位)不能確定外,其餘5位的值都是已知的,分別爲:1、0、1、1、0。現假設採用的是偶校驗(也就是要求整個被校驗的位中的“1”的個數爲偶數),從已知的5位碼值可知,已有3個“1”,所以此時p1位校驗碼的值必須爲“1”,得出p1=1。

        再求第2個“?”(也就是p2,第2位)的值,根據以上規則可以很快得出本示例中p2校驗碼校驗的位數是2、3、6、7、10、11,也是一共6位。這6位中除了第2位(也就是p2位)不能確定外,其餘5位的值都是已知的,分別爲:1、0、1、1、0。現假設採用的是偶校驗,從已知的5位碼值可知,也已有3個“1”,所以此時p2位校驗碼的值必須爲“1”,得出p2=1。

       再求第3個“?”(也就是p3,第4位)的值,根據以上規則可以很快得出本示例中p3校驗碼校驗的位數是4、5、6、7、12,一共5位。這5位中除了第4位(也就是p3位)不能確定外,其餘4位的值都是已知的,分別爲:0、0、1、1。現假設採用的是偶校驗,從已知的4位碼值可知,也已有2個“1”,所以此時p2位校驗碼的值必須爲“0”,得出p3=0。

       最後求第4個“?”(也就是p4,第8位)的值,根據以上規則可以很快得出本示例中p4校驗碼校驗的位數是8、9、10、11、12(本來是可以連續校驗8位的,但本示例的碼字後面的長度沒有這麼多位,所以只校驗到第12位止),也是一共5位。這5位中除了第8位(也就是p4位)不能確定外,其餘4位的值都是已知的,分別爲:1、1、0、1。現假設採用的是偶校驗,從已知的4位碼值可知,已有3個“1”,所以此時p2位校驗碼的值必須爲“1”,得出p4=1。

        最後就可以得出整個碼字的各個二進制值碼字爲:111000111101(帶陰影的4位就是校驗碼)。

  • part B

    雖然上一步已把各位校驗碼求出來了,但是如何實現檢測出哪一位在傳輸過程中出了差錯呢?(海明碼也只能檢測並糾正一位錯誤)它又是如何實現對錯誤的位進行糾正呢?其實最關鍵的原因就是海明碼是一個多重校驗碼,也就是碼字中的信息碼位同時被多個校驗碼進行校驗,然後通過這些碼位對不同校驗碼的聯動影響最終可以找出是哪一位出錯了。

1)海明碼的差錯檢測

    現假設整個碼字一共是18位,根據表5-1可以很快得出,其中有5位是校驗碼,再根據本節前面介紹的校驗碼校驗規則可以很快得出各校驗碼所校驗的碼字位,如表5-2所示。

表5-2  各校驗碼校驗的碼位對照表

    從表中可以得出以下兩個規律:

  1. 所有校驗碼所在的位是隻由對應的校驗碼進行校驗,如第1位(只由p1校驗)、第2位(只由p2校驗)、第4位(只由p3校驗)、第8位(只由p4校驗)、第16位(只由p5校驗),……。也就是這些位如果發生了差錯,影響的只是對應的校驗碼的校驗結果,不會影響其它校驗碼的校驗結果。這點很重要,如果最終發現只是一個校驗組中的校驗結果不符,則直接可以知道是對應校驗組中的校驗碼在傳輸過程中出現了差錯
  2. 所有信息碼位均被至少兩個校驗碼進行了校驗,也就是至少校驗了兩次。查看對應的是哪兩組校驗結果不符,然後根據表5-2就可以很快確定是哪位信息碼在傳輸過程中出了差錯。

海明碼校驗的方式就是各校驗碼對它所校驗的位組進行“異或運算”,即:

G1=p1⊕b1⊕b2⊕b4⊕b5⊕……

G2=p2⊕b1⊕b3⊕b4⊕b6⊕b7⊕b10⊕b11⊕……

G3= p3⊕b2⊕b3⊕b4⊕b8⊕b9⊕b10⊕b11⊕……

G4= p4⊕b5⊕b6⊕b7⊕b8⊕b9⊕b10⊕b11⊕……

G5= p5⊕b12⊕b13⊕b14⊕b15⊕b16⊕b17⊕b18⊕b19⊕b20⊕b21⊕b11⊕b23⊕b24⊕b25⊕b26⊕……

    正常情況下(也就是整個碼字不發生差錯的情況下),在採用偶校驗時,各校驗組通過異或運算後的校驗結果均應該是爲0,也就是前面所說的G1、G2、G3、G4,……均爲0,因爲此時1爲偶數個,進行異或運算後就是0;而採用奇校驗時,各組校驗結果均應是爲1

    現在舉一個例子來說明,假設傳輸的海明碼爲111000111101(一共12位,帶陰影的4位就是校驗碼),從中可以知道它有四個校驗組:G1、G2、G3、G4,然而到達接收端經過校驗後發現只有G4=1(也就是隻有這組校驗結果不等於0),通過前面介紹的校驗規律可以很快地發現是G4校驗組中的p4校位碼(也就是整個碼字中的第8位)錯了(因爲只有一組校驗結果出現差錯時,則肯定只是對應的校驗位出了差錯),也就是最終的碼字變成了:111000001101。

    再假設G3、G4兩個校驗值都不爲0,也就是都等於1。通過表5-2中比較G3、G4兩個校驗組(注意本示例中碼字長度一共才12位,只需要比較前12位)中共同校驗的碼位可是以很快發現是b8,也就是第12位出現了差錯,也就是最終的碼字變成了:111000011100

    【經驗之談】在這裏一定要注意,最終有多少個校驗組出現差錯也不是隨意的,一定要結合實際傳輸的碼字長度來考慮。如上例是一共12位,如果換成了是16位的碼字,且當b9位出現差錯時,則G1、G3、G4一定會同時出現錯誤,因爲b9這個位是三個校驗組同時校驗的,只要它一出錯,肯定會同時影響這三個校驗組的值。同理,如果是b11位出現了差錯,因爲它同時受G1、G2、G3、G4四個校驗組校驗,所以這四個校驗組結果都將出現錯誤。

    2)海明碼的差錯糾正

    檢測出了是哪位差錯還不夠,因爲海明碼具有糾正一位錯誤的能力,所以還需要完成糾錯過程。這個過程的原理比較簡單,就是直接對錯誤的位進行取反,或者加“1”操作,使它的值由原來的“1”變成“0”,由原來的“0”變成“1”(因爲二進制中每一位只能是這二者之一)。

    以上就是海明碼的整差錯檢測和差錯糾正原理了,確實比單純的奇偶校驗碼複雜些,但只要理清了思路,也還是比較簡單的。

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