当前位置:   article > 正文

CRC校验码的检错性能(一)—— 检出(或漏检)比例_crc检错率

crc检错率

0. 前言

CRC(Cyclic Redundancy Check,循环冗余校验),是一种数字编码技术,广泛应用于数字通信的传输差错检测,或数字存储的数据完整性检测,最早由W. Wesley Peterson于1961年发表的论文《Cyclic Codes for Error Detection》中提出(以下简称论文)。论文主体分为三个部分:

  • CRC校验码的基本数学原理、编/解码规则;

  • CRC校验码检错性能的8条定理及其证明;

  • CRC校验的两种编码电路。

本文是个人学习W. Wesley Peterson教授的论文的一些整理,如果您喜欢原汁原味,请点击原文链接。当然,本文也包含了原论文之外的一些内容。

重要提示:文中公式如果显示不全,请刷新页面重试

1. CRC校验编码及检错的基本规则

1.1 CRC校验的编码

CRC校验的编码是一种线性分组码的编码方法,将待编码的 k 位二进制序列 D[dk1,...,d0] 看作 GF(2) 域多项式 D(x) 的系数,将 D(x) 乘以 xr(对二进制序列而言,即左移 r 位并右侧补0)后得到一个新的多项式 xrD(x),将其除以一个预先选定的 r 次生成多项式 G(x),将得到一个次数小于 r  的余式 S(x),求余过程中得到的次数 k1r商式  Q(x) 未使用。此过程的数学描述为:

xrD(x)=Q(x)G(x)+S(x)

求出余式 S(x) 后,将其系数对应的 r 位二进制序列 S[sr1,...,s0] 附加于原信息位之后,即获得编码完成的 n=k+r 位待发送码字 M[dk1,...,d0,sr1,...,s0],这一过程的数学描述为:

M(x)=xrD(x)+S(x)

对于 GF(2) 域的多项式,其系数的加、减定义为模二加、减,依模二算术的定义,模二减和模二加是相同的操作,故上式可写为:

M(x)=xrD(x)S(x)=Q(x)G(x)

可以看到,CRC校验编码完成的码字有两个显著特点:

  • 信息位原样不变的出现在编码后码字的高 k 位,意味着接收端不需要任何的信息恢复译码电路;

  • 2k 个许用码字,其码多项式 M(x) 都是生成多项式 G(x) 的倍式,自然可以被相同的 G(x) 整除(余式为0)。

1.2 CRC校验的检错译码

要检错,我们首先需要搞清楚编码后的二进制序列在传输或存储过程中会出什么错?二进制序列嘛,就其比特而言,两种错:0→1或1→0。如果我们专业一点,用一个 n 位二进制序列 E[en1,...,e0] 来描述消息中对应比特的错误情况: ei=0 表示无错;ei=1 表示有错。好了,错误序列 E 中的某一位 ei=1 了,消息序列中对应位置的 mi 原来是0,那得变成1;原来是1,那得变成0。啰嗦半天,不就是个异或操作嘛!对,就是异或,还是模二加呢,所以,接收端收到的消息是这样的:

M(x)=M(x)+E(x)

当我们知道错误是如何描述时,那又如何识别错误呢?还记得发送编码时所有的 M(x) 都有一个可被 G(x) 整除的特征吗?管它啥用,先同样的操作来一遍看看(备注,这里的计算还是模二算术):

M(x)G(x)=M(x)+E(x)G(x)=Q(x)G(x)+E(x)G(x)

结果很明显嘛,原来的 M(x) 是可以被 G(x) 整除的,收到的不知道对不对的消息 M(x) 如果:

  • 不能被 G(x) 整除,只能是 E(x) 不能被 G(x) 整除,那必然说明有人动了我的消息;

  • 能被 G(x) 整除,那就麻烦了, E(x)=0E(x)0但恰好能被 G(x) 整除?有人动过我的消息?没人动过我的消息?天知道!

至此我们知道,CRC校验的编码和检错译码将采用完全相同的方法:GF(2) 域的多项式带余除法,求取一个多项式对生成多项式 G(x) 的余式。乍一看,又是多项式,又是除法,又是求余,还有个啥子有限域,这要用电路来实现的话,得多复杂哦?

但事实却是CRC校验的编/译码电路仅由一个 r 位的串行移位寄存器阵列 + 不多于 r 个的异或门构成其实现难度(或成本)比相同位宽的“校验和”电路还低

2. CRC校验码检错性能的定义

