我是靠谱客的博主 迅速猫咪,最近开发中收集的这篇文章主要介绍汉明码详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

汉明码

        • 1.首先确定汉明码的位数
            • 如何标注
        • 2、求出校验位的值
        • 3、纠错过程

1.首先确定汉明码的位数

公式: 2 k ≥ n + k + 1 2^kgeq n+k+1 2kn+k+1
字母含义: k k k表示检验位数, n n n表示传送的信息位数
简单解释一下这个公式怎么来的,因为我们要检验传送的信息中到底是哪一位出错了,所以首先会有传送的信息位数 n n n,然后我们的校验位数 k k k也插入到传送的信息当中去了,所以总位数变成 n + k n+k n+k,最后还要留出一个正确状态位,所以最后加 1 1 1,而校验码所能检错的总位数为 2 k 2^k 2k,当 2 k ≥ n + k + 1 2^kgeq n+k+1 2kn+k+1时,才能把所有位置标注出来。
下面有个表格

n12-45-1112-2627-5758-120
k234567

简单记一下这个表,一般k=3,4,5用的比较多。

如何标注

在唐朔飞版的教材中用的是 C i C_i Ci表示校验位, b i b_i bi表示信息位。
标注方法:校验位应该位于 2 k − 1 2^{k-1} 2k1序号处,信息位按顺序依次填入
举个例子:欲传送的信息为1010
首先根据 2 k ≥ n + k + 1 2^kgeq n+k+1 2kn+k+1求出校验位 k = 3 k=3 k=3
我比较喜欢顺着来就设 b 1 b 2 b 3 b 4 = 1010 b_1b_2b_3b_4=1010 b1b2b3b4=1010 C 1 C 2 C 4 C_1C_2C_4 C1C2C4分别表示三个校验码。

二进制序号 H 1 H_1 H1 H 2 H_2 H2 H 3 H_3 H3 H 4 H_4 H4 H 5 H_5 H5 H 6 H_6 H6 H 7 H_7 H7
名称 C 1 C_1 C1C_2 b 1 b_1 b1 C 4 C_4 C4 b 2 b_2 b2 b 3 b_3 b3 b 4 b_4 b4
1010

根据此表,以 C 4 C_4 C4为例, C 4 C_4 C4应填到第 2 k − 1 = 2 3 − 1 = 4 2^{k-1}=2^{3-1}=4 2k1=231=4位处,其他两个也是如此,然后将 b i b_i bi依次填入(k表示 C i C_i Ci是第几个校验位)。

2、求出校验位的值

H 3 = 3 = 011 H_3=3=011 H3=3=011
H 5 = 5 = 101 H_5=5=101 H5=5=101
H 6 = 6 = 110 H_6=6=110 H6=6=110
H 7 = 7 = 111 H_7=7=111 H7=7=111
这里的等于说的是 H 3 H_3 H3为第三位,只不过使用二进制表示
其中 H 3 = b 1 H_3=b_1 H3=b1 H 5 = b 2 H_5=b2 H5=b2 H 6 = b 3 H_6 =b3 H6=b3 H 7 = b 4 H_7=b_4 H7=b4
H 3 = H 5 = H 6 = H 7 = [ 0 1 1 1 ] [ 1 0 1 1 ] [ 1 1 0 1 ] begin{matrix} H_3=\H_5 = \ H_6= \ H_7= end{matrix} begin{bmatrix} 0\1 \ 1 \ 1 end{bmatrix}begin{bmatrix} 1\0 \ 1 \ 1 end{bmatrix}begin{bmatrix} 1\1 \ 0 \ 1 end{bmatrix} H3=H5=H6=H7=011110111101
最后一列表示 C 1 = H 3 ⨁ H 5 ⨁ H 7 = b 1 ⨁ b 2 ⨁ b 4 C_1=H_3bigoplus H_5bigoplus H_7=b_1bigoplus b_2bigoplus b_4 C1=H3H5H7=b1b2b4(注意这里 C i C_i Ci的位置正好和列的位置相反)
其中 ⨁ bigoplus 表示异或。
取值规则为:
C 1 C_1 C1取用二进制表示的位置最后一列为一所对应的信息位。
C 2 C_2 C2取用二进制表示的位置倒数第二列为一所对应的信息位。
C 4 C_4 C4取用二进制表示的位置倒数第三列为一所对应的信息位。
依次类推。
还有一种就是按照定义方式,先分小组。
有三个要求:
(1) g i g_i gi小组独占第 2 i − 1 2^{i-1} 2i1位(i=1,2,3,…)
(2) g i , g j g_i,g_j gi,gj共同占有第 2 i − 1 + 2 j − 1 2^{i-1}+2^{j-1} 2i1+2j1位(i,j=1,2,3,…)
(3) g i , g j , g l g_i,g_j,g_l gi,gj,gl共同占有第 2 i − 1 + 2 j − 1 + 2 l − 1 2^{i-1}+2^{j-1}+2^{l-1} 2i1+2j1+2l1位(i,j,l=1,2,3,…),是其他小组没有的

C i C_i Ci g g g检测的 g i g_i gi小组包含的位
C 1 C_1 C1 g 1 g_1 g11,3,5,7,9,11,…
C 2 C_2 C2 g 2 g_2 g22,3,6,7,10,11,14,15,…
C 4 C_4 C4 g 3 g_3 g34,5,6,7,12,13,14,15,…
C 8 C_8 C8 g 4 g_4 g48,9,10,11,12,13,14,15,24,…

