Hamming(7,4)编译码器

  • 实验目的
    加深理解Hamming(7,4)码的编码方法和抗干扰性能;
    通过编程实现Hamming(7,4)码的编码算法,进一步掌握按位二进制加法的实现原理。

  • 实验要求
    输入:长度为4的任意二进制序列。
    输出:输入数据经Hamming(7,4)编码器编码之后,通过二元对称信道模拟器(信道容量)(错误概率为0.1)传输后,再经过Hamming(7,4)译码器译码输出得到信宿端的长度为4的二进制序列。

  • 实验程序

package com.yrwan.Hamming;
import java.util.Scanner;
public class Main {
    private static final double errPr=0.1;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入长度为4的二进制序列:");
        int d[] = new int[4];
        for (int i = 0; i < 4; i++) {
            d[i] = Hamming.fromHex(sc.next());
        }
        sc.close();
        int[] encodeData=Hamming.encode(d);
        println("编码后:",encodeData);
        BSC bsc=new BSC(errPr);
        int[] transmitedData=bsc.send(encodeData);
        println("BSC传输后:",transmitedData);
        int[] decodeData=Hamming.decode(transmitedData);
        println("解码结果:",decodeData);
    }
    private static void println(String message,int[] data){
        System.out.print(message);
        for (int i:data){
            System.out.printf(i+" ");
        }
        System.out.println();
    }
}
package com.yrwan.Hamming;
public class Hamming {
    //根据传入的4位二进制序列算出7位汉明码,其中前三位为信息码 后三位为监督码
    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进制序列,其中后三位为监督码
    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进制编码
    public static int fromHex(String s) {
        return Integer.parseInt(s, 16) & 0xFFFF;
    }
}
package com.yrwan.Hamming;
public class BSC {
    double errPr;//BSC信道的错误概率
    public BSC(double Pr){
        errPr = Pr;
    }
//经BSC传输信号,返回传输后的值
    public int[] send(int[] data){
        int[] x=new int[data.length];
        x = data;
        for(int i = 0; i<data.length;i++)
            if(Math.random()<errPr){
                x[i] = 1 - x[i];
            }
        return x;
    }
}

猜你喜欢

转载自blog.csdn.net/yrwan95/article/details/73695637