信道容量迭代算法验证

信道容量迭代算法验证

一、实验目的
1.熟悉信道容量的迭代算法。
2.学习如何将复杂的公式转化成程序。
3.熟悉c++编译码过程

二、实验要求
1,学习vs2012软件编程和调试方法;
2,输入:任意一个转移概率矩阵,包括信源符号个数,信宿符号个 数,信道转移概率,在程序运行时从键盘输入。
3,输出信道容量C 迭代次数,最佳信源分布。
三、实验仪器,设备
笔记本电脑,vs2012软件
四、实验原理
已知:信源符号个数r,新宿符号份额数s、信道转移概率矩阵p;
输入:任意的一个信道转移概率矩阵。r、s、p在运行时从键盘输入。
输出:最佳信源分布P‘,信道容量C。
4.1信道容量的含义
一个信道,若给定输入分布Q(x) ,和转移概率分布P(y|x) ,则输出概率分布为:Θ(y)=∑xQ(x)P(y|x)
对DMC信道有Θ(y)=∑xQ(x)P(y|x)
当研究联合 空间XY时,则信道输出和输入之间的平均互信息量为:

=H(Y)−H(Y|X)
=H(X)−H(X|Y)
从上述公式中,当信道输入为X,接收端得到的平均信息量 I(X;Y)是信道输入概率和信道转移概率的函数。一般干扰越大,传输的信息量就越小。现在研究信道哦给定,即 {P(y|x)}给定的情况下,如何选择输入分布 QkQk使传输的信息量 I(X;Y)达到最大。
信道容量的定义:
C=maxI(X;Y)
C=maxI(X;Y)

即C为改变输入分布时,使每个符号所能含有的平均互信息量的最大值。相应的输入分布称为最佳输入分布信道容量的迭代算法。
五、实验方案与步骤
5.1信道容量的迭代算法的步骤如下:

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

计算 。
4.由公式

计算。
5. 若 |C(k+1)−C(k)|≤δ,进入第7步。
6. 令 k=k+1, 转向第二步。
7. 程序结束输出最佳输入分布及C(k+1)。
5.2程序设计流程图:
在这里插入图片描述

5.3关键程序代码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>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();
}

六、实验数据与结果分析
6.1实验结果图,如下图所示:
在这里插入图片描述

6.2实验结果分析:
根据图片的结果信息得到了信源迭代次数的最佳信源分布,并且计算了出了最优的信道容量。经过验算得到结果正确,代码编译成功。
6.3实验过程中的问题及其解决
1,首先,不了解信道迭代算法,最后回到书中,复习了下才明白怎么回事。
2,然后在设计算法的时候,设计的流程结构有问题,一直算不出来最佳信源分布,最后经过多次修改才得到结果。
3,运行的时候,输入完函数结果没出来就自动结束进程,一直以为是代码的原因,最后发现是因为没有延时函数,其实代码结果早就出来了。最后加了一个延时函数,得到结果。
七、实验总结
7.1、实验结论;
验证了信道容量迭代算法的正确性,解决了将公式变成代码的问题。
7.2、心得体会;
1,根据本次实验,我学习到vs2012软件编程和调试方法;为今后的实验打下了坚实的基础。
2,了解的信道容量迭代函数的原理,更加明白信道容量的具体意义。
3,知道如何将公式变成具体的代码,为以后的工作,学习打下了坚实的基础。
4.懂得了在面对困难的时候不放弃不抛弃,总会看见成功的。
7.3、对本实验方法、手段及过程等的改进建议。
对本次实验是建立在迭代的基础上的,首先要深刻理解信道容量的迭代算法,其次是,将复杂的公式转化成为程序。通过本次实验我了解信道容量的迭代算法的基本知识,学会的如何将复杂的公式用语言描述出来,掌握了高级语言数值计算过程的程序设计和调试的相关知识,对于将实际问题公式转换成程序的能力有所提高。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值