信息论与编码实验报告-信道容量的迭代算法

合集下载

可以码信道容量迭代算法C 程序.

可以码信道容量迭代算法C  程序.

信息科学基础课程设计报告学院班级学号姓名课程设计一、信道容量的迭代算法1.课程设计目的(1)进一步熟悉信道容量的迭代算法;(2)学习如何将复杂的公式转化为程序;(3)掌握程序设计语言的数值计算程序和调试技术。

2.课程设计要求(1)已知:信源符号个数r、信宿符号个数s、信道转移概率矩阵P;(2)输入:任意的一个信道转移概率矩阵。

信源符号个数、信宿符号个数和每一个具体的转移概率在运行时从键盘输入;(3)输出:最佳信源分布*p,信道容量C。

3. 程序设计代码:#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[MAX][MAX];void main(){int i,j;double C1,C2,E;double a[MAX],pa[MAX];E=0.000001;printf("请输入信源符号个数r:\n");scanf("%d",&r);printf("请输入信宿符号个数s:\n");scanf("%d",&s);printf("请输入信源P[ai]:\n");for(i=0;i<r;i++)scanf("%lf",&pa[i]);printf("请输入信道转移概率矩阵P[bj][ai]:\n");for(i=0;i<r;i++)for(j=0;j<s;j++)scanf("%lf",&pba[i][j]);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);}4.输入、输出结果:例1:请输入信源符号个数r:2请输入信宿符号个数s:3请输入信源P[ai]:0.50.5请输入信道转移概率矩阵P[bj][ai]: 0.50.30.20.30.50.2最佳信源概率:0.5000000.500000信道容量为:0.036453Press any key to continue例2 :请输入信源符号个数r:3请输入信宿符号个数s:3请输入信源P[ai]:0.20.30.5请输入信道转移概率矩阵P[bj][ai]: 0.50.333333330.166666660.166666660.50.3333333330.333333330.166666660.5最佳信源概率:0.3333300.3333340.333337信道容量为:0.125815Press any key to continue课程设计二、惟一可译码判决准则1.课程设计目的(1)进一步熟悉惟一可译码判决准则;(2)掌握程序设计语言字符串处理程序和调试技术。

信息论与编码实习报告

信息论与编码实习报告

信息论与编码实习报告指导老师:姓名:班级:学号:实验一绘制二进制熵函数曲线一、内容用Matlab软件制作二进制熵函数曲线。

二、要求1.掌握Matlab绘图函数2.掌握、理解熵函数表达式及其性质三.Matlab程序及实验结果1.matlab程序:p=0.00001:0.001:1;h=-p.*log2(p)-(1-p).*log2(1-p);plot(p,h);title('二进制熵函数曲线');ylabel('H(P,1-P)')2.运行结果:结果分析:从图中可已看出当p=0.5即信源等概时熵取得最大值。

实验二一般信道容量迭代算法一、内容编程实现一般信道容量迭代算法。

伪代码见教材。

二、要求1.掌握一般信道容量迭代算法的原理2.掌握MA TLAB开发环境的使用(尤其是程序调试技巧),或者使用C语言完成程序设计三.Matlab程序及运行结果1.matlab程序:clc;clear all;N = input('输入信源符号X的个数N=');M = input('输入信源符号Y的个数M=');p_yx=zeros(N,M); %程序设计需要信道矩阵初始化为零fprintf('输入信道矩阵概率\n')for i=1:Nfor j=1:Mp_yx(i,j)=input('p_yx='); %输入信道矩阵概率if p_yx(i)<0error('不符合概率分布')endendEndfor i=1:N %各行概率累加求和s(i)=0;for j=1:Ms(i)=s(i)+p_yx(i,j);endendfor i=1:N %判断是否符合概率分布if (s(i)<=0.999999||s(i)>=1.000001)error('不符合概率分布')endendb=input('输入迭代精度:'); %输入迭代精度for i=1:Np(i)=1.0/N; %取初始概率为均匀分布endfor j=1:M %计算Q(j)Q(j)=0;for i=1:NQ(j)=Q(j)+p(i)*p_yx(i,j);endendfor i=1:N %计算F(i) f(i)=0;for j=1:Mif(p_yx(i,j)==0)f(i)=f(i)+0;elsef(i)=f(i)+p_yx(i,j)*log(p_yx(i,j)/Q(j));endendF(i)=exp(f(i));endx=0;for i=1:N %计算x x=x+p(i)*F(i);endIL=log2(x); %计算ILIU=log2(max(F)); %计算IUn=1;while((IU-IL)>=b) %迭代计算for i=1:Np(i)=p(i)*F(i)/x; %重新赋值p(i) endfor j=1:M %计算Q(j) Q(j)=0;for i=1:NQ(j)=Q(j)+p(i)*p_yx(i,j);endendfor i=1:N %计算F(i) f(i)=0;for j=1:Mif(p_yx(i,j)==0)f(i)=f(i)+0;elsef(i)=f(i)+p_yx(i,j)*log(p_yx(i,j)/Q(j));endEndF(i)=exp(f(i));endx=0;for i=1:N %计算xx=x+p(i)*F(i);endIL=log2(x); %计算ILIU=log2(max(F)); %计算IUn=n+1;endfprintf('信道矩阵为:\n');disp(p_yx);fprintf('迭代次数n=%d\n',n);fprintf('信道容量C=%f比特/符号',IL);2.运行结果为:若输入信道矩阵为:0.8500 0.15000.7500 0.2500则运行结果为:实验四线性分组码的信道编码和译码一、内容编程实现线性分组码(6,2)重复码的信道编码和译码。

信息论实验

信息论实验

设计并完成以下三个实验,要求有实验目的、原理、步骤、结果、程序和分析讨论(30分,每个实验10分) 实验①信道容量的计算实验②Huffman 编码或者算术编码实验 实验③信道编码方案设计实验一 信道容量的计算一、 实验目的1、 熟悉Matlab 工作环境以及工具箱;2、 掌握一般信道容量迭代算法原理。