CRC校验码在工程实际中主要用于“对数字信息(二进制序列)在传输或存储过程中的差错进行检测”。

检错性能(指标)在量化描述时通常称为“检错率”,是一个百分比数值,是一个“样本”与“总和”的比值,但这是一种易混淆的称呼,依据“样本”与“总和”描述的维度,这个“率”将分别表示“比率”与“概率”:

  • 检出比例(Kd):CRC校验码“能检出的某种错误数量”占“此种错误总数量”的比例。这一性能由CRC校验的生成多项式 G(x) 和编码后的码字总长度决定。与检出比例对应的为漏检比例 Kud,有 Kd+Kud=1

  • 漏检概率(Pud):CRC校验码“未能检出已发生错误”的概率。这一性能由比特错误概率(ϵ)、码字长度 n 和许用码字重量分布 A 共同决定,有: Pud=i=1nAiϵi(1ϵ)ni。与(差错)漏检概率对应的是(差错)检出概率 Pd,同时,传输还有无差错概率 P0,三者之和是为全概率,有 Pd+Pud+P0=1

事实上,对于差错检测而言,几乎不太可能做到检出所有(100%)的错误,意即检测手段给出“无错”结论时,这一结论本身很难做到100%的置信度。因此,人们评价一种检错手段的性能时,通常真正关心的是“未能检出已发生错误”的概率,显然,这个概率越小越好!有鉴于此,本文将对CRC校验码检出比例的分析称为“定性分析”,而将对漏检概率的分析称为“定量分析”。

3. CRC校验码生成多项式G(x)的最基本要求

G(x) 必须是一个“首1尾1”的多项式,即 G(x) 的最高次项和零次项的系数必须是1。

r 位CRC校验码的生成多项式: G(x)=1xr+gr1xr1+...+g1x+1x0G(x) 的次数为 r,项数为 r+1

校验码是一个多项式除以 G(x) 的余式 R(x),依据多项式除法中余式的定义, R(x) 的次数必 <r,项数必 <r+1,故CRC校验码的宽度等于 G(x) 的次数 r

最简单的 G(x) = x + 1 ,校验位宽度为1,称为CRC-1,等同奇偶校验

  • 当CRC-1的余数寄存器初值规定为1时,等同奇校验;

  • 当CRC-1的余数寄存器初值规定为0时,等同偶校验。

4. CRC校验码的检错比例Kd是确定的

CRC校验码是典型的二进制线性分组码,当生成多项式选定后,校验位长度 r 随之确定,进一步确定信息位长度 k 后,编码后的码字长度 n=k+r 亦被确定。CRC校验通过线性编码将原 k 位信息码的码字集合由 2k 扩张为 2n2n 个码字组成的码字集合中,有 2k 个许用码字, (2n2k) 个禁用码字。

经编码后的消息码在传输或存储过程中,任意位的任意组合都可能发生错误,错误图样(码字)的长度同为 n,全 0 码字代表无错误而被排除在外,剩余的码字组成一个 (2n1) 个码字的错误图样(码字)集合。

当某个错误图样(码字)位于本CRC校验编码的 2k 个许用码字集合内时,错误不能检出,反之可被检出

包括CRC校验码在内的二进制线性分组码,记为 C(n,k)若以“能检出的错误数量”占“(可能的)总错误数量”之比例为研究对象,即错误的检出(或不能检出)比例 Kd (或 Kud )是确定的

  • 不可检出比例, Kud=2k12n12(nk)=2r ;

  • 可检出比例,Kd=(2n1)(2k1)2n1=2n2k2n112(nk)=12r

看到这里,初学者容易产生一个错觉(误解):“CRC校验码的检错性能就是由校验位长度决定的嘛,生成多项式随便选一个就可以了…,还整啥子多项式嘛,还整啥子除法嘛,干脆每个校验位都是前面位的奇偶校验也可以嘛…”。你要只从错误检出比例的角度来看这个问题,还真就是这样的!

IEEE 802.3暨以太网的32位CRC校验是讨论(研究)得比较广泛的一个CRC校验,其码字长度范围512 ~ 12144比特[1]

如果我告诉你:“某次12144比特的传输,这12144比特都是错的,但是CRC校验没检测出这个错误!”

你大概率会说:“你豁我哦,不可能!”,我知道,你说的是那12144比特不可能都是错的。

如果我告诉你:“某次12144比特的传输,其中有1个比特是错的,但是CRC校验没检测出这个错误!”

