2. CRC数学基础与星载适用性
CRC(Cyclic Redundancy Check,循环冗余校验)之所以能在星载数据链中长期占据核心地位,根本原因在于它建立在有限域GF(2)之上,用极少的硬件代价换取了可量化、可证明的检错能力。理解这一点的关键,不是记住某个生成多项式,而是理解GF(2)上的多项式运算规则、模2除法的余数含义,以及生成多项式如何决定检错边界。
一、GF(2)与多项式表示:把比特串变成"系数"
GF(2)是最简单的有限域,只有两个元素0和1,加法等价于异或(XOR),乘法等价于与(AND)。在CRC中,我们不把数据看成整数,而是把一串比特看成GF(2)上多项式的系数。例如数据字节 0xB5 = 1011 0101,按从高位到低位的顺序,对应多项式:
0xB5 → x^7 + x^5 + x^4 + x^2 + 1
这里约定:最左边的比特是最高次项系数,最右边是最低次项(常数项)。这个约定必须在发送端和接收端完全一致,否则校验必然失败。星载协议中通常还会规定比特发送顺序(MSB first 或 LSB first),它与多项式系数顺序是两回事,需要分别明确。
GF(2)上的多项式加法就是逐位异或,没有进位;减法与加法相同,因为 -1 = 1。这一性质使得CRC的编码和译码都可以只用异或和移位实现,不需要乘法器、不需要除法器,非常适合星载FPGA或ASIC中的低资源实现。
二、生成多项式与模2除法:余数就是校验码
CRC的核心操作是模2除法:把"数据多项式左移r位"后除以一个r次生成多项式G(x),得到的r位余数就是CRC校验码。设数据多项式为M(x),生成多项式为G(x)(最高次为r),则:
M(x) · x^r = Q(x) · G(x) + R(x)
CRC = R(x),即余数
发送码字 T(x) = M(x) · x^r + R(x)
由于GF(2)中加法即减法,T(x) = M(x)·x^r + R(x) 必然能被G(x)整除,余数为0。接收端只要对收到的码字做同样的模2除法,余数为0则认为无错,非0则判定出错。
以一个教学示例说明:设数据 M = 1101(即 x³+x²+1),生成多项式 G = 1011(即 x³+x+1,r=3)。先左移3位得 1101000,再做模2除法:
1110
________
1011 ) 1101000
1011
----
1100
1011
----
1110
1011
----
101 ← 余数 R = 101
因此发送码字为 1101 101。接收端若收到 1101101,除以1011余数为0,判定正确;若某一位翻转,余数通常非0。这个例子中的数值仅用于说明算法,实际星载系统会使用更长、经过严格筛选的生成多项式。
三、检错能力:由生成多项式的结构决定
CRC的检错能力不是"概率性猜测",而是由G(x)的代数性质决定的。几条关键结论如下:
- 所有单比特错误都能检出:只要G(x)含有(x+1)以外的非零常数项,即G(0)=1,任何单项式x^k都不能被G(x)整除。
- 所有双比特错误都能检出:只要G(x)不是x^i+1形式的因子,且G(x)不含x因子。常用生成多项式都满足这一条件。
- 所有奇数个比特错误都能检出:只要G(x)含有因式(x+1)。因为奇数个错误对应的多项式在x=1处值为1,而含(x+1)的G(x)在x=1处值为0,无法整除。
- 所有长度≤r的突发错误都能检出:r为G(x)的次数。这是CRC在星载信道中最有价值的性质之一,因为空间辐射导致的错误常表现为短突发。
- 长度>r的突发错误漏检概率约为2^(-r):在随机错误模型下,漏检概率上界为2^(-r)。
需要强调的是,上述结论大多建立在"错误图样随机均匀"的假设上。星载环境中,单粒子翻转(SEU)造成的错误往往集中在少数比特,突发错误比例较高,因此突发检错能力比随机漏检概率更值得关注。
四、漏检概率与星载选型依据
在随机独立比特错误模型下,若比特错误率为p,未编码数据长度为n,则CRC漏检概率近似为:
P_undetected ≈ 2^(-r) · (1 - (1-p)^n) (p较小时)
≈ 2^(-r) · n · p
例如r=16、n=1024字节(8192比特)、p=1e-6时,漏检概率约为 2^(-16)×8192×1e-6 ≈ 1.25e-7。若把r提高到32,同样条件下漏检概率降到约1.9e-12。这就是星载高可靠链路普遍采用CRC-32甚至CRC-32C的原因:每增加16位校验,漏检概率下降约4个数量级,而硬件代价仅增加16个触发器。
星载选型时,除了位数,还要看生成多项式的具体形式。常用候选包括:
| 生成多项式 | 次数r | 典型应用 | 关键性质 |
|---|---|---|---|
| CRC-16/CCITT (0x1021) | 16 | 遥测帧、分包数据 | 含(x+1),检奇数错 |
| CRC-16/IBM (0x8005) | 16 | 早期星载总线 | 突发检错强 |
| CRC-32/ISO-HDLC | 32 | 星上文件、图像数据 | 漏检概率极低 |
| CRC-32C (Castagnoli) | 32 | 高速星载链路 | 硬件实现友好 |
选型时建议按以下顺序判断:第一,确定可接受的漏检概率上限,反推所需r;第二,确认生成多项式是否含(x+1)以覆盖奇数错;第三,评估突发错误长度分布,确保r大于典型突发长度;第四,核对星载协议或地面系统是否已有强制规定,避免互操作性风险;第五,评估FPGA查找表、触发器和时序开销。对多数低轨遥测链路,CRC-16/CCITT已足够;对高速数传和存储数据,CRC-32C更稳妥。
最后需要提醒:CRC只能检错,不能纠错。在星载高可靠链路中,CRC通常与FEC(前向纠错)、ARQ(自动重传请求)或地面重传机制配合使用。CRC的价值在于以极低成本提供一道"最后防线",确保错误数据不会被误当作正确数据送入星务计算机或地面处理系统。理解GF(2)、生成多项式和模2除法,是正确选择和使用CRC的前提,也是后续实现星载CRC编解码模块的数学基础。