Hamming(7,4)编译码器
Posted R-Pursue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hamming(7,4)编译码器相关的知识,希望对你有一定的参考价值。
- 实验目的
加深理解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;
运行结果
以上是关于Hamming(7,4)编译码器的主要内容,如果未能解决你的问题,请参考以下文章