奇偶校验
奇偶校验包含奇校验和偶校验两种校验。
奇校验(Odd Parity)约定的编码规律是,让整个校验码(包含有效信息和校验位)中“1”的个数为奇数。
偶校验(Even Parity)约定的编码规律是,让整个校验码中“1”的个数为偶数。
有效信息(被校验的信息)部分可能是奇性(“1”的个数为奇数)的,也可能是偶性的,所以奇、偶两种校验都只需配一个校验码,就可以使整个校验码满足指定的奇偶性要求。
如果是采用奇校验,在传送每一个字节的时候另外附加一位作为校验位,当实际数据中“1”的个数为偶数的时候,这个校验位就是“1”,否则这个校验位就是“0”,这样就可以保证传送数据满足奇校验的要求。在接收方收到数据时,将按照奇校验的要求检测数据中“1”的个数,如果是奇数,表示传送正确,否则表示传送错误。
同理偶校验的过程和奇校验的过程一样,只是检测数据中“1”的个数为偶数。
两个码组对应位上数字的不同位的个数称为码组的距离,简称码距,又称海明(Hamming)距离。例如00110和00100码距为1,12345和13344码距为2,Caus和Daun码距为2。
码距越大,纠错能力越强,但数据冗余也越大,即编码效率低了。所以,选择码距要取决于特定系统的参数。
海明校验码
它的实现原理,是在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。
公式
2^r-1>=k+r(k为数据位,r为校验位)
假设有r个校验位,一个位子有0或1两种情况,r个位子就有2r种排列情况,能表示2r种状态。其中一个状态用来表示正确(没有错误发生)的这种情况。其余的2r-1种状态来表示错误发生在哪一位。总共有k+r位,所以2r-1一定要>=总位子k+r。
注意:海明校验码是放在2的幂次位上的,即“1,2,4,8,16,32······”
例:求1011的海明码
第一步:求r的值(即校验位数)
直接根据公式代入得:
2^r-1 ≥ 4 + r
2^r-r ≥ 5
得到r最小为3
所以海明码的位数是4+3=7位
第二步:校验位和信息位对号入座
注意: 信息位的位置分配是从高位到低位依次存放
注意: 海明校验码是放在2的幂次位上的
第三步:确定校验位的值
校验原则:被校验的海明位的下标等于所有参与校验该为的校验位的下标之和
第四步将校验码校验的信息位的位置记录下来:
r1: 3, 5, 7
r2: 3, 6, 7
r3: 5, 6, 7
然后做对应信息位的异或运算(异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)
r1: 1 xor 1 xor 1 = 1
r2: 1 xor 0 xor 1 = 0
r3: 1 xor 0 xor 1 = 0
代入表格得到按照从低位到高位的排列顺序得到海明码:1010101
循环冗余校验码
在发送端,先把数据划分为组,假定每个组k个比特。现假定待传送的数据M=101001(k=6)。CRC运算就是在数据M后面添加供差错检验用的n位冗余码,然后构成一个帧发送出去,一共发送(k+n)位。在要发送的数据后面加n位的冗余码
生成多项式------决定除数(共n位)----被除数左移(n-1位,全补0)-----过程进行异或处理------得到余数------余数为0则无差错,否则出现错误