海明码(汉明码)
海明码是可以发现双比特错误,并可以纠正单比特错误的编码方案。(一般来讲,检错编码不一定具有纠错能力,但是纠错编码具有检错能力)。
其工作流程可以分为以下四个步骤:
(1)确定校验码位数r;
(2)确定校验码和数据的位置;
(3)求出校验码的值;
(4)检错并纠错。
在以下的工作流程中,我们要发送的数据D=101101.
工作流程
1、确定校验码位数r
我们使用海明不等式来确定校验码的位数r,海明不等式的形式如下:
2^r>=k+r+1
其中:
k为数据的位数(信息位数);
可以满足不等式的最小r为校验码的位数(冗余信息位数)
- 解例:
由海明不等式2^r>=k+r+1知:数据的位数为6位,校验码位数为4位。
2、确定校验码和数据的位置
在确定校验码P和数据D的位置的时候,我们的数据位按照1,2,3,…的顺序排布,按照下列原则:
(1)P1,P2,…,Pn:放在2的n(n>=0)次方的位置上;
(2)D1,D2,…,Dm:在校验码已经排放好的基础上,将D按序把剩下的空填满。
注意:P的值暂放不填,将D的值按位填进去。
- 解例:
数据位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
代码 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 |
实际值 | 1 | 0 | 1 | 1 | 0 | 1 |
3、求出校验码的值
首先,在步骤的表格基础上,加上数据位对应的二进制,更改后的表格如下:
二进制 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 |
---|---|---|---|---|---|---|---|---|---|---|
数据位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
代码 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 |
实际值 | 1 | 0 | 1 | 1 | 0 | 1 |
接着按照如下的步骤操作:
(1)先找到P所对应的的二进制中1所在的位置
(2)再去看D中哪些数的对应位上的值也是1
(3)找到满足条件的D,再将P和这些D的实际值依次进行异或,令结果为等于0
(4)即可求出P(实际值)
- 解例:
按照以上步骤,可得:
P1⊕D1⊕D2⊕D4⊕D5=0 ⇒P1=0
P2⊕D1⊕D3⊕D4⊕D6=0 ⇒P2=0
P3⊕D2⊕D3⊕D4=0 ⇒P3=0
P4⊕D5⊕D6=0 ⇒P4=1
将P的值填入表中,得:
二进制 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 |
---|---|---|---|---|---|---|---|---|---|---|
数据位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
代码 | P1 | P2 | D1 | P3 | D2 | D3 | D4 | P4 | D5 | D6 |
实际值 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 |
由此,我们可以得到101101的海明码为 0010011101.
4、检错并纠错
在接收端,我们采用如下步骤进行判断所接收的数据串是否发生错误:
(1)按照前个步骤的做法。将P和对应的D(带入实际接收到值)进行异或
(2)将得到的结果按照倒序的方式进行排列
(3)排列好的结果,即数据出错位数的二进制值
(4)在找到出错位后,我们将其实际接收的值改为其相反的数即可。(1->0,0->1)
- 解例:
假设接收到的数据位0010111101,按照步骤进行判断。
P1⊕D1⊕D2⊕D4⊕D5=1
P2⊕D1⊕D3⊕D4⊕D6=0
P3⊕D2⊕D3⊕D4=1
P4⊕D5⊕D6=0
对应的位数的二进制表示为0101,即5.
所以第五位出错,我们将第五位的1改为0即可。