2021-01-23--常见效验

常见效验

借鉴博客链接:

奇偶效验:
https://www.cnblogs.com/Mayfly-nymph/p/11098007.html
海明效验:
https://www.cnblogs.com/Mayfly-nymph/p/11098213.html
循环冗余效验:
https://www.cnblogs.com/Mayfly-nymph/p/11100021.html

奇偶效验

  • 奇效验:使完整编码(有效位和效验位)中的“1”的个数为奇数个
  • 偶效验:使完整编码(有效位和效验位)中的“1”的个数为偶数个

奇效验:
当有效信息的“1”为奇数个的时候,最后添0,反之添加1

偶效验:
当有效信息的“1”为奇数个的时候,最后添加1,反之添加0
举栗子:

有效信息奇效验码偶效验码
11001111001111100110
10101010101011010100

奇偶校验实际上就是对我们DnDn-1…D0进行异或运算(两两相同为0,不同为1),最后偶校验生成0,奇校验生成1,正确,反之错误。

第一个奇效验:
1⊕1⊕0⊕0⊕1⊕1⊕1=1(正确)

第一个偶效验:
1⊕1⊕0⊕0⊕1⊕1⊕0=0(正确)

第二个奇效验:
1⊕0⊕1⊕0⊕1⊕0⊕1=1(正确)

第二个偶效验:
1⊕0⊕1⊕0⊕1⊕0⊕0=0(正确)

海明效验

定义

海明码利用奇偶性来检错和纠错的效验方法。海明码的构成方法是在数据位之间的确定的位置插入k个效验位,通过扩大码距来实现检错和纠错。

对于数据位m的数据,加入k位的效验码,应该满足香农的第二定理:n=m+k<=2^k-1

说明:
这里的m就是待编有效信息的位数,例如110101就是m=6,然后代入m,6+k<=2^k-1得到m=6,k>=4(取最小值),这样组成10位海明效验码

例子
设数据为01101001,试采用校验位求其偶校验方式的海明码。
根据上面的公式得到,m=8,k≥4
(1)确定数据位D和效验位P在海明码中的位置:
由海明码编码规则可知:Pi在海明码的第2i-1,比如P4=2(4-1)=8,所以位于第8位

海明码123456789101112
效验位P1P2P3
数据位D0D1D2D3D4D5D6D7

(2)确定效验关系
这个难点在于如何确定效验位组
H3=D0,海明码下标为3,我们必须用已知的效验位(P1,P2,P3,P4)来表示3,这里的3等于1+2

海明码海明码下标效验位组
H11P1
H22P2
H3(D3)3 = 1+2P1,P2
H44P3
H5(D1)5 = 1+4P1,P3
H6(D2)6 = 2+4P2,P3
H7(D3)7 = 1+2+4P1,P2,P3
H88P4
H9(D4)9 = 1+8P1,P4
H10(D5)10 = 2+8P2,P4
H11(D6)11 = 1+2+8P1,P2,P4
H12(D7)12 = 4+8P3,P4

(3)故:P1效验:P1,D0,D1,D3,D4,D6

P1=D0⊕D1⊕D3⊕D4⊕D6=0⊕1⊕0⊕1⊕0=0
P2=D0⊕D2⊕D3⊕D5⊕D6=0⊕1⊕0⊕0⊕0=1
P3=D1⊕D2⊕D3⊕D7=1⊕1⊕0⊕1=1
P4=D4⊕D5⊕D6⊕D7=1⊕0⊕0⊕1=0

⊕符号:代表异或,相同则为0,不同则为1。只要仔细一定可以计算正确。

按照表格海明码的位置插入P1~P4到数据中,所以海明校验码:010111001001

(4)设置指错字G4,G3,G2,G1

G4=P4⊕D4⊕D5⊕D6⊕D7
G3=P3⊕D1⊕D2⊕D3⊕D7
G2=P2⊕D0⊕D2⊕D3⊕D5⊕D6
G1=P1⊕D1⊕D3⊕D4⊕D6

G1G2G3G4为0000,则数据传输没有错误。

以上面的数据传输为例子:
G4=0  G3=0  G2=0  G1=0

若数据传输之后变成010111001000

G4=P4⊕D4⊕D5⊕D6⊕D7=0⊕1⊕0⊕0⊕0=1
G3=P3⊕D1⊕D2⊕D3⊕D7=1⊕1⊕1⊕0⊕0=1
G2=P2⊕D0⊕D2⊕D3⊕D5⊕D6=1⊕0⊕1⊕0⊕0⊕0=0
G1=P1⊕D1⊕D3⊕D4⊕D6=0⊕0⊕1⊕0⊕1⊕0=0

G4G3G2G1组成的二进制数为:1100,也就是12,说明第12位出现的错误

(5)海明码效验缺点

  • (1)海明校验的每一步还是使用的奇偶校验,因此当G中同时出现两个错误时,G1G2G3G4依然为0000,例如D1,D2出错,010100001001

G4=P4⊕D4⊕D5⊕D6⊕D7=0⊕1⊕0⊕0⊕0⊕1=0
G3=P3⊕D1⊕D2⊕D3⊕D7=1⊕0⊕0⊕0⊕1=0
G2=P2⊕D0⊕D2⊕D3⊕D5⊕D6=1⊕0⊕0⊕0⊕0⊕0=1
G1=P1⊕D1⊕D3⊕D4⊕D6=0⊕0⊕0⊕1⊕0=1

  • (2)同时,G4G5G6G1=0000不一定数据传输过程中就没有错误,只有当只有一位发生错误时,才能检测出来。

G1G2G3G4=0011,也就是第3位出现错误,很明显这是不准确的。

循环冗余效验

冗余码

CRC和海明效验码类似,也就是有效信息(k位)+效验信息(r位),需要满足n=m+k<=2^k-1

生成多项式G(X)

定义

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

满足条件:
  • 1.最高位和最低位必须为1
  • 2.当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0
  • 3.不同位数发生错误时,模2除运算后余数不同;
  • 4.对不为0余数继续进行模2除运算应使余数循环
G(X)多项式G(X)
x3+x2 +x+11111
x3 +x+11011
x4+x2 +x+110111

下面举个栗子:
假设我们要传输的数据为:
11001100

我们约定一个G(X),但是在得出G(X)的长度之前,我们先要计算一下k的位数应该为多少。我们要传输的数据的位数是8位,那么根据n=m+k<=2^k-1,这个公式,我们可以得出:k应该为4
并且G(X)的最高位和最低位都应该是1,那么我们就约定一个:
10001
(或许有的人要问了,为啥是五位数呢?因为k是4,我们约定的位数应该比这个k多一位数字)

接着在11001100后面添加0000四个0

再用110011000000去和10001进行模2除运算。
运算的过程中,余数的开头为,那么就在上面添0,如果开头是1的话,那么就可以添加1

这个可以算出来结果是:
11000000
余数是:
0000
那么就表明正确的冗余码应该是:
0000
添加到后面就是:
110011000000
上面就是编码后的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值