nfssuzukaze / Blog

0 stars 0 forks source link

海明码 #13

Open nfssuzukaze opened 3 years ago

nfssuzukaze commented 3 years ago

海明码

海明距离

海明距离的值为:两个码字中不相同的个数的和

码字1 0000 1111
码字2 1110 0011
海明距离 5

如果两个码字的海明距离为 d,则需要 d个 1位错误才能将一个码字转变为另一个码字**(如上表所示,码字1 在第 2,3,5,6,7 位出现 5个 1位错误,就会转化为 码字2)

如果给出一个计算校验位的算法,那么就可以构建出一个完整的合法码字列表,然后从这个列表中找出两个具有最小海明距离的码字。这个距离就是整个编码的海明距离

块码的纠错与检错

同样是上表,现将其看作为一个合法码字列表。假设发送端发送了一个 01 序列 0000 1111 ,但在途中被干扰

在上面的例子中,解码的作用就是找到距离接收码字最近的合法码字。但是将所有的合法码字作为候选被评估,是一项非常耗时的工作。所以实际上的代码被设计成了允许使用快捷方式找到最有可能的原始码字

海明码的规则

计算校验位个数

每个 n 位的码字有 m 个消息位与 r 个校验位,有着纠错 1 位的功能。(由纠错 1 位 可以推测出海明码可以检错 2 位)

则对于 2^m 个合法消息,每个合法消息有 n 位,则意味着其对应着 n 个非法的码字,加上原来那个合法的码字,有:一个合法消息对应 (n + 1) 个码字,然而总共只有 2^n 个位模式,所以有如下

2^m × (n + 1) <= 2^n 因为 n = m + r 所以 m + r + 1 <= 2^r

在给定 m 的情况下,可以根据该公式得出拥有纠正 1位错误所需的最少校验位

计算各校验位的值

现假定需要传送 8 位数据 0000 1111 ,根据公式可算出,所需的校验位有 4 位。在海明码中,码字的位被连续编号,其中,校验码存在于 2^i ( i = 0, 1, 2, ... ),信息码存在于其他位,如下表格所示

1 2 3 4 5 6 7 8 9 10 11 12
P1 P2 M3 P4 M5 M6 M7 P8 M9 M10 M11 M12
1 1 1 1 0 0 0 0

现对校验位进行计算

1 2 4 8
3 1 1
5 1 1
………

P1 = M3 ^ M5 ^ M7 ^ M9 ^ M11 P2 = M3 ^ M6 ^ M7 ^ M10 ^ M11 ……

如此计算,可得 P1 = 1,P2 = 1,P4 = 1,P8 = 0。可以得到 12 位码字如下,由发送端发送

1 2 3 4 5 6 7 8 9 10 11 12
P1 P2 M3 P4 M5 M6 M7 P8 M9 M10 M11 M12
1 1 1 1 1 1 1 0 0 0 0 0

接收端的检验

当接收端接收到该码字时,会进行如下检测

S1 = P1 ^ M3 ^ M5 ^ M7 ^ M9 ^ M11 ……

在这个码字中会有 S1, S2, S3, S4 四个位(与校验位的个数相对应)