Hamming(7,4)编译码器

来源:互联网 发布:p2p运营模式数据图表 编辑:程序博客网 时间:2024/06/04 17:47
  1. 实验目的
    加深理解Hamming(7,4)码的编码方法和抗干扰性能。
    通过编程实现Hamming(7,4)码的编码算法,进一步掌握按位二进制加法的实现原理。
  2. 实验要求
    输入:长度为4的任意二进制序列。
    输出:输入数据经Hamming(7,4)编码器编码之后,通过二元对称信道模拟器(另一篇博客)(错误概率为0.1)传输后,再经过Hamming(7,4)译码器译码输出得到信宿端的长度为4的二进制序列。

  3. 代码

    • 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;    }}

运行结果
这里写图片描述

0 0
原创粉丝点击