校验方法综述、奇偶校验、海明纠错、循环冗余校验

在本个内容中我们会进行校验方法综述、奇偶校验、海明纠错、循环冗余校验的相关内容讲解,本文参考于吴迪副教授的资料,浙江大学华中科技大学课程所著

在进行讲解之前,我们需要了解几个基本概念

        码距,编码集的码距,校验码,SEC,ECC,多重奇偶校验,海明码,生成多项式,异或运 算,模 2 运算,CRC 码

一、校验方法综述

1.为什么要对信息进行校验?

        受外界电磁环境的影响,可能造成电容的充电和放电 以及触发器的翻转,这样,存储的信息就 可能出错

2.为了能够校验出信息是否正确,如何进行编码?

        理查德·海明(Richard Hamming)发明了一种广泛应用于存储器的冗余技术,并因此获得 1968 年的图灵奖。海明使用奇偶校验码进行错误检测。

3.纠错或检错能力与什么因素有关?

        通过本页的例子得到:d-1=e+t。(由《计算机组成原理教材》(谭志虎版本)表 2.17 可以总结得到)

4.校验出信息出错后是如何进行纠错? 也就是如何找到出错位。

首先我们给出

【码距】(海明距离)d 的定义:两个编码对应二进制位不同的个数。

比如:10101 和 00110 的码距:d=3.

【编码集的码距】:在一个有效编码集合中,任意两个码字的最小距离。

【校验码】:具有发现错误或者纠正错误能力的数据编码。作用是扩大码距,从而通过编码规则 来识别错误代码。

问:如果代码要具有检错、纠错能力,代码应该符合怎样的条件呢?

答:也就是说,哪些代码不在代码集合中,如果出现了,就能确认这些代码是错误的。

一般来说,码距越大,抗干扰能力越强,纠错能力越强;数据冗余越大,编码效率越低。 编码的检测能力和纠错能力与什么有关,我们来看看合法代码的集合:

1. 假如说我们的合法代码集合是第一行所示。

        比如说: 000 出错了,变成了 001,而 001 也在合法代码集合中,那么计算机是很难检测出这个 代码出错了(或者根本检测不出来)

2. 改造一下,假如合法代码只包含 4 个,如第二行。 编码的特点是:1 的个数是偶数个。

        如果这个时候有 1 位错,

        比如:000 存放在某个内存单元,但是读出的时候,我读到的是 100,那么,是可以检测到出错 了;但是,能不能知道哪一位错误呢?不能

        因为 000,101,110 的一位错,都可能造成 100

3. 如果采用【三倍冗余】的方式——即:用 000 表示 0,用 111 表示 1。

        来看看能否检测出 1 位错,能否纠正 1 位错

        比如:100,不在代码集合中。在出错的过程中,会有多种类型的故障,可能是 1 位错、2 位错、 3 位错,而 1 位错的概率最大,甚至超过 90%。所以,如果收到的出错的代码是 100 的话,那么,原 始保存的代码应该是 000,于是,便判断出了是第一位错,并且可以纠错。

         能不能判断两位错呢?比如:110,看上去好像是 000 发生两位错,实际上 111 也可能是发生 1 位错造成 110。所以【检 1 位错,纠 1 位错】

4. 合法代码集合:【四倍冗余】

这种情况下,检测出 1 位错,纠正 1 位错是没有问题的;我们来看一下能否检测出两位错

比如:1100 到底是哪两位出错,无法判断。

但是可以纠正 1 位错误,比如 1000,可以纠正 1→0

5.【5 倍冗余】

11000,便可以检测到两位错,能纠正这两位

    如果是 11100,会纠正成为 11111,而检测不出来三位错

通过这里的分析,我们不禁回到之前提出的问题:编码的检测能力和纠错能力与什么有关呢?

通过分析:1 中,从一个合法代码到另外一个合法代码,至少要改变 1 位

                  2 中,从一个合法代码到另外一个合法代码,至少要改变 2 位

                  3 中,从一个合法代码到另外一个合法代码,至少要改变 3 位

