校驗碼:奇偶校驗,海明碼,CRC
大多數情況下,使用檢錯碼,查錯後請求重發;
只有在單工通道(沒有反向反饋),才使用糾錯功能
1. 奇偶校驗
1.1 原理
有效資料:data_code
msg = data_code + check_code
check_code一般是1位,使msg中“1”的個數為偶數(或奇數)
1.2 分類
水平校驗:只檢不糾
垂直校驗:只檢不糾
水平垂直校驗:只能糾正1位錯,(互補的錯不行)
2. 海明碼
2.1 海明距離(HD)
海明距離(HD):兩個碼字的對應位元取值不同的位元數
檢d個位查錯:HD >= d + 1 (至少有一碼代表無效)
糾d個位查錯:HD >= 2d + 1
2.2 原理
傳送端在 k 位元資訊上附加 r 位元冗餘資訊(即校驗位元),構成 n=k+r 位元的碼字,且滿足條件:2^r≥n+1,即 2^r≥k+r+1。其中,每個校驗位元和某幾個特定的資訊位元構成偶校驗的關係。
eg:
P1 P2 D3P4D5D6D7P8D9D10D11
其中,P1、P2、P4、P8 為插入的校驗位元,D3D5D6D7D9D10D11 為原來ASCII碼的資訊位元。
如果把各資訊位元的下標寫成 2 的冪次之和,即下標3=1+2,5=1+4,6=2+4,7=1+2+4,9=1+8,10=2+8,11=1+2+8,這表示:資訊位元 D3 要參與校驗位元 P1、P2 的生成、資訊位元 D5 要參與校驗位元 P1、P4 的生成,……,等等。
則各校驗位元由下式決定:
P1 = D3+D5+D7+D9+D11
P2 = D3+D6+D7+D10+D11
P4 = D5+D6+D7
P8 = D9+D10+D11
S1 = P1+D3+D5+D7+D9+D11
S2 = P2+D3+D6+D7+D10+D11
S4 = P4+D5+D6+D7
S8 = P8+D9+D10+D11
if S1= S2 = S4 = S8 = 0, 則無錯;
else 有錯.
錯誤位置在 S= S8 S4 S2 S1 處,
‘A’的 ASCII 碼為1000001, 由於海明碼為
P1P2D3P4D5D6D7P8D9D10D11的形式,
即此處 D3=D11=1, D5=D6=D7=D9 =D10=0,
則由 P1 = D3+D5+D7+D9+D11,P2 = D3+D6+D7+D10+D11,
P4 = D5+D6+D7,P8 = D9+D10+D11
得:P1=0,P2=0,P4=0,P8=1
∴傳送端形成的海明碼為 00100001001
若接收方接收錯誤,收到:00100001011 (D10錯誤)
則檢/糾錯過程如下:計算校正因子S1、S2、S4、S8,
得: S1=0,S2=1,S4=0,S8=1
∵ S2= S8= 1 ∴ 檢測有錯,
錯誤位置在 S=1010 處即D10,將D10取反即可.
3. CRC(迴圈冗餘校驗碼)
3.1 原理
將位串看成係數為 0 或 1 的多項式。
如位串1 0 1 0 0 1 1 1 即對應於多項式: x^7 + x^5 + x^2 + x + 1
收發雙方約定一個多項式G(x),傳送方用位串及 G(x)進行某種運算得到校驗和,並在幀的末尾加上校驗和,使帶校驗和的幀的多項式能被 G(x) 整除; 接收方收到後,用 G(x) 除多項式,若有餘數,則傳輸有錯。
3.2 校驗和計算
G(x)的最高階和最低階係數必須為1
設G(x)為n階,待發送資料M = k (bits)
則校驗和(冗餘碼)長度為r(bits)
M = 1010001101 , n = 5, G(x) = P = 110101
將餘數 R 作為冗餘碼新增在資料 M 的後面傳送出去,即傳送的資料是101000110101110,或 2^n * M + R
常用的G(x)
N | K | 碼距d | G(x)多項式 | G(x) |
7 | 4 | 3 |
x3+x+1 |
1011 |
7 | 4 | 3 |
x3+x2+1 |
1101 |
7 | 3 | 4 |
x4+x3+x2+1 |
11101 |
7 | 3 | 4 |
x4+x2+x+1 |
10111 |
15 | 11 | 3 |
x4+x+1 |
10011 |
15 | 7 | 5 |
x8+x7+x6+x4+1 |
111010001 |
31 | 26 | 3 |
x5+x2+1 |
100101 |
31 | 21 | 5 |
x10+x9+x8+x6+x5+x3+1 |
11101101001 |
63 | 57 | 3 |
x6+x+1 |
1000011 |
63 | 51 | 5 |
x12+x10+x5+x4+x2+1 |
1010000110101 |
1041 | 1024 |
x16+x15+x2+1 |
11000000000000101 |