汉明码奇偶校验矩阵理解

这篇具有很好参考价值的文章主要介绍了汉明码奇偶校验矩阵理解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先看  汉明码
一、矩阵解释 单bit纠正( SEC,single  error correction )
以数据位为8位(m)为例,编码位数为r,2^r>=m+r+1
r最小为4
编码后位数为4+8=12位
编码位为p1,p2 ,p3, p4
p1掌控:d1 d2 d4 d5 d7,分别对应位置是:11,101,111,1001,1011(也就是位置的二进制编码,第一位为1的,注意p1由其掌控的数据为求取得到)
p2掌控:d1 d3 d4 d6 d7,分别对应位置是:   11,110,111,1010,1011(也就是位置的二进制编码,第二位为1的)
p3:... :d2 d3 d4 d8(第三位为1的) 
p4:....:   d5 d6 d7 d8(第四位为1的)
位置编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
位置二进制编码
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
数据为和编码为标志
p1
p2
d1
p3
d2
d3
d4
p4
d5
d6
d7
d8
p1
1
1
1
1
1
1
p2
1
1
1
1
1
1
p3
1
1
1
1
1
p4
1
1
1
1
1
根据上表可以得到奇偶校验矩阵H:
H=
1 0 1 0 1 0 1 0 1 0 1 0
0 1 1 0 0 1 1 0 0 1 1 0
0 0 0 1 1 1 1 0 0 0 0 1
0 0 0 0 0 0 0 1 1 1 1 1
比如数据为1001_1100, 按照奇校验求取得到下表(就是保证所有位(包括校验位p)的1的个数是奇数)。
p1=^(10110)+1= 0(因为是奇数所以p1=0,这里1+1不进位,所以等于0)
p2=^(10110) +1 = 0
p3=^(00010)+1  = 0
p4=^(1100)+1=1 (因为是偶数所以p4=1)
位置编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
位置二进制编码
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
数据为和编码为标志
p1
p2
d1
p3
d2
d3
d4
p4
d5
d6
d7
d8
0
0
1
0
0
0
1
1
1
1
0
0
p1
1
1
1
1
1
1
p2
1
1
1
1
1
1
p3
1
1
1
1
1
p4
1
1
1
1
1
编码后数据流是:0 0 1 0 0 0 1 1 1 1 0 0
如果对方接受到的数据是0 0 1 0 0 0 1 1 1 1 0 0那么数据流和奇偶校验矩阵的乘积 矩阵 相乘并模2加法应该是一个全1矩阵,表示没有位置出错。
理解: 实际上就是对p和p所掌控的数据位重新取异或。(因为编码使,p和p所掌控的数据是按照奇校验计算的,所以对这些位重新取异或后值应该为1)
模二加法的话是1+1=0,1+0=1不进位
数据流是:
0 0 1 0 0 0 1 1 1 1 0 0
矩阵乘法:
1 0 1 0 1 0 1 0 1 0 1 0              0    1
0 1 1 0 0 1 1 0 0 1 1 0        *     0    1 
0 0 0 1 1 1 1 0 0 0 0 1              1  = 1   
0 0 0 0 0 0 0 1 1 1 1 1              0    1  
                                                 0
                                                 0
                                                 1
                                                 1
                                                 1
                                                 1
                                                 0
                                                 0
A、如果接收到的单bit出错,比如第5位(d2):0 0 1 0 1 0 1 1 1 1 0 0
数据流是:
0 0 1 0 1 0 1 1 1 1 0 0
矩阵乘法:
1 0 1 0 1 0 1 0 1 0 1 0              0    0  p1'
0 1 1 0 0 1 1 0 0 1 1 0        *     0    1  p2'
0 0 0 1 1 1 1 0 0 0 0 1              1  = 0  p3' 
0 0 0 0 0 0 0 1 1 1 1 1              0    1  p4'
                                                 1
                                                 0
                                                 1
                                                 1
                                                 1
                                                 1
                                                 0
                                                 0
