信道容量

Posted R-Pursue

tags:

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

  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+" ");
        
    

执行结果


以上是关于信道容量的主要内容,如果未能解决你的问题,请参考以下文章

信道容量

信道容量

《信息与编码》考试复习笔记4----第四章离散信道容量

《信息与编码》考试复习笔记4----第四章离散信道容量相关例题

数字通信之信源编码信道编码调制

我不允许你现在还不知道信编的这些重要概念考点!