分析纠错或检错能力与什么因素有关?
1、{000,001,010,011,100,101,110,111};这里给出的代码是从3个0开始到3个1结束,中间是连续变化的,其中的任何一个代码出错以后,假设000变成了001,这样的情况是没有办法检错的。检0位错、纠0位错。
下面对代码的集合进行改造
2、{000, 011,101,110};现在进行改造之后,编码的特点1的个数是偶数个或者是零个,假设000变成了100就能检错出来因为1不是偶数个,但是不能纠错,应为000,101,110都有可能变成100。检1位错,纠0位错。
3、{000,111};改造之后用3个0表示一个0,3个1表示一个1,假如现在有一个代码100,假如是一位错,就能检测出原始代码保存的是000。但是如果是110,显然有可能是000 --> 110,或者是111 --> 110,但是根据检1位错,会把代码110改为111,而不是000。检1位错,纠1位错。
4、{0000,1111};改造之后用4个0表示一个0, 4个1表示一个1,假如现在有一个代码1100,可以判断是两位除了错,但是是哪两位出了错我们无法判断。检2位错,纠1位错
5、{00000,11111};改造之后用5个0表示一个0, 5个1表示一个1, 假如现在有一个代码11000,根据检错概率来说判断是两位错了,判断出11是错的,接收方可以直接把这个11改成00,纠成00000。假如是11100 ,有可能是111错了,也有可能是00错了,显然检测不出3位错。 检2位错,纠2位错。
根据上面的分析:编码的检测能力和纠错能力和什么有关呢 ?
任意两组合法代码之间 二进制位 的 最少差异数 比如第2组代码,差2位,只能检1位错,纠0位错;比如第3组代码,差3位,检1位错,纠1位错;
比如第4组代码,差4位,检2位错,纠1位错;比如第5组代码,差5位,检2位错,纠2位错;
编码的最小距离
任意两组合法代码之间二进制位数的最少差异(合法代码集中的一个合法代码,把它变成这个集合当中另外的一个合法代码我们需要改变最少的二进制的位数)
编码的纠错 、检错能力与编码的最小距离有关(这个最小距离越大,检错和纠错能力就越强)
L
−
1
=
D
+
C
(
D
>
=
C
)
L - 1 = D + C(D>=C)
L−1=D+C(D>=C)
上面给出的是最小距离的公式,其中L —— 编码的最小距离,D —— 检测错误的位数,C —— 纠正错误的位数,通常情况下检测到错误的位数要大于等于纠错的错误的位数。
假设L = 3,具有 一位纠错能力(D=1),那么C应该等于(最小有1位的纠错位数), 3 - 1 = 1 + 1
汉明码的组成
汉明码采用奇偶检验(奇校验就是加上一个校验位,加上原来的数据位,合在一起让1的个数是奇数个,偶校验就是加上一个校验位,加上原来的数据位,合在一起让1的个数是偶数个)
汉明码的组成需添加多少位检测位,如果要传输代码信息位包含了n位,校验位包含了k位(分成了k组),一共就是n + k + 1
公式为:2^k >= n + k + 1
检测位的位置?放在 2^i(i = 0 , 1 , 2 , 3 , 4 …)的位置;检测位的取值?根据采用奇校验还是偶校验来决定检测位的取值
下面看一个例子:
现在我们要保存的信息:00100011,假设现在使用偶校验:100100011(高位1是检验位,使用这个校验如果我们读出来的数据1的个数是奇数个,我们就能知道这9位代码中有一位代码发现的翻转,让1的个数变成了奇数个,但是哪一位错不知道)
现在使用分组来更精确的检错,比如我们现在使用两位校验位。把这8位数据分为两组,前面的4位是一组,后面的4位是一组。1001000011,加粗的1和0是校验位,如果前面一组1的个数变成了奇数个说明有一位数据错了,如果后面一组的1的个数变成了奇数个也说明有一位数据错了。
汉明码的分组是一种非划分方式
组合组之间是有交叉的,有些位是属于多个组的,有些位是属于一个组的。比如现在有一组数据
1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|
分成三组每组有一个校验位共包括4位数据。(校验位应该放在哪里位置呢?放在2 ^ i次方上,上面7个数据2 ^ 0=1,2 ^ 1=2,2 ^ 2=4)所以1,2,4放在校验位; 2 ^ 3 = 8,但是这组数据最大就是7,所以校验位到4为止。
知道了校验位之后,其他几个数据是如何分组的呢?
十进制 1 2 3 4 5 6 7 二进制 00001 00010 00011 00100 00101 00110 00111 第一组:xxxx1(二进制的最后一位是1)
第二组:xxx1x(二进制的倒数第二位是1)
第三组:xx1xx(二进制的倒数第三位是1)
第四组:x1xxx(二进制的顺数第二位是1)
第五组:1xxxx(二进制的第一位是1)
所以第一组数据就是1 3 5 7(1是检测位,把1 3 5 7都转为2进制,它们最后一位2进制都是1,所以将这四位分成第一组),第二组数据就是2 3 6 7(2是检测位,把2 3 6 7都转为2进制,它们倒数第二位2进制都是1,所以将这四位分成第二组),第三组数据就是4 5 6 7(4是检测位,把4 5 6 7都转为2进制,它们倒数第三位2进制都是1,所以将这四位分成第三组);
如果一个数的二进制码最后一位和倒数第二位都是1,那么这个数就是第一组和第二组共有的。同理,如果最后一位和倒数第三位都是1,那么这个数就是第一组和第三组共有的。倒数第二位和倒数第三位都是1的话,那么这个数就是第二组和第三组共有的。
下面给出汉明码的图
对每一位检错的组合就是
P3 | P2 | P1 | 转为十进制 | 错误码 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 无差错 |
0 | 0 | 1 | 1 | 1 |
1 | 0 | 1 | 5 | 5 |
1 | 1 | 0 | 6 | 6 |
1 | 1 | 1 | 7 | 7 |
练习:求0101按 “偶校验” 配置的汉明码
第一:n = 4 ,根据 2^k >= n + k + 1, 2^k >= 5 + k 得k = 3,所以需要分成三组。
第一组 1 3 5 7
第二组 2 3 6 7
第三组 4 5 6 7
在第一组中,5 7位置上存放的都是1, 3位置上存放是0,为了确保1是偶数个,所以C1的位置存放0
在第二组中,3 6位置上存放的都是0, 7位置上存放是1,为了确保1是偶数个,所以C2的位置存放1
在第三组中,5 7位置上存放的都是1, 6位置上存放是0,为了确保1是偶数个,所以C4的位置存放0
二进制序号 1 2 3 4 5 6 7 名称 C1 C2 0 C4 1 0 1 0 1 0 所以0101的汉明编码为:0100101
下面给出一道题目,朋友们可以根据上面的练习,计算出这道题目的汉明码
按配偶原则配置 0011 的汉明码
答案是1000011