所以:【任意两组合法代码之间 二进制位 的 最少差异数】,差异越大,检错和纠错的能力就越 强。我们可以得出结论

        合法代码集合中的一个合法代码,把它变成这个集合中另外一个合法代码,需要改变的最少的二 进制数的位数——就是【编码的最小距离】

        编码的纠错、检错能力与编码的这个最小距离直接相关。最小距离越大,检错和纠错能力就越强。 我们可以用一个公式来描述检错能力、纠错能力 与 编码的最小距离 之间的关系,即:d-1 = e + t ( e ≥ t ) 这是一个经验公式。

        如果 d=3,则 d-1=2,通过上面的分析我们可以看到,要使得编码具有一位的纠错能力,那么, 它至少需要 1 位的检错能力。

        同学们还可以思考一下,d 的最小值是多少?

        由这个公式,我们可以看到,要提高校验码的检错和纠错能力,就必须增大码距,而增大码距又 必须增加更多的校验位,这会带来时间和成本上的开销。

因此,需要综合考虑,选择性价比高的校验码。所以,我们主要讨论【奇偶校验】【海明码】【循 环冗余校验】

SEC:Single-bit Error Correction (单位错误纠正),海明码便是这样的例子。

ECC:Error Correction Code 纠错码

        而海明码是具有一位纠错能力的编码,除此之外,海明码还采用了奇偶校验的方式,而且是一种 分组(非划分型分组)的奇偶校验。因此,我们首先学习奇偶校验。

        奇校验——一个校验位+原来的数据位 ,使得代码中 1 的个数为奇数个。

        偶校验——一个校验位+原来的数据位 ,使得代码中 1 的个数为偶数个。

二、奇偶校验和海明纠错码

        我们来看看改进的奇偶校验(多重奇偶校验):

        原始数据:根据偶校验,分别在行和列进行【配偶】(配置到偶数个 1)。

在收到数据后,每行会产生一个偶校验位,每列也会产生一个偶校验位。

         图 1:假设是 1 位错,则可以通过行、列定位出错位,并且可纠正这 1 位错。

         但是对于图 3:第 3 行有偶数位错,那么这一行的【检错码】不会发生变化,因此,检测不到这 样的错误。

         大家可以验证:交叉校验编码可以检测出所有奇数位错、所有双位错、所有 3 位错,大多数 4 位 错(4 个出错位正好位于矩形 4 个定点除外);

         可以纠正一位错、部分多位错误。

        它大大降低了误码率,适用于中、低速度传输系统和反馈重传系统,被广泛应用于通信和某些计 算机外部设备中。

海明纠错码

        简单的奇偶校验把整个被校验的信息分成一组,且只设置一位校验位,因此检错能力弱,无纠错 能力。1950,理查德海明提出海明校验,本质上是一种多重奇偶校验,既能检错、也能纠错。

        理论依据

        海明码的编码最小距离 d=3,也就是非法的码字与合法的码字对应二进制位不同的个数最小为 3。 根据:d-1=e(检错)+t(纠错),且 e≥t

        得到:e+t=2

        于是可以检测出 1 位错,并且纠正 1 位错,为了表达对海明的敬意,这种编码方法称为:Hamming ECC(Hamming Error Correction Code)