3、 学习如何将复杂的公式转化为程序实现。

二、 实验要求1、 已知信源符号个数,信宿符号个数,信道转移概率矩阵P 。

2、 输入任意的一个信道转移概率矩阵,信源符号个数,信宿符号个数和每个具体转移概率,得出结果。

三、 实验原理定理:设信道的前向转移概率矩阵J K k j a b q Q ⨯=))((,0P 是任给的输入字母的一个初始概率分布,其所有分量)(0k a P 均不为零。

按照下式不断对概率分布进行迭代、更新:∑=+=Ki ri i r rk k rk r P a p P a p a p11)()()()()(ββ其中[]⎪⎪⎭⎪⎪⎬⎫⎪⎪⎩⎪⎪⎨⎧===∑∑===J j Ki i j i rk j k j pp k rk a b q a p a b q a b q Y a x I P r11)()()(log)(exp );(exp )(β则由此所得的),(Q p I r 序列收敛于信道容量C 。

在上述定理中,输入字母概率分布的更新方法具有很明显的意义,即不断将具有较大互信息);(Y a x I k =的输入字母的概率加以提高,将具有较小互信息);(Y a x I k =的输入字母的概率加以降低。

四、实验程序及结果。

进行Matlab仿真,仿真程序如下:contmax.m文件function [P_X,C,N]=contmax(P_YX,E)%计算任意信道的信道容量C及最佳输入分布P_X%P_X为输入概率分布%C为信道容量%N为迭代次数%P_YX为DMC信道的转移矩阵%E为预设精度if length(find(P_YX<0)~=0) %转移矩阵中各元素必须大于等于0 error('Not a probable vector, Negative component');endB=abs(sum(P_YX')-1);if max(B)>10e-10 %转移矩阵的行和必须等于1,否则重新输入error('Not a probable vector, Component do not add up to "1" ');end%变量初始化C1=1;C=0;N=0; r=size(P_YX);P_X=ones(1,r(1))/r(1);%调整P_YX的零元素值Pyx=(P_YX==0).*eps;P_YX=P_YX+Pyx;%迭代求解while (abs(C1-C))>EP_Y=P_X*P_YX;I1=sum((P_YX.*log2(P_YX))');I2=log2(P_Y)*(P_YX'); BETA=exp(I1-I2);B=P_X*(BETA');C1=log(B);C=log(max(BETA));P_X=P_X.*BETA/B;N=N+1; %迭代次数end保存为contmax.m文件执行程序为:p=0.4;P_YX=[1,0,0;0,1-p,p;0,p,1-p]; %信道的转移矩阵[P_X,C,n]=contmax(P_YX,0.001) %预设迭代精度e=0.001C0=log2(1+2*(p^p)*((1-p)^(1-p))) %通过算式直接求得信道容量执行结果:P_X =0.4887 0.2557 0.2557C =1.0340n =9C0 =1.0333五、分析讨论迭代精度对计算结果的影响。

信息论与编码实验2-实验报告

信息论与编码实验2-实验报告

信息论与编码实验2-实验报告信息论与编码实验 2 实验报告一、实验目的本次信息论与编码实验 2 的主要目的是深入理解和应用信息论与编码的相关知识,通过实际操作和数据分析,进一步掌握信源编码和信道编码的原理及方法,提高对信息传输效率和可靠性的认识。

二、实验原理(一)信源编码信源编码的目的是减少信源输出符号序列中的冗余度,提高符号的平均信息量。

常见的信源编码方法有香农编码、哈夫曼编码等。

香农编码的基本思想是根据符号出现的概率来分配码字长度,概率越大,码字越短。

哈夫曼编码则通过构建一棵最优二叉树,为出现概率较高的符号分配较短的编码,从而实现平均码长的最小化。

(二)信道编码信道编码用于增加信息传输的可靠性,通过在发送的信息中添加冗余信息,使得在接收端能够检测和纠正传输过程中产生的错误。

常见的信道编码有线性分组码,如汉明码等。

三、实验内容与步骤(一)信源编码实验1、选取一组具有不同概率分布的信源符号,例如:A(02)、B (03)、C(01)、D(04)。

2、分别使用香农编码和哈夫曼编码对信源符号进行编码。

3、计算两种编码方法的平均码长,并与信源熵进行比较。

(二)信道编码实验1、选择一种线性分组码,如(7,4)汉明码。

2、生成一组随机的信息位。

3、对信息位进行编码,得到编码后的码字。

4、在码字中引入随机错误。

5、进行错误检测和纠正,并计算错误纠正的成功率。

四、实验结果与分析(一)信源编码结果1、香农编码的码字为:A(010)、B(001)、C(100)、D (000)。

平均码长为 22 比特,信源熵约为 184 比特,平均码长略大于信源熵。

2、哈夫曼编码的码字为:A(10)、B(01)、C(111)、D (00)。

平均码长为 19 比特,更接近信源熵,编码效率更高。

(二)信道编码结果在引入一定数量的错误后,(7,4)汉明码能够成功检测并纠正大部分错误,错误纠正成功率较高,表明其在提高信息传输可靠性方面具有较好的性能。

信道容量迭代计算实验报告

信道容量迭代计算实验报告

信道容量迭代计算实验报告王升10271051信科1002信道容量迭代计算实验报告一、实验目的:了解信道容量的定义和计算方法,能编写出正确的程序进行迭代计算得出信道容量。

二、实验要求:1)输入:输入信源个数、信宿个数和信道容量的精度,程序能任意生成随机的信道转移概率矩阵。

2)输出:输出最佳信源分布和信道容量。

三、实验环境:Matlab四、实验原理:五、源程序代码:clear;r=input('输入信源个数:');s=input('输入信宿个数:');deta=input('输入信道容量的精度:');Q=rand(r,s); %创建m*n随机分布矩阵A=sum(Q,2);B=repmat(A,1,s);disp('信源转移概率矩阵:'),p=Q./B %信源转移概率矩阵i=1:1:r;q(i)=1/r;disp('原始信源分布:'),qc=-10e-8;C=repmat(q',1,s);for k=1:1:100000m=p.*C; %后验概率的分子部分a=sum(m); %后验概率的分母部分su1=repmat(a,r,1);t=m./su1; %后验概率矩阵D=exp(sum(p.*log(t),2)); %信源分布的分子部分su2=sum(D); %信源分布的分母部分q=D/su2; %信源分布C=repmat(q,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<=0.000001)break;endenddisp('最大信道容量时的信源分布:q='),disp(q') disp('最大信道容量:c='),disp(c(k+1))六、实验结果:。

实验二:信道容量的迭代算法

实验二:信道容量的迭代算法

实验二信道容量迭代算法一、实验目的:了解信道容量的计算方法二、实验内容与原理:内容: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_); }四、运行结果。

