海明码笔记

纠错编码——海明码

海明码:可发现双比特错,纠正单比特错。

工作流程

  1. 确认校验码位数r
  2. 确定校验码和数据的位置
  3. 求出校验码的值
  4. 检错并纠错

01确认校验码位数r

海明不等式: 2 r ≥ k + r + 1 k 为 信 息 位 , r 为 冗 余 信 息 位 \text{海明不等式:} 2^r \geq k + r + 1 \\ k为信息位,r为冗余信息位 海明不等式:2rk+r+1kr

原理

r位冗余信息位共有 2 r 2^r 2r种组合,除去1种标识信息正确,另有 2 r − 1 2^r-1 2r1种组合来标识 2 r − 1 2^r - 1 2r1位置的错误。则应有标识错误组合数>=总共传输比特位,即 2 r − 1 ≥ k + r 2^r - 1 \geq k + r 2r1k+r

02确定校验码和数据的位置

假设数据 D = 101101 D=101101 D=101101

则根据海明不等式得出 r = 4 r = 4 r=4

设校验位从左至右为 P 1 、 P 2 、 P 3 、 P 4 P_1、P_2、P_3、P_4 P1P2P3P4,数据从左至右为 D 1 、 D 2 、 D 3 、 D 4 、 D 5 、 D 6 D_1、D_2、D_3、D_4、D_5、D_6 D1D2D3D4D5D6

校验位分别放在2的几次幂位,数据位则从左至右填充空位。

位置 1 2 3 4 5 6 7 8 9 10
代码 P 1 P_1 P1 P 2 P_2 P2 D 1 D_1 D1 P 3 P_3 P3 D 2 D_2 D2 D 3 D_3 D3 D 4 D_4 D4 P 4 P_4 P4 D 5 D_5 D5 D 6 D_6 D6
实际值 1 0 1 1 0 1

03求出校验码的值

每一个校验位都填在2的幂次位置,所以其"位置的二进制表示"只有一个1,设在右数第r位。该校验位就校验"位置二进制表示"的右数第r位为1的数据。

例如: P 1 P_1 P1位置二进制表示中1在右数第1位,则其校验所有"位置二进制表示"的右数第一位为1的数据,即第 3 、 5 、 7 、 9 … 3、5、7、9 \ldots 3579位, P 2 P_2 P2校验第 3 、 6 、 7 、 10 … 3、6、7、10 \ldots 36710位, P 3 P_3 P3校验第 5 、 6 、 7 … 5、6、7 \ldots 567位, P 4 P_4 P4校验第 9 、 10 … 9、10 \ldots 910位。

校验位要使得其所有校验位置的数据与自己异或为0(可理解为偶校验)。
P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 ⊕ D 5 = 0    ⟹    P 1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 0 = 0    ⟹    P 1 = 0 P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 ⊕ D 6 = 0    ⟹    P 2 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 1 = 0    ⟹    P 2 = 0 P 3 ⊕ D 2 ⊕ D 3 ⊕ D 4 = 0    ⟹    P 3 ⊕ 0 ⊕ 1 ⊕ 1 = 0    ⟹    P 3 = 0 P 4 ⊕ D 5 ⊕ D 6 = 0    ⟹    P 4 ⊕ 0 ⊕ 1 = 0    ⟹    P 4 = 1 \begin{aligned} & P_1 \oplus D_1 \oplus D_2 \oplus D_4 \oplus D5 = 0 & \implies & P_1 \oplus 1 \oplus 0 \oplus 1 \oplus 0 = 0 & \implies P_1 = 0 \\ & P_2 \oplus D_1 \oplus D_3 \oplus D_4 \oplus D6 = 0 & \implies & P_2 \oplus 1 \oplus 1 \oplus 1 \oplus 1 = 0 & \implies P_2 = 0 \\ & P_3 \oplus D_2 \oplus D_3 \oplus D_4 = 0 & \implies & P_3 \oplus 0 \oplus 1 \oplus 1 = 0 & \implies P_3 = 0 \\ & P_4 \oplus D_5 \oplus D_6 = 0 & \implies & P_4 \oplus 0 \oplus 1 = 0 & \implies P_4 = 1 \\ \end{aligned} P1D1D2D4D5=0P2D1D3D4D6=0P3D2D3D4=0P4D5D6=0P11010=0P21111=0P3011=0P401=0P1=0P2=0P3=0P4=1

将所得校验位数值填入

位置 1 2 3 4 5 6 7 8 9 10
二进制表示 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
代码 P 1 P_1 P1 P 2 P_2 P2 D 1 D_1 D1 P 3 P_3 P3 D 2 D_2 D2 D 3 D_3 D3 D 4 D_4 D4 P 4 P_4 P4 D 5 D_5 D5 D 6 D_6 D6
实际值 0 0 1 0 0 1 1 1 0 1

即所传输数据为0010 0111 01

04检错并纠正

假设传输过程中第5位即 D 2 D_2 D2出错,收到的结果为 0010 1111 01

按照求校验值方式进行异或计算
P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 ⊕ D 5 = 0 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 0 = 1 P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 ⊕ D 6 = 0 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 1 = 0 P 3 ⊕ D 2 ⊕ D 3 ⊕ D 4 = 0 ⊕ 1 ⊕ 1 ⊕ 1 = 1 P 4 ⊕ D 5 ⊕ D 6 = 1 ⊕ 0 ⊕ 1 = 0 \begin{aligned} & P_1 \oplus D_1 \oplus D_2 \oplus D_4 \oplus D5 & = & 0 \oplus 1 \oplus 1 \oplus 1 \oplus 0 & = 1 & \\ & P_2 \oplus D_1 \oplus D_3 \oplus D_4 \oplus D6 & = & 0 \oplus 1 \oplus 1 \oplus 1 \oplus 1 & = 0 \\ & P_3 \oplus D_2 \oplus D_3 \oplus D_4 & = & 0 \oplus 1 \oplus 1 \oplus 1 & = 1 \\ & P_4 \oplus D_5\oplus D_6 & = & 1 \oplus 0 \oplus 1 & = 0 \end{aligned} P1D1D2D4D5P2D1D3D4D6P3D2D3D4P4D5D6====01110011110111101=1=0=1=0
从下到上排序结果 0101,对应十进制5,即第5位出错,只需将其从1改为0即可。

注:单比特、双比特出错都可检测出,但只能纠正单比特错误。若出现双比特出错,那么根据海明码校验结果只能表示出错误,即校验结果不全0,但其对应的位置不一定出错,这种情况下海明码默认当作单比特出错而进行纠错,就会出现纠错也错误问题。

原理:当某一校验位检错异或出1时,说明出错位的"位置二进制表示"的该位置一定是1,若异或出0,则说明出错位的"位置二进制表示"的该位置为0。则校验结果从下至上排序正好表示了出错位的"位置二进制表示"。

个人理解,若有错误或您有更好的理解,望斧正。

以上为个人学习笔记,学习视频链接B站-王道考研-计算机网络

猜你喜欢

转载自blog.csdn.net/qq_44856695/article/details/105350019
今日推荐