海明码

海明码

海明码是最为常见的纠错码,实现原理就是加入校验位形成海明码。然后根据检验位检验错误、纠正错误。
海明码分为五个步骤

  1. 确定校验位的位数
    如果有 n 位的有效信息位数,k 位的校验位的位数,则信息位 n 和校验位 k 需要满足
    \(n + k \leq 2^k -1\) (这里只能检测一位错误,减去 1 是没有发生错误的情况,而剩下 \(2^k - 1\) 则是对应 n + k 位中哪一位出错的情况)
    例: 有效信息位为 4 位 那么需要的校验位需要满足 \(4 + k \leq 2^k - 1\) 则 k 最小位 3 位
  2. 确定校验位位置
    规定中校验位 Pi 在海明位号为 2^(i-1) 的位置上,上面提到校验位有 3 位:P1 位置为 1,P2位置为 2,P3位置为 4;
    对应为
    D4 D3 D2 P3 D1 P2 P1 => 111 110 101 100 011 010 001
  3. 分组求校验值
    P1(##1): D1 D2 D4
    P2(#1#): D1 D3 D4
    P3(1##): D2 D3 D4
    利用偶检验(默认是偶检验,也就是直接数据位异或操作
    P1 为 P1 分组中奇偶检验的偶校验的值,P1 为校验位,D1 D2 D4 为数据位 => P1 = D1 ⨁ D2 ⨁ D4
    P2,P3同理
  4. 校验
    校验值为分组中所有数据异或
    S1 = P1 ⨁ D1 ⨁ D2 ⨁ D4
    S2 = P2 ⨁ D1 ⨁ D3 ⨁ D4
    S3 = P3 ⨁ D2 ⨁ D3 ⨁ D4
    拼接 S3S2S1,如果 S3S2S1 = 000 则说明没有错误,如果 = 001 则说明第一位出现了错误,也就是 P1 出现错误

码距

两个相同长度的字符串中,把其中一个字符串替换成另一个字符串需要的操作次数
如: 10000 和 10001 的码距为 1,只需要把末尾的 0 换成 1 即可
而: 00000 和 11111 的码距为 5,需要把五个 0 换成 1
编码的海明距是指该种编码中最小的存在的码距

对此引出如下结论
1)海明码“纠错” d 位,需要的编码码距最小为 2d + 1
2)海明码“检错” d 位,需要的编码码距最小为 d + 1

对于 1)
因为只有当码距大于 2d + 1 时,才存在一个码距最接近的值与之对应
例:编码为 A(100000) B(111111) 如果 A 发生了两位错误变成了 100011 则此时这段与 A 的码距为 2,与 B 的码距为 3,所以能推断是 A 发生了错误,并对其进行纠正,相反如果编码为 A(10000) B(11111) ,此时 A 发生了两位错误变成了 10011,此时这段字符串与 A 的码距为 2,与 B 的码距也为 2,无法判断是 A 发生了错误还是 B 发生了错误,所以说需要码距大于 2d + 1
对于 2)
在编码码距为 d + 1 中只改变了 d 位的数据是不可能变为另一个合法值的,所以最小为 d + 1 位

更详细的可以看一下 NR-LDPC编码(一):纠错编码基本原理 - 知乎 (zhihu.com)

posted @ 2023-09-06 20:27  PupilXIao  阅读(438)  评论(0编辑  收藏  举报