信息论实验

您所在的位置:网站首页 信道容量迭代算法实验分析 信息论实验

信息论实验

2024-07-06 06:08| 来源: 网络整理| 查看: 265

信道容量的迭代算法 实验目的

熟悉信道容量的迭代算法; 学习如何将复杂的公式转化为程序;

实验要求

已知:信源符号个数r,新宿符号份额数s、信道转移概率矩阵p; 输入:任意的一个信道转移概率矩阵。r、s、p在运行时从键盘输入。 输出:最佳信源分布P‘,信道容量C。

实验内容 信道容量的含义

一个信道,若给定输入分布Q(x) ,和转移概率分布P(y|x) ,则输出概率分布为 Θ(y)=∑xQ(x)P(y|x) 对DMC信道有 Θ(y)=∑xQ(x)P(y|x) 当研究联合 空间XY时,则信道输出和输入之间的平均互信息量为

I(X;Y)=∑k=0K−1∑j=0J−1QkP(j|k)logP(j|k)∑K−1k=0QiP(j|i) =H(Y)−H(Y|X) =H(X)−H(X|Y) 从上述公式中,当信道输入为X,接收端得到的平均信息量 I(X;Y)是信道输入概率和信道转移概率的函数。一般干扰越大,传输的信息量就越小。现在研究信道哦给定,即 {P(y|x)}给定的情况下,如何选择输入分布 Qk 使传输的信息量 I(X;Y)达到最大。 信道容量的定义: C=maxI(X;Y) 即C为改变输入分布时,使每个符号所能含有的平均互信息量的最大值。相应的输入分布称为最佳输入分布。

信道容量的迭代算法

算法流程: 1. 取出时分布 r(0) ,置k=0。 2. 由公式

Q(k)(x|y)=P(y|x)r(k)(x)∑xP(y|x′)r(k)(x′) 计算 Q(k)(x|y) 3. 由公式 rk+1(x)=∏yQ(k)(x|y)P(y|x)∑x′∏yQ(k)(x′|y)P(y|x) 计算 r(k+1) 4. 由公式 C(k+1)=I(r(k+1),Q(k)) 5. 若 |C(k+1)−C(k)|≤δ ,进入第7步。 6. 令 k=k+1 , 转向第二步 7. 程序结束输出最佳输入分布 r(k+1) 及 C(k+1)

算法实现

根据算法的基本原理和迭代的流程进行程序编写。 程序代码如下

#include #include #include void printMessage(); int main() { int r, s, i, j, k = 0; double p[20]; //存放输入信源概率矩阵 double z[20]; double q[20][20]; //存放信道转移概率矩阵 double F[20][20]; //存放(|)iipxy的概率分布矩阵的转置 double x, y, a; double epsilon = 1e-5; //门限 double C = -1000.0; //取初始迭代时的信道容量为一个较大的负数 printMessage(); printf("!-------请输入信源符号个数:---------!\n"); scanf("%d", &r); printf("!-------请输入信宿符号个数:---------!\n"); scanf("%d", &s); printf("!-------请输入信道转移概率矩阵---------!\n\n"); for (i = 0; i < r; i++) { for (j = 0; j < s; j++) scanf("%lf", &q[i][j]); printf("\n"); } for (i = 0; i < r; i++) p[i] = (double)(1.0 / (double)r); //设初始信源分布为等概分布 do { k++; a = C; for (j = 0; j < s; j++) { x = 0.0; for (i = 0; i < r; i++) x = x + (p[i])*(q[i][j]);// x 为(|)iipxy的分母部分 if (x > 0) for (i = 0; i < r; i++) F[i][j] = (p[i])*(q[i][j]) / x;// F为(|)iipxy的概率分布矩阵的转置 else for (i = 0; i < r; i++) F[i][j] = 0.0;//(|)iipxy的分母部分为0时,令F=0 } y = 0.0; for (i = 0; i < r; i++) { z[i] = 0.0; for (j = 0; j < s; j++) { if (F[i][j] > 0) z[i] = z[i] + (q[i][j] * (log(F[i][j]) / log(2.0)));//z[i]为ip的分子部分 } z[i] = (pow(2.0, z[i])); y = y + z[i];//z[i]为ip的分母部分 } for (i = 0; i < r; i++) { p[i] = z[i] / y;//更新输入信源概率矩阵 } C = (log(y) / log(2.0));//求信道容量单位为“bit” } while (fabs((C - a) / C) > epsilon); printf("!----------迭代次数为:k=%d --------!\n", k);//输出迭代次数 printf("!----------最佳信源分布为:--------!\n\n"); for (i = 0; i < r; i++) { printf("%.3lf", p[i]); //输出信源的最佳分布,保留3位小数 } printf("\n"); printf("!----------信道容量为:C=%.3lf bit --------!\n\n", C); //输出信道容量,保留3位小数 getchar(); getchar(); } void printMessage() { printf("!--------- --------!\n\n"); printf("!----------姓名:小猪嘎嘎 --------!\n\n"); printf("!----------信道容量迭代算法 --------!\n\n"); printf("!----------csdn --------!\n\n"); }

显示结果 运行过程需要输入信源符号个数,信宿的个数和对应的状态转移矩阵。最终通过迭代过程获得信道容量和对应的最佳输入分布。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3