信息论与编码课程大作业信道容量的迭代算法
- 格式:doc
- 大小:116.00 KB
- 文档页数:7
信息论与编码课程大作业题目:信道容量的迭代算法学生姓名:____________________学号:2010020200 __________________专业班级:10电子信息工程2013年5 月 18日信道容量的迭代算法1信道容量的迭代算法的步骤、用了 matlab 实现DMC 容量迭代的算法如下: 第一步:首先要初始化信源分布:P(k)0,1, ,r,置k 0,选1 deta 0r第三步:exp[ P ji logt kj ]j计算P k 1exp[ P ji logtU]ij第四步:第五步:执行下面的程序2. Matlab 实现clear;deta=i nput('输入信道容量的精度:'); (k)一个精度,本次中我选 deta=0.000001 。
(k)第二步: 根据式子tij ()piP ji ,得到反向转移概率矩阵{t ij (k)}。
(k) P i ( )p jii由式C k 1I P k1,t krlog expi 0P ji log t j k 计算 c k 1。
j 0C (k1) —C(k 1)C (k) deta , 则执行k=k+1,然后转第二步。
直至转移条件不成立,接着第六步:输出迭代次数 k 和C k 1和P k 1,程序终止。
r=input('输入信源个数: '); s=input('输入信宿个数:');Q=ran d(r,s);%形成r 行s 列随机矩阵Q可编辑A=sum(Q,2); %把Q矩阵每一行相加和作为一个列矩阵AB=repmat(A,1,s); %把矩阵A的那一列复制为S列的新矩阵%判断信道转移概率矩阵输入是否正确P=input('输入信道转移矩阵P: ')%从这句话开始将用下面两句代替可自动生成信道转移矩阵[r,s]=size(P);for i=1:rif(sum(P(i,:))~=1) %检测概率转移矩阵是否行和为 1.error( '概率转移矩阵输入有误!!')return ;endfor j=1:sif(P(i,j)<0||P(i,j)>1) %检测概率转移矩阵是否负值或大于 1error( '概率转移矩阵输入有误!!')return ;endendend%将上面的用下面两句代替可自动生成信道转移矩阵%disp(' 信道转移概率矩阵 :')%P=Q./B 信道转移概率矩阵(每一个原矩阵的新数除以所在行的数总和)i=1:1:r; %设置循环首项为1,公差为1,末项为r (Q的行数)的循环p(i)=1/r; %原始信源分布r个信源,等概率分布disp( ' 原始信源分布: ')p(i)E=repmat(p',1,s); %把r个等概率元素组成一列,复制为s列for k=1:1:1/detam=E.*P; % m=p.*E; %后验概率的分子部分a=sum(m); %把得到的矩阵m每列相加之和构成一行su仁repmat(a,r,1); %把得到的行矩阵a复制r行,成一新矩阵sul,后验概率的分母部分t=m./su1; %后验概率矩阵n=exp(sum(P .*log(t),2)); %信源分布的分子部分su2=sum(n); %信源分布的分母部分p=n/su2; %信源分布E=repmat(p,1,s);C(k+1)=log(sum(exp(sum(P .*log(t),2))))/log(2);kk=abs(C(k+1)-C(k))/C(k+1);if(kk<=deta)break ;enddisp( '迭代次数: k=' ),disp(k)enddisp( '最大信道容量时的信源分布: p=' ),disp(p')可编辑disp('最大信道容量:C=' ),disp(C(k+1))3•运行结果及分析(宋体四号,加粗)结果分析:这两组数据都是我随机选的,都是选的信源个数为足,然后输出k 和C k 1和P k 1。
信息论中的信道容量与编码速率信息论是数学与通信工程学科的交叉领域,它研究了信息传输的基本原理与极限。
在信息传输过程中,我们需要考虑信道容量和编码速率这两个重要的概念。
本文将详细介绍信息论中的信道容量和编码速率,并探讨它们对于信息传输的影响。
一、信道容量信道容量是指在特定的通信信道中传输信息的最大速率。
它是指在不引入任何差错的情况下,信道所能够传输的最高信息率。
信道容量取决于信道的带宽、噪声水平和信噪比等因素。
在信息论中,香农公式被广泛应用于计算信道容量。
根据香农公式,信道容量C可以通过以下公式计算得出:C = B * log2(1 + S/N)其中,B为信道的带宽,S为信道的信号功率,N为信道的噪声功率。
通过这个公式,我们可以看出,信道容量与带宽成正比,与信噪比也成正比。
在实际应用中,我们可以通过增加带宽或提高信噪比的方式来增加信道容量。
但是,无论如何提高这些因素,信道容量都有一定的极限,这是由信道本身的特性所决定的。
二、编码速率编码速率是指信息在信道中传输时的速率,也被称为传输速率。
它决定了我们可以多快地将信息输入到信道中,并对应着信号的频率。
编码速率一般用比特每秒(bps)来衡量。
在设计通信系统时,我们需要根据信道容量和所需的传输质量来确定编码速率。
一般来说,我们希望编码速率尽可能接近信道容量,以实现高效的信息传输。
但是,如果编码速率超过信道容量,就会发生信息传输的错误,这是由信道的限制所决定的。
为了实现高效的信息传输,我们需要选择合适的编码方案。
常见的编码技术有冗余编码、差错纠正编码等。
这些编码技术可以在保证传输质量的同时,提高编码速率。
三、信道容量与编码速率的关系信道容量与编码速率之间存在着紧密的关系。
通常情况下,编码速率不能超过信道容量,否则会导致传输错误。
因此,为了实现高效的信息传输,我们需要控制编码速率与信道容量的关系。
在信道容量小于编码速率的情况下,我们需要对输入信号进行压缩处理,以降低编码速率,来适应信道的限制。
实验二信道容量迭代算法一、实验目的:了解信道容量的计算方法二、实验内容与原理:内容:1.令pe1=pe2=0.1和pe1=pe2=0.01,分别计算该对称信道的信道容量和最佳分布;2.令pe1=0.15,pe2=0.1和pe1=0.075pe2=0.01,分别计算该信道的信道容量和最佳分布;信道容量是信息传输率的极限,当信息传输率小于信道容量时,通过信道编码,能够实现几乎无失真的数据传输;当数据分布满足最佳分布时,实现信源与信道的匹配,使得信息传输率能够达到信道容量。
本实验利用信道容量的迭代算法,使用计算机完成信道容量的计算。
三、程序代码#include<stdio.h>#include<math.h>int main(){double Pe1,Pe2,Pa1_=0,Pa2_=0; double b1a1,b2a1,b1a2,b2a2;double Pa1=0,Pa2=0;double I=0,max=0;//平均互信息量,最大平均互信息量int count=0;printf("输入信道容量参数Pe1:");scanf("%lf",&Pe1);printf("输入信道容量参数Pe2:");scanf("%lf",&Pe2);printf("信道容量参数:Pe1=%lf Pe2=%f\n",Pe1,Pe2);b1a1=1-Pe1;b2a1=Pe1;b1a2=Pe2;b2a2=1-Pe2;for(Pa1=0.01;Pa1<=1;Pa1=Pa1+0.01){ Pa2=1-Pa1;count=count+1;I=Pa1*b1a1*( log( b1a1/(Pa1*b1a1+Pa2*b1a2) )/log(2) )+Pa1*b2a1*( log(b2a1/(Pa1*b2a1+Pa2*b2a2) )/log(2) )+Pa2*b1a2*( log(b1a2/(Pa1*b1a1+Pa2*b1a2) )/log(2) )+Pa2*b2a2*( log(b2a2/(Pa1*b2a1+Pa2*b2a2) )/log(2) );printf("%10lf",I);if (I>max){max=I;Pa1_=Pa1,Pa2_=Pa2;}elsecontinue;}printf("\n");printf(" 一共计算机了:%d\n",count);printf(" 最大互信息量为:%lf\n",max);printf(" 最大互信息量的P(a1)=%lf;P(a2)=%lf\n",Pa1_,Pa2_); }四、运行结果。
实验二---一般信道容量迭代算法.doc实验二一般信道容量迭代算法1.实验目的掌握一般离散信道的迭代运算方法。
2.实验要求1)理解和掌握信道容量的概念和物理意义2)理解一般离散信道容量的迭代算法3)采用Matlab 编程实现迭代算法4)认真填写试验报告3.算法步骤①初始化信源分布),,,,,(21)0(p p p p P ri =(一般初始化为均匀分布) ,置迭代计数器k=0 ,设信道容量相对误差门限为δ ,δ>0 ,可设-∞=C )0(;②∑=i k i ij k i ij k ji p p p p )()()(? s j r i ,??=??=,1;,,1 ③∑∑∑??=+i k ji j ij k ji j ij k i p p p ??)()()1(ln exp ln exp r i ,,1??= ④??=∑∑+ik ji j ij k p C ?)()1(ln exp ln ⑤如果δ≤-++C C Ck k k )1()()1( ,转向⑦;⑥置迭代序号k k →+1,转向②;⑦输出p k i )1(+和C k )(1+的结果;⑧停止。
4.代码P=input('转移概率矩阵P=')e=input('迭代精度e=')[r,s]=size(P);n=0;C=0;C_k=0;C_k1=0;X=ones(1,r)/r;A=zeros(1,r);B=zeros(r,s);%初始化各变量while(1)n=n+1;for i=1:rfor j=1:sB(i,j)=log(P(i,j)/(X*P(:,j))+eps); if P(i,j)==0B(i,j)=0;elseendendA(1,i)=exp(P(i,:)*B(i,:)');endC_k=log2(X*A');C_k1=log2(max(A));if (abs(C_0-C_1)。
湖南大学信息科学与工程学院实验报告实验名称信道容量的迭代算法课程名称信息论与编码第1页共9页1.实验目的(1)进一步熟悉信道容量的迭代算法; (2)学习如何将复杂的公式转化为程序;(3)掌握C 语言数值计算程序的设计和调试技术。
2、实验方法硬件:pc 机开发平台:visual c++软件 编程语言:c 语言3、实验要求(1)已知:信源符号个数r 、信宿符号个数s 、信道转移概率矩阵P 。
(2)输入:任意的一个信道转移概率矩阵。
信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入。
(3)输出:最佳信源分布P*,信道容量C 。
4.算法分析1:procedure CHANNEL CAPACITY(r,s,(jip ))2:initialize:信源分布ip =1/r ,相对误差门限σ,C=—∞3:repeat 4:5:6:C2211log [exp(log )]rsji ij r j p φ==∑∑7:until C Cσ∆≤8:output P*=()i rp ,C9:end procedure21211exp(log )exp(log )sji ij j r sjiij r j p pφφ===∑∑∑ip 1i jiri jii p p p p=∑ijφ5.程序调试1、头文件引入出错f:\visualc++\channel\cpp1.cpp(4) : fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory————#include<unistd.h>纠错://#include<unistd.h>f:\visualc++\channel\cpp1.cpp(5) : fatal error C1083: Cannot open include file: 'values.h': No such file or directory————#include<values.h>纠错://#include<values.h>2、变量赋值错误f:\visualc++\channel\cpp1.cpp(17) : error C2065: 'ij' : undeclared identifierf:\visualc++\channel\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'int' to 'float ** ' Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast————float **phi_ij=ij=NULL;纠错:float **phi_ij=NULL;3、常量定义错误f:\visualc++\channel\cpp1.cpp(40) : error C2143: syntax error : missing ';' before 'for' ————for(i=0;i<r;i++)phi_ij[i]=(float *)calloc(s,sizeof(float));f:\visualc++\channel\cpp1.cpp(52) : error C2021: expected exponent value, not ' '————if(fabs(validate -1.0)>DELTA)f:\visualc++\channel\Cpp1.cpp(84) : error C2021: expected exponent value, not ' '————if(fabs(p_j)>=DELTA)f:\visualc++\channel\Cpp1.cpp(100) : error C2021: expected exponent value, not ' '————if(fabs(phi_ij[i][j])>=DELTA)f:\visualc++\channel\Cpp1.cpp(116) : error C2021: expected exponent value, not ' ' ————while(fabs(C-C_pre)/C>DELTA);纠错:#define DELTA 0.000001;F:\visualc++\channel\Cpp1.cpp(68) : error C2065: 'MAXFLOAT' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(68) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data————C=-MAXFLOAT;纠错:#define MAXFLOAT 1000000;3、引用中文逗号f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'f:\visualc++\channel\cpp1.cpp(60) : error C2065: 'Starting' : undeclared identifierf:\visualc++\channel\cpp1.cpp(60) : error C2059: syntax error : '.'f:\visualc++\channel\cpp1.cpp(60) : error C2017: illegal escape sequencef:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xa1'f:\visualc++\channel\cpp1.cpp(60) : error C2018: unknown character '0xb1'————fprintf(stdout,”Starting..\n”);纠错:fprintf(stdout,"Starting..\n");4、没有进行强制转换F:\visualc++\channel\Cpp1.cpp(65) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————p_i[i]=1.0/(float)r;纠错:p_i[i]=(float)(1.0/(float)r);F:\visualc++\channel\Cpp1.cpp(101) : warning C4244: '+=' : conversion from 'double' to 'float', possible loss of data————sum[i]+=p_ji[i][j]*log( phi_ij[i][j])/ log(2.0);纠错:sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0));F:\visualc++\channel\Cpp1.cpp(103) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————sum[i]=pow(2.0,sum[i]);纠错:sum[i]=(float)(pow(2.0,sum[i]));F:\visualc++\channel\Cpp1.cpp(114) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data————C= log(p_j)/ log(2.0);纠错:C= (float)(log(p_j)/ log(2.0));4、表达式错误F:\visualc++\channel\Cpp1.cpp(86) : error C2065: 'phi_ji' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer typeF:\visualc++\channel\Cpp1.cpp(86) : error C2109: subscript requires array or pointer type ————phi_ij[i][j]=p_i[i]* phi_ji[i][j]/p_j;纠错:phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'fprint' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'F:\visualc++\channel\Cpp1.cpp(122) : error C2065: 'The' : undeclared identifierF:\visualc++\channel\Cpp1.cpp(122) : error C2146: syntax error : missing ')' before identifier 'iteration'F:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2017: illegal escape sequenceF:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xa1'F:\visualc++\channel\Cpp1.cpp(122) : error C2018: unknown character '0xb1'————fprint(stdout,”The iteration number is %d.\n\n”,k);纠错:fprintf(stdout,"The iteration number is %d.\n\n",k);F:\visualc++\channel\Cpp1.cpp(145) : error C2143: syntax error : missing ')' before ';' ————free((p_i);纠错:free(p_i);5、没有返回值F:\visualc++\channel\Cpp1.cpp(149) : warning C4508: 'main' : function should return a value; 'void' return type assumed、纠错:return 0;6.改进程序/*引入头文件*/#include<stdio.h>#include<math.h>#include<stdlib.h>/*定义常量*/#define DELTA 0.0000001//DELTA为相对误差门限#define MAXFLOAT 1000000;//MAXFLOAT为初始化信道容量值int main( void){/*定义全局变量*//*register允许直接从寄存器中读取变量,提高速率*/register int i,j;//i、j为整型变量register int k;//信道容量迭代计算次数int r,s;//r为信源符号个数,s为新宿符号个数float *p_i=NULL;//r个信源符号发生的概率float **p_ji=NULL;//信源到新宿的信道转移概率矩阵Pfloat **phi_ij=NULL;float C,C_pre,validate;//C为信道容量,C_pre为信道最大容量,validate为判定输入转移概率矩阵是否合法float * sum=NULL;//信源符号所带的全部信息量float p_j;//条件概率/*输入信源符号和新宿符号个数*/printf("请输入信源符号个数r、信宿符号个数s...\n");printf("+++++注意!!!r必须大于等于s!!+++++\n");fscanf(stdin,"%d",&r);fscanf(stdin,"%d",&s);/*为 p_i,p_ji 和 phi_ij 分配内存空间*/p_i=(float *)calloc(r,sizeof(float));p_ji=(float **)calloc(r,sizeof(float));/*为每个p_ji分配大小为s的内存空间*/for(i=0;i<r;i++)p_ji[i]=(float *)calloc(s,sizeof(float));phi_ij=(float **)calloc(r,sizeof(float*));/*输入转移概率矩阵*/for(i=0;i<r;i++)/*为每个phi_ij分配大小为s的内存空间*/phi_ij[i]=(float *)calloc(s,sizeof(float));printf("信道转移概率矩阵P...\n");for(i=0;i<r;i++)for(j=0;j<s;j++)fscanf(stdin,"%f",&p_ji[i][j]);/*判定输入的转移概率矩阵是否正确*/for(i=0;i<r;i++){validate=0.0;for(j=0;j<s;j++){validate +=p_ji[i][j];}if((validate-1.0)>=0)//如果转移概率矩阵的概率和大于1,输入数据不合法{fprintf(stdout,"invalid input data.\n");exit(-1);}}/*显示开始计算..*/fprintf(stdout,"Starting..\n");/*初始化 p_i 和 phi_ij*/for(i=0;i<r;i++){/* p_i为等概率,即概率为1/r*/p_i[i]=(float)(1.0/(float)r);}/*初始化信道容量c,迭代次数k和临时变量variable*/C=-MAXFLOAT;k=0;/* 为sum分配大小为r的内存空间*/sum=(float *)calloc(r,sizeof(float));/*开始迭代计算*/do{k++;//每进行一次迭代,迭代次数k加1/* 计算phi_ij(k)*/for(j=0;j<s;j++){p_j=0.0;for(i=0;i<r;i++)p_j+=p_i[i]*p_ji[i][j];if(fabs(p_j)>=DELTA)for(i=0;i<r;i++)phi_ij[i][j]=p_i[i]* p_ji[i][j]/p_j;elsefor(i=0;i<r;i++)phi_ij[i][j]=0.0;}/*计算p_i(k+1)*/p_j=0.0;for(i=0;i<r;i++){sum[i]=0.0;for(j=0;j<s;j++){/*相对误差门限为0*/if(fabs(phi_ij[i][j])>=DELTA)sum[i]+=(float)(p_ji[i][j]*log( phi_ij[i][j])/ log(2.0)); }sum[i]=(float)(pow(2.0,sum[i]));p_j+=sum[i];}for(i=0;i<r;i++){p_i[i]=sum[i]/p_j;}C_pre=C;C= (float)(log(2.0)/log(p_j) );}while(fabs(C-C_pre)/C>DELTA);free(sum);sum=NULL;/*显示结果*/fprintf(stdout,"The iteration number is %d.\n\n",k);//迭代次数fprintf(stdout,"The capacity of the channel is %.6f bit/symbol:\n\n",C);//信道容量fprintf(stdout,"The best input probability distribution is :\n");//最佳信源分布 for(i=0;i<r;i++)fprintf(stdout,"%.6f\n",p_i[i]);fprintf(stdout,"\n");/* 释放指针空间*/for(i=s-1;i>=0;i--){free(phi_ij[i]);phi_ij[i]=NULL;}free(phi_ij);phi_ij=NULL;for(i=r-1;i>=0;i--){free(p_ji[i]);p_ji[i]=NULL;}free(p_ji);p_ji=NULL;free(p_i);p_i=NULL;exit(0);return 0;}7.实验结果八、实验结论信道容量是指信道能无错误传送的最大信息率。
陕西科技大学实验报告 班级: XXXX 学号:XXXXXXXXX 姓名:XXX 实验组别: 实验日期: 报告日期: 成绩: 报告内容:(目的和要求、原理、步骤、数据、计算、小结等)实验名称:信道容量的迭代算法一、实验目的(1) 进一步熟悉信道容量的迭代算法。
(2) 学习如何将复杂的公式转化为程序。
(3) 掌握高级语言数值计算程序的设计和调试技术。
二、实验要求(1)已知:信源符号个数r 、信宿符号个数s 、信道转移概率矩阵P 。
(2)输入:任意的一个信道转移概率矩阵。
信源符号个数、信宿符号个数和每个具体的转移概率在运行时从键盘输入。
(3)输出:信道容量C 。
三、实验原理(流程图):1: procedure ChannelCapacity(r, s, (ji p ))2: initialize: 信源分布1i p r =,相对误差门限δ,C =-∞ 3: repeat4: 1i jiij r ijii p p p p φ=←∑ 5: 111exp log exp log s ji ij j i r s ji ij i j p p p φφ===⎛⎫ ⎪⎝⎭←⎛⎫ ⎪⎝⎭∑∑∑ 6: 11log exp log r s ji ij i j C p φ==⎡⎤⎛⎫←⎢⎥ ⎪⎢⎥⎝⎭⎣⎦∑∑ 7: until C Cδ∆≤ 8: output C9: end procedure四、实验数据(源代码):#include<stdio.h>#include<math.h>#define MAX 100double Calculate_a(int k,double pa[]); double Calculate_C1(double pa[],double a[]); double Calculate_C2(double a[]);int r,s;double pba[3][3];void main(){int i,j;double C1,C2,E;double a[MAX],pa[3];E=0.000001;r=3;s=3;pa[0]=0.2;pa[1]=0.3;pa[2]=0.5;pba[3][3]={0.5,0.33333333,0.16666666,0.16666666,0.5,0.333333333,0.333 33333,0.16666666,0.5};do{for(i=0;i<r;i++)a[i]=Calculate_a(i,pa);C1=Calculate_C1(pa,a);C2=Calculate_C2(a);if(C2-C1>=E){double sum=0;for(i=0;i<r;i++)sum+=pa[i]*a[i];for(i=0;i<r;i++)pa[i]=pa[i]*a[i]/sum;}else{printf("最佳信源概率:\n");for(i=0;i<r;i++)printf(" %lf \n",pa[i]);}}while(C2-C1>=E);printf("信道容量为:%lf\n",C1/log(2));}double Calculate_a(int k,double pa[]){int i,j;double temp,sum2=0;for(j=0;j<s;j++){double sum1=0;for(i=0;i<r;i++){sum1+=pa[i]*pba[i][j];}temp=pba[k][j]/sum1;temp=log(temp);sum2+=pba[k][j]*temp;}return exp(sum2);}double Calculate_C1(double pa[],double a[]){int i;double sum=0;for(i=0;i<r;i++)sum+=pa[i]*a[i];return log(sum);}double Calculate_C2(double a[]){int i;double max=a[0];for(i=0;i<r;i++)if(max<a[i]) max=a[i];return log(max);}五、程序运行结果:最佳信源概率:0.3333300.3333340.333337信道容量为:0.125815Press any key to continue六、实验小结:通过本次实验,我了解了信道容量的迭代算法,在理论的掌握基础上,更进一步的实现了程序的运行算法,同时又加深了编程语言上的一些不足和毛病.。
信息论与编码课程大作业
题目:信道容量的迭代算法
学生姓名:
学号:2010020200
专业班级:10电子信息工程
2013 年5 月18 日
信道容量的迭代算法
1信道容量的迭代算法的步骤
一、用了matlab 实现DMC 容量迭代的算法如下: 第一步:首先要初始化信源分布:.0deta 10,1,0,1
)
(>>=⋯==,选置,,k r i r
P k i
即选取一个精度,本次中我选deta=0.000001。
第二步:}{,)
()()()
(k ij i
ji
k i
ji
k i k ij t p p
p p t 得到反向转移概率矩阵根据式子∑=。
第三步:
()()()()(){}
111]
log exp[]
log exp[+++==
∑∑∑k i k i
j
ij k ji
j
ij k ji k i p P t p
t p p 计算由式。
第四步:
()
()()
()()()。
C t p t P
I C
k r i s j k ij ji k k k 10011log exp log ,+==++⎪⎭⎪⎬⎫
⎪⎩⎪⎨⎧⎥⎦⎤⎢⎣⎡==∑∑计算由式
第五步: 若
a C
C C k k k det )
1()
()1(>-++,则执行k=k+1,然后转第二步。
直至转移条件不成立,接着
执行下面的程序。
第六步:输出迭代次数k 和()1+k C 和1+k P ,程序终止。
2. Matlab 实现
clear;
r=input('输入信源个数:'); s=input('输入信宿个数:');
deta=input('输入信道容量的精度: '); Q=rand(r,s); %形成r 行s 列随机矩阵Q
A=sum(Q,2); %把Q矩阵每一行相加和作为一个列矩阵A
B=repmat(A,1,s); %把矩阵A的那一列复制为S列的新矩阵
%判断信道转移概率矩阵输入是否正确
P=input('输入信道转移矩阵P:')%从这句话开始将用下面两句代替可自动生成信道转移矩阵
[r,s]=size(P);
for i=1:r
if(sum(P(i,:))~=1) %检测概率转移矩阵是否行和为1.
error('概率转移矩阵输入有误!!')
return;
end
for j=1:s
if(P(i,j)<0||P(i,j)>1) %检测概率转移矩阵是否负值或大于1
error('概率转移矩阵输入有误!!')
return;
end
end
end
%将上面的用下面两句代替可自动生成信道转移矩阵
%disp('信道转移概率矩阵:')
%P=Q./B 信道转移概率矩阵(每一个原矩阵的新数除以所在行的数总和)
i=1:1:r; %设置循环首项为1,公差为1,末项为r(Q的行数)的循环
p(i)=1/r; %原始信源分布r个信源,等概率分布
disp('原始信源分布:')
p(i)
E=repmat(p',1,s);%把r个等概率元素组成一列,复制为s列
for k=1:1:1/deta
m=E.*P; % m=p.*E; %后验概率的分子部分
a=sum(m); %把得到的矩阵m每列相加之和构成一行
su1=repmat(a,r,1);%把得到的行矩阵a复制r行,成一新矩阵sul,后验概率的分母部分
t=m./su1; %后验概率矩阵
n=exp(sum(P.*log(t),2)); %信源分布的分子部分
su2=sum(n); %信源分布的分母部分
p=n/su2; %信源分布
E=repmat(p,1,s);
C(k+1)=log(sum(exp(sum(P.*log(t),2))))/log(2);
kk=abs(C(k+1)-C(k))/C(k+1);
if(kk<=deta)
break;
end
disp('迭代次数:k='),disp(k)
end
disp('最大信道容量时的信源分布:p='),disp(p')
disp('最大信道容量:C='),disp(C(k+1))
3.运行结果及分析(宋体四号,加粗)
结果分析:这两组数据都是我随机选的,都是选的信源个数为2,信宿的个数为3,选用的精度为
0.000001。
然后输入信道转移矩阵
P ,执行
}
{,)
()()()
(k ij i
ji
k i
ji
k i k ij
t p p
p p t 得到反向转移概率矩阵∑=
,
将
得
到
的
结
果
代
入
()()()()(){}
111]
log exp[]
log exp[+++==
∑∑∑k i k i
j
ij k ji
j
ij k ji k i p P t p
t p p 计算由式,
得
到
)
1(+k p 后
()
()()
()()()。
C t p t P
I C
k r i s j k ij ji k k k 10011log exp log ,+==++⎪⎭
⎪⎬⎫
⎪⎩⎪⎨⎧⎥⎦⎤⎢⎣⎡==∑∑计算由式,再进行
a C C C k k k det )
1()
()1(>-++的判断,这个条件满足时继续求
)
(k ij
t ,再依次往下计算,直至这个条件不
满足,然后输出k 和()
1+k C
和1+k P 。
总的来说这不过是将矩阵不断的代入公式,当最后的
精度不大于0.000001.输出k 和()1+k C 和1+k P 。
第二组数据:
4.心得体会
在此次matlab编程实现信道容量的迭代算法的过程中,开始我觉得这十分的困难,经过网上查阅资料和请教同学,最后才对本次设计有了一定的理解,详细理解了信道容量的迭代算法过程。
经过理解,发现这种编码其实挺简单的,最重要的是怎样用程序把它实现,这对我们的编程能力也是一次考验。
编程时逻辑要十分的严谨,严格的遵守编程的规则,一点的错误都会造成整个程序的无法运行。
调试过程会发现很多问题,这时不能烦躁,要耐心的去发现问题,不断掌握matlab软件的各种调试方法。
通过这次设计我深刻体会到细节决定成败,同时也发觉自己知识学的太浅薄,没有从本质上把握住要点,运用知识不灵活。
让我认识到在今后学习当中,要注意去深度思考,把所学知识有机联系起来,掌握本质,理解要领。
此次实验进一步加强了我的编程能力和严谨的逻辑思维能力,受益颇多。
很感谢老师给了我这么一次锻炼的机会,让我对自己有了新的认识,感谢同学在这次作业的完成对我的帮助,让我有了新的提高。