实验目的
加深理解Hamming(7,4)码的编码方法和抗干扰性能;
通过编程实现Hamming(7,4)码的编码算法,进一步掌握按位二进制加法的实现原理。实验要求
输入:长度为4的任意二进制序列。
输出:输入数据经Hamming(7,4)编码器编码之后,通过二元对称信道模拟器(信道容量)(错误概率为0.1)传输后,再经过Hamming(7,4)译码器译码输出得到信宿端的长度为4的二进制序列。实验程序
package com.yrwan.Hamming;
import java.util.Scanner;
public class Main {
private static final double errPr=0.1;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.print("请输入长度为4的二进制序列:");
int d[] = new int[4];
for (int i = 0; i < 4; i++) {
d[i] = Hamming.fromHex(sc.next());
}
sc.close();
int[] encodeData=Hamming.encode(d);
println("编码后:",encodeData);
BSC bsc=new BSC(errPr);
int[] transmitedData=bsc.send(encodeData);
println("BSC传输后:",transmitedData);
int[] decodeData=Hamming.decode(transmitedData);
println("解码结果:",decodeData);
}
private static void println(String message,int[] data){
System.out.print(message);
for (int i:data){
System.out.printf(i+" ");
}
System.out.println();
}
}
package com.yrwan.Hamming;
public class Hamming {
//根据传入的4位二进制序列算出7位汉明码,其中前三位为信息码 后三位为监督码
public static int[] encode(int[] d){
if (d.length!=4){
return new int[4];
}
// 根据四位信息码算出三位监督码
int p1 = d[0] ^ d[1] ^ d[3];
int p2 = d[0] ^ d[2] ^ d[3];
int p3 = d[1] ^ d[2] ^ d[3];
int[] results=new int[7];
results[0]=d[0];
results[1]=d[1];
results[2]=d[2];
results[3]=d[3];
results[4]=p1;
results[5]=p2;
results[6]=p3;
return results;
}
//根据传入的7位汉明码算出2进制序列,其中后三位为监督码
public static int[] decode(int[] d){
if (d.length!=7){
return new int[4];
}
int c1 = d[4] ^ d[0] ^ d[1] ^ d[3];
int c2 = d[5] ^ d[0] ^ d[2] ^ d[3];
int c3 = d[6] ^ d[1] ^ d[2] ^ d[3];
if (c1 + c2 + c3 == 3) d[3] = 1 ^ d[3];
else if (c1 + c2 == 2) d[0] = 1 ^ d[0];
else if (c1 + c3 == 2) d[1] = 1 ^ d[1];
else if (c2 + c3 == 2) d[2] = 1 ^ d[2];
int[] results=new int[4];
results[0]=d[0];
results[1]=d[1];
results[2]=d[2];
results[3]=d[3];
return results;
}
//返回四位的16进制编码
public static int fromHex(String s) {
return Integer.parseInt(s, 16) & 0xFFFF;
}
}
package com.yrwan.Hamming;
public class BSC {
double errPr;//BSC信道的错误概率
public BSC(double Pr){
errPr = Pr;
}
//经BSC传输信号,返回传输后的值
public int[] send(int[] data){
int[] x=new int[data.length];
x = data;
for(int i = 0; i<data.length;i++)
if(Math.random()<errPr){
x[i] = 1 - x[i];
}
return x;
}
}