信道容量

来源:互联网 发布:帝国cms标签工具 编辑:程序博客网 时间:2024/05/21 11:24
  1. 信道容量的迭代算法
    • 实验目的
      熟悉信道容量的迭代算法;
      学习如何将复杂的公式转化为程序;
    • 实验要求
      输入:任意的一个信道转移概率矩阵。r、s、P在运行时从键盘输入。
      输出:最佳信源分布P’,信道容量C。
  2. 二元对称信道模拟器
    • 实验目的
      加深理解二进制对称信道的工作原理;掌握通过高级编程语言生成伪随机数的方法
    • 实验要求
      输入:BSC信道的错误概率,任意的二进制序列
      输出:经BSC信道传输后的二进制序列
      源程序格式整齐清晰,注释简单明了

代码
1. 信道容量的迭代算法

package com.tanrong.channelCapacity;import java.util.Scanner;/** * Created by tanrong.ltr on 16/6/18. *  */public class Main1 {    public static int N;//行    public static int M;//列    public static double C;    public static void main(String[] args) {        int times = 0;// 迭代次数        Scanner input = new Scanner(System.in);        System.out.println("输入状态转移矩阵的行列数M,N:");        N = input.nextInt();        M = input.nextInt();        double[][] p = new double[N][M];        double[] S = new double[N];        double[] SS = new double[N];// 存入迭代计算后的S        System.out.println("输入状态转移矩阵:");        /** 输入转移矩阵 */        for (int i = 0; i < N; i++)            for (int j = 0; j < M; j++) {                p[i][j] = input.nextDouble();            }        /** 初始化数据 */        for (int i = 0; i < N; i++)            S[i] = (double) 1 / N;// 赋值        /** 迭代 */        boolean flag = true;        double[][] fa = new double[M][N];        while (flag) {            /** 计算fa ji */            for (int j = 0; j < M; j++) {                double sum = 0;                for (int i = 0; i < N; i++) {                    sum = sum + S[i] * p[i][j];                }                for (int i = 0; i < N; i++)                    fa[j][i] = (S[i] * p[i][j]) / sum;            }            /** 迭代计算S */            // 计算分母            double sum1 = 0;            for (int i = 0; i < N; i++) {                boolean flag3 = true;                double sum2 = 0;                for (int j = 0; j < M; j++) {                    if (fa[j][i] != 0)                        sum2 = sum2                                + (p[i][j] * (Math.log(fa[j][i]) / Math                                .log(Math.E)));                    else if (fa[j][i] == 0 && p[i][j] != 0) {                        flag3 = false;                    }// exp(log0)=0,下同                    else if (fa[j][i] == 0 && p[i][j] == 0)                        sum2 = sum2 + 0;// 0log0=0                }                if (flag3)                    sum1 = sum1 + Math.exp(sum2);                else                    sum1 = sum1 + 0;            }            /** 计算SS[i] */            for (int i = 0; i < N; i++) {                boolean flag1 = true;// 若有无穷比无穷                double sum6 = 0;                for (int j = 0; j < M; j++) {                    if (fa[j][i] != 0)                        sum6 = sum6 + p[i][j]                                * (Math.log(fa[j][i]) / Math.log(Math.E));                    else if (fa[j][i] == 0 && p[i][j] != 0) {                        flag1 = false;                    } else if (fa[j][i] == 0 && p[i][j] == 0)                        sum6 = sum6 + 0;                }                if (flag1)                    SS[i] = Math.exp(sum6) / sum1;                else                    SS[i] = 0;            }            double distance = 0;            for (int i = 0; i < N; i++) {                distance = distance + Math.pow(SS[i] - S[i], 2);// 计算范数            }            if (distance < 0.00001)                flag = false;            else {                for (int i = 0; i < N; i++)                    S[i] = SS[i];            }            C = Math.log(sum1) / Math.log(2);            times++;        }        System.out.println("经过" + times + "次迭代计算得到结果如下:");        System.out.print("其最佳信源分布为:(");        for (int i = 0; i < N - 1; i++)            System.out.print(S[i] + ",");        System.out.print(S[N - 1]);        System.out.println(")");        System.out.println("其信道容量为:" + C);    }}
  1. 二元对称信道模拟器
    • BSC.java
package com.tanrong.channelCapacity;/** * Created by tanrong.ltr on 16/6/18. *  *//** * 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;    }}
- Main.java
package com.tanrong.channelCapacity;import java.util.Scanner;/** * Created by tanrong.ltr on 16/6/18. */public class Main2 {    public static void main(String[] args){        double errorProbability;        int[] data;        Scanner input = new Scanner(System.in);        System.out.println("请输入BSC信道的错误概率(0~1)");        errorProbability=input.nextDouble();        System.out.println("请输入要传输的二进制序列长度");        data=new int[input.nextInt()];        System.out.println("请输入要传输的二进制序列(0/1)");        for (int i = 0; i < data.length; i++) {            data[i]=input.nextInt();        }        BSC bsc=new BSC(errorProbability);        int[] result=bsc.send(data);        System.out.printf("传输后的二进制序列为");        for (int r:result) {            System.out.printf(r+" ");        }    }}

执行结果
这里写图片描述
这里写图片描述
这里写图片描述

0 0