您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Hamming码实验
云南大学数学与统计学实验教学中心实验报告第1页共10页云南大学数学与统计学实验教学中心实验报告课程名称:计算机网络实验学期:2012-2013学年第二学期成绩:指导教师:陆正福学生姓名:卢富毓学生学号:20101910072实验名称:Hamming码实验实验要求:必做实验学时:4学时实验编号:No.9实验日期:2013/5/28完成日期:2013/6/3学院:数学与统计学院专业:信息与计算科学年级:2010级一、实验目的:通过实验掌握Hamming码编码实验的构造算法,以及其重要思想。二、实验内容:Hamming码编码实验1.熟悉Hamming码的设计原理;2.编程实现(15,11,3)Hamming的编码和译码算法;3.验证Hamming码的检错能力和纠错能力三、实验环境Win7、Eclipse四、实验过程(请学生认真填写):实验过程、结果以及相应的解释:1.预备知识A、与其他的错误校验码类似,汉明码也利用了奇偶校验位的概念,通过在数据位后面增加一些比特,可以验证数据的有效性。利用一个以上的校验位,汉明码不仅可以验证数据是否有效,还能在数据出错的情况下指明错误位置。B、Hamming码中主要的是生成矩阵以及校验矩阵。通过得到这二者,我们就可以对需要的字符串进行编码、检错、纠错、译码的工作了。C、具体如下:2.实验过程A、原理分析:这里主要对如何纠错进行简要分析:编码所对应的码字为C=0110011。若接收到R=0110001。有H*x=0可以判断其存在错误。Erro={110}。用Erro中的元素与校验矩阵中的每一列表,与其中一列全部相同。则带便这一列有错。找到第六位有错。异或运算后得到R=0110011。云南大学数学与统计学实验教学中心实验报告第2页共10页当然这里需要注意的是Hamming码只能纠正一位错误。当出现两位错误时,将无法纠错后得到正确结果。好了,废话不多说了。先把代码贴上来。B、具体代码如下:/*HammingCode的实验**1.熟悉Hamming码的设计原理;*2.编程实现(15,11,3)Hamming的编码和译码算法;*3.验证Hamming码的检错能力和纠错能力。*/packageHammingCode;importjava.util.Scanner;/***@author卢富毓*@see实现HammingCode的生成、检错、纠错**/publicclassHammingCode{int[][]H;int[][]G;/***@paramstart*()Hamming码的具体实现*@paramHMC*类的实例*/publicvoidstart(HammingCodeHMC){intsend[]=newint[11];intreceive[]=newint[15];//step115,11Hamming码的校验矩阵生成H=HMC.CreateCheckArray();//step115,11Hamming码的生成矩阵生成G=HMC.GenerateArray();//输入四个字符进行编码System.out.print(请输入需编码的字符(0、1)11个:);Scannersc=newScanner(System.in);for(inti=0;i11;i++){云南大学数学与统计学实验教学中心实验报告第3页共10页send[i]=sc.nextInt();}sc.reset();HMC.encode(G,send);//编码System.out.println(\n----------------------------------------------------------);//输入四个字符检测编码System.out.print(请输入需译码字符(0、1)15个:);for(inti=0;i15;i++){receive[i]=sc.nextInt();}HMC.checkAndDecode(H,receive);//检错以及译码//sc.close();}/***@paramToBinary*校验矩阵十进制数转为二进制矩阵*@return返回校验矩阵*/publicint[][]CreateCheckArray(){//二进制校验矩阵intm=1;intl=1;int[][]b=newint[4][16];for(inti=0;ib.length;i++){for(intj=1;jb[i].length;j++){b[i][j]=0;}}for(inti=1;i16;i++){//二进制m=i;if(i!=1&&i!=2&&i!=4&&i!=8){for(intj=3;j=0;j--){b[j][l]=m%2;m=m/2;if(m0){break;}}l++;}云南大学数学与统计学实验教学中心实验报告第4页共10页}for(intj=0;j4;j++){//二进制for(inti=12;i16;i++){if(i-12==j){b[j][i]=1;}}}System.out.println((15,11)HammingCode校验矩阵生成:);System.out.println(----------------------------------------------------------);for(inti=0;i4;i++){for(intj=1;j16;j++){System.out.print(b[i][j]+);}System.out.println();}System.out.println(----------------------------------------------------------);returnb;}/***@paramGenerate*生成矩阵十进制数转为二进制矩阵*@return*/publicint[][]GenerateArray(){//生成矩阵增加还没有做intg[][]=newint[4][12];intl=1;intm=1;for(inti=1;i16;i++){//二进制m=i;if(i!=1&&i!=2&&i!=4&&i!=8){for(intj=3;j=0;j--){g[j][l]=m%2;m=m/2;if(m0){break;云南大学数学与统计学实验教学中心实验报告第5页共10页}}l++;}}//G生成int[][]G=newint[11][15];for(inti=0;iG.length;i++){for(intj=0;jG[i].length;j++){if(j==i){G[i][j]=1;}else{G[i][j]=0;}}}for(intj=11;j15;j++){for(inti=0;iG.length;i++){G[i][j]=g[j-11][i+1];}}System.out.println((15,11)HammingCode生成矩阵:);System.out.println(----------------------------------------------------------);for(inti=0;i11;i++){for(intj=0;j15;j++){System.out.print(G[i][j]+);}System.out.println();}System.out.println(----------------------------------------------------------);returnG;}/***@paramencode*用生成矩阵编码*@paramG云南大学数学与统计学实验教学中心实验报告第6页共10页*代表生成矩阵*@paramsend*输入的字符诸位1、0等*@return*/publicint[]encode(int[][]G,int[]send){//利用生成矩阵编码int[]newArray=newint[G[1].length];//得到X*G的一个矩阵for(inti=0;inewArray.length;i++){newArray[i]=0;for(intj=0;jG.length;j++)newArray[i]+=send[j]*G[j][i];if((newArray[i]&1)==1){newArray[i]=1;}else{newArray[i]=0;}}System.out.print((15,11)HammingCode的编码:);for(inti=0;inewArray.length;i++){System.out.print(newArray[i]+);}returnnewArray;}/****@paramH*校验矩阵错误*@paramreceive*收到的信息*@return返回海明码的译码*/publicint[]checkAndDecode(int[][]H,int[]receive){//检测错误以及纠正错误int[]e=newint[H.length];//H*x得到intflag=0;for(inti=0;ie.length;i++){//得到Hx的一个矩阵云南大学数学与统计学实验教学中心实验报告第7页共10页e[i]=0;for(intj=0;jreceive.length;j++){e[i]=e[i]^(receive[j]&H[i][j+1]);}}//检测编码是否有错H*x=0System.out.print(H*x为:);for(inti=0;ie.length;i++){System.out.print(e[i]+);}System.out.println();for(inti=0;ie.length;i++){if(e[i]!=0){flag=-1;break;}}if(flag==-1){//代表有错flag得到位错的下标flag=0;intk=0;for(inti=e.length-1;i=0;i--){flag+=Math.pow(2,i)*e[k];k++;}System.out.print(接收的数据第+flag+位有错:);for(inti=0;ireceive.length;i++){System.out.print(receive[i]);}System.out.println();//进行纠错flag=flag-1;receive[flag]=receive[flag]^1;System.out.print(接收的数据纠错后:);for(inti=0;ireceive.length;i++){System.out.print(receive[i]);}}else{//System.out.println();System.out.print(接收正确,数据为:);for(inti=0;ireceive.length;i++){System.out.print(receive[i]);}}云南大学数学与统计学实验教学中心实验报告第8页共10页System.out.println();System.out.print((15,11)HammingCode译码为:);for(inti=0;i11;i++){System.out.print(receive[i]+);}System.out.println();returne;}publicstaticvoidmain(String[]args){HammingCodeHMC=newHammingCode();HMC.start(HMC);}}结果如下:校验矩阵和生成矩阵结果如图:当输入正确与接收相同时结果如图:云南大学数学与统计学实验教学中心实验报告第9页共10页当收到结果有错的时候(其中错误为非校验位)结果如图:当收到结果有错的时候(其中错误为校验位)结果如图://进过三种不同的形式的检验,得到编写的15,11,3海明码的算法正确。五、实验总结
本文标题:Hamming码实验
链接地址:https://www.777doc.com/doc-7238703 .html