1. 程式人生 > >常用校驗碼(奇偶校驗,海明校驗,CRC)學習總結

常用校驗碼(奇偶校驗,海明校驗,CRC)學習總結

結果 post 1的個數 增加 src 所在 如果 ble 繼續

常用校驗碼(奇偶校驗,海明校驗,CRC)學習總結

一.為什麽要有校驗碼?

因為在數據存取和傳送的過程中,由於元器件或者噪音的幹擾等原因會出現錯誤,這個時候我們就需要采取相應的措施,發現並糾正錯誤,對於錯誤的檢測和校正,大多采取“冗余校驗”的思想,即除原數據外,額外增加若幹位編碼,這些新增的代碼稱為校驗位。

二.數據是如何校驗的?

技術分享圖片

  • 輸入的數據m經過f得到p校驗位。
  • 數據m和校驗位一起通過存儲器或傳輸線路,分別得到m‘和p‘,這兩者可能和m,f相同,也可能由於傳輸儲存發生問題而不同。
  • 由數據m‘再次經過f得到校驗位p‘‘,比較p‘‘和p‘,從而得出是否出錯,輸出對應的信息,如何比較,會在下面的對應校驗碼中給出。

三.碼距

若幹位代碼組成的一個字稱為碼字,而兩個碼字具有不同代碼的位數為這兩個碼字的距離,而碼制裏各種碼字間最小的距離稱為碼距。

比如8421碼,1001和0000,有兩位不同,所以距離是2,而0010和0011的距離為1,是最小的距離,故8421碼碼距為1

那麽,碼距有什麽用呢?答案是碼距和這種類型的碼的檢錯,糾錯能力有關。

如8421碼,由於碼距是1,無檢錯,糾錯能力,比如數據0000,如果其中一位變化,變成0001,那麽,這個數據仍然是合法的。
再如奇偶校驗碼中奇校驗碼,如100000000和010000000,碼距為2,我們可以發現,如果數據中有一位變化了,如100000000變為110000000,我們可以很容易地判斷出數據出錯了,因為110000000不符合奇校驗的編碼(校驗位和數據位一起所含1的個數為奇數)

我們可以發現,校驗碼可以幫助擴大碼距,從而找出錯誤。

碼距與檢錯、糾錯能力的關系(當d≤4)

  • 若碼距d為奇數,則能發現d-1位錯,或能糾正(d-1)/2位錯。
  • 若碼距d為偶數,則能發現d/2位錯,並能糾正(d/2-1)位錯。

四.奇偶校驗碼

1.編碼方式

  • 無論數據位多少位,校驗位只有一位
  • 數據位和校驗位一共所含的1個數為奇數,稱為奇校驗
  • 數據位和校驗位一共所含的1個數為偶數,稱為偶校驗

例如(加粗為校驗位):

數據 奇校驗的編碼 偶校驗的編碼
00000000 100000000 000000000
01010100 001010100 101010100
01111111 001111111 101111111

由於數據傳輸過程一般是出現一位錯誤,而奇偶校驗碼能發現奇數個錯誤,所以奇偶校驗的實用價值還是很高的。

2.實現原理

那麽,奇偶校驗是怎麽來發現錯誤的呢?根據二.數據是如何校驗的我們可以知道,在數據傳輸之前,我們會求一次校驗位,傳輸後,會求一次校驗位,那麽,在奇偶校驗中,我們通過比較這兩個校驗位是否相同,一般是采用異或的方式,若結果為1,則說明有奇數個錯誤,結果為0,則說明正確或者偶數個錯誤。

五.海明校驗碼

1.引入

  • 在了解了奇偶校驗碼之後,我們可以稍稍做下思考,既然奇偶校驗碼具有一定的局限性,也就是只能檢測奇數的錯誤,並且不能改正錯誤,這也就意味著數據一旦傳輸錯誤,我們必須要重新上傳,那麽,我們有辦法確定錯誤發生的位置麽?只要確定了錯誤發生的位置,改正其實就是取反。
  • 這個時候,讓我們來看看奇偶校驗碼,它是在數據的前面或者後面加上以為校驗位,那麽,如果我們將數據分段,分成某些小段,這樣是不是能判斷錯誤發生的位置呢?

2.海明校驗碼 最簡單求法

我們以8位數據位,4(5)位校驗位為例