计算出来结果不是全1的,所以存在错误,如果是单bit出错,计算结果0101=5就表示出错位置,但是高于1bit的话实际上也会爆出来是出错,只是没有办法确认是哪几位。
p1'和p3'与值为0说明奇校验没有过。
图解释,如下,d2出错,从图中可以很形象的确认出p1'和p3'会报错:
汉明码奇偶校验矩阵理解
B、如果接收到的两bit出现错误
     原始编码后数据:                                 0 0 1 0 0 0 1 1 1 1 0 0
     如果第5位(d2)和第11位(d7)位出错:0 0 1 0 1 0 1 1 1 1 1 0
数据流是:
0 0 1 0 1 0 1 1 1 1 1 0
矩阵乘法:
1 0 1 0 1 0 1 0 1 0 1 0              0    1  p1'
0 1 1 0 0 1 1 0 0 1 1 0        *     0    0  p2'
0 0 0 1 1 1 1 0 0 0 0 1              1  = 0  p3'
0 0 0 0 0 0 0 1 1 1 1 1              0    0  p4'
                                                 1
                                                 0
                                                 1
                                                 1
                                                 1
                                                 1
                                                 1
                                                 0
从计算结果来看p2',p3',p4'计算出来有错误,奇校验没有过,但是p1'是正确的。1000=8没法确认出错的bit。
如下图所示,因为d2和d7都在p1中所以,求异或后抵消了,所以p1'是计算出来正确的。由于d2出错,所以p3'报错,由于d7出错,所以p4'和p2'报错。从图上也知道没法确认出错bit,也没有办法确认出错bit数量。也没法纠正。
汉明码奇偶校验矩阵理解
二、矩阵解释 单bit纠正,两bit检测( SECDED,single  error correction and  double error detection)(3bit err not work)
实现这种校验,需要额外增加一个校验位  global parity check bit,称为g
依然按照上面两种情况举例。
位置编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
位置二进制编码
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
数据为和编码为标志
p1
p2
d1
p3
d2
d3
d4
p4
d5
d6
d7
d8
g
0
0
1
0
0
0
1
1
1
1
0
0
0
p1
1
1
1
1
1
1
p2
1
1
1
1
1
1
p3
1
1
1
1
1
p4
1
1
1
1
1
g
1
1
1
1
1
1
1
1
1
1
1
1
g的话是所有为校验位:^(0 0 1 0 0 0 1 1 1 1 0 0)+1=0
编码后数据流是:                                          0 0 1 0 0 0 1 1 1 1 0 0 0
A、如果接收到的单bit出错,比如第5位(d2):0 0 1 0 1 0 1 1 1 1 0 0 0
数据流是:
0 0 1 0 1 0 1 1 1 1 0 0 0 
矩阵乘法:
1 0 1 0 1 0 1 0 1 0 1 0 0            0    0  p1'
0 1 1 0 0 1 1 0 0 1 1 0 0       *    0    1  p2'
0 0 0 1 1 1 1 0 0 0 0 1 0            1  = 0  p3' 
0 0 0 0 0 0 0 1 1 1 1 1 0            0    1  p4'
1 1 1 1 1 1 1 1 1 1 1 1 1            1    0  g' 
                                                  0
                                                  1
                                                  1
                                                  1
                                                  1
                                                  0
                                                  0
                                                  0