如何理解这几个要求呢,以 C 2 C_2 C2为例说明一下。
C 2 , i = 2 C_2,i=2 C2,i=2,根据(1)知,包含 2 2 − 1 = 2 2^{2-1}=2 221=2;根据(2)知,包含 2 2 − 1 + 2 j − 1 , ( j = 1 , 2 , 3 , . . ) 所 以 可 以 的 到 3 , 6 , 10 , . . . ( i ≠ j ) 2^{2-1}+2^{j-1},(j=1,2,3,..)所以可以的到3,6,10,...(ineq j) 221+2j1,(j=1,2,3,..)3,6,10,...(i̸=j);根据(3)知,包含 2 2 − 1 + 2 j − 1 + 2 l − 1 , ( j , l = 1 , 2 , 3 , . . ) 2^{2-1}+2^{j-1}+2^{l-1},(j,l=1,2,3,..) 221+2j1+2l1,(j,l=1,2,3,..),所以有7,11,14,…。我感觉这种方法不如上面那种方法好用。

继续求 C i C_i Ci
C 1 = H 3 ⨁ H 5 ⨁ H 7 = b 1 ⨁ b 2 ⨁ b 4 = 1 ⨁ 0 ⨁ 0 = 1 C_1=H_3bigoplus H_5bigoplus H_7=b_1bigoplus b_2bigoplus b_4= 1bigoplus 0bigoplus0=1 C1=H3H5H7=b1b2b4=100=1
C 2 = H 3 ⨁ H 6 ⨁ H 7 = b 1 ⨁ b 3 ⨁ b 4 = 1 ⨁ 1 ⨁ 0 = 0 C_2=H_3bigoplus H_6bigoplus H_7=b_1bigoplus b_3bigoplus b_4= 1bigoplus 1bigoplus0=0 C2=H3H6H7=b1b3b4=110=0
C 4 = H 5 ⨁ H 6 ⨁ H 7 = b 2 ⨁ b 3 ⨁ b 4 = 0 ⨁ 1 ⨁ 0 = 1 C_4=H_5bigoplus H_6bigoplus H_7=b_2bigoplus b_3bigoplus b_4= 0bigoplus 1bigoplus0=1 C4=H5H6H7=b2b3b4=010=1
如果不懂异或直接数一的个数,奇数个就等于1,偶数个等于0。

3、纠错过程

P 1 = H 1 ⨁ H 3 ⨁ H 5 ⨁ H 7 = C 1 ⨁ b 1 ⨁ b 2 ⨁ b 4 = 1 ⨁ 1 ⨁ 0 ⨁ 0 = 0 P_1=H_1bigoplus H_3bigoplus H_5bigoplus H_7=C_1bigoplus b_1bigoplus b_2bigoplus b_4=1bigoplus 1bigoplus 0bigoplus 0=0 P1=H1H3H5H7=C1b1b2b4=1100=0
P 2 = H 2 ⨁ H 3 ⨁ H 6 ⨁ H 7 = C 2 ⨁ b 1 ⨁ b 3 ⨁ b 4 = 0 ⨁ 1 ⨁ 1 ⨁ 0 = 0 P_2=H_2bigoplus H_3bigoplus H_6bigoplus H_7=C_2bigoplus b_1bigoplus b_3bigoplus b_4=0bigoplus 1bigoplus 1bigoplus 0=0 P2=H2H3H6H7=C2b1b3b4=0110=0
P 4 = H 4 ⨁ H 5 ⨁ H 6 ⨁ H 7 = C 4 ⨁ b 2 ⨁ b 3 ⨁ b 4 = 1 ⨁ 0 ⨁ 1 ⨁ 0 = 0 P_4=H_4bigoplus H_5bigoplus H_6bigoplus H_7=C_4bigoplus b_2bigoplus b_3bigoplus b_4=1bigoplus 0bigoplus 1bigoplus 0=0 P4=H4H5H6H7=C4b2b3b4=1010=0
P i P_i Pi的取值规则,通过上面的事例应该能看出来,是 P i P_i Pi对应的 C i C_i Ci,再加上 C i C_i Ci对应的 b i b_i bi
P 4 P 2 P 1 = 000 P_4P_2P_1=000 P4P2P1=000,表示没有错。
错误实例:传递信息还是1010,加上检错码为1011010,但是在传输过程中,出现一位错误,变成1011011,。
P 1 = H 1 ⨁ H 3 ⨁ H 5 ⨁ H 7 = 1 ⨁ 1 ⨁ 0 ⨁ 1 = 1 P_1=H_1bigoplus H_3bigoplus H_5bigoplus H_7=1bigoplus 1bigoplus 0bigoplus 1=1 P1=H1H3H5H7=1101=1
P 2 = H 2 ⨁ H 3 ⨁ H 6 ⨁ H 7 = 0 ⨁ 1 ⨁ 1 ⨁ 1 = 1 P_2=H_2bigoplus H_3bigoplus H_6bigoplus H_7=0bigoplus 1bigoplus 1bigoplus 1=1 P2=H2H3H6H7=0111=1
P 4 = H 4 ⨁ H 5 ⨁ H 6 ⨁ H 7 = 1 ⨁ 0 ⨁ 1 ⨁ 1 = 1 P_4=H_4bigoplus H_5bigoplus H_6bigoplus H_7=1bigoplus 0bigoplus 1bigoplus 1=1 P4=H4H5H6H7=1011=1
P 4 P 2 P 1 = 111 = 7 P_4P_2P_1=111=7 P4P2P1=111=7,表示第七位出错。

最后

以上就是迅速猫咪为你收集整理的汉明码详解的全部内容,希望文章能够帮你解决汉明码详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部