信道容量
来源:互联网 发布:帝国cms标签工具 编辑:程序博客网 时间:2024/05/21 11:24
- 信道容量的迭代算法
- 实验目的
熟悉信道容量的迭代算法;
学习如何将复杂的公式转化为程序; - 实验要求
输入:任意的一个信道转移概率矩阵。r、s、P在运行时从键盘输入。
输出:最佳信源分布P’,信道容量C。
- 实验目的
- 二元对称信道模拟器
- 实验目的
加深理解二进制对称信道的工作原理;掌握通过高级编程语言生成伪随机数的方法 - 实验要求
输入: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); }}
- 二元对称信道模拟器
- 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
- 信道容量
- 信道容量
- 信道容量
- 数据信道容量
- 信道容量与Shannon公式
- 信道容量的概念
- MIMO信道的信道容量
- 信道容量迭代算法
- Bianchi信道容量(matlab)
- MIMO信道的信道容量
- 多天线信道容量
- 一般信道容量的计算
- 离散信道容量迭代算法
- 通信信道容量、带宽的理解
- 信道与信道容量(一)
- 关于信道容量的一点知识
- 信道容量的迭代算法实现
- 关于级联信道的信道容量计算问题
- 使用Python Pandas处理亿级数据
- 采用Atlas+Keepalived实现MySQL读写分离、读负载均衡
- 九度OJ 1031
- 网页源码查看器
- 自定义控件起步(二)(自定义属性)
- 信道容量
- 初识RxJava和Retrofit
- android5.0StateListAnimator
- 对面向对象的理解及应该了解的问题
- Spring配置bean时id和name的相关讨论
- linux 中的eclipse安装maven
- 从0开始玩安全--Python篇--Python入门指导 & 案例Unixshadow密码破解
- ActionBar的使用问题
- Java - PAT - 1004. 成绩排名 (20)