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
Main
BSC
运行结果
加深理解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; } }
运行结果
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- ASP编码必备的8条原则
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- XML指南——XML编码
- C#实现的算24点游戏算法实例分析
- C#中字符串编码处理
- mysql binlog二进制日志详解
- ExtJS中文乱码之GBK格式编码解决方案及代码
- 经典排序算法之冒泡排序(Bubble sort)代码
- 程序员趣味读物 谈谈Unicode编码