海明编码实验报告
学科专业:计算机科学与技术 姓 名: 学 号: 指导教师:
天津工业大学计算机科学与技术学院
二零一零年十二月
一.海明编码原理
海明码是一种可以纠正一位差错发现两位差错的编码。它是利用在信息位为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
因篇幅问题不能全部显示,请点此查看更多更全内容