编码理论及其应用 -- 2循环冗余校验码 (CRC)

1. 简介

循环冗余校验码 (Cyclic Redundancy Chck, CRC) 是一种线性分组校验码 [1]。最早由计算数学家 William Wesley Peterson 于1961年提出。在通信设备的数据传输过程中,为了保证传输的可靠性,通常需要引入信息编码技术进行错误校验 (Error Detection) 和错误校正 (Error Correction)。CRC 循环冗余校验码属于错误校验 (Error Detection) 中常用的一种方法。


2. 计算

Step 1: CRC 循环冗余校验码的前提是通信双方共享同一个最高次数为 r r r的生成多项式 G ( x ) = g 0 + g 1 x + g 2 x 2 + ⋯ + g r x r G(x)=g_0 + g_1x + g_2x^2 + \cdots + g_{r}x^{r} G(x)=g0+g1x+g2x2++grxr

Step 2: 给定 k k k位的原始信息 M = [ m 0 , m 1 , m 2 , ⋯   , m k − 1 ] M=[m_0, m_1, m_2, \cdots ,m_{k-1}] M=[m0,m1,m2,,mk1],其相应的多项式表达为 M ( x ) = m 0 + m 1 x + m 2 x 2 + ⋯ + m k − 1 x k − 1 M(x)=m_0 + m_1x + m_2x^2 + \cdots + m_{k-1}x^{k-1} M(x)=m0+m1x+m2x2++mk1xk1

Step 3: 编码后的原始信息等于编码前的原始信息加上一个 r r r 位的校验余数后缀。CRC 循环冗余校验有两个条件,其一,编码后的信息总长为 k + r k+r k+r,其二,编码后的信息后 r r r 位值为校验余数值。为了同时实现这两个条件,一个可行的方法是将原始信息 M ( x ) M(x) M(x)乘以 x r x^r xr后,将得到的 x r M ( x ) x^rM(x) xrM(x)模二除 [3], [4] 生成多项式 G ( x ) G(x) G(x),舍去商 ξ \xi ξ,保留余数 R ( x ) R(x) R(x),即 R ( x ) = x r M ( x ) − ξ G ( x ) R(x)=x^rM(x) - \xi G(x) R(x)=xrM(x)ξG(x)。然后将 R ( x ) R(x) R(x) 加上 x r M ( x ) x^rM(x) xrM(x),得到带有校验和的编码后的信息 C ( x ) = x r M ( x ) + R ( x ) C(x)=x^rM(x)+R(x) C(x)=xrM(x)+R(x)——实现CRC循环冗余校验的两个条件。

Step 4: 发送方将带有校验和的编码信息 C ( x ) C(x) C(x) 发送给接收方。

Step 5: 接收方收到该编码信息 C ( x ) C(x) C(x) 后,同样地,将 C ( x ) C(x) C(x) 模二除 [3], [4] 同一个生成多项式。如果余数是零,说明通过CRC循环冗余校验,未发现编码信息 C ( x ) C(x) C(x) 存在异常错误;如果余数不为零,说明未通过CRC循环冗余校验,发现编码信息 C ( x ) C(x) C(x) 存在异常错误。


3. 举例

Step 1: 假设通信双方共享同一个最高次 r = 4 r=4 r=4 的生成多项式 G ( x ) = x 4 + x 3 + x 2 + 1 G(x)=x^{4}+x^3+x^2+1 G(x)=x4+x3+x2+1

Step 2: 给定 k = 3 k=3 k=3 位原始信息 M = [ 1 , 0 , 1 ] M=[1, 0, 1] M=[1,0,1],其相应的多项式表达为 M ( x ) = 1 x 2 + 0 x 1 + 1 x 0 = x 2 + 1 M(x)=1x^2+0x^1+1x^0=x^2+1 M(x)=1x2+0x1+1x0=x2+1