离散无记忆信道的信道容量计算实验报告

离散无记忆信道的信道容量计算实验报告

感谢聆听!
2.信道容量算法
信道容量是互信息的最大值,首先要将信道容量求极值得问题表示 为二重交替优化问题。
(1)
运行结果
(2)
实验结果(1):输入概率转移矩阵是之前例题中的概率转移矩阵,迭代 次数为11和70次,经验证,迭代程序结果比例题中的一般信道容量算 法更为精确。
实验结果(2):迭代次数为4,迭代结果为1.3219,经验算发现此输入概 率转移矩阵的实际结果为1.329,误差不大,符合要求,另外精度越高, 结果越接近。
离散无记忆信道的迭代运算
一、为什么要迭代?
(1)解方程组求出的输入分布 {P(x)}可能不唯一,因为可能有多个 极值点;
(2)需要验证求出的输入分布序列 是否符合要求。
二、Blahut-Arimoto算法
1.交替优化
(2)、通过轮流固定f的其中一个自变量,对另一个没固定的 自变量求极值,由此来确定受此自变量影响下的最值。下一 次对另一个自变量也如此操作,循环往复形成迭代。
程序部分
程序设计思路
(1)参数输入模块
(2)判断模块
判断矩阵中的元素是否 >=0且<=1
判断矩阵的行相加是否 都为1
(3)迭代模块1
(4)迭代模块2
(5)输出模块
P116 4.3 (b)
一般的王育民、李晖 .《信息论与编码理论第二版》[M]北京:高等教育出版社,2013.4 96-101 [2]辛英.《离散信道容量的迭代算法及其实现》[D]山东:山东工商学院,1994 [3]徐伟业 耿苏燕 马湘蓉 冯月芹.《任意DMC信道容量的计算与仿真》[D]南京:南京工程学院 2017

(完整word版)信道容量迭代算法

(完整word版)信道容量迭代算法

C(n 1, n) ln p(ai )i
i
C(n 1, n)

ln(
max i
i
)
C(n+1,n)— C (n+1,n)<


