信息论与编码课程大作业信道容量的迭代算法.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date信息论与编码课程大作业信道容量的迭代算法信息论与编码课程大作业信道容量的迭代算法1信道容量的迭代算法的步骤一、用了matlab实现DMC容量迭代的算法如下:第一步:首先要初始化信源分布:即选取一个精度,本次中我选deta=0.000001。第二步:。第三步:。 第四步:第五步:若,则执行k=k+1,然后转第二步。直至转移条件不成立,接着执行下面的程序。第六步:输出迭代次数k和和,程序终止。2. Matlab实现clear;r=input('输入信源个数:');s=input('输入信宿个数:');deta=input('输入信道容量的精度: ');Q=rand(r,s); %形成r行s列随机矩阵QA=sum(Q,2); %把Q矩阵每一行相加和作为一个列矩阵AB=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 endend%将上面的用下面两句代替可自动生成信道转移矩阵%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) enddisp('最大信道容量时的信源分布:p='),disp(p')disp('最大信道容量:C='),disp(C(k+1)3. 运行结果及分析(宋体四号,加粗)结果分析:这两组数据都是我随机选的,都是选的信源个数为2,信宿的个数为3,选用的精度为0.000001。然后输入信道转移矩阵P,执行,将得到的结果代入,得到后,再进行的判断,这个条件满足时继续求,再依次往下计算,直至这个条件不满足,然后输出k和和。总的来说这不过是将矩阵不断的代入公式,当最后的精度不大于0.000001.输出k和和。第二组数据: 4.心得体会 在此次matlab编程实现信道容量的迭代算法的过程中,开始我觉得这十分的困难,经过网上查阅资料和请教同学,最后才对本次设计有了一定的理解,详细理解了信道容量的迭代算法过程。经过理解,发现这种编码其实挺简单的,最重要的是怎样用程序把它实现,这对我们的编程能力也是一次考验。编程时逻辑要十分的严谨,严格的遵守编程的规则,一点的错误都会造成整个程序的无法运行。调试过程会发现很多问题,这时不能烦躁,要耐心的去发现问题,不断掌握matlab软件的各种调试方法。通过这次设计我深刻体会到细节决定成败,同时也发觉自己知识学的太浅薄,没有从本质上把握住要点,运用知识不灵活。让我认识到在今后学习当中,要注意去深度思考,把所学知识有机联系起来,掌握本质,理解要领。此次实验进一步加强了我的编程能力和严谨的逻辑思维能力,受益颇多。很感谢老师给了我这么一次锻炼的机会,让我对自己有了新的认识,感谢同学在这次作业的完成对我的帮助,让我有了新的提高。-