我們將海明校驗碼表示為(H13) H12 H11 H10 H9 H8 H7 H6 H5 H4 H3 H2 H1
其中加粗的部分為校驗位,校驗位所在位置為2^(i-1),i=1,2,3...
我們還可以把它寫成(P5) D8 D7 D6 D5 P4 D4 D3 D2 P3 D1 P2 P1
其中P代表的是校驗位,D代表數據位

12 11 10 9 8 7 6 5 4 3 2 1 S
2^0 D7 D5 D4 D2 D1 P1 S1
2^1 D7 D6 D4 D3 D1 P2 S2
2^2 D8 D4 D3 D2 P3 S3
2^3 D8 D7 D6 D5 P4 S4

技術分享圖片

我們來看看這個表是怎麽畫出來的

  • 首先數據位和校驗位的位置我們通過公式可以得出
  • 同列數據位所占的位置對應的行的值之和為列的值。舉個例子,如D1,所在列為3,所在行分別為2^0和2^1,即1和2,滿足式子1+2=3。

校驗位的值為同行數據位相異或得到,至於P5,則是由所有數據位和校驗位一起異或得到。

3.海明校驗碼判斷修復錯誤

下面引入一個錯誤字S的概念
其實錯誤字S也就是傳輸前後分別求的校驗位的異或值,奇偶校驗碼只要看一個錯誤字,而海明校驗碼則要考慮多個錯誤字。
S4 ~ S1為全0,說明沒錯. S4 ~ S1不為全0,說明有錯. S5=1說明1位出錯,而S5=0說明2位錯,不再有效,且不能查出是哪2位出錯。
S4~S1的編碼值對應的則是出錯的海明碼位號(不太清楚圖表可以返回上面的表格對照):
如1100,對應D8出錯
如1011,對應D7出錯
如1010,對應D6出錯
如1001,對應D5出錯......

  • Tip:我們通過觀察8個數據位4個校驗位的海明校驗碼,發現,若一位出錯,則至少有兩組校驗碼的生成收到影響,故我們得到其碼距為3,根據碼距與檢錯、糾錯能力的關系可以得出該校驗碼能發現兩位錯,或修改一位錯。

4.校驗碼位數的確定

前面看完後,一定有人會有疑問,為什麽八位數據位我要四位或者五位校驗位,三位不行麽?六位不行麽?那麽,請繼續看看下面

假定數據位數為n,校驗碼為k位,則故障字位數也為k位。k位故障字所能表示的狀態最多是2K,每種狀態可用來說明一種出錯情況。

若只有一位錯,則結果可能是:
數據中某一位錯 (n種可能)
校驗碼中有一位錯 (k種可能)
無錯 ( 1 種可能)

假定最多有一位錯,則n和k必須滿足下列關系:

2^k≥1+n+k, 即:2^k-1≥n+k

所以當數據有8位時,校驗碼和故障字都應有至少4位。

六.循環冗余碼(CRC碼)

1.為什麽大批量數據不用奇偶校驗?

在每個字符後增加一位校驗位會增加大量的額外開銷;尤其在網絡通信中,對傳輸的二進制比特流沒有必要再分解成一個個字符,因而無法采用奇偶校驗碼。

2.模2運算

在介紹CRC碼之前,有必要介紹下計算CRC碼必要的模2運算:

模2運算不考慮加法進位和減法借位,上商的原則是當部分余數首位是1時商取1,反之商取0。然後按模2相減原則求得最高位後面幾位的余數。這樣當被除數逐步除完時,最後的余數位數比除數少一位。這樣得到的余數就是校驗位。
技術分享圖片

3.基本思想

  • 數據信息M(x)為一個n位的二進制數據,將M(x)左移k位後,用一個約定的“生成多項式”G(x)相除,G(x)是一個k+1位的二進制數,相除後得到的k位余數就是校驗位。校驗位拼接到M(x)後,形成一個n+k位的代碼,稱該代碼為循環冗余校驗 ( CRC ) 碼,也稱(n+k,n)碼。
  • 一個CRC碼一定能被生成多項式整除,當數據和校驗位一起送到接受端後,只要將接受到的數據和校驗位用同樣的生成多項式相除,如果正好除盡,表明沒有發生錯誤;若除不盡,則表明某些數據位發生了錯誤。通常要求重傳一次。
    技術分享圖片

4.CRC碼求法

技術分享圖片
技術分享圖片

5.CRC碼檢錯

將收到的CRC碼用約定的生成多項式G(x)去除,如果碼字無誤則余數應位0,如果有某一位出錯,則余數不為0,不同位數出錯余數不同.
技術分享圖片

常用校驗碼(奇偶校驗,海明校驗,CRC)學習總結