信息论与编码课程设计报告统计信源熵与香农编码.doc

上传人:苏美尔 文档编号:6179054 上传时间:2020-09-18 格式:DOC 页数:14 大小:119.50KB
返回 下载 相关 举报
信息论与编码课程设计报告统计信源熵与香农编码.doc_第1页
第1页 / 共14页
信息论与编码课程设计报告统计信源熵与香农编码.doc_第2页
第2页 / 共14页
信息论与编码课程设计报告统计信源熵与香农编码.doc_第3页
第3页 / 共14页
信息论与编码课程设计报告统计信源熵与香农编码.doc_第4页
第4页 / 共14页
信息论与编码课程设计报告统计信源熵与香农编码.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《信息论与编码课程设计报告统计信源熵与香农编码.doc》由会员分享,可在线阅读,更多相关《信息论与编码课程设计报告统计信源熵与香农编码.doc(14页珍藏版)》请在三一文库上搜索。

1、信息论与编码课程设计报告设计题目: 统计信源熵与香农编码 专业班级 电 信 12-06 学 号 学生姓名 指导教师 教师评分 2015年 3 月 30日目 录一、设计任务与要求2二、设计思路2三、设计流程图3四、程序运行及结果4五、心得体会6参考文献7附录:源程序8一、设计任务与要求1.统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。2.香农编码要求:任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。二、设计思路本次课程设计中主要运用C语言编程以实现任务要求,分析所需要的统计量以及相关变量,依据具体公式和计算步骤编写语句,组成完整C程

2、序。1、信源熵定义:信源各个离散消息的自信息量的数学期望为信源的平均信息量,一般称为信源的信息熵,也叫信源熵或香农熵,有时称为无条件熵或熵函数,简称熵,记为H()。计算公式:2、香农编码过程:(1)将信源消息符号按其出现的概率大小依次排列为(2)确定满足下列不等式的整数码长为(3)为了编成唯一可译码,计算第i个消息的累加概率(4)将累计概率变换成二进制数。(5)取二进制数的小数点后位即为该消息符号的二进制码字。3、 设计流程图1、 统计信源熵 开始 读取给定文件 判断文件是否打开 否 并且不为空 是 统计文本字符,直 关闭文件 至文本字符读完。 统计同一字符(不分 大小写)出现的次数 计算字符

3、概率 计算信源熵 输出 结束 2、香农编码 开始 输入概率 计算累加概率 计算码字 计算码长 计算平均码长 计算信源熵 计算编码效率 输出 结束 四、 程序运行及结果1、统计信源熵 2、 香农编码 五、心得体会通过这次课程设计明显的体会到知识匮乏所带来的种种问题,首先是对C语言编程的不熟练,课程知识在与C语言的结合中没有清晰的思路,具体实现程序语言的编写较为困难。在程序的调试中出现的问题无法及时快速的解决,有些错误甚至无法找到合适的解决方法,以至于不断的修改程序,浪费了大量的时间。在设计期间出现的问题还是非常多的,要求熟悉相关软件的操作使用,需要不断的搜集所需的各种资料,及时解决遇到的问题。课

4、程设计很是考察个人能力和团队合作协调能力,在面对自己所不熟悉甚至不了解的问题时,是怎样一步步的设计完成给定的任务,及时有成效的解决面临的问题的。从整体的分析设计到后面语句变量的敲定最终完成课题是对自己极其有益的锻炼,从中收获的不仅是知识上的,也是学习经验的积累和思维能力的提升,虽然一次课程设计任务不是那么繁重,可是认真去完成其中的一个个细节也是一种难得的体验。参考文献1曹雪虹,张宗橙.信息论与编码清华大学出版社.2009.2贾宗璞,许合利.C语言程序设计人民邮电出版社.2010.3盛骤,谢式千,潘承毅.概率论与数理统计M.高等教育出版.1989.附录:源程序1、 统计信源熵#include #

5、include #include /*memcpy所需头文件*/#include #define N 1000/*宏定义N,此处N代表读取文本文件最大字符数为1000*/ int main(void) char sN,MN; int i = 0,j=0,n=0,L=0; int len, num27 = 0; double result=0,p27= 0; FILE *f; char tempN; /*打开文件.txt*/ if(!(f = fopen(D:VC+6.0text518.txt,rb) printf(文件打开失败!n); return 0; while(!feof(f)/*feo

