本文已参与⌈新人创作礼⌋活动,一起开启掘金创作之路。
忽然翻到以前学计组时候的实验,就拿出来做个参考。当时学习的海明码。
【实验目的】
设计出22位的海明编码(16位原始数据+5位海明检验位+1位总的奇偶校验位)。海明码可检两位错同时纠一位错。
【实验原理】
海明码是在k位数据位中加入r个校验位,形成k+r位新码字,K代表其中有效信息位数,r表示添加的校验码位。并且将数据的每一个二进制位分配到几个不同的奇偶校验组中,其中一个发生变化时,会引起有关的几个组出现奇偶校验错。通过这些出错组的不同组合,就能够指明是哪一位主线错误,从而进行纠错。
| 信息码位数 | 1 | 2~4 | 5~11 | 12~26 | 27~57 | 58~120 | 121~247 |
|---|---|---|---|---|---|---|---|
| 校验码位数 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
校验码必须是在2的n次方位置,如第1、2、4、8、16、32,……位。信息码的分布位置,也就是非2的n次方位置,如第3、5、6、7、9、10、11、12、13,……位。
eg.现有8位信息码d1 ~ d8 ,根据上表知道要插入4位校验码 p1 ~ p4,校验码放2的次方的位置,得到顺序:
p1 p2 d1 p3 d2 d3 d4 p4 d5 d6 d7 d8
【实验内容】
海明编码
P1=d1⊕d2⊕d4⊕d5⊕d7⊕d9⊕d11⊕d12⊕d14⊕d16
P2=d1⊕d3⊕d4⊕d6⊕d7⊕d10⊕d11⊕d13⊕d14
P3=d2⊕d3⊕d4⊕d8⊕d9⊕d10⊕d11⊕d15⊕d16
P4=d5⊕d6⊕d7⊕d8⊕d9⊕d10⊕d11
P5=d12⊕d13vd14⊕d15⊕d16
P6=d1⊕d2⊕d3⊕d4⊕d5⊕d6⊕d7⊕d8⊕d9⊕d10⊕d11⊕d12⊕d13⊕d14⊕d15⊕d16⊕p1⊕p2⊕p3⊕p4⊕p5
海明解码
G1=d1⊕d2⊕d4⊕d5⊕d7⊕d9⊕d11⊕d12⊕d14⊕d16⊕p1
G2= d1⊕d3⊕d4⊕d6⊕d7⊕d10⊕d11⊕d13⊕d14⊕p2
G3=d2⊕d3⊕d4⊕d8⊕d9⊕d10⊕d11⊕d15⊕d16⊕p3
G4= d5⊕d6⊕d7⊕d8⊕d9⊕d10⊕d11⊕p4
G5= d12⊕d13vd14⊕d15⊕d16⊕p5
G6=d1⊕d2⊕d3⊕d4⊕d5⊕d6⊕d7⊕d8⊕d9⊕d10⊕d11⊕d12⊕d13⊕d14⊕d15⊕d16⊕p1⊕p2⊕p3⊕p4⊕p5⊕p6
G6为1,表示奇数位出错,此时g5g4g3g2g1对应的二进制码就是出错位,通过译码器让该位与1异或,从而纠错,若g6为0,则表示偶数位出错,若g5g4g3g2g1也为0,则无错误