存儲器(9)存儲器的校驗
一、合法編碼
- {000,001,010,011,100,101,110,111} 檢0位錯、糾0位錯
- {000,011,101,110} 檢1位錯,糾0位錯
- {000,111} 檢1位錯,糾1位錯
- {0000,1111} 檢2位錯,糾1位錯
- {00000,11111} 檢2位錯,糾2位錯
編碼的最小距離:任意兩組合法代碼之間二進制位數的最小差異
編碼的糾錯,檢錯能力和編碼的最小距離有關
L-1 = D + C
L:編碼的最小距離
D:檢測錯誤的位數
C:糾正錯誤的位數、
漢明碼:
一、漢明碼的配置
漢明碼采用分組 奇偶校驗:
- 奇校驗:校驗位 + 數據位使得代碼當中的數據1的個數為奇數個
- 偶校驗:校驗位 + 數據位使得代碼當中的數據1的個數為偶數個
分組奇校驗舉例:
00100011 100100011 分組校驗:10010 00011
漢明碼的分組是一種非划分方式:即存在一些數據位是交叉存在某些組中的
組成漢明碼三要素:
- 需要增添多少位檢測位: 2^k >= n+ k+ 1 :檢測位編碼至少要包含n位數據位和k位檢測位,再加上一個沒有出錯的情況
- 檢測位的位置:2^i(i = 0, 1, 2, 3, 4, 5……)
- 檢測位的取值:由所在小組中承擔的奇偶校驗任務有關
例子:0101按“偶校驗”配置的漢明碼
解析:n=4, 根據 2^k ≥ n + k +1 得 k=3
第1,2,3組的校驗位分別安排在1,2,4位上,由於偶校驗要求每一組的1的個數為偶數
可以得到 C1 = 0, C2 = 1, C4 = 0
所以 0101的漢明碼為 0100101
按配偶原則配置0011的漢明碼
同理 0011的漢明碼為1000011
二、漢明碼的糾錯:
糾錯過程中形成新的檢測位 Pi , 如增添 3 位 (k = 3),新的檢測位為 P4 P2 P1。
P1對 1, 3, 5, 7進行異或得到;P2對 2, 3, 6, 7進行異或得到;P4對 4, 5, 6, 7進行異或得到
- 當由偶校驗配置得到漢明碼時,不出錯時,為0, 出錯時,為1
- 當由奇校驗配置得到漢明碼時,不出錯時,為1, 出錯時,為0
例:已知接收到的漢明碼為 0100111 (按配偶原則配置)試問要求傳送的信息是什么?
解析:首先確定新增3位檢測位P1, P2, P4;
P1 = 0(無錯); P2 =1(有錯); P4 = 1(有錯)
則最終得到編碼位 P4P2P1 = 110, 可以確定第6位有錯,糾正為0100101
所以要求傳送的信息為0101(原來為0111)
同上,漢明碼為0101101,寫出糾錯過程
P4 = 1; P2 = 0; P1 = 0; P4P2P1 = 100(第四位為檢測位發生錯誤,可不糾正)
三、總結
漢明碼可以做到一位糾錯,一位校驗。其本身利用的是交叉分組,然后每一組設置一個奇偶校驗位,這樣做的好處是,校驗位的編碼可以定位錯誤的存在
如何分組:第i組中,對應位數(第k個數)的二進制編碼,從左開始第i位為1,如
- 第一組: 1——001 3——011 5——101 7——111 左數第1位為1
- 第二組: 2——010 3——011 6——110 7——111 左數第2位為1
- 第三組: 4——100 5——101 6——110 7——111 左數第3位為1
(注意到如111,三位均為1,這個時候,7在三組中均被包含)
校驗位由於只和它負責的單獨一個組有關,不包含在別的組中,因此,其必須置於第2^i(i=0, 1,2 ……)位
糾錯過程本質上就是將第i組的數據位進行異或運算,然后根據得到的新的檢測位獲得新的編碼,從而確定錯誤的位數,很有趣的一點在於,這個編碼確定的檢測位位置與二進制編碼的分組原則本質上是一致的
(有一個問題:如果最終發現檢測位出錯了,那是不是意味着通過檢測位進行的糾錯過程本身也有問題,但是計算過程中好像就直接忽略掉了而默認數據沒有問題,就離譜)