【例如】现在要传输的信息是一个 8 位的信息

        先来看看奇偶校验,加上校验位后使得 1 的个数为偶数个(偶校验),如果我们读出来的信息发 现 1 的个数是奇数个,我们便可以得知这 9 位代码中,有 1 位代码发生的翻转,使得 1 的个数由偶数 个变成了奇数个,但是不知道是哪一个错。

        于是,我们提出一种分组方法,来确定到底是哪一位错误。比如,我们采用两位奇偶校验,前面 4 位一组,后面 4 位一组(动画所示),如果是前面的 5 位中 1 的个数变成了奇数个,那么就可以肯 定前面 5 位中有 1 位错误;如果是后 5 位信息发现 1 的个数是奇数个,就说明后 5 位中有 1 位错误。 这样的话,编码出错的范围就被缩小了。这是一种【划分式】的分组方式。

        而海明码的分组是一种【非划分】方式: 组和组是有交叉的。而刚才的分组中,组合组之间没有 重叠,组和组合在一起,就是要传输的数据,而海明码之间的组和组是有交叉的。 比如:1~7,7 位数据,分成 3 组,每组有 1 位校验位, 所以,7 位中有 3 位校验位,4 位数据位。 如何分组呢?(动画)每个圆圈表示一组,1,2,4 被分入 3 组;1+2=3 放重合位,1+4=5 放重合位, 2+4=6 放重合位,最后 7 放中间

        分成了三组,每组都是偶校验的方式。

         这三组中,每一组都有 4 位数据,有 1 位是校验位。

         下面,我们要对每一组分别进行校验,三个组便生成 3 个校验结果:P3,P2,P1,如果没有任何 差错,这三组的校验都为:0,即:000 (因为偶校验采用的异或来来实现,1 的个数是偶数个,所以 校验的结果是 000),如果是 001,说明第一组出错,也就是【1】这个位置错了,(动画红色),也就 是说,001 这个编码的值反映出了出差错的位置;如果校验结果是 101,说明第 1 组和第 3 组错了, 即第 1 组和第 3 组公共的位置发生了错误,这个位置就是 5,正好也等于编码实际的值:101=5;后 面的类似,大家可以类似分析。

        所以结论是:用校验结果排列的二进制,便给出了错误的位置。

        下面一个问题: 校验位应该放在哪些位置呢?

        因为校验位只会对这一组数据进行校验,所以,它绝不会和其他组 共用位置,所以校验位,都放在【2 i】这个位置。

        下面一个问题:

         如何分组的呢?

        第一组:二进制代码,【从最右侧开始】都是 1,比如:1,3,5,7 的二进制是 001,011,101, 111,他们的最低位都是 1

        第二组:2,3,6,7 : 010,011,110,111

        第三组:4,5,6,7 : 100,101,110,111

        如果这样分组,二进制编码的位置从右侧开始数,第一个值和第二个值都是 1,,比如 011,就说 明,011 是第一组和第二组共有的,其他的类似,大家可以验证。

        所以,1,2,4,8,….这样的位置,便是每一组独有的位置,用作校验位。

        所以:如果我们采用偶校验,对海明码的每一组编码进行校验,得出的测试位 P3P2P1 进行有序 的排列,得到的值便指出了出错代码的位置(或者,没有代码出错)。

海明码的组成

海明校验码一共 n 位:Hn…H2H1 :n = k + r

        k——信息位的数量

        r——校验位的数量,也就是分成了 k 组

海明码公式的由来

        我们的校验结果要指出这 k+r 位是哪一位错了,于是一共有 k+r 种情况(假设只能判断 1 位错), 还有一种情况是没有错,所以,总共的状态数量是 k+r+1,而校验位是 r 位,因此可以列出这个方程。 根据采用的是奇校验还是偶校验,来决定检测位的取值。现在默认采用“偶校验”,即:每一组编码 中,1 的个数为偶数个。

海明码的纠错过程

        首先,接收方和发送方之间需要有协议,大家要说好,使用海明码进行编码且编码是偶校验,根 据接收到数据的位数,来判断编码被编成了多少组,然后对每一组进行校验,看符不符合编码的规则, 每一组都会形成一个 Pi,其位数与增添的检测位有关。

比如:如增添 3 位(r = 3),新的检测位为 P4 P2 P1 。

P1:第一组,如果在传送过程中,没有发生任何错误的话,1,3,5,7 位置中 1 的个数如果是偶数 个,那么 P1=0

第二组、第三组类似