C=C(n+1,n)
终止
P=input('转移概率矩阵 P=') e=input('迭代精度 e=') [r,s]=size(P); k=0; C=0; C_0=0; C_1=0; [r,s]=size(P); for i=1:r
C_1=log2(max(A));
if (abs(C_0-C_1)<e)
C=C_0;
fprintf('迭代次数: k=%d\n',k)
fprintf('信道容量: C=%f 比特/符号\n',C)
b/(X*A');
continue;
end
end 实 验 结 果 及 分 析:
end
end
end
X=ones(1,r)/r;
A=zeros(1,r);
B=zeros(r,s);
while(1)
k=k+1;
for i=1:r
for j=1:s
B(i,j)=log(P(i,j)/(X*P(:,j))+eps);
end
A(1,i)=exp(P(i,:)*B(i,:)');
end
C_0=log2(X*A');
if(sum(P(i,:))~=1) error('概率转移矩阵输入有误!!') return;
end for j=1:s
if(P(i,j)<0||P(i,j)>1) error('概率转移矩阵输入有误!!')

实验二---一般信道容量迭代算法.doc

实验二---一般信道容量迭代算法.doc

实验二---一般信道容量迭代算法.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.实验结果八、实验结论信道容量是指信道能无错误传送的最大信息率。

信息论与编码实验报告格式

信息论与编码实验报告格式

《信息论与编码》指导教师:蒋明峰实验报告学号:E08640229姓名:邹超班级:08电科二班实验一: 离散信道容量的迭代计算实验学时:3实验类型:(演示、验证、综合、√设计、研究)实验要求:(√必修、选修) 一、实验目的通过本实验的学习,理解和掌握信道容量的概念和物理意义;了解信道容量的计算方法尤其是迭代计法;采用计算机编程实现迭代算法。

二、实验内容信道容量的概念和物理意义; 信道容量的计算方法;采用计算机编程实现信道容量的计算 三、实验原理、方法和手段 算法归纳如下:设信道输入输出符号集的大小分别为r ,s ,且ε为一个小的正数。

且初始概率分布为均匀分布,即设pi =1/r 1) 计算i ij iq p p j=∑;2) 计算ln(/),1,,ij ij j jp p q i ei r α∑== ;3) 计算i i iu p α=∑;4)计算22log (),log (max())L U i iI u I α==;5) 若(IU -IL )<ε,转到6),否则/,1,;i i i p p ui r α== 返回1) 6)输出信道容量的值C=I L (比特/符号)四、实验数据源:(可任意)1.P(a 1)=p(a 2)=0.52.P(a 1)=p(a 2)=0.5五、实验源程序代码:#include <stdio.h>#include <math.h>#include <stdlib.h>void main(){register int i,j;register int k;int N,M;float *p=NULL;float *q=NULL;float *d=NULL;float *a=NULL;float *s=NULL;float **p_yx=NULL;float C,b,u,max,IL,IU;printf("输入信源符号a的个数N=");scanf("%d",&N);printf("输出信源符号b的个数M=");scanf("%d",&M);p=(float *)calloc(N,sizeof(float));q=(float *)calloc(M,sizeof(float));d=(float *)calloc(N,sizeof(float));a=(float *)calloc(N,sizeof(float));s=(float *)calloc(N,sizeof(float));p_yx=(float **)calloc(N,sizeof(float));for(i=0;i<N;i++){p_yx[i]=(float *)calloc(M,sizeof(float));}printf("请输入信道矩阵:\n");for(i=0;i<N;i++){for(j=0;j<M;j++){printf("p_yx[%d][%d]=",i,j);scanf("%f",&p_yx[i][j]);}printf("\n");}for(i=0;i<N;i++){s[i]=0.0;for(j=0;j<M;j++)s[i]=s[i]+p_yx[i][j];for(i=0;i<N;i++){if(s[i]<=0.999999||s[i]>=1.000001)printf("不符合概率分布");elseif(s[N-1]>=0.999999&&s[N-1]<1.000001){printf("请输入迭代精度:");scanf("%f",&b);}break;}for(i=0;i<N;i++)p[i]=1.0/N;for(j=0;j<M;j++){q[j]=0;for (i=0;i<N;i++)q[j]=q[j]+p[i]*p_yx[i][j];}for(i=0;i<N;i++){d[i]=0;for(j=0;j<M;j++){if(p_yx[i][j]==0)d[i]=d[i]+0;elsed[i]=d[i]+p_yx[i][j]*log(p_yx[i][j]/q[j]);}a[i]=exp(d[i]);}u=0.0;for(i=0;i<N;i++)u=u+p[i]*a[i];IL=log(u)/log(2.0);max=a[0];for(i=0;i<N;i++){if(a[i]>=max)max=a[i];}IU=log(max)/log(2.0);C=IL;while((IU-IL)>=b){for(i=0;i<N;i++)p[i]=p[i]*a[i]/u;for(j=0;j<M;j++){q[j]=0;for (i=0;i<N;i++)q[j]=q[j]+p[i]*p_yx[i][j];}for(i=0;i<N;i++){d[i]=0;for(j=0;j<M;j++){if(p_yx[i][j]==0)d[i]=d[i]+0;elsed[i]=d[i]+p_yx[i][j]*log(p_yx[i][j]/q[j]);}a[i]=exp(d[i]);}u=0.0;for(i=0;i<N;i++)u=u+p[i]*a[i];IL=log(u)/log(2.0);max=a[0];for(i=0;i<N;i++){if(a[i]>=max)max=a[i];}IU=log(max)/log(2.0);k=k+1;}C=IL;printf("信道矩阵为:\n");for(i=0;i<N;i++){for(j=0;j<M;j++){printf("%f ",p_yx[i][j]);printf("\n");}printf("迭代次数k=%d\n",k);printf("信道容量C=%f比特/符号",C);printf("\n");}六、运行结果:七、分析与讨论:1.当信道矩阵为对称阵时,只要迭代一次即可。

信息论与编码实验报告

信息论与编码实验报告

实验一:计算离散信源的熵一、实验设备:1、计算机2、软件:Matlab二、实验目的:1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程;三、实验内容:1、写出计算自信息量的Matlab 程序2、写出计算离散信源平均信息量的Matlab 程序。

3、将程序在计算机上仿真实现,验证程序的正确性并完成习题。

四、求解:1、习题:A 地天气预报构成的信源空间为:()⎥⎦⎤⎢⎣⎡=⎥⎦⎤⎢⎣⎡6/14/14/13/1x p X 大雨小雨多云晴 B 地信源空间为:17(),88Y p y ⎡⎤⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦⎣⎦ 小雨晴 求各种天气的自信息量和此两个信源的熵。

2、程序代码:p1=[1/3,1/4,1/4,1/6];p2=[7/8,1/8];H1=0.0;H2=0.0;I=[];J=[];for i=1:4H1=H1+p1(i)*log2(1/p1(i));I(i)=log2(1/p1(i));enddisp('自信息I分别为:');Idisp('信息熵H1为:');H1for j=1:2H2=H2+p2(j)*log2(1/p2(j));J(j)=log2(1/p2(j));enddisp('自信息J分别为');Jdisp('信息熵H2为:');H23、运行结果:自信息量I分别为:I = 1.5850 2.0000 2.0000 2.5850信源熵H1为:H1 = 1.9591自信息量J分别为:J =0.1926 3.0000信源熵H2为:H2 =0.54364、分析:答案是:I =1.5850 2.0000 2.0000 2.5850 J =0.1926 3.0000H1 =1.9591; H2 =0.5436实验2:信道容量一、实验设备:1、计算机2、软件:Matlab二、实验目的:1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉 Matlab 编程;三、实验内容:1、写出计算自信息量的Matlab 程序2、写出计算离散信源平均信息量的Matlab 程序。

信息论与编码实验报告

信息论与编码实验报告

信息论与编码实验报告一、实验目的信息论与编码是一门涉及信息的度量、传输和处理的学科,通过实验,旨在深入理解信息论的基本概念和编码原理,掌握常见的编码方法及其性能评估,提高对信息处理和通信系统的分析与设计能力。

二、实验原理(一)信息论基础信息熵是信息论中用于度量信息量的重要概念。

对于一个离散随机变量 X,其概率分布为 P(X) ={p(x1), p(x2),, p(xn)},则信息熵H(X) 的定义为:H(X) =∑p(xi)log2(p(xi))。

(二)编码原理1、无失真信源编码:通过去除信源中的冗余信息,实现用尽可能少的比特数来表示信源符号,常见的方法有香农编码、哈夫曼编码等。

2、有噪信道编码:为了提高信息在有噪声信道中传输的可靠性,通过添加冗余信息进行纠错编码,如线性分组码、卷积码等。