计算出来结果不是全1的,所以存在错误,如果是单bit出错(注意这里用的如果),计算结果0101=5就表示出错位置。由于g'不等于1所以整体上来说奇偶校验没有过存在错误的bit。
而且p1'和p3'也出错了。如果是单bit出错所以是可以找到对应bit并纠正的。(注意这里是如果)
整体出错,分量也出错,那么是单bit出错( 前提是没有超过3bit出错
图解释,如下,d2出错,从图中可以很形象的确认出p1'和p3'会报错,g也会报错:
汉明码奇偶校验矩阵理解
B、如果接收到的两bit出现错误
     原始编码后数据:                                 0 0 1 0 0 0 1 1 1 1 0 0 0
     如果第5位(d2)和第11位(d7)位出错:0 0 1 0 1 0 1 1 1 1 1 0 0
数据流是:
0 0 1 0 1 0 1 1 1 1 1 0 0
矩阵乘法:
1 0 1 0 1 0 1 0 1 0 1 0 0            0    1  p1'
0 1 1 0 0 1 1 0 0 1 1 0 0       *    0    0  p2'
0 0 0 1 1 1 1 0 0 0 0 1 0            1  = 0  p3'
0 0 0 0 0 0 0 1 1 1 1 1 0            0    0  p4'
1 1 1 1 1 1 1 1 1 1 1 1 1            1    1  g'
                                                  0
                                                  1
                                                  1
                                                  1
                                                  1
                                                  1
                                                  0
从计算结果来看p2',p3',p4'计算出来有错误,但是p1’和g'是正确的。1000=8没法确认出错的bit。
如下图所示,因为d2和d7都在p1中所以,求异或后抵消了,所以p1'是计算出来正确的(g'也是一样的)。由于d2出错,所以p3'报错,由于d7出错,所以p4'和p2'报错。从图上也知道没法确认出错bit,也没法纠正。由于 整体是正确的,但是分量有错误,所以判断出事两个bit出错了,但是没法纠正也没法确认出错bit。( 前提是没有超过3bit出错
汉明码奇偶校验矩阵理解
C.如果接收到的是3 bits错误或以上,SECDED没法work。
     原始编码后数据:                                                      0 0 1 0 0 0 1 1 1 1 0 0 0
     如果第5位(d2)和第11位(d7)以及第10位(d6)出错:0 0 1 0 1 0 1 1 1 0 1 0 0
数据流是:
0 0 1 0 1 0 1 1 1 0 1 0 0
矩阵乘法:
1 0 1 0 1 0 1 0 1 0 1 0 0            0    1  p1'
0 1 1 0 0 1 1 0 0 1 1 0 0       *    0    1  p2'
0 0 0 1 1 1 1 0 0 0 0 1 0            1  = 0  p3'
0 0 0 0 0 0 0 1 1 1 1 1 0            0    1  p4'
1 1 1 1 1 1 1 1 1 1 1 1 1            1    0  g'
                                                  0
                                                  1
                                                  1
                                                  1
                                                  1
                                                  1
                                                  0
