搜索
您的当前位置:首页正文

海明编码实验报告

来源:爱够旅游网


海明编码实验报告

学科专业:计算机科学与技术 姓 名: 学 号: 指导教师:

天津工业大学计算机科学与技术学院

二零一零年十二月

一.海明编码原理

海明码是一种可以纠正一位差错发现两位差错的编码。它是利用在信息位为k位,增加r位冗余位,构成一个n=k+r位的码字,然后用r个监督关系式产生的r个校正因子来区分无错和在码字中的n个不同位置的一位错。它必需满足以下关系式:

2r>=n+1 或 2r>=k+r+1 海明码的编码效率为:

R=k/(k+r)

式中 k为信息位位数

r为增加冗余位位数 2.海明码的生成与接收 二.海明编码方法

1)海明码的生成(顺序生成法)。

例3.已知:信息码为:\" 1 1 0 0 1 1 0 0 \" (k=8) 求:海明码码字。

解:1)把冗余码A、B、C、…,顺序插入信息码中,得海明码 码字:\" A B 1 C 1 0 0 D 1 1 0 0 \" 码位: 1 2 3 4 5 6 7 8 9 10 11 12

其中A,B,C,D分别插于2k位(k=0,1,2,3)。码位分别为1,2,4,8。 2)冗余码A,B,C,D的线性码位是:(相当于监督关系式) A->1,3,5,7,9,11; B->2,3,6,7,10,11;

C->4,5,6,7,12;(注 5=4+1;6=4+2;7=4+2+1;12=8+4) D->8,9,10,11,12。

3)把线性码位的值的偶校验作为冗余码的值(设冗余码初值为0): A=∑(0,1,1,0,1,0)=1 B=∑(0,1,0,0,1,0)=0 C=∑(0,1,0,0,0) =1 D=∑(0,1,1,0,0) =0

1

4)海明码为:\"1 0 1 1 1 0 0 0 1 1 0 0\" 2)海明码的接收。

例.已知:接收的码字为:\"1 0 0 1 1 0 0 0 1 1 0 0\"(k=8) 求:发送端的信息码。

解: 1)设错误累加器(err)初值=0

2)求出冗余码的偶校验和,并按码位累加到err中: A=∑(1,0,1,0,1,0)=1 err=err+20=1 B=∑(0,0,0,0,1,0)=1 err=err+21=3 C=∑(1,1,0,0,0) =0 err=err+0 =3 D=∑(0,1,1,0,0) =0 err=err+0 =3 由err≠0可知接收码字有错,

3)码字的错误位置就是错误累加器(err)的值3

(怎么快速计算出数值3是编程的重点)

4)纠错--对码字的第3位值取反得正确码字: \"1 0 1 1 1 0 0 0 1 1 0 0\"

5)把位于2k位的冗余码删除得信息码:\"1 1 0 0 1 1 0 0\" 3)发现两位差错(关键在于如何监测具有两位的错误) P5=∑(1,2,3,4,5,6,7,8,9,10,11,12) S5=∑(1,2,3,4,5,6,7,8,9,10,11,12,P5) 如果err≠0且S5=0是两位错 三.程序

import java.applet.*; import java.awt.*; import java.awt.event.*;