三、实验内容及步骤(一)信息熵的计算1、生成一个离散信源,例如信源符号集为{A, B, C, D},对应的概率分布为{02, 03, 01, 04}。

2、根据信息熵的定义,使用编程语言计算该信源的信息熵。

(二)香农编码1、按照香农编码的步骤,首先计算信源符号的概率,并根据概率计算每个符号的编码长度。

2、确定编码值,生成香农编码表。

(三)哈夫曼编码1、构建哈夫曼树,根据信源符号的概率确定树的结构。

2、为每个信源符号分配编码,生成哈夫曼编码表。

(四)线性分组码1、选择一种线性分组码,如(7, 4)汉明码。

2、生成编码矩阵,对输入信息进行编码。

3、在接收端进行纠错译码。

四、实验结果与分析(一)信息熵计算结果对于上述生成的离散信源,计算得到的信息熵约为 184 比特/符号。

这表明该信源存在一定的不确定性,需要一定的信息量来准确描述。

(二)香农编码结果香农编码表如下:|信源符号|概率|编码长度|编码值|||||||A|02|232|00||B|03|174|10||C|01|332|110||D|04|132|111|香农编码的平均码长较长,编码效率相对较低。

大学信息论_信道容量的迭代算法

大学信息论_信道容量的迭代算法

陕西科技大学实验报告 班级: 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六、实验小结:通过本次实验,我了解了信道容量的迭代算法,在理论的掌握基础上,更进一步的实现了程序的运行算法,同时又加深了编程语言上的一些不足和毛病.。

信道容量迭代算法

信道容量迭代算法

附录:实验代码(C++)
#include<iostream> using namespace std; #include<math.h> #define MAX 50 double Calculate_C1(double p[],double a[]); double Calculate_C2(double a[]); int r,s; double P[MAX][MAX]; int main() { int i,j; double C1,C2,E; double a[MAX],p[MAX]; E=0.000001; cout<<"请输入信源符号个数 r:\n"; cin>>r; cout<<"请输入信宿符号个数 s:\n"; cin>>s; cout<<"请输入信道转移概率矩阵 P[bj][ai]:\n"; for(i=0;i<r;i++) for(j=0;j<s;j++) cin>>P[i][j]; for(i=0;i<r;i++) p[i]=1.0/r; do { for(i=0;i<r;i++) { int w,j; double temp,sum2=0; for(j=0;j<s;j++) { double qj=0; for(w=0;w<r;w++) { qj+=p[w]*P[w][j]; } temp=P[i][j]/qj;
算法原理
1. 2.
1 (0) 初始化信源分布:pi= ,循环变量 k=1,门限△,C =- r

信息论与编码实验报告

信息论与编码实验报告

实验报告课程名称:信息论与编码姓名:系:专业:年级:学号:指导教师:职称:年月日目录实验一信源熵值的计算 (1)实验二 Huffman信源编码 (5)实验三 Shannon编码 (9)实验四信道容量的迭代算法 (12)实验五率失真函数 (15)实验六差错控制方法 (20)实验七汉明编码 (22)实验一 信源熵值的计算一、 实验目的1 进一步熟悉信源熵值的计算 2熟悉 Matlab 编程二、实验原理熵(平均自信息)的计算公式∑∑=--==qi i i qi i i p p p p x H 1212log 1log )(MATLAB 实现:))(log *.(2x x sum HX -=;或者))((log *)(2i x i x h h -= 流程:第一步:打开一个名为“nan311”的TXT 文档,读入一篇英文文章存入一个数组temp ,为了程序准确性将所读内容转存到另一个数组S ,计算该数组中每个字母与空格的出现次数(遇到小写字母都将其转化为大写字母进行计数),每出现一次该字符的计数器+1;第二步:计算信源总大小计算出每个字母和空格出现的概率;最后,通过统计数据和信息熵公式计算出所求信源熵值(本程序中单位为奈特nat )。

程序流程图:三、实验内容1、写出计算自信息量的Matlab 程序2、已知:信源符号为英文字母(不区分大小写)和空格。

输入:一篇英文的信源文档。

输出:给出该信源文档的中各个字母与空格的概率分布,以及该信源的熵。

四、实验环境Microsoft Windows 7Matlab 6.5五、编码程序#include"stdio.h"#include <math.h>#include <string.h>#define N 1000int main(void){char s[N];int i,n=0;float num[27]={0};double result=0,p[27]={0};FILE *f;char *temp=new char[485];f=fopen("nan311.txt","r");while (!feof(f)) {fread(temp,1, 486, f);}fclose(f);s[0]=*temp;for(i=0;i<strlen(temp);i++){s[i]=temp[i];}for(i=0;i<strlen(s);i++){if(s[i]==' ')num[26]++;else if(s[i]>='a'&&s[i]<='z')num[s[i]-97]++;else if(s[i]>='A'&&s[i]<='Z')num[s[i]-65]++;}printf("文档中各个字母出现的频率:\n");for(i=0;i<26;i++){p[i]=num[i]/strlen(s);printf("%3c:%f\t",i+65,p[i]);n++;if(n==3){printf("\n");n=0;}}p[26]=num[26]/strlen(s);printf("空格:%f\t",p[26]);printf("\n");for(i=0;i<27;i++){if (p[i]!=0)result=result+p[i]*log(p[i]);}result=-result;printf("信息熵为:%f",result);printf("\n");return 0;}六、求解结果其中nan311.txt中的文档如下:There is no hate without fear. Hate is crystallized fear, fear’s dividend, fear objectivized. We hate what we fear and so where hate is, fear is lurking. Thus we hate what threatens our person, our vanity andour dreams and plans for ourselves. If we can isolate this element in what we hate we may be able to cease from hating.七、实验总结通过这次实验,我们懂得了不必运行程序时重新输入文档就可以对文档进行统计,既节省了时间而且也规避了一些输入错误。

信息论与编码实验报告

信息论与编码实验报告

信息论与编码实验报告实验⼀关于硬币称重问题的探讨⼀、问题描述:假设有N 个硬币,这N 个硬币中或许存在⼀个特殊的硬币,这个硬币或轻或重,⽽且在外观上和其他的硬币没什么区别。

现在有⼀个标准天平,但是⽆刻度。

现在要找出这个硬币,并且知道它到底是⽐真的硬币重还是轻,或者所有硬币都是真的。

请问:1)⾄少要称多少次才能达到⽬的;2)如果N=12,是否能在3 次之内将特殊的硬币找到;如果可以,要怎么称?⼆、问题分析:对于这个命题,有⼏处需要注意的地⽅:1)特殊的硬币可能存在,但也可能不存在,即使存在,其或轻或重未知;2)在⽬的上,不光要找到这只硬币,还要确定它是重还是轻;3)天平没有刻度,不能记录每次的读数,只能判断是左边重还是右边重,亦或者是两边平衡;4)最多只能称3 次。