从计算结果来看p3'计算出来有错误,但是p1’,p2’,p4'和g'是正确的。1101=13没法确认出错的bit。
如下图所示,因为d2和d7都在p1中所以,求异或后抵消了,所以p1'是计算出来正确的。由于d2出错,所以p3'报错,由于d7和d6出错,所以p4'和p2'校验正确。
由于有三个bit错误没法抵消,所以g'也是奇校验没有通过。
由于整体是错误的,分量也有错误,从下图也知道没法确认出错bit数,也没法纠正。
汉明码奇偶校验矩阵理解
所以超过三个bits出错的话没法work。超过3个bit(包括三个)没法区分是哪个bit出错,出错了几个bit。但是能分出是奇数个还是偶数个。
整体校验通过,分量没有通过那么是偶数个bit出错。
整体校验失败,分量校验也失败的话那么是奇数个bit出错。
从上面分析可以得出另一个结论是,实际上划分p1,p2,p3,p4所掌控的数据,并不一定要按照上面的规则去划分,按照图像解释只要能保证单个bit出错能定位到该bit就可以。
也就是校验矩阵可以采用其
三.生成码和校验码(G and  H
A.校验矩阵
位置编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
位置二进制编码
1
10
11
100
101
110
111
1000
1001
1010
1011
1100
数据为和编码为标志
p1
p2
d1
p3
d2
d3
d4
p4
d5
d6
d7
d8
0
0
1
0
0
0
1
1
1
1
0
0
p1
1
1
1
1
1
1
p2
1
1
1
1
1
1
p3
1
1
1
1
1
p4
1
1
1
1
1
实际上校验码矩阵H中,是可以将p和d位置分开来的。
原来的校验矩阵H是上表中的红色以及框起来的部分组成的,形式如下
1 0 1 0 1 0 1 0 1 0 1 0             
0 1 1 0 0 1 1 0 0 1 1 0        
0 0 0 1 1 1 1 0 0 0 0 1             
0 0 0 0 0 0 0 1 1 1 1 1            
如果将数据和校验位分开不做穿插排列的话(原始数据还是1001_1100),可排成如下表格:
位置编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
位置二进制编码
1
10
100
1000
101
110
111
1001
1010
1011
1100
1101
数据为和编码为标志
p1
p2
p3
p4
d1
d2
d3
d4
d5
d6
d7
d8
0
0
0
1
1
0
0
1
1
1
0
0
p1(位置编号第一位为1的数据)
1
1
1
1
1
1
p2(位置编号第二位为1的数据)
1
1
1
1
1
p3(位置编号第三位为1的数据)
1
1
1
1
1
1
p4(位置编号第4位为1的数据)
1
1
1
1
1
1
(注意表格中:位置二进制编码也往前提了)
那么现在的校验矩阵H就是两部分组成,一部分是校验位的单位阵(eye,上表黄色框部分),一部分是数据位的归属阵(上表红色框部分):
p1 p2 p3 p4 d1 d2 d3 d4 d5 d6 d7 d8
1 0 0 0     1 0 1 1 0 1 0 1 
0 1 0 0     0 1 1 0 1 1 0 0
0 0 1 0     1 1 1 0 0 0 1 1
0 0 0 1     0 0 0 1 1 1 1 1 (4*12)
生成矩阵G也是有两部分组成,一个是数据位归属阵的转置阵( 行换成同序数的列),一部分是数据的单位阵(eye):
p1 p2 p3 p4 d1 d2 d3 d4 d5 d6 d7 d8
1 0 1 0     1 0 0 0 0 0 0 0   
0 1 1 0     0 1 0 0 0 0 0 0
1 1 1 0     0 0 1 0 0 0 0 0
1 0 0 1     0 0 0 1 0 0 0 0
0 1 0 1     0 0 0 0 1 0 0 0
1 1 0 1     0 0 0 0 0 1 0 0
0 0 1 1     0 0 0 0 0 0 1 0
1 0 1 1     0 0 0 0 0 0 0 1   (8*12)
B.生成矩阵
生成矩阵G可以用于在编码器中生成编码后打代码。
公式是c= mG
比如上面源码m是 1001_1100,矩阵乘法后,取模二加法再+1(奇校验):
mG=
1 0 0 1 1 1 0 0 (1*8)* 
    1 0 1 0 1 0 0 0 0 0 0 0   
    0 1 1 0 0 1 0 0 0 0 0 0
    1 1 1 0 0 0 1 0 0 0 0 0
    1 0 0 1 0 0 0 1 0 0 0 0
    0 1 0 1 0 0 0 0 1 0 0 0
    1 1 0 1 0 0 0 0 0 1 0 0
    0 0 1 1 0 0 0 0 0 0 1 0
    1 0 1 1 0 0 0 0 0 0 0 1   (8*12)= 0 1 0 0 1 0 0 1 1 1 0 0(1*12)
                                                       p1 p2 p3 p4 d1 d2 d3 d4 d5 d6 d7 d8
最终求出的矩阵(1*12)就是编码后的数据,前四位是校验位,后面8位是原数据没变。
p1=^(d1d3d5d7)+1=^(1010)+1=1
p2=^(d2d3d6d7)+1=^(0010)+1=0
C.校验
奇校验情况下如果收到的码是正确的,那么可H和收到的数据相乘应该为全为一(取模二加法):
接收到的正确的码:
0 1 0 0 1 0 0 1 1 1 0 0
校验:
1 0 0 0 1 0 1 1 0 1 0 1
0 1 0 0 0 1 1 0 1 1 0 0         *
0 0 1 0 1 1 1 0 0 0 1 1
0 0 0 1 0 0 0 1 1 1 1 1 (4*12)   
                                       
0           
1
0
0
1           1
0     =    1  
0           1
1           1
1
1
0
0(12*1)                                                                         
只要生成矩阵和校验矩阵能够对应上,就能进行编码和校验,并不一定说要p1使用第一位为1的位置,p2使用第二位为1的位置(我也可以p1使用第一位为0,p2第二位为0的位置)
四.任意生成矩阵和校验矩阵(不完全正确自己理解的总结)
如三.中的例子,使用4位的校验位,可以表示16个错误位。(还是奇校验),可以写成如下错码表
位置编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
位置二进制编码
1
10
100
1000
101
110
111
1001
1010
1011
1100
1101
错码位
p1
p2
p3
p4
d1
d2
d3
d4
d5
d6
d7
d8
p1'p2'p3'p4'
0111
1011
1101
1110
0101
1001
0001
0110
1010
0010
1100
0100
图像解释:
0111表示p1'计算出来不正确,所以错误位是p1 (表示p1属于p1)
1001表示p2'p3'计算出来不正确,所以错误位是d2(1001表示d2属于p2和p3)
以此类推...
汉明码奇偶校验矩阵理解
从这个错码表可以知道,实际上可以通过错码表来生成校验和生成矩阵,而且错码表示可以是任意的,只需要保证每一个错码表示唯一一个可能的错位。这样就可以在只有一个bit出错时可以纠正。
五.代码
编码器:这个编码器使用的是SECDED,且也不是按照 p 1使用第一位为1的位置,p2使用第二位为1的位置来计算的,可能使用错码表思路。
汉明码奇偶校验矩阵理解
汉明码奇偶校验矩阵理解
解码器:校验并纠正。
汉明码奇偶校验矩阵理解
汉明码奇偶校验矩阵理解
汉明码奇偶校验矩阵理解
此代码是偶校验的,校验原理是:校验位和数据位的异或结果s[i]需要是0,如果不是0说明有错误。在认为只有小于3bit出错的情况下,此算法的工作会认为:
s中存在bit为1,那么说明有错误,ecc_err_detected拉高
如果s异或结果为1,那么说明有一bit错误, ecc_err_detected和 ecc_err_detected_s都会拉高
s中存在bit为1,那么说明有错误,ecc_err_detected拉高,且 s异或结果为0,那么说明不是1 bit错误, ecc_err_detected和 ecc_err_detected_d都会拉高
超过3个bit(包括3bit)后此代码不能纠正也不能判断出错位数,只能判断出错位数的奇偶性。
此代码的纠正原理是:e[0]表示d[0]所在属的三个校验位c[0],c[2],c[3]的校验结果s[0],s[2],s[3]的取&,如果为1表示三个校验位都出错,(按照上面图形解释思想)同时属于这三个校验位的只有d[0],那么就表示d[0]出错了。最后矫正时d[0]^e[0]就是,如果d[0]出错,出错后为0,那么0^1=1,如果出错后为1,那么1^1=0.这样就可以矫正。

文章来源地址https://www.toymoban.com/news/detail-501505.html

到了这里,关于汉明码奇偶校验矩阵理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】UART串口通信——奇偶校验实现

    奇偶校验位是基于uart的数据上进行一个判断 奇校验:数据1个数为奇时,校验为0,反之为1 偶校验:数据0个数为偶时,校验为0,反之为1 Uart回环在之前已经实现,现在需要基于uart增加一个奇偶校验位的需求 uart及代码:https://blog.csdn.net/weixin_59150966/article/details/128005066?spm=10

    2024年02月11日
    浏览(32)
  • 汇编语言(32位除法、分支结构、循环结构,奇偶校验,ascii转换,功能号调用)

    1)顺序结构:编写一个32位无符号数除法的程序。要求将存放在NUM1中的32位无符号数与存放在NUM2中的16位无符号数相除,结果存放在NUM3和NUM4中。 根据题目要求,应把存放在数据段内的被除数NUM1定义为32位,除数NUM2定义为16位,商NUM3定义为16位,余数NUM4定义为16位。 2)分支

    2024年02月06日
    浏览(39)
  • P02114065刘浩宇,P02114070程韩奇,P02114066吴其,P02114068张璐——深入理解线性分组码的生成矩阵和校验矩阵定义及其关系

    目录 前言 线性分组码 定义 性质 生成矩阵和校验矩阵 生成矩阵 生成矩阵的定义 生成矩阵的特性 校验矩阵 校验矩阵的定义 校验矩阵的特性 生成矩阵和校验矩阵的关系 由于移动通信存在干扰和衰落,在信号传输过程中将出现差错,故对数字信号必须采用纠、检错技术,即纠

    2024年02月03日
    浏览(33)
  • 计算机组成原理--基于Logisim的奇偶校验电路实验的应用(超详细/设计/实验/作业/练习)

    1、掌握奇偶校验基本原理和特性 2、掌握在 Logisim 中实现偶校验编码电路,检错电路,理解校验码传输的原理。 1.软件:Logisim软件、JAVA环境 2.硬件:计算机Windows 10 在 logisim 中打开实验资料包中的 data.circ 文件,在对应电路中完成偶校验编码电路。实验电路输入输出引脚如图所

    2024年02月05日
    浏览(33)
  • 计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码

    带你度过期末难关 文章目录 一、差错控制 1、冗余编码 2、编码VS编码 二、检错编码 1、奇偶校验码 2、CRC循环冗余码 三、纠错编码————海明码 海明距离 1、确定校验码位数r 2、确定校验码和数据的位置 3、求出校验码的值 4、检错并纠错 纠错的方法一: 纠错方法二: 总

    2024年02月04日
    浏览(44)
  • ZZULIOJ 1126: 布尔矩阵的奇偶性

    题目描述 一个布尔方阵具有奇偶均势特性,当且仅当 每行、每列总和为偶数,即包含偶数个1。如下面这个4*4的矩阵就具有奇偶均势特性: 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 1 编写程序,读入一个n阶方阵并检查它是否具有奇偶均势特性。如果没有,你的程序应当再检查一下它是否可以通

    2024年02月01日
    浏览(25)
  • 循环码生成矩阵与监督 (校验) 矩阵

    本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 定义:记 C ( x ) mathrm{C}(x) C ( x ) 为 (n, k) 循环码的所有码字对应的多项式的集

    2024年02月06日
    浏览(33)
  • shell脚本中对明码加密的方法

    工作中连接数据库或登陆时,应避免在代码中或者配置文件中直接使用明码,因为明码可能会造成数据泄露等不安全操作,现对shell脚本中对明码加密解密操作进行说明,从而方便的对敏感信息做加密处理。本文推荐使用base64编码加密方法对各种明码进行加密,上手快且使用

    2024年02月11日
    浏览(25)
  • Elasticsearch学习,请先看这篇!

    目录 一、初始elasticsearch 1、概述 简介 发展 2、倒排索引 3、基本概念 文档 索引 Mysql和es的区别 4、分词器 初始分词器 Ik分词器-扩展词库 二、索引库操作 1、mapper属性 2、创建索引库  3、查询、删除索引库 三、文档操作 1、新增文档  2、查询、删除文档  3、修改文档 四、

    2023年04月25日
    浏览(38)
  • 从原理到代码理解CRC循环冗余校验

    概述:本文详细介绍了CRC循环冗余计算的数学原理,算法中使用的参数说明,并以Modbus协议中的CRC-16算法为例,进行手算验证,同时提供LabVIEW和C语言的直接计算CRC-16 值的代码以及C的查表计算CRC-16代码和代码原理的说明。 初次接触CRC校验是因为项目需要上位机软件来记录P

    2024年02月04日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包