6、f检查文件是否结束。如结束,否则返回0.*/ len=fread(temp,1,1000,f);/*fread返回读取的字符个数。从f锁指定的文件中读取长度为1的1000个数据项,存到temp所指向的内存区。返回所读取的数据个数。*/fclose(f);/*关闭f所指向的文件*/ templen=0;/*将temp数组元素清空(0空字符)*/ memcpy(s,temp,sizeof(temp); /*从temp中拷贝sizeof个字节到目标s中。sizeof返回一个对象或者类型所占的内存字节数*/ /*计算各个字母、空格出现数目*/for(i=0; i=a&si=A&si=Z) numsi-

7、65+; printf(文本文件中各字符(不区分大小写)数量:n);for(j=0; j26; j+) Mj=numj; printf(%4c:%dt,j+65,Mj);/*输出格式,%3c在该字符前在空三个空格*/L+; if(L=5)/*输出格式,每行五个字母*/printf(n);L=0; printf(空格:%dt,num26); /*计算各个字母、空格出现概率*/ printf(n文本文件中各个字符概率:n);for(i=0; i26; i+) pi=(double)numi/strlen(s); printf(%3c:%ft,i+65,pi);n+;if(n=5)/*输出格式,每行

8、五个字母概率*/ printf(n);n=0; p26=(double)num26/strlen(s);printf(空格:%ft,p26);printf(n); /*计算信源熵*/ for(i=0; i27; i+) if (pi!=0) result=result+pi*log(pi)*1.433;/*信源熵,I(x)=-logp(x)*/ result=-result; printf(信源熵为:%f,result); printf(n);return 0; 2、 香农编码#include #include #include #define max_CL 10 /*最大容量的代码的长度*/

9、 #define max_PN 6 /*输入序列的个数*/ typedef float datatype; typedef struct SHNODE datatype pb; /*第i个消息符号出现的概率*/ datatype p_sum; /*第i个消息符号累加概率*/ int kl; /*第i个消息符号对应的码长*/ int codemax_CL; /*第i个消息符号的码字*/ struct SHNODE *next; shnolist; datatype sym_arrymax_PN; /*序列的概率*/ void pb_scan(); /*得到序列概率*/ void pb_sort(

10、); /*序列概率排序*/ void valuelist(shnolist *L); /*计算累加概率码长码字*/ void codedisp(shnolist *L); void pb_scan() int i; datatype sum=0; printf(input %d possible!n,max_PN); for(i=0;i); scanf(%f,&sym_arryi); sum=sum+sym_arryi; /*判断序列的概率之和是否等于1在实现这块模块时scanf()对float数的缺陷故只要满足0.99sum1.0001|sum0.99) printf(sum=%f,sum

11、must (0.999sum1.0001),sum); pb_scan(); /*选择法排序*/ void pb_sort() int i,j,pos; datatype max; for(i=0;imax_PN-1;i+) max=sym_arryi; pos=i; for(j=i+1;jmax) max=sym_arryj; pos=j; sym_arrypos=sym_arryi; sym_arryi=max; void codedisp(shnolist *L) int i,j; shnolist *p; datatype hx=0,KL=0; /*hx存放序列的熵的结果KL存放序列编

12、码后的平均码字的结果*/ p=L-next; printf(numtgailvtsumt-lb(p(ai)tlenthtcoden); printf(n); for(i=0;ipb,p-p_sum,-3.332*log10(p-pb),p-kl); j=0; for(j=0;jkl;j+) printf(%d,p-codej); printf(n); hx=hx-p-pb*3.332*log10(p-pb); /*计算消息序列的熵*/ KL=KL+p-kl*p-pb; /*计算平均码字*/ p=p-next; printf(H(x)=%ftKL=%fnR=%fbit/code,hx,KL,hx

13、/KL); /*计算编码效率*/ shnolist *setnull() shnolist *head; head=(shnolist *)malloc(sizeof(shnolist); head-next=NULL; return(head); shnolist *my_creat(datatype a,int n) shnolist *head,*p,*r; int i; head=setnull(); r=head;/87 for(i=0;ipb=ai; p-next=NULL; r-next=p; r=p; return(head); void valuelist(shnolist

14、*L) shnolist *head,*p; int j=0; int i; datatype temp,s; head=L; p=head-next; temp=0; while(jp_sum=temp; temp=temp+p-pb; p-kl=-3.322*log10(p-pb)+1; /*编码*/ s=p-p_sum; for(i=0;ikl;i+) p-codei=0; for(i=0;ikl;i+) p-codei=2*s; if(2*s=1) s=2*s-1; else if(2*s=0) break; else s=2*s; j+; p=p-next; int main(void) shnolist *head; pb_scan(); pb_sort(); head=my_creat(sym_arry,max_PN); valuelist(head); codedisp(head);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1