三、解决⽅案:1.关于可⾏性的分析在这⾥,我们把称量的过程看成⼀种信息的获取过程。

对于N 个硬币,他们可能的情况为2N+1 种,即重(N 种),轻(N 种)或者⽆假币(1 种)。

由于这2N+1 种情况是等概率的,这个事件的不确定度为:Y=Log(2N+1)对于称量的过程,其实也是信息的获取过程,⼀是不确定度逐步消除的过程。

每⼀次称量只有3 种情况:左边重,右边重,平衡。

这3 种情况也是等概率的,所以他所提供的信息量为:y=Log3在K 次测量中,要将事件的不确定度完全消除,所以K= Log(2N+1)/ Log3根据上式,当N=12 时,K= 2.92< 3 所以13 只硬币是可以在3 次称量中达到⽬的的。

通过此式,我们还可以计算得到:通过3 次测量⽽找出异常硬币,N 的最⼤值为13.2.⽅案的提出为了描述⽅便,我们给这12枚硬币分别编号(1)-(12)。

⾸先,任选8个⽐较,如选:⑴⑵⑶⑷⽐⑸⑹⑺⑻1.若⼀样重,则假币在⑼~⑿中,第⼆步:⑼⑽⽐⑾⑴(1)若⼀样重,则可能的假币为⑿。

则第三步:⑴⽐⑿a.若⼀样重,则没有假币;b.不⼀样重,则假币为⑿:如果(1)>(12),则假币轻,反之,假币重;(2)若⑼⑽重,则第三步:⑼⽐⑽a.若⼀样重,则假币为⑾(较轻)b.不⼀样重,则假币为⑼、⑽中较重者(3)若⑼⑽轻,则第三步:⑼⽐⑽a.若⼀样重,则假币为⑾(较重)b.不⼀样重,则假币为⑼、⑽中较轻者2.若⑴⑵⑶⑷重,则第⼆步:⑴⑵⑸⽐⑶⑷⑹(1)若⼀样重,则假币在⑺⑻中,第三步:⑺⽐⑻假币为⑺、⑻中较轻者(2)若⑴⑵⑸端较重,则假币在⑴⑵⑹中,第三步:⑴⽐⑵a.若⼀样重,则假币为⑹(较轻)b.不⼀样重,则假币为⑴⑵中较重者(3)若⑶⑷⑹端较重,则假币在⑶⑷⑸中,第三步:⑶⽐⑷a.若⼀样重,则假币为⑸(较轻)b.不⼀样重,则假币为⑶、⑷中较重者3.若⑴⑵⑶⑷轻,则与上⾯类似,第⼆步:⑴⑵⑸⽐⑶⑷⑹(1)若⼀样重,则假币在⑺⑻中,第三步:⑺⽐⑻假币为⑺、⑻中较重者(2)若⑴⑵⑸端较轻,则假币在⑴⑵⑹中,第三步:⑴⽐⑵a.若⼀样重,则假币为⑹(较重)b.不⼀样重,则假币为⑴⑵中较轻者(3)若⑶⑷⑹端较轻,则假币在⑶⑷⑸中,第三步:⑶⽐⑷a.若⼀样重,则假币为⑸(较重)b.不⼀样重,则假币为⑶、⑷中较轻者3.⽤C语⾔编程实现上述⽅案为:#includevoid main(){int i;float a[12];for(i=0;i<12;i++)scanf("%f",&a[i]);if(a[0]+a[1]+a[2]+a[3]==a[4]+a[5]+a[6]+a[7]){if(a[0]+a[1]+a[2]==a[8]+a[9]+a[10]){if(a[8]==a[11])printf("There is no special coin!\n");else if(a[8]>a[11])printf("There is a special coin:%f(12) and it's lighter than others.\n",a[ 11]); elseprintf("There is a special coin:%f(12) and it's heavier than others.\n",a[ 11]); }else if(a[0]+a[1]+a[2]>a[8]+a[9]+a[10]){if(a[8]==a[9])printf("There is a special coin:%f(11) and it's lighter than others.\n",a[ 10]); else if(a[8]>a[9])printf("There is a special coin:%f(10) and it's lighter than others.\n",a[ 9]); elseprintf("There is a special coin:%f(9) and it's lighter than others.\n",a[8 ]);}else{if(a[8]==a[9])printf("There is a special coin:%f(11) and it's heavier than others.\n",a[ 10]); else if(a[8]>a[9])printf("There is a special coin:%f(9) and it's heavier than others.\n",a[8 ]); elseprintf("There is a special coin:%f(10) and it's heavier than others.\n",a[ 9]); }}else if(a[0]+a[1]+a[2]+a[3]>a[4]+a[5]+a[6]+a[7]){if(a[0]+a[2]+a[5]==a[1]+a[4]+a[8]){if(a[6]==a[7])printf("There is a special coin:%f(4) and it's heavier than others.\n",a[3 ]); else if(a[6]>a[7])printf("There is a special coin:%f(8) and it's lighter than others.\n",a[7 ]); elseprintf("There is a special coin:%f(7) and it's lighter than others.\n",a[6 ]);}else if(a[0]+a[2]+a[5]>a[1]+a[4]+a[8]){if(a[0]==a[2])printf("There is a special coin:%f(5) and it's lighter than others.\n",a[4 ]); else if(a[0]>a[2])printf("There is a special coin:%f(1) and it's heavier than others.\n",a[0 ]);elseprintf("There is a special coin:%f(3) and it's heavier than others.\n",a[2 ]); }else{if(a[1]>a[8])printf("There is a special coin:%f(2) and it's heavier than others.\n",a[1 ]); if(a[5]printf("There is a special coin:%f(6) and it's lighter than others.\n",a[5 ]); }}else{if(a[0]+a[2]+a[5]==a[1]+a[4]+a[8]){if(a[6]==a[7])printf("There is a special coin:%f(4) and it's lighter than others.\n",a[3 ]); else if(a[6]>a[7])printf("There is a special coin:%f(7) and it's heavier than others.\n",a[6 ]); elseprintf("There is a special coin:%f(8) and it's heavier than others.\n",a[7]); }else if(a[0]+a[2]+a[5]{if(a[0]==a[2])printf("There is a special coin:%f(5) and it's heavier than others.\n",a[4 ]); else if(a[0]>a[2])printf("There is a special coin:%f(3) and it's lighter than others.\n",a[2 ]);printf("There is a special coin:%f(1) and it's lighter than others.\n",a[0 ]);}else{if(a[1]printf("There is a special coin:%f(2) and it's lighter than others.\n",a[1 ]);if(a[5]>a[8])printf("There is a special coin:%f(6) and it's heavier than others.\n",a[5 ]);}}}运⾏结果如图:即输⼊12个数表⽰这12枚硬币的重量,最后输出哪⼀枚为假币,并判断其轻重。

