信道容量
Posted R-Pursue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了信道容量相关的知识,希望对你有一定的参考价值。
- 信道容量的迭代算法
- 实验目的
熟悉信道容量的迭代算法;
学习如何将复杂的公式转化为程序; - 实验要求
输入:任意的一个信道转移概率矩阵。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+" ");
执行结果
以上是关于信道容量的主要内容,如果未能解决你的问题,请参考以下文章