public class Haiming extends Applet implements ActionListener{ Label fsxx; Label xybm; Label xdbm; Label xdgr; Label xdym; Label cc; Label xyym;

Label sdxx;

2

TextField tfxx; TextField txybm; TextField txdbm; TextField txdgr; TextField txdym; TextField tcc; TextField txyym; TextField tsdxx;

public void init(){

public void actionPerformed(ActionEvent e){

String sfsxx,erjz,sxdbm,sxdgr,sxdym;

int sjs,i,count = 0,j = 0,m = 0,count1 = 0,count2 = 0,count3 = 0; double err = 0,sum = 0; fsxx = new Label(\"发送信息:\"); xybm = new Label(\"信源编码:\"); xdbm = new Label(\"信道编码:\"); xdgr = new Label(\"信道干扰:\"); xdym = new Label(\"信道译码:\"); cc = new Label(\"一/二错:\"); xyym = new Label(\"信源译码:\"); sdxx = new Label(\"收到信息:\"); tfxx = new TextField(30); txybm = new TextField(30); txdbm = new TextField(30); txdgr = new TextField(30); txdym = new TextField(30); tcc = new TextField(30); txyym = new TextField(30); tsdxx = new TextField(30); setLayout(new GridLayout(8,2)); add(fsxx);add(tfxx); add(xybm);add(txybm); add(xdbm);add(txdbm); add(xdgr);add(txdgr); add(xdym);add(txdym); add(cc);add(tcc); add(xyym);add(txyym); add(sdxx);add(tsdxx);

tfxx.addActionListener(this); txdgr.addActionListener(this); }

3

char xx,a = '0',b = '0',c = '0',d = '0',s5 = '0'; char[] C = new char[12]; //放海明码 char[] C1 = new char[12]; //放信道干扰码 char[] S = new char[4]; //放s1到s4 char[] C2 = new char[8]; //放信源译码 char[] C3 = new char[1]; //放收到的信息 sfsxx = tfxx.getText(); //获得输入信息 xx = sfsxx.charAt(0); sjs = xx - '0' + 48;

erjz = '0' + Integer.toBinaryString(sjs);//将其转换成二进制字符串 txybm.setText(erjz);

for(i = 0;i<12;i++){ //将p1,p2,p3,p4放在字符数组

中,并赋初值'0' if(i == 0||i == 1||i == 3||i == 7)

}

for(i = 0;i<12;i = i + 2){ //求出p1 if(C[i] == '1')count++; }

count = 0;

for(i = 0;i<12;i++){ //求出p2,p3,p4 if(i == 1||i == 2||i == 5||i == 6||i == 9||i == 10)

if(C[i] == '1')count1++; if(count1 % 2 == 1)b = '1'; else b = '0';

if(C[i] == '1')count2++; if(count2 % 2 == 1)c = '1'; else c = '0';

if(C[i] == '1')count3++; if(count3 % 2 == 1)d = '1'; else d = '0';

if(count % 2 == 1)a = '1'; else a = '0';

C[i] = '0';

C[i] = erjz.charAt(j++); else

if(i == 3||i == 4||i == 5||i == 6||i == 11)

if(i == 7||i == 8||i == 9||i == 10||i == 11)

} count = 0; count1 = 0; count2 = 0; count3 = 0;

for(i = 0;i<12;i++){ //把p1,p2,p3,p4的新值放到字

4

符数组中 if(i == 0) C[i] = a; if(i == 1) C[i] = b; if(i == 3) C[i] = c; if(i == 7)

C[i] = d; }

sxdbm = String.copyValueOf(C); //把字符数组转换成字符串 txdbm.setText(sxdbm); //把字符串输出到文本框中 sxdgr = txdgr.getText(); for(i = 0;i<12;i++){ C1[i] = sxdgr.charAt(i);

}

for(i = 0;i<12;i = i + 2){ //求出s1 if(C1[i] == '1')count++; if(count % 2 == 1)S[0] = '1'; else S[0] = '0';

}

count = 0;

for(i = 0;i<12;i++){ //求出s2,s3,s4 if(i == 1||i == 2||i == 5||i == 6||i == 9||i == 10) if(C1[i] == '1')count1++; if(count1 % 2 == 1)S[1] = '1'; else S[1] = '0';

if(i == 3||i == 4||i == 5||i == 6||i == 11)

if(C1[i] == '1')count2++; if(count2 % 2 == 1)S[2] = '1'; else S[2] = '0';

if(i == 7||i == 8||i == 9||i == 10||i == 11)

if(C1[i] == '1')count3++; if(count3 % 2 == 1)S[3] = '1';

else S[3] = '0';

}

count = 0;

for(i = 0;i<12;i++){ //求s5 if(C[i] == '1')count++; }

for(i = 0;i<12;i++){ //求s5 if(C1[i] == '1')count++; }

if(count%2 == 0)s5 = '0';

5

else

s5 = '1';

for(i = 0;i<4;i++){ //判断是否出现错误,出现几位错误 if(S[i]!='0')

err = err + Math.pow(2, i);

}

if(err==0)tcc.setText(\"正确\"); else if(s5!='0')

tcc.setText(\"第\"+(int)err+\"位出错\"); else tcc.setText(\"两位出错\");

if(err!=0)if(C1[(int)(err-1)]=='0')C1[(int)(err-1)] = '1'; 将错误改过来,得到信道译码 else C1[(int)(err-1)] = '0'; sxdym = String.copyValueOf(C1); txdym.setText(sxdym);

for(i = 0;i<12;i++){ //得到信源译码 if(i == 0||i == 1||i == 3||i == 7)continue; else

C2[m++] = C1[i];

}

txyym.setText(String.copyValueOf(C2));

for(i = 0;i<8;i++){ //求得信源译码的十进制数 if(C2[i]=='1')

sum = sum + Math.pow(2, 7 - i); }

C3[0] = (char)(sum); //求出字符 if(err != 0&&s5 == '0' )

tsdxx.setText(\"\"); else

tsdxx.setText(String.copyValueOf(C3));

}

}

四.程序执行结果

无干扰时:

//

6

一位出错时:

两位出错时:

7

参考文献

[1] 阳宪惠 现场总线技术及其应用 清华大学出版社 [2] 王行言 java语言与面向对象程序设计 清华大学出版社 [3] Thinking in Java

8

因篇幅问题不能全部显示,请点此查看更多更全内容

Top