信道容量的迭代算法

信道容量的迭代算法
p (0) (x i )
输入
s P(y j | x i ) ai(n) exp y j | x i ) ln q(y j ) j 1 (i=1,2...)
u (n) p(x i )ai (n)
i
I L log 2 (u (n) ), IU log 2 (max(a i(n) ))
I (X; Y) p(x i ) p(y j | x i ) ln
i j
p(x ) p(y
i i
p(y j | x i )
j
| xi )
(1)
要求信道容量 C 就是要在 p(x i ) 的约束下,求 I (X; Y) 的极大值。 首先引入后验概率,即:
q(x i | y j )
p(x ) p(y
表 1.1 ε的选取与信道容量关系 因此,使用该算法计算 C 的时候要选取适当的ε值,才能保证 值的准确性。
四 程序说明 1、程序采用的是C++语言,编译环境为visual studio 2010 2、信道矩阵放在“Channel_matrix.txt”中,其中初始信源为等概 1/R(R表示信源个数),并放在vector<float> pxi中。 3、本程序使用#define wucha ε 定义误差,因此通过改变 wucha 的值就可以控制迭代的次数 4、程序为:channel_code.cpp 信道矩阵为:Channel_matrix.txt
信道容量的迭代算—彭海军
研究信道的目的是要讨论信道中平均每个符号所能传送的信息 量,而将最大的信息传输率称为信道容量。由于对于普通的线性信 道(信道矩阵 r=s),直接可以采用 C ln e 求解信道容量。但当

信息论与编码实验报告

信息论与编码实验报告

信息论与编码实验报告信息论与编码实验报告一、引言信息论与编码是现代通信领域中的重要理论基础,通过对信息的量化和编码方式的设计,可以提高通信系统的传输效率和可靠性。

本实验旨在通过对信息论与编码的实际应用进行探索,加深对相关理论的理解和掌握。

二、实验目的1. 了解信息论与编码的基本概念和原理;2. 学习使用信息论与编码的工具和方法;3. 进行实际的编码实验,验证理论的有效性。

三、实验内容1. 信息熵的计算信息熵是信息论中的重要概念,用于衡量信息的不确定性。

我们选择一个简单的例子来计算信息熵,假设有一个硬币,正反面出现的概率分别为0.5。

根据信息熵的公式,我们可以计算出该硬币的信息熵为1比特。

2. 信道容量的计算信道容量是指在给定信道带宽和信噪比条件下,信道能够传输的最大数据率。

我们选择一个高斯信道作为实验对象,通过改变信噪比来计算信道容量。

实验结果显示,信噪比越高,信道容量越大。

3. 奇偶校验码的设计与实现奇偶校验码是一种简单的错误检测码,可以用于检测数据传输过程中的错误。

我们设计了一个简单的奇偶校验码方案,并通过编程实现了该方案。

实验结果表明,奇偶校验码能够有效地检测出数据传输中的错误。

4. 哈夫曼编码的设计与实现哈夫曼编码是一种有效的数据压缩算法,通过对出现频率较高的字符进行短编码,可以实现数据的高效传输和存储。

我们选择一段文本作为实验对象,通过统计字符出现频率并设计相应的哈夫曼编码表,成功地对文本进行了压缩。

四、实验结果与分析通过实验,我们成功地计算了信息熵和信道容量,并验证了理论的准确性。

在奇偶校验码的实验中,我们发现该码能够有效地检测出单比特错误,但对于多比特错误的检测能力有限。

在哈夫曼编码的实验中,我们成功地对文本进行了压缩,并获得了较高的压缩比。

五、实验总结通过本次实验,我们深入了解了信息论与编码的基本概念和原理,并通过实际操作加深了对相关理论的理解。

实验结果表明,信息论与编码在通信系统中具有重要的应用价值,能够提高通信效率和可靠性。

信道容量迭代算法(信息与编码论)

信道容量迭代算法(信息与编码论)

实验四信道容量迭代算法一、实验目的让学生初步掌握信道容量的基础知识、计算方法及迭代算法计算方法,以及取得信道容量的判别算法,并学会使用c 语言完成迭代算法。

二、实验原理信息率失真函数迭代算法具体如下:(1)首先假设绝对值足够大的负数作为斜率S 的取值,并且选择试验信道的转移概率1(|)j k p b a 为等分布的,且令1n =。

(2)根据公式1()(|)()rn j n j k k k p b p b a p a ==∑计算出()n j p b 。

(2)将()n j p b 代入公式1()exp((,))(|)()exp[(,)]n j i j n j i n j i jj p b Sd a b p b a p b Sd a b +=∑计算出1(|)n j i p b a +。

(4)计算平均失真和信息率1111()(|)(,)s r n i n j i i j j i D p a p b a d a b ++===∑∑11(|)()(|)log()r s n j i n i n j i i j n j p b a R p a p b a p b ===∑∑(5)如果1||n n D D ε+-≤,则跳转到(6);否则,令1n n =+,跳转到(2)。

其中ε为事先确定的精度。

(6)令()n D S D =,()n R S R =;改变斜率值S ,选择初始条件概率为等概率分布,令1n =,然后跳转到(2),直至斜率足够接近0为止。

三、实验内容1)给定一个两输入的概率分布和失真矩阵测度分别如下12()1X a a p x p p ⎡⎤⎡⎤=⎢⎥⎢⎥-⎣⎦⎣⎦11122122(,)(,)01(,)(,)10d a b d a b d a b d a b ⎡⎤⎡⎤==⎢⎥⎢⎥⎣⎦⎣⎦D 令p=0.5,初始斜率s=-20,斜率递增步长为0.05,利用迭代算法完成信息率失真函数的计算;将失真和信息率的值写入excel 文档,利用excel 的绘图工具画出信息率失真函数曲线;2)令p=0.3,0.1重复上述过程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
课程名称:信息论与编码姓名:
系:
专业:
年级:
学号:
指导教师:
职称:
年月日
实验四信道容量的迭代算法
一、 实验目的
1、进一步熟悉信道容量的迭代算法;
2、学习如何将复杂的公式转化为程序;
3、熟悉程序设计语言的数值计算程序和调试技术。

