2.2 校验码:奇偶校验、海明码与 CRC

码距与检错纠错能力,奇偶校验码,海明码的编码、检错与纠错,循环冗余校验码的生成与校验。

考查要求 ★★★ 重点掌握 码距奇偶校验海明码校验位数海明码纠错CRC 模 2 除法

码距

由若干位代码组成的一个字称为码字。将两个码字逐位进行对比,具有不同的位的个数称为这两个码字间的距离。一种编码方案可能有若干合法码字,各合法码字间的最小距离称为码距 dd。

奇偶校验码

在有效信息位上添加一位校验位,使整个校验码中”1”的个数为奇数(奇校验)或偶数(偶校验)。

  • 偶校验位 = 所有信息位的异或:P=b1⊕b2⊕⋯⊕bnP = b_1 \oplus b_2 \oplus \cdots \oplus b_n;奇校验位为其取反;
  • 只能检测奇数位的错误,不能纠错,也不能检测偶数位的错误;
  • 实现简单,常用于存储器读写检查或 ASCII 码传送。

海明码

海明码的设计思想:在有效信息位中加入几个校验位形成海明码,使码距比较均匀地拉大,并把海明码的每个二进制位分配到几个奇偶校验组中。当某一位出错后,就会引起有关的几个校验位的值发生变化,这不但可以发现错误,还能指出错误的位置,为自动纠错提供依据。

校验位个数:设信息位为 nn 位,校验位为 kk 位,则需满足

2k≥n+k+12^k \ge n + k + 1

即 kk 位校验位能表示 2k2^k 种状态,其中 1 种表示无错,其余 2k−12^k - 1 种用于指出 n+kn + k 位中哪一位出错。例如 n=4n = 4 时 k=3k = 3;n=8n = 8 时 k=4k = 4;n=16n = 16 时 k=5k = 5。

编码步骤(以偶校验为例):

  1. 校验位 PiP_i 放在位号为 2i−12^{i-1} 的位置上(H1,H2,H4,H8,…H_1, H_2, H_4, H_8, \ldots),信息位按顺序放在其余位置;
  2. 每个信息位由位号的二进制表示中为 1 的那些校验位共同负责。例如 H7H_7(111)由 P1P_1、P2P_2、P3P_3 共同校验,H6H_6(110)由 P2P_2、P3P_3 校验;
  3. PiP_i = 它所负责的所有信息位的异或。

检错与纠错:接收端对每一组(含校验位本身)重新求异或,得到指错字 Sk⋯S2S1S_k \cdots S_2 S_1。若全为 0 则无错;否则其二进制值就是出错的位号,将该位取反即可纠正。

交互演示海明码:编码、出错与纠错(点击"接收端"的某一位使其出错)
k = 4 位信息,需要 r = 3 位校验(2ʳ ≥ k + r + 1),码长 n = 7H1P1H2P2H3D1H4P3H5D2H6D3H7D4发送端1011010接收端1001010S1 = 11000S2 = 10010S3 = 01010每个校验位 Pᵢ 负责位号的二进制表示中第 i 位为 1 的那些位;Sᵢ 为这些位(含 Pᵢ)的异或。
指错字 S3…S1 = 011= 3,说明第 3 位(H3)出错,将其取反即可纠正。

循环冗余校验码(CRC)

CRC 码的基本思想:在 KK 位信息码之后拼接 RR 位校验码,整个编码长度为 N=K+RN = K + R 位。生成规则:

  1. 根据生成多项式 G(x)G(x) 写出对应的二进制位串(最高次为 RR,共 R+1R + 1 位)。例如 G(x)=x3+x2+1G(x) = x^3 + x^2 + 1 对应 1101;
  2. 在信息码后面补 RR 个 0;
  3. 用补 0 后的信息码对 G(x)G(x) 进行模 2 除法(不借位、不进位的减法,即异或),得到 RR 位余数;
  4. 把余数拼接在信息码后面,就得到 CRC 码。
动画演示CRC 循环冗余校验码:模 2 除法
商1101 )101001000
1/14生成多项式 G(x) 对应 1101,最高次为 r = 3。先在信息位 101001 后面补 3 个 0,得到被除数 101001000

检错:接收端将收到的 CRC 码用同一个 G(x)G(x) 进行模 2 除法,若余数为 0,则认为没有错误;若余数不为 0,则说明传输过程中出现了错误(在合理选取生成多项式时,余数与出错位置有一一对应关系,因此 CRC 码也可以纠正 1 位错误,但实际通常只用于检错)。

即时练习

即时练习4 题
点击选项即可作答
  1. 1
    用海明码对长度为 8 位的数据进行检/纠错时,若能纠正一位错,则校验位数至少为( )。
  2. 2
    下列编码中,能检测出所有长度小于或等于校验位(检测位)长度的突发错的校验码是( )。
  3. 3
    若信息码字为 111000110,生成多项式 G(x) = x⁵ + x³ + x + 1,则计算出的 CRC 校验码为( )。
  4. 4
    某数据的 7 位编码为 0100011,若要增加一位奇校验位(在最高位之前),则编码为( )。
学完了吗?

标记完成后,侧栏会显示进度。进度仅保存在本浏览器中。