海明码原理与计算

一、设计

1.1 编码位数

以要发送1101这个数据为例子,假设校验码有m位。为了满足一位纠错能力(即知道哪一位出现了错误),则m位纠错码101这个数据为例子,假设校验码有m位。为了满足一位纠错能力(即知道哪一位出现了错误),则m位纠错码需要能表示4+m+1种状态(+1为没有错的状态)
因此可以推出,若有n位数据,m位校验码,计算插入的校验码位数的公式为:

$$ 2^m>m+n+1 $$

1.2 校验方式

使用异或进行校验
由异或的性质可知,如果一个数于它自己本身进行异或,结果为0
假设存在一组数(a1, a2, a3, a4) 设 p = a1 ^ a2 ^ a3 ^ a4
将p和(a1, a2, a3, a4)一起, 设接受端收到的数据为(a1' ,a2' , a3' ,a4' , p')
若发生了1位错误 则 a1' ^ a2' ^ a3' ^ a4' ^ p' = 1,就代表(a1, a2, a3, a4)当中存在传输错误。但这样不能具体知道哪一位出现了错误,则可以使用相交分组的部分,就可以确定哪一位出错。
海明码原理与计算_第1张图片
其中标黄的的位为每组的p,通过相交发部分,就可以确定每一位的内容,而具体分组方式,由1.3中接受端的状态码决定

1.3 状态码

在1101当中,组成的二进制值可以表示8种状态,如下(注意,这里的P3 P2 P1码值 并不是原始插入校验码数据,是接收方用来分辨状态的码值)

P3 P2 P1 value
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

为了让状态码值 和 接收的各组数据异或组成的值可以对应起来,则需要按1.2中的分组

二、编码

2.1 计算插入位数

$$ 2^m>m+n+1 $$

2.2 计算插入位置

 校验码在二进制串中的位置为2的整数幂,即1、2、4、8、16……..剩下的位置是信息码

  1 2 3 4 5 6 7
P1 P2 D1 P3 D2 D3 D4

2.3 计算校验码值

从第$2^{n-1}$位开始校验,校验$2^{n-1}$位个,然后跳过$2^{n-1}$位个

  1 2 3 4 5 6 7
P1 P2 D1 P3 D2 D3 D4
1 0 1 0 1 0 1

三、解码

接收数据后,进行如下计算
G3 = P3 ^ D2 ^ D3 ^D4
G2 = P2 ^ D1 ^ D3 ^D4
G1 = P1 ^ D1 ^ D2 ^D4
以{P3, P2, P1}, 组成的状态码,查询对应状态

G3 G2 G1 有问题的位
0 0 0 没有问题
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

你可能感兴趣的:(计算机网络,程序员,嵌入式)