二、实验原理
(1)初始化信源分布()r 21)0(,,,P P P P =(一般初始化为均匀分布),置迭代计数器k=0,设信道容量相对误差门限为δ,δ>0,可设; (2) s i P P P P i k i ij k i ij k ji ,,2,1)
()()(
==∑ϕ (3) r i P P P i j k ji ij j k ji ij k i ,2,1ln exp ln exp )()()1(=⎪⎭
⎪⎬⎫⎪⎩⎪⎨⎧⎥⎦⎤⎢⎣⎡⎥⎦⎤⎢⎣⎡=∑∑∑+ϕϕ (4) ⎪⎭⎪⎬⎫⎪⎩⎪⎨⎧⎥⎦⎤⎢⎣⎡=∑∑+i k ji j ij k P C )()
1(ln exp ln ϕ (5)如果δ≤-++)1()
()1(k k k C C C ,转向(7);
(6)置迭代序号k k →+1,转向(2);
(7)输出)1(+k i P 和)1(+k C 的结果;
(8)停止。

三、实验内容
1、已知:信源符号个数r 、新宿符号个数s 、信道转移概率矩阵P ;
2、输入:任意的一个信道转移概率矩阵,信源符号个数、信宿符号个数和每一个具体的转移概率在运行时从键盘输入;
3、 输出:最佳信源分布P*,信道容量C 。

四、实验环境
Microsoft Windows 7、
Matlab
五、编码程序
文件:
clear;
r=input('输入信源个数:');
s=input('输入信宿个数:');
deta=input('输入信道容量的精度: ');
Q=rand(r,s); %创建m*n随机分布矩阵
A=sum(Q,2);
B=repmat(A,1,s);
disp('信源转移概率矩阵:'),p=Q./B %信源转移概率矩阵i=1:1:r;
q(i)=1/r;
disp('原始信源分布:'),q
c=-10e-8;
C=repmat(q',1,s);
for k=1:1:100000
m=p.*C; %后验概率的分子部分
a=sum(m); %后验概率的分母部分
su1=repmat(a,r,1);
t=m./su1; %后验概率矩阵
D=exp(sum(p.*log(t),2)); %信源分布的分子部分
su2=sum(D); %信源分布的分母部分
q=D/su2; %信源分布
C=repmat(q,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<=
break;
end
end
disp('最大信道容量时的信源分布:q='),disp(q')
disp('最大信道容量:c='),disp(c(k+1))
六、实验结果结果
1)检验:运行
输入信源的个数:2
输入信宿的个数:3
输入信道容量的精度:
信宿转移概率矩阵:p =
原始信源分布:q =
最佳信源分布:q=
最大信道容量:c=
2)计算信源个数为3,信宿个数为5的信道容量:
运行
输入信源的个数:3
输入信宿的个数:5
输入信道容量的精度:
信宿转移概率矩阵:p =
原始信源分布:q =
最佳信源分布:q =
最大信道容量:c =
七、实验总结
通过实验,我们对信道容量的理解更加深刻了。

信道容量是指信道能无错误传送的最大信息率。

信道的输入、输出都取值于离散符号集,且都用一个随机变量来表示的信道就是离散单符号信道。

由于信道中存在干扰,因此输入符号在传输中将会产生错误,这种信道干扰对传输的影响可用传递概率来描述。

为了评价实际信道的利用率,应具体计算已给信道的容量。

这是一个求最大值的问题。

由于互信息对输入符号概率而言是凸函数,其极值将为最大值,因此这也就是求极值的问题。

对于离散信道,P(x)是一组数,满足非负性和归一性等条件,可用拉格朗日乘子法求得条件极值。

对于连续信道,P(x)是一函数,须用变分法求条件极值。

实验过程中,我们虽然也遇到了很多困难,但也正是因为如此,我们才能发现自己基础的薄弱点,学的更有方向。

对于编程方面,我们也有了很大的提升。

相关文档
最新文档