你大概率会说:“你豁我哦,不可能!”,我知道,你说的是CRC校验肯定能检测出单比特的错误。

所以,其实都知道,虽然都是在 (2n1) 种错误中,有 (2k1) 种检测不出来,但错误和错误是不一样的,有些出现的可能性大些,有些出现的可能性小些。也都能给出科学的指导:“那就抓大放小,把可能性大的错误挑出来!”这就是人们研究相同校验位长度下不同的CRC校验生成多项式的原因。

CRC校验定位的目标应用场景是低误码率的数字通信系统,错误比特数量越少的发生概率越大,因此,CRC校验生成多项式的选择原则很单一:就是让经该多项式编码的 2k 个许用码字中除全0码字外,剩余码字中1的比特数量尽可能的多。遗憾的是,这并不是一个可以轻易完成的工作。就笔者所知的范畴,除了W. Wesley Peterson在最早的论文中给出的8条定理可用于CRC校验生成多项式的快速评估,后续的研究[4.1]多数指向了“穷举法”,即选定CRC的校验位长度 r 后,从候选的 2r1 个多项式中,硬算某个多项式生成的码组的最小汉明距离或在给定误比特率下的漏检概率,以此筛选出满足目标应用的多项式。

[*4.1*]:

  • CRC校验生成多项式与其反多项式具有相同的检错性能,故 2r1 个候选多项式中,我们实际需要计算的数量可大致减半[2]
  • MacWilliams恒等式!让不可能变成了可能!例如IEEE 802.3的CRC-32,12144比特的码字长度,信息位长度 k=1214432=12112,2k1.2×103646,这对普通计算机来说,几乎是不可能完成的任务,但MacWilliams恒等式揭示了线性分组码重量分布与其对偶码重量分布之间的恒等关系,从而让我们可以计算这个32位CRC校验码的 232 个对偶码字的重量分布,让不可能变为了可能!
  • 生成多项式 G(x) 的汉明重量决定了其生成的CRC校验码字集合最小汉明距离的上限。注意,这是上限,是可能的最好情况,例如IEEE 802.3的CRC-32生成多项式的汉明重量为15,要想码组获得15的最小汉明距离,含校验位的码字长度须限制为42仅10个比特的信息位。在12144比特码字长度范围内,能提供的最小汉明距离 dmin=4,即可确保检测出错误比特数量3的所有错误[1]
  • 。。。。。。

5. CRC校验码对随机错误的检出比例

随机错误指某个比特是否出错是随机的,独立的,与其它比特是否出错或怎样出错无关。随机错误的检测是纠(检)错编码的主要研究对象。

5.1 单比特错误

  • 性能  :CRC校验可检测出所有单个比特的错误。本性能不受码长限制

  • 条件  :生成多项式 G(x) 非0系数的个数大于1。

  • 备注1:对应论文的定理1。

  • 备注2:基于CRC校验编码规则生成的线性分组码,其最小汉明距离大于等于2。

以CRC-4/ITU的 G(x)=x4+x+1 为例,发送数据0x3A5,其校验码 CRC (0x3A5) = 0x9,则发送端发送的码字为0x3A59,传输过程中,该码字的16-bits中有且仅有任意一位出现错误,则接收端可检测出该错误,如下图所示:

5.2 奇数个错误

  • 性能  :CRC校验可检测出所有“错误比特数量为奇数”的错误类型。本性能不受码长限制
  • 条件  :生成多项式 G(x) 非0系数的个数为偶数,或 G(x) 包含因式 (x+1),这两个条件等价,满足其中一个,则另一个必然满足。(x+1) 是 (xi+1) 的因式,故 G(x) 包含因式(xi+1)时也满足本条件。
  • 备注1对应论文的定理2。
  • 备注2生成多项式 G(x) 非0系数的个数为奇数时不表明能检测所有偶数个错误,不可类推
  • 备注3生成多项式 G(x) 不满足非0系数的个数为偶数的条件时,只是不能检测出全部的“错误比特数量为奇数”的错误类型,该多项式仍能检测出大部分(=12r的“错误比特数量为奇数”的错误类型。

以CRC-4/ITU的 G(x)=x4+x+1 为例,发送数据0x3A5,其校验码 CRC (0x3A5) = 0x9 ,则发送端发送的码字为0x3A59。因 G(x) 不满足本条件,传输过程中,该码字的16-bits中分别出现了3-bits、5-bits的错误,接收端未检测出该错误,如下图所示:

G(x) 不满足本条件时,只是不能检测出全部的“错误比特数量为奇数”的错误类型。如上图所示的两种错误图样,G(x)=x4+x+1 未能检出错误,但如下图所示的错误图样,接收端可检出错误:

以CRC-4/SAE J2716的 G(x)=x4+x3+x2+1 为例,发送数据0x3A5,其校验码 CRC (0x3A5) = 0x3,则发送端发送的码字为0x3A53。因 G(x) 满足本条件,传输过程中,该码字的16-bits中错误比特数量为奇数时,接收端可检测出该错误,如下图所示:

5.3 双比特错误

对于 GF(2) 域的一个非0多项式 G(x),使得 G(x) 整除 xe+1 的最小正整数 e,称为 G(x) 的阶(order),有时也称为G(x)的周期(period)或指数(exponent)。例如,G(x)=x4+x+1 的阶为15,G(x)=x4+x3+x2+1 的阶为7。

  • 性能  :CRC校验可检测出一定码长内所有“错误比特数量为2”的错误类型。
  • 条件  :CRC校验码的总长度 n(信息位 + 校验位)小于等于生成多项式 G(x) 的阶 e 
  • 备注1对应论文的定理3。
  • 备注2论文只讨论了码字长度 ne 的情况,本文扩展了码字长度 n>e 时,间隔距离不等于整数倍 e 的双比特错误类型都能检出。

以CRC-4/ITU的 G(x)=x4+x+1(阶e=15)为例,发送数据0x3A5,其校验码 CRC (0x3A5) = 0x9,则发送端发送的码字为0x3A59。因 G(x) 的阶 e=15当码字长度 n15 时,可检测出所有双比特错误。本例码字长度 n=16 ,有且只有一种双比特错误图样不能检测,如下图所示:

以CRC-4/SAE J2716的 G(x)=x4+x3+x2+1 为例,发送数据0x3A5,其校验码 CRC (0x3A5) = 0x3,则发送端发送的码字为0x3A53。因 G(x) 的阶 e=7,当码字长度 n7 时,可检测出所有双比特错误。本例码字长度 n=16,将有11种双比特错误图样不能检测,设双比特错误图样对应的多项式为 E(x)=xi+xj=xj(xij+1),i>j,双比特错误的码距 d=ij,当:

  • 码距 d 能整除 G(x) 的阶 e 时,不能检出对应的双比特错误图样;
  • 码距 d 不能整除 G(x) 的阶 e 时,能检出对应的双比特错误图样。

如下图所示的 11 种错误图样均不能检出错误(16-bits码长,共计 (162)=16!2!×(162)!=120 种双比特错误图样,其余的12011=109 种双比特错误图样可检出错误):

5.4 1~3比特错误

  • 性能  :CRC校验可检测出一定码长内所有“错误比特数量 3”的错误类型。
  • 条件  :生成多项式形如 G(x)=(x+1)G1(x),其中 G1(x) 的阶为 e
  • 备注1对应论文的定理4。

本条性能是前述检错性能及条件的综合:

  • G(x) 的非0系数个数 > 1,可检测出任意长度码字内的单比特错误;
  • G(x) 包含因式 x+1,可检测出任意长度码字内的奇数个比特错误;
  • 码字长度小于 G(x) 的阶时,可检测出码字内的双比特错误。

综上,形如 G(x)=(x+1)G1(x) 的生成多项式(其中 G1(x) 的阶为 e),在码字长度 ne 时,可检测出该码字内所有“错误比特数量 3”的错误类型。

6. 突发错误(Burst-Error)

突发错误(Burst-Error),指一段(块)连续的错误,通常由通信的外部干扰或存储的介质损坏导致。突发错误以首、末两个错误位界定,不关心此两位之间的比特是否错误,如下图所示:

突发错误所覆盖的全部(含首、末错误位)比特数量,称为突发长度 l,对应的多项式可表示为 E(x)=xi(xl1+el2xl2+...+e1x+1)=xiE1(x)E1(x) 的次数为 (l1) 。对于一个长度为 l2 的突发错误,首、末错误位之间的 (l2) 比特可以是任意的,共计 2l2 种不同的错误图样。

单比特错误(E(x)=xi)是一种特殊的突发错误,其突发长度 l=1,只有一种错误图样。

6.1 单突发错误

任何满足“首1尾1”这一最低要求的CRC校验码生成多项式 G(x) (次数 r,校验位长度 r),因 xi 不能整除 G(x),故当且仅当 E1(x)=Q(x)G(x) 时,该突发错误不能检出。CRC校验对“单个突发错误的 2l2 种可能”的检测能力(检出或不能检出的比例)分三种情况讨论(对应论文的定理56):

  • 可检测出所有的突发长度 l ≤ 校验位长度 r 的突发错误。此情况下, E1(x) 的次数(l1)小于G(x) 的次数 r,显然不能整除 G(x) ,该突发长度下的 2l2 个错误可全部检出,不能检出的比例为0
  • 当突发长度 l=r+1 时,该长度突发错误不能检出的比例为 1/2r1该突发长度条件下,本突发错误位置区间内,共计 2l2=2r1 种错误图样,且 E1(x) 的次数为 l1=r,与 G(x) 的次数相等,有且只有 E1(x)=G(x) 一种错误不能检出,故不能检出的比例为 1/2r1 。
  • 当突发长度 l>r+1 时,该长度突发错误不能检出的比例为 1/2r该突发长度条件下,本突发错误位置区间内,共计 2l2 种错误图样,其中满足 E1(x)=Q(x)G(x) 的错误图样不能检出。依定义,E1(x) 、G(x) 均为“首1尾1”的多项式,则 Q(x) 也必为“首1尾1”的多项式,且次数为l1r,即 Q(x)=xl1r+...+1,共 (l1r+1)=(lr) 项,中间位置的 lr2 项的系数可任意,故 Q(x) 共 2lr2 种选择,不能检出的比例 Kud=2lr2/2l2=1/2r 。

一个基于CRC校验原理编码的码字,其长度(含校验位)为 n,有且仅有一个长度为 l 的突发错误,虽然突发错误的长度是确定的,但其在整个码字中的分布位置却是可变的,如下图所示:

以长度为 l 的单个突发错误在码字中的分布位置为统计对象,共计 nl+1 种可能,则整个码字中长度为 l 的单个突发错误所对应的错误图样总数按比例扩大为 (nl+1)×2l2,CRC校验码对这些错误的检出(或不能检出)数量亦等比例扩大,即总的检出(或不能检出)比例保持不变。

6.2 双突发错误

形如 G(x)=(x+1)G1(x) 的生成多项式(其中 G1(x) 的阶为 e),在码字长度 ne 条件下,错误图样为以下四种(突发)错误组合的任意一种时,可检出错误(备注:对应论文的定理7):

  1. E(x)=xi+xj
  2. E(x)=(xi+xi+1)+xj
  3. E(x)=xi+(xj+xj+1)
  4. E(x)=(xi+xi+1)+(xj+xj+1)

其中:1)为双比特错误图样,见前文5.3;2)、3)为奇数个比特错误图样,见前文5.2;4)可写为 E(x)=(x+1)(xi+xj)(x+1) 作为 E(x) 、G(x) 的公因式,可约掉,转变为双比特错误图样的检测。

