编码信息纠错 a1 0 0 1 1 0 0 1 1 a0 0 1 0 1 0 1 0 1 信息序号 0 1 2 3 4 5 6 7 二进码字 a3 0 1 1 0 1 0 0 1 图 2 码距 1 2 3 4 5 6 7 码 能 力 检错 纠错 0 1 2 2 2 3 3 图3 0 0 1 1 2 2 3 a2 0 0 0 0 1 1 1 1 a1 0 0 1 1 0 0 1 1 a0 0 1 0 1 0 1 0 1 或 并 并 并 并 1 和检错能力的提高需要进一步增大编码系统的码距。 图 3 的表概括了编码系统的码距为 1 至 7 时,码的纠 错和检错能力。 在海明码系统中有关系: L-1=C+D。 其中 L 为码距, D 为可以检测出的错误位数, 为可以纠正的错误位数, C 并且有 D≥C。 码距越大,纠错能力越强,但数据冗余也越大,即编码效率低了。所以,选择码距要 取决于特定系统的要求。 数字系统的设计者必须考虑信息发生差错的概率和该系统能容许的 最小差错率等因素。 二、海明校验 前面指出过要能纠正信息字中的单个错误,编码系统的码距至少为 3。实现这种编码系 统的方法之一是海明码。王诚所撰的《计算机组成原理》中,使用的海明校验码距为 4,以 下叙述以此为依据。 海明码是一种多重奇偶检错系统。它将信息用逻辑形式编码,以便能够检错和纠错。 用在海明码中的全部传输码字是由原来的信息和附加的奇偶校验位组成的。 每一个这种奇偶 位被编在传输码字的特定位置上。 这个系统对于错误的数位无论是原有信息位中的, 还是附 加校验位中的都能指示出来。 使用具有 k 位数据海明码,所需步骤如下: 1、确定最小的校验位数 r,将它们分别记成 P1、P2、…、Pr。 2、选择 r 校验位的数值(0 或 1)以满足必要的奇偶条件,k 位数据和 r 个校验位一起 编成长为 k+r 位的新码字。 3、对所接收的信息作所需的 r 个奇偶检查。 4、如果所有的奇偶检查结果均为正确的,则认为信息无错误。 如果发现有一个或多个错了,则错误的位由这些检查的结果来唯一地确定或者纠正。 推求海明码时的一项基本考虑是确定所需最少的校验位数 r。考虑长度为 k 位的信息, 若附加了 r 个校验位,则所发送的总长度为 k+r。在接收器中要进行 r 个奇偶检查,每个检 查结果或是真或是伪。 这个奇偶检查的结果可以表示成一个 r 位的二进制字, 它可以确定最 r 多 2 种不同状态。 这些状态中必有一个其所有奇偶测试都是真的,它便是判定信息正确的 r 条件。于是剩下的(2 -1)种状态,可以用来判定误码的位置。于是导出下一关系: r 2 -1≥k+r 如果要求能检测出与自动纠正一位错误,并能检测两位错误,应该符合: r-1 2 ≥k+r 三、海明码使用实例 设有 4 位数据 D4D3D2D1=1011,求海明码。 ⑴先求校验位数 r-1 根据 2 ≥4+r 得 r=4。 ⑵编码阵列 这是求海明码的关键。从理论上讲,校验位可放在任何位置,但习惯上校验位被安排在 0、1、2、4、8、…的位置上。据此,可以方便得到口诀——从右到左、先校(验位)后数 (据位)、校验阵列对角置“1”,从而就有: D 4 D3 D2 D1 P4 P3 P2 P1 S4 1 1 S3 S2 1 2 S1 1 其中 Si 为构成译码方程的译码位。 进而第一行置全“1“,校验阵列其余置“0”,最后一行是去除数字阵列第一行后的校 验阵列的列值。 D4 D3 D2 D1 P4 P3 P2 P1 S4 1 1 1 1 1 1 1 1 0 1 0 0 S3 S2 0 0 1 0 S1 0 0 0 1 0 4 2 1 将此数字阵列左边的数据阵列根据去除数字阵列第一行后的数据阵列列值应该依次为 3、5、6、7 填入相应数字。 D4 D3 D2 D1 P4 P3 P2 P1 S4 1 1 1 1 1 1 1 1 S3 1 1 1 0 0 1 0 0 S2 1 1 0 1 0 0 1 0 S1 1 0 1 1 0 0 0 1 7 6 5 3 0 4 2 1 ⑶列出编码方程 取 Pi 为“1”的行中的所有为“1”的项进行“异或”,得编码方程。 P4= D4⊕D3⊕D2⊕D1⊕P3⊕P2⊕P1 P3= D4⊕D3⊕D2 P2= D4⊕D3⊕D1 P1= D4⊕D2⊕D1 根据已知数据求出校验位 0001。 P3= D4⊕D3⊕D2=1⊕0⊕1=0 P2= D4⊕D3⊕D1=1⊕0⊕1=0 P1= D4⊕D2⊕D1=1⊕1⊕1=1 P4= D4⊕D3⊕D2⊕D1⊕P3⊕P2⊕P1=1⊕0⊕1⊕1⊕0⊕0⊕1=0 ⑷海明编码 将数据和校验位组合,即得到海明编码: 10110001 ⑸译码方程的获得 译码方程的值是接收方判断接收数据的依据,由⑶得到以下方程。 S4= D4⊕D3⊕D2⊕D1⊕P4⊕P3⊕P2⊕P1 S3= P3⊕D4⊕D3⊕D2 S2= P2⊕D4⊕D3⊕D1 S1= P1⊕D4⊕D2⊕D1 ⑹接收正确 如果接收正确译码方程的值应该全部为 0。 S4= D4⊕D3⊕D2⊕D1⊕P4⊕P3⊕P2⊕P1=1⊕0⊕1⊕1⊕0⊕0⊕0⊕1=0 S3= P3⊕D4⊕D3⊕D2=0⊕1⊕0⊕1=0 S2= P2⊕D4⊕D3⊕D1=0⊕1⊕0⊕1=0 S1= P1⊕D4⊕D2⊕D1=1⊕1⊕1⊕1=0 3 ⑺接收错误 如果 S4=0,则有两位出错;S4=1,一位出错,可以纠正。例如接收到的是 10010001。 S4= D4⊕D3⊕D2⊕D1⊕P4⊕P3⊕P2⊕P1=1⊕0⊕0⊕1⊕0⊕0⊕0⊕1=1 S3= P3⊕D4⊕D3⊕D2=0⊕1⊕0⊕0=1 S2= P2⊕D4⊕D3⊕D1=0⊕1⊕0⊕1=0 S1= P1⊕D4⊕D2⊕D1=1⊕1⊕0⊕1=1 显然属于 S4=1,一位出错。