您的位置:首页 > 其它

Hamming(7,4)编译码器

2016-06-18 22:17 405 查看
实验目的

加深理解Hamming(7,4)码的编码方法和抗干扰性能。

通过编程实现Hamming(7,4)码的编码算法,进一步掌握按位二进制加法的实现原理。

实验要求

输入:长度为4的任意二进制序列。

输出:输入数据经Hamming(7,4)编码器编码之后,通过二元对称信道模拟器(另一篇博客)(错误概率为0.1)传输后,再经过Hamming(7,4)译码器译码输出得到信宿端的长度为4的二进制序列。

代码

HammingUtil

package com.tanrong.hamming;

/**
* Created by tanrong.ltr on 16/6/18.
*/
public class HammingUtil {

/**
* 根据传入的4位二进制序列算出7位汉明码
* 其中前三位为信息码 后三位为监督码
* @param d
* @return
*/
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进制序列
*
* 其中后三位为监督码
* @param d
* @return
*/
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进制编码
* @param s
* @return
*/
public static int fromHex(String s) {
return Integer.parseInt(s, 16) & 0xFFFF;
}
}


Main

package com.tanrong.hamming;

import com.tanrong.channelCapacity.BSC;

import java.util.Scanner;

/**
* Created by tanrong.ltr on 16/6/18.
*
*/
public class Main {
private static final double errorProbability=0.1;
public static void main(String[] args){

Scanner sc = new Scanner(System.in);
System.out.println("请输入长度为4的二进制序列,以空格隔开");
int d[] = new int[4];
for (int i = 0; i < 4; i++) {
d[i] = HammingUtil.fromHex(sc.next());
}
int[] encodeData=HammingUtil.encode(d);
println("编码后",encodeData);
BSC bsc=new BSC(errorProbability);
int[] transmitedData=bsc.send(encodeData);
println("BSC传输后",transmitedData);

int[] decodeData=HammingUtil.decode(transmitedData);
println("解码结果",decodeData);
}
private static void println(String message,int[] data){
System.out.println(message);
for (int i:data){
System.out.printf(i+" ");
}
System.out.println();
}
}


BSC

package com.tanrong.channelCapacity;

/**
* Created by tanrong.ltr on 16/6/18.
* https://github.com/chsasank/LDPC-Codes/blob/master/src/ldpc/BSC.java */

/**
* BSC信道模拟器,当随机数小于错误发生概率时会发生传输错误
*/
public class BSC {
double errorProbability;

/**
* 设置BSC的错误发生概率
* @param f
*/
public BSC(double f){
errorProbability = f;
}

/**
* 经BSC传输信号,返回传输后的值
* @param data
* @return
*/
public int[] send(int[] data){
boolean [] x=int2boolean(data);
for(int i = 0; i<x.length;i++)
if(Math.random()<errorProbability){
x[i] = !x[i];
}
return boolean2int(x);
}

/**
* 将Boolean型数组转为整形
* @param data
* @return
*/
private boolean[] int2boolean(int[] data){
boolean [] x=new boolean[data.length];
for (int i = 0; i < data.length; i++) {
x[i] = data[i] != 0;
}
return x;
}

/**
* 将int型数组转为boolean型
* @param data
* @return
*/
private int[] boolean2int(boolean[] data){
int[] x=new int[data.length];
for (int i = 0; i < data.length; i++) {
x[i]=data[i]?1:0;
}
return x;
}
}


运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二进制 编码 算法