纠错编码——海明码
海明码:可发现双比特错,纠正单比特错。
工作流程
- 确认校验码位数r
- 确定校验码和数据的位置
- 求出校验码的值
- 检错并纠错
01确认校验码位数r
海明不等式: 2 r ≥ k + r + 1 k 为 信 息 位 , r 为 冗 余 信 息 位 \text{海明不等式:} 2^r \geq k + r + 1 \\ k为信息位,r为冗余信息位 海明不等式:2r≥k+r+1k为信息位,r为冗余信息位
原理:
r位冗余信息位共有 2 r 2^r 2r种组合,除去1种标识信息正确,另有 2 r − 1 2^r-1 2r−1种组合来标识 2 r − 1 2^r - 1 2r−1位置的错误。则应有标识错误组合数>=总共传输比特位,即 2 r − 1 ≥ k + r 2^r - 1 \geq k + r 2r−1≥k+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 P1、P2、P3、P4,数据从左至右为 D 1 、 D 2 、 D 3 、 D 4 、 D 5 、 D 6 D_1、D_2、D_3、D_4、D_5、D_6 D1、D2、D3、D4、D5、D6
校验位分别放在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 3、5、7、9…位, P 2 P_2 P2校验第 3 、 6 、 7 、 10 … 3、6、7、10 \ldots 3、6、7、10…位, P 3 P_3 P3校验第 5 、 6 、 7 … 5、6、7 \ldots 5、6、7…位, P 4 P_4 P4校验第 9 、 10 … 9、10 \ldots 9、10…位。
校验位要使得其所有校验位置的数据与自己异或为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} P1⊕D1⊕D2⊕D4⊕D5=0P2⊕D1⊕D3⊕D4⊕D6=0P3⊕D2⊕D3⊕D4=0P4⊕D5⊕D6=0⟹⟹⟹⟹P1⊕1⊕0⊕1⊕0=0P2⊕1⊕1⊕1⊕1=0P3⊕0⊕1⊕1=0P4⊕0⊕1=0⟹P1=0⟹P2=0⟹P3=0⟹P4=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} P1⊕D1⊕D2⊕D4⊕D5P2⊕D1⊕D3⊕D4⊕D6P3⊕D2⊕D3⊕D4P4⊕D5⊕D6====0⊕1⊕1⊕1⊕00⊕1⊕1⊕1⊕10⊕1⊕1⊕11⊕0⊕1=1=0=1=0
从下到上排序结果 0101,对应十进制5,即第5位出错,只需将其从1改为0即可。
注:单比特、双比特出错都可检测出,但只能纠正单比特错误。若出现双比特出错,那么根据海明码校验结果只能表示出错误,即校验结果不全0,但其对应的位置不一定出错,这种情况下海明码默认当作单比特出错而进行纠错,就会出现纠错也错误问题。
原理:当某一校验位检错异或出1时,说明出错位的"位置二进制表示"的该位置一定是1,若异或出0,则说明出错位的"位置二进制表示"的该位置为0。则校验结果从下至上排序正好表示了出错位的"位置二进制表示"。
个人理解,若有错误或您有更好的理解,望斧正。
以上为个人学习笔记,学习视频链接B站-王道考研-计算机网络