Step 3: 为了满足CRC循环冗余校验码的两个条件,即编码后的信息总长为 k + r k+r k+r 位,且编码后的信息的后 r r r 位的值为校验余数值。 一个可行的方法是将 x r x^r xr 乘以 M ( r ) M(r) M(r) 得到 x r M ( x ) = x 6 + x 4 x^rM(x)=x^6+x^4 xrM(x)=x6+x4。接着将 x r M ( x ) x^rM(x) xrM(x)模二除生成多项式 G ( x ) = x 4 + x 3 + x 2 + 1 G(x)=x^{4}+x^3+x^2+1 G(x)=x4+x3+x2+1,舍去商 ξ ( 111 ) \xi (111) ξ(111),保留余数 R ( x ) = x + 1 R(x)=x+1 R(x)=x+1。 最后将 R ( x ) R(x) R(x) 加上 x r M ( x ) x^rM(x) xrM(x),得到带有校验和的编码后的信息 C ( x ) = x 6 + x 4 + x + 1 C(x)=x^6+x^4+x+1 C(x)=x6+x4+x+1

    111 
------- 
1010000
11101
-----
 100100
 11101
 -----
  11110
  11101
  -----
   0011

Step 4: 发送方将带有校验和的编码信息 C ( x ) = x 6 + x 4 + x + 1 C(x)=x^6+x^4+x+1 C(x)=x6+x4+x+1 发送给接收方。

Step 5: 接收方收到该编码信息 C ( x ) C(x) C(x) 后,同样地,将 C ( x ) C(x) C(x) 模二除 [3], [4] 同一个生成多项式。如果余数是零,说明通过CRC循环冗余校验,未发现编码信息 C ( x ) C(x) C(x) 存在异常错误;

    111 
------- 
1010011
11101
-----
 100111
 11101
 -----
  11101
  11101
  -----
   0000

如果余数不为零,说明未通过CRC循环冗余校验,发现编码信息 C ( x ) C(x) C(x) 存在异常错误。

    111 
------- 
1010010
11101
-----
 100110
 11101
 -----
  11100
  11101
  -----
   0001

4. CRC生成多项式标准

Code Generator Polynomial, G(x) Appended Bits, r Applications
CRC-4 x 4 + x + 1 x^4+x+1 x4+x+1 4 ITU G.704
CRC-8 x 8 + x 2 + x + 1 x^8+x^2+x+1 x8+x2+x+1 8 ATM header
CRC-10 x 10 + x 9 + x 5 + x 4 + x + 1 x^{10}+x^9+x^5+x^4+x+1 x10+x9+x5+x4+x+1 10 ATM AAL
CRC-16 x 16 + x 12 + x 5 + 1 x^{16}+x^{12}+x^5+1 x16+x12+x5+1 16 Bluetooth
CRC-32 x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x + 1 x^{32}+x^{26}+x^{23}+x^{22}+x^{16}+x^{12}+x^{11}+x^{10}+x^8+x^7+x^5+x^4+x^2+x+1 x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 32 LANs

5. 小结和展望

本文主要介绍CRC循环冗余校验码的原理。进一步的工作主要是关于CRC循环冗余校验能力的分析——即,近世代数中本原多项式 (Primitive polynomial) 的数学分析 [7] 和其在CRC循环冗余检验码的校验能力的应用推广 [8]。


参考资料

[1] 线性分组校验码 https://www.eee.hku.hk/~sdma/elec7073/Part2-2-Cyclic redundancy check (CRC).pdf.
[2] 循环冗余校验码 https://en.wikipedia.org/wiki/Cyclic_redundancy_check
[3] 模二除 https://baike.baidu.com/item/模2除法
[4] 模二除 https://zh.wikipedia.org/zh-hk/模除.
[5] 模二除运算过程生成器 https://asecuritysite.com/comms/mod_div?a=10011&b=11.
[6] CRC生成多项式标准 https://www.eee.hku.hk/~sdma/elec7073/Part2-2-Cyclic redundancy check (CRC).pdf.
[7] Primitive Polynomial https://en.wikipedia.org/wiki/Primitive_polynomial_(field_theory).
[8] CRC校验能力 https://www.computing.dcu.ie/~humphrys/Notes/Networks/data.polynomial.html

你可能感兴趣的:(编码原理)