1. 程式人生 > >史上最通俗的海明碼編碼計算、檢錯和糾錯原理解析

史上最通俗的海明碼編碼計算、檢錯和糾錯原理解析

合法程式碼集:所謂合法程式碼集就是當代碼由於未知因素導致出錯後,計算機可是識別到錯誤的程式碼。不合法程式碼集:{(001), (010), (101), (111)}。如果(101)出錯,可能是(111),那麼無法判斷是錯誤程式碼還是本來就是(111),因此不合法。下面給出合法程式碼集:{001),(100), (111},當有一位發生變化時並不會和程式碼集中的其他程式碼發生衝突,因此合法。

編碼的最小距離:合法程式碼集中任意兩組合法程式碼之間二進位制位數的最少差異。編碼的檢錯、糾錯能力與編碼最小距離直接相關,公式描述為:L-1 = D+C(D>=C)

L: 編碼的最小距離

D: 檢錯的位數

C:糾錯的位數

漢明碼:具有一位糾錯能力的編碼方案,實質上是使用特殊分組方式的奇偶校驗。

奇偶校驗:假定需要傳輸的資料是“00100011”,那麼在原資料加上一個校驗位,使得“1”的個數是偶數個:“100100011”。當傳輸到另一端的時候,檢查“1”的個數是否是偶數個,如果還是偶數,那麼表示沒有錯誤,否則就是失效的資料。

帶分組的奇偶校驗:為了更加精確的定位出錯的二進位制位,那麼可是將二進位制位分組,將“00100011”分成“0010”和“0011”,分別在兩個分組前加上一個校驗位:“10010”和“00011”,這就構成了“1001000011”,傳送到對方的時候,將每個分組的“1”查詢一遍,然後考察是否是偶數個,即可更加精確的定位到是哪個分組出錯。

漢明碼的編碼:上邊說的都是基於劃分的分組方式,漢明碼是基於非劃分的分組方式。假定存在如下資料位:

圖片1.png

我們將這個長度的程式碼分成3組,每組包含1個校驗位,總共包含4個數據位,如下圖所示:

圖片2.png

將3個組分別命名為Group1Group2Group3,那麼將會產生三個校驗位結果:

Group3

Group2

Group1

Result

0

0

0

沒有錯誤

0

0

1

Group1中有錯誤,1的位置出錯.

1

0

1

Group1Group3公共區域出錯,5位置出錯.

...

...

...

...

既然有了校驗位,那麼這些校驗位應該放到哪裡呢?我們上面將資料按位劃分了組:

Group1: {1, 3, 5, 7};

Group2: {2, 3, 6, 7};

Group3: {4, 6, 6, 7}.

實際上,我們的分組方式就是按照漢明碼的編碼規則劃分的,因此要考察每個分組的特徵:

Group1: {1, 3, 5, 7};

Group2: {2, 3, 6, 7};

Group3: {4, 6, 6, 7}.

顯然,應該放到2n-1位。

如果是二進位制程式碼的話產生的校驗值會有如下特徵:

Group1:xxxx1

Group2:xxx1x

Group3:xx1xx

Group4:x1xxx

...

從右向左,如果Group1的第一位是1,表示Group1獨有的位元位出錯。如果是Group1的第一位和Group4的第四位同時是1,表示Group1Group4共有且其他組沒有的位元位出錯。

綜上所述,漢明碼總共有三個要素:

漢明碼的組成需要新增多少位校驗位

因為每個組都有一個校驗位,所以多少個校驗位就是多少個組,設校驗位包含k位,原始資料位元位有n位,在加上一種沒有錯誤的情況,因此是2k >= n+k+1(和畫圖一樣的道理)

校驗位在整個編碼中的位置

2n-1

校驗位的取值

根據採用的是奇校驗還是偶校驗有關。

漢明碼使用交替跳躍的方式選擇每個組中應該包含的位元位,比如:

Group1:選取1位,跳躍1位;

Group2:選取2位,跳躍2...

漢明碼的校驗:

Group1 = 1⊕357

Group2 = 2⊕367

...

測試題:求“0101”按照偶校驗配置的漢明碼

原始資料長度n = 4; 分組個數:k = 3; 漢明碼排序:

位元位序號

1

2

3

4

5

6

7

漢明碼

C1

C2

0

C4

1

0

1

下面是每個分組的情況:

C1分組情況:

1

3

5

7

C1

0

1

1

C1分組已經有偶數個1”,因此C1 = 0;同理,C2 = 1; C4 = 0

因此,漢明碼為:“0100101