一个基于CRC校验原理编码的码字,其长度(含校验位)为 n,有两个独立的突发错误,如下图所示:

两个突发错误的长度分别为 l1l2,错误图样对应的多项式为 E(x)=xiE1(x)+xjE2(x) ,当以下条件都满足时,该错误图样可被检出(证明见论文的定理8):

  •  生成多项式形如 G(x)=(xc+1)G1(x) ;
  •  G1(x) 是阶为 e,次数为 r 的不可约多项式;
  •  G1(x) 的次数 r 不小于 l1l2 中较小值,即 rmin(l1,l2)
  •  码字长度 n 应不大于 c e 的最小公倍数,即 nLCM(c,e)
  •  (c+1) 应不小于两个突发长度之和,即 (c+1)(l1+l2) 。

关于“( c + 1 )应不小于两个突发长度之和”的条件,笔者认为并无理解上的偏差,下图为论文原文:

但前文已证明 E(x)=(xi+xi+1)+(xj+xj+1) 的双突发错误模式可被形如 G(x)=(x+1)G1(x) 的生成多项式检出错误,此时,c=1,l1=l2=2,并不满足 (c+1)(l1+l2) 的条件。

讨论:按说“定理8”应是“定理7”的一般化,但似乎有点儿不对?正如W. Wesley Peterson教授所言,定理8的证明很长,我也确实没看明白

参考文献

[1]、Dunia Prieto. Study of Undetected Error Probability of IEEE 802.3 CRC-32 code for MTTFPA analysis.

[2]、Philip Koopman. 32-Bit Cyclic Redundancy Codes for Internet Applications.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/683801
推荐阅读
相关标签
  

闽ICP备14008679号