海明碼校驗和糾錯原理 詳細


海明糾錯碼

當計算機存儲或移動數據時,可能會產生數據位錯誤,這時可以利用漢明碼來檢測並糾錯,簡單的說,漢明碼是一個錯誤校驗碼碼集,由Bell實驗室的R.W.Hamming發明,因此定名為漢明碼。

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

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

要采用海明碼糾錯,需要按以下幾個步驟。

1計算校驗位數

2 確定校驗碼位置

3 確定校驗碼

4 實現校驗和糾錯

1.    計算校驗位數

它是這樣的規定的:假設用N表示添加了校驗碼位后整個信息的二進制位數,用K代表其中有效信息位數,r表示添加的校驗碼位,它們之間的關系應滿足:N=K+r≤2r1。

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

 

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位就是校驗碼)。

 

轉自:https://blog.csdn.net/a747lulu747/article/details/10961989

https://blog.51cto.com/winda/1068000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM