Hamming(7,4)编译码器

Posted R-Pursue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hamming(7,4)编译码器相关的知识,希望对你有一定的参考价值。

  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;
    

运行结果

以上是关于Hamming(7,4)编译码器的主要内容,如果未能解决你的问题,请参考以下文章

HammingHamming编译码理论与误码率matlab仿真和分析

(15,7)循环码的编译码方法

RSRS编译码理论与误码率性能matlab仿真和分析

RSRS编译码理论与误码率性能matlab仿真和分析

球形+汉明译码基于球形汉明译码算法的MATLAB仿真

BCH编译码