1,2,4 位为校验位,3,5,6,7 为真正的数据位

我们来看一个具体例子,是如何纠正错误的

        对于这个例子,我们假设的是【1 位错】,所以出错的应该是第 2 组和第三组公共的位置,即第 6 位出错。但是:同学们可以看到,7 也是公共位置,但是,7 也是第一组的位置,如果是 7 这个位置 错了,那么第一组的异或也应该是有错,但是第一组计算显示是“无错”的。

是【从左往右】还是【从右往左】的问题

总结:海明码纠错两步骤

        ①先填入 ECC

        ②对收到的串计算 P8P4P2P1,则(P8 P4 P2 P1)2 便是错误位置,为 0 则表示传输正确。

【这里补充阅读材料】:

        海明并没有止步于 1 位纠错码。通过增加 1 位的代价,可以让码字中的最小海明距离变到 d=4。 由于 d-1=e+t 得到 e+t=3,这意味着可以纠正 1 位错(t=1),并检测 2 位错(e=2)。这个方法增加了 1 位奇偶校验码,对整个字进行校验。有兴趣的同学可以查阅 H&P 的教材。

         纠 1 位错/检 2 位错(SEC/DED)的技术现在广泛应用于服务器的内存。方便的是,8 字节的数据 块做 SEC/DED 时,只需要恰好 1 个字节的额外开销,这正是许多 DIMM(双列直插式存储模块)宽度 为 72 位的原因。

         在大型系统中,出现多位错的概率和宽内存芯片出错的概率变得显著起来。为了解决这一问题, 有兴趣的同学可以查阅 H&P 的教材中关于此部分的综述。

三、循环冗余校验

生成多项式 G(x)

        收发双方约定的一个(r + 1)位二进制数,发送方利用 G(X)对信息多项式做模 2 除运算,生成校 验码。接收方利用 G(X)对收到的编码多项式做模 2 除运算检测差错及错误定位。

G(x)应满足的条件

        A、最高位和最低位必须为 1;

         B、当被传送信息(CRC 码)任何一位发生错误时,被生成多项式做除后应该使余数不为 0;

        C、不同位发生错误时,模 2 除运算后余数不同;

        D、对不为 0 余数继续进行模 2 除运算应使余数循环。

常见生成多项式 G(x)

模 2 运算规则

加/减运算 (异或运算,加不进位,减不借位)

         0±0=0,0±1=1,1±0=1,1±1=0

模 2 除法

        按模 2 减,求部分余数,不借位。

上商原则

        ①部分余数首位为 1 时,商为 1,减除数;

        ②部分余数首位为 0 时,商为 0,减 0;

        ③当部分余数的位数小于除数的位数时,该余数即为最后余数。

CRC 校验 的步骤

        需要注意的是:能不能说只要得出的 R=0,就一定没有出现差错呢?不是的!因为在某种非常特 殊的比特组合下,也可能非常碰巧的使得余数 R=0.但是,只要经过严格的挑选,并使用位数足够多的 除数 P,那么出现检测不到的差错的概率就可以是一个极小的数值。

        下面一个问题自然要问,如何纠正错误

生成多项式不同的时候,对应的余数的情况:

这正是非零的余数具有的循环特征。

        比如,出错的位置为第 7 位,我们并不是立刻去修改这个出错位,而是通过刚才的办法,将余数 末位补 0 之后,继续去除以多项式 1011.

        下面,我们通过一个具体的例子,来学习纠错的过程。

        持续左移余数 对生成多项式做模 2 除法,得到新余数,当计算到第 8 行时,余数回滚为 0001, 这就是循环冗余校验码名称的得来。

        ①所有一位错的余数均不相同,且都具有可循环的特性。

         ②模 2 除法的余数满足结合律:多个一位错的余数按模 2 相加可得到多为错的余数。

        比如:第 9 行,x1 和 x2 同时出错的余数就等于 x1 和 x2 一位错的余数之和(0001+0010=0011)

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值