汉明码编码原理介绍
更新时间:2024-01-21 02:19:01 阅读量: 教育文库 文档下载
汉明码编码原理介绍
汉明码是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。其SECDED版本另外加入一检测比特,可以侦测两个或以下同时发生的比特错误,并能够更正单一比特的错误。
1940年,汉明于贝尔实验室工作,运用贝尔模型电脑,输入端依靠打孔卡,这不免有些读取错误。在平日,特殊代码将发现错误并闪灯,使得操作者能够纠正这个错误。在周末和下班期间,在没有操作者的情况下,机器只会简单地转移到下一个工作,汉明在周末工作,他对于不可靠的读卡机发生错误后,总是必须重新开始方案变得愈来愈沮丧。在接下来的几年中,他为了解决调试的问题,开发了功能日益强大的调试算法。在1950年,他发表了今日所称的汉明码。现在汉明码有着广泛的应用。
人们在汉明码出现之前使用过多种检查错误的编码方式,但是没有一个可以在和汉明码在相同空间消耗的情况下,得到相等的效果。
汉明码原理介绍:
奇偶校验是一种添加一个奇偶位用来指示之前的数据中包含有奇数还是偶数个1的检验方式。如果在传输的过程中,有奇数个位发生了改变,那么这个错误将被检测出来(注意奇偶位本身也可能改变)。一般来说,如果数据中包含有奇数个1的话,则将奇偶位设定为1;反之,如果数据中有偶数个1的话,则将奇偶位设定为0。换句话说,原始数据和奇偶位组成的新数据中,将总共包含偶数个1.
奇偶校验并不总是有效,如果数据中有偶数个位发生变化,则奇偶位仍将是正确的,因此不能检测出错误。而且,即使奇偶校验检测出了错误,它也不能指出哪一位出现了错误,从而难以进行更正。数据必须整体丢弃并且重新传输。在一个噪音较大的媒介中,成功传输数据可能需要很长时间甚至不可能完成。虽然奇偶校验的效果不佳,但是由于他只需要一位额外的空间开销,因此这是开销最小的检测方式。并且,如果知道了发生错误的位,奇偶校验还可以恢复数据。
如果一条信息中包含更多用于纠错的位,且通过妥善安排这些纠错位使得不同的出错位产生不同的错误结果,那么我们就可以找出出错位了。在一个7位的信息中,单个数据位出错有7种可能,因此3个错误控制位就足以确定是否出错及哪一位出错了。
汉明编码方案通用算法
下列通用算法可以为任意位数字产生一个可以纠错一位的汉明码。 一、1开始给数字的数据位(从左向右)标上序号, 1,2,3,4,5... 二、将这些数据位的位置序号转换为二进制,1, 10, 11, 100, 101,等。
三、数据位的位置序号中所有为二的幂次方的位(编号1,2,4,8,等,即数据位位置序号的二进制表示中只有一个1)是校验位
四、有其它位置的数据位(数据位位置序号的二进制表示中至少2个是1)是数据位 五、每一位的数据包含在特定的两个或两个以上的校验位中,这些校验位取决于这些数据位的
位置数值的二进制表示
1.校验位1覆盖了所有数据位位置序号的二进制表示倒数第一位是1的数据:1(校验位自身,这里都是二进制,下同),11,101,111,1001,等
2.校验位2覆盖了所有数据位位置序号的二进制表示倒数第二位是1的数据:10(校验位自身),11,110,111,1010,1011,等
3.校验位4覆盖了所有数据位位置序号的二进制表示倒数第三位是1的数据:100(校验位自身),101,110,111,1100,1101,1110,1111,等
4.校验位8覆盖了所有数据位位置序号的二进制表示倒数第四位是1的数据:1000(校验位自身),1001,1010,1011,1100,1101,1110,1111,等
5.简而言之,所有校验位覆盖了数据位置和该校验位位置的二进制与的值不为0的数。 采用奇校验还是偶校验都是可行的。偶校验从数学的角度看更简单一些,但在实践中并没有区别。
从编码形式上,我们可以发现汉明码是一个校验很严谨的编码方式。在这个例子中,通过对4个数据位的3个位的3次组合检测来达到具体码位的校验与修正目的(不过只允许一个位出错,两个出错就无法检查出来了,这从下面的纠错例子中就能体现出来)。在校验时则把每个汉明码与各自对应的数据位值相加,如果结果为偶数(纠错代码为0)就是正确,如果为奇数(纠错代码为1)则说明当前汉明码所对应的三个数据位中有错误,此时再通过其他两个汉明码各自的运算来确定具体是哪个位出了问题。
· 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 p1 X X X X X X X X X X X X X X X X 编码后数据位置 p1 p2 d1 p4 d2 d3 d4 p8 d5 d6 d7 d8 d9 d10 d11 p16 d12 d13 d14 d15 X X X X p2 X X X X 奇偶校验位 p4 X X X X 覆盖率 p8 X X p16 X X X X X X X 观察上表可发现一个比较直观的规律:第i个检验位是第2i-1位,从该位开始,检验2i-1位,跳过2i-1位……依次类推。例如上表中第3个检验位p4从第23-1=4位开始,检验4、5、6、7共4位,然后跳过8、9、10、11共4位,再检验12、13、14、15共4位……
在数学方面,汉明码是一种二元线性码。对于每一个整数m>2,存在一个编码,带有m个奇偶校验位2m- m-1个数据位。
X X X X X 例子
对11000010进行汉明编码,求编码后的码字。
1.列出表格,从左往右(或从右往左)填入数字,但2的次方的位置不填。 位置 数据 1 2 3 1 4 5 1 6 0 7 0 8 9 0 10 0 11 1 12 0 13 14 2.把数据行有1的列的位置写为二进制。 位置 数据 二进制 1 2 3 1 0011 4 5 1 0101 6 0 7 0 8 9 0 10 0
11 1 1011 12 0 13 14 3.收集所有二进制数字,求异或。
4.把1101依次填入表格中2的次方的位置(低位在左)。 位置 数据 二进制 校验 1 1 2 0 3 1 0011 4 1 5 1 0101 6 0 7 0 8 1 9 0 10 0 11 1 1011 12 0 13 14 5.所以编码后的码字是101110010010。
以数据码1101为例再次码的编码原理,此时D8=1、D4=1、D2=0、D1=1,在P1编码时,先将D8、D4、D1的二进制码相加,结果为奇数3,汉明码对奇数结果编码为1,偶数结果为0,因此P1值为1,D8+D2+D1=2,为偶数,那么P2值为0,D4+D2+D1=2,为偶数,P3值为0。这样,参照上文的位置表,汉明码处理的结果就是1010101。在这个4位数据码的例子中,我们可以发现每个汉明码都是以三个数据码为基准进行编码的。下面就是它们的对应表:
编码用的数据码 P1 (D8、D4、D1) P2 (D8、D2、D1) P3 (D4、D2、D1)
从编码形式上,我们可以发现汉明码是一个校验很严谨的编码方式。在这个例子中,通过对4个数据位的3个位的3次组合检测来达到具体码位的校验与修正目的(不过只允许一个位出错,两个出错就无法检查出来了,这从下面的纠错例子中就能体现出来)。在校验时则把每个汉明码与各自对应的数据位值相加,如果结果为偶数(纠错代码为0)就是正确,如果为奇数(纠错代码为1)则说明当前汉明码所对应的三个数据位中有错误,此时再通过其他两个汉明码各自的运算来确定具体是哪个位出了问题。
1950年,汉明介绍了(7,4)代码。其编码由4数据比特到7位,增加三个奇偶校验码。汉明(7,4)可以检测并纠正单比特错误,且也能检测双比特错误。
带附加奇偶校验码的汉明码(SECDED),汉明(8,4)码:汉明(7,4)码可以很容易地编码为一个(8,4)码
汉明距离:
在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:
1011101与1001001之间的汉明距离是2。 2143896与2233796之间的汉明距离是3。 \与\之间的汉明距离是3。
汉明重量是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是1的个数,所以11101的汉明重量是4。
Hamming码编译码器的设计
Hamming码编译码器的设计
首先构造最佳奇权码的校验矩阵即H矩阵,最佳奇权码的H矩阵应满足: (1)每列含有奇数个1,且无相同列;
(2)总的1的个数少,所以校验位、伴随式生成表达式中的半加项数少,从而生成逻辑所需的半加器少,可以节约器材、降低成本和提高可靠性。
(3)每行中1的个数尽量相等或接近某个平均值,这种决定了生成逻辑及其级数的一致性,不仅译码速度快,同时线路匀称。
译码时把数据再次编码所得到的新校验位与原校验位模二加,便得到伴随式S,由其可判别错误类型。
(1)若S=0,则认为没有错误;
(2)若S≠0,且S含有奇数个1,则认为产生了单位错; (3)若S≠0,且S含有偶数个1,则认为产生了两位错;
其中的情况(2)中,根据错误图样可以确定错误位置,将其取反即可完成纠错.因为对用户而言真正有用的是数据,校验位是无用的。为了节省时间和器材,只对数据纠错,而对校验位不进行纠错,纠错后的数据也不再写回存储器。
void CHammingDlg::OnButtonEncode() { UpdateData(true); int i;
char str[]=\ for (i=0;i<7;i++)
{ if(m_input[i]=='0') input[6-i]=0; else
input[6-i]=1; }
encodeout[2]=input[0]; encodeout[4]=input[1]; encodeout[5]=input[2]; encodeout[6]=input[3]; encodeout[8]=input[4]; encodeout[9]=input[5]; encodeout[10]=input[6];
encodeout[0]=input[0]^input[1]^input[3]^input[4]^input[6]; encodeout[1]=input[0]^input[2]^input[3]^input[5]^input[6]; encodeout[3]=input[1]^input[2]^input[3]; encodeout[7]=input[4]^input[5]^input[6]; for (i=0;i<11;i++)
{ if(encodeout[i]==0) str[10-i]='0'; else
str[10-i]='1'; }
m_encodeout=str; UpdateData(false); }
void CHammingDlg::OnButtonNoise() { srand((unsigned)time(NULL)); m_noisebit=rand();
encodeout[m_noisebit-1]=encodeout[m_noisebit-1]^1; UpdateData(false); }
void CHammingDlg::OnButtonDecode() {int output[7];
int N,check[4];
char str[]=\N=0; int i;
output[0]=encodeout[2]; output[1]=encodeout[4]; output[2]=encodeout[5]; output[3]=encodeout[6]; output[4]=encodeout[8]; output[5]=encodeout[9]; output[6]=encodeout[10];
check[0]=encodeout[2]^encodeout[4]^encodeout[6]^encodeout[8]^encodeout[10]; check[1]=encodeout[2]^encodeout[5]^encodeout[6]^encodeout[9]^encodeout[10]; check[2]=encodeout[4]^encodeout[5]^encodeout[6]; check[3]=encodeout[8]^encodeout[9]^encodeout[10]; check[0]!=encodeout[0]?N=N+1:N=N; check[1]!=encodeout[1]?N=N+2:N=N; check[2]!=encodeout[3]?N=N+4:N=N; check[3]!=encodeout[7]?N=N+8:N=N; encodeout[N-1]=encodeout[N-1]^1; output[0]=encodeout[2]; output[1]=encodeout[4]; output[2]=encodeout[5]; output[3]=encodeout[6]; output[4]=encodeout[8]; output[5]=encodeout[9]; output[6]=encodeout[10]; m_errorbit=N; for (i=0;i<7;i++) { if(output[i]==0)
str[6-i]='0'; else
str[6-i]='1'; }
m_decodeout=str; UpdateData(false); }
int N,check[4];
char str[]=\N=0; int i;
output[0]=encodeout[2]; output[1]=encodeout[4]; output[2]=encodeout[5]; output[3]=encodeout[6]; output[4]=encodeout[8]; output[5]=encodeout[9]; output[6]=encodeout[10];
check[0]=encodeout[2]^encodeout[4]^encodeout[6]^encodeout[8]^encodeout[10]; check[1]=encodeout[2]^encodeout[5]^encodeout[6]^encodeout[9]^encodeout[10]; check[2]=encodeout[4]^encodeout[5]^encodeout[6]; check[3]=encodeout[8]^encodeout[9]^encodeout[10]; check[0]!=encodeout[0]?N=N+1:N=N; check[1]!=encodeout[1]?N=N+2:N=N; check[2]!=encodeout[3]?N=N+4:N=N; check[3]!=encodeout[7]?N=N+8:N=N; encodeout[N-1]=encodeout[N-1]^1; output[0]=encodeout[2]; output[1]=encodeout[4]; output[2]=encodeout[5]; output[3]=encodeout[6]; output[4]=encodeout[8]; output[5]=encodeout[9]; output[6]=encodeout[10]; m_errorbit=N; for (i=0;i<7;i++) { if(output[i]==0)
str[6-i]='0'; else
str[6-i]='1'; }
m_decodeout=str; UpdateData(false); }
正在阅读:
汉明码编码原理介绍01-21
假设检验例题05-16
公务员结构化面试 - 组织管理03-01
论固定资产折旧方法对企业收益的影响11-13
地大必考-工程机械设计复习题11-11
人教版八年级语文下册第一单元第3课:我的第一本书教案06-10
上海市预初英语试卷及其答案04-16
1-6供电系统的保护接地05-30
教师年终工作总结和计划05-14
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 明码
- 编码
- 原理
- 介绍
- 河南省教师招聘考试模拟题(一)
- 考 察 报 告 - 图文
- 新版四年级数学下册第四单元“小数意义”教学设计
- 施工组织设计(完整版,技术标范本)
- 顾德兴、张桂权主编普通生物学(动物学部分)习题
- 当今中国不应该降低刑责年龄
- 2015电子科大移动通信课程设计题目
- 风险管理历年试题第四五章
- 邓州“4+2”工作法开创农村工作新局面(四议两公开)
- 2017-2022年海西蒙古族藏族自治州体育小镇市场前景调查及投资咨询报告(目录) - 图文
- 特种设备安全法释义
- 建设项目竣工财务决算报告编制的问题
- CDMA数字超远覆盖移频直放站说明书
- 空军项目试验方案(2)
- 政法干警先进事迹材料(多篇范文)
- 培训班结业主持词
- 2018最全出国日常英语词汇(带详细分类)
- 瓦渡乡中心学校生态高效课堂实施方案
- 2002年高考青海高考分数文科分数段 - 图文
- 中学教师职务评审通过人员名单