关于海明码
Posted _Origin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于海明码相关的知识,希望对你有一定的参考价值。
前置知识:
海明码:
- 海明码一般只能纠1位错。
- 海明码默认进行偶校验(除非特殊说明使用奇校验)。
- 海明码是一串只由0和1组成的序列
奇偶校验:
- 奇校验:一串由0和1组成的序列中1的个数如果为偶数则在前面加个1,使1的个数变成奇数,否则加0。
- 偶校验:一串由0和1组成的序列中1的个数如果为奇数则在前面加个1,使1的个数变成偶数,否则加0。
````例:
``````1111 奇校验就是 11111 偶校验就是 01111
``````1110 奇校验就是 01110 偶校验就是 11110
计算步骤
一、计算校验位的个数
计算 1011 的海明码 为例
公式:2^r >= m + r + 1
r:校验位的个数
m:信息位的个数 1011的信息位个数为:4
如图: r最小为3,即校验位的个数为3
二、分组
确定校验位在海明码中的位置2^1\\2^2\\2^3
校验码只出现在第2的r次方位置上,这里用P表示
分组:对P进行按进制位分组
先从P1开始,P1位置二进制中的最后一位是1(不看0),所以将所有位置二进制中最后一位为1的分为一组
即:
L1,L3,L5,L7
以此类推
L1,L3,L5,L7 将对应位置的序列值替换 P1,1,1,1
L2,L3,L6,L7 =====================》 P2,1,0,1
L4,L5,L6,L7 P3,1,0,1
校验码计算:
偶校验:一串由0和1组成的序列中1的个数如果为奇数则在前面加个1,使1的个数变成偶数,否则加0。
第一组中1的个数是3,为奇数,所以P1应为1,保证1的个数为偶数,同理P2=0,P3=0
将P带回序列得到偶校验码为 1010101
奇校验:一串由0和1组成的序列中1的个数如果为偶数则在前面加个1,使1的个数变成奇数,否则加0。
第一组中1的个数是3,为奇数,所以P1应为0,保证1的个数为奇数,同理P2=1,P3=1
将P带回序列得到奇校验码为 1011110
纠错:
假如传输过程中将1011传成了 1001
按照偶校验纠错:校验位P的值刚刚已经计算出P1=1,P2=0,P3=0
按照上方的方法进行分组
根据纠错位E进行判断错误的位置
E1,L1,L3,L5,L7 将对应位置的序列值替换 E1,1,1,0,1
E2,L2,L3,L6,L7 =====================》 E2,0,1,0,1
E3,L4,L5,L6,L7 E3,0,0,0,1
根据偶校验得出E1=1,E2=0,E3=1,按照E3E2E1的顺序合并得到101,101为10进制的5,所以第5个位置出错,如表所示是正确的
奇偶校验,海明码与crc码
奇偶校验
检查前面的每一位的‘1’是奇数个还是偶数个 若是奇校验,在为奇数个时输出1 偶校验同理 而奇偶校验一般都会在码距中检查
例如码距为4时 就是 1111 e 1111 e 1111 e 1111 其中每个 e 都是检查在校验中的1的检验码 如果直接是例子中的进行奇校验,毫无疑问e的值都会是0
海明码
有大部分冗杂的教程..但海明码的本质很简单:
把在第i位的校验码以二进制展开 然后就着该二进制为1的位进行奇偶校验即可;
crc码(冗余运算码)
这个比海明码比起来也简单 只不过稍微复杂点而已。。
首先是需要有固定长的数据位和固定的校验多项式
其中校验多项式一般都是 x^4 + x^2 + 1 这样的 就拿这个例来说,我们可以得到一串:10011
而这个校验多项式的数据位一定是不小于它的长度的 也就是 不小于5。这里我们用这个例子:111000101
接下来就是很重要的一部分:进行模二运算 模二运算顾名思义就是对数据进行二进制方式的加,减 其中规则如下:
模加&模减
1 1 ->0 0 0 ->0 1 0 ->1 0 1 ->1
模乘
1 1->1 00=01=10=0 也就是与运算
模除
这个有点难 也是crc最常用的运算; 只不过crc取的是它的尾数
这里拿上面的例子来说吧,首先我们让10011和111000101的前5位相比-> 若大,进1 若小 进0 且前五位进行模减
->10011 011110101 此时 1
->10011 001101101 此时11
->10011 000101011 此时111
->10011 000001011 此时1111
这时候如果只是用来取校验码就不用算了 取 结果的余数 01011 即可。
以上是关于关于海明码的主要内容,如果未能解决你的问题,请参考以下文章