当前位置:文档之家› 河南理工大学信息论与编码论文

河南理工大学信息论与编码论文

信息论与编码课程设计报告设计题目:统计信源熵与费诺编码专业班级电信 11学号学生姓名指导教师教师评分2014年 3月24日目录一、设计任务与要求 (2)二、设计思路 (3)三、设计流程图 (4)四、程序运行及结果 (5)五、心得体会 (7)参考文献 (7)附录:源程序 (8)一、设计任务与要求要求完成两个题目,1和2选做一题,3、4和5选做一题。

1、统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。

2、判断唯一可译码要求:利用尾随后缀法判断任意输入的码是否为唯一可译码。

3、香农编码要求:任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。

4、费诺编码要求:任意输入消息概率,利用费诺编码方法进行编码,并计算信源熵和编码效率。

5、哈夫曼编码要求:任意输入消息概率,利用哈夫曼编码方法进行编码,并计算信源熵和编码效率。

二、设计思路此设计是将统计信源熵与费诺编码结合在一起。

程序中采用模块化思想将实现某个功能的程序独立成一个模块,然后在主程序中加以调用。

H(X)表示信源输出后,每个消息(或符号)所提供的平均信息量。

统计信源熵模块是程序从键盘中读取用户输入的字母(不区分大小写)或空格,并分别统计出总数N和每个字母、空格出现的次数n以及概率P(x i),然后由公式可计算出信源熵。

费诺编码:1、将信源发出的N个消息符号按其概率的递减次序依次排列。

2、将依次排列的信源符号依概率分成两组,使两个组的概率和近于相同,并对各组赋予一个二进制代码符号“0”和“1”(编m进制码就分成m组)。

3、将每一个大组的信源符号进一步再分成两组,使划分后的两个组的概率和近于相同,并又分别赋予两组一个二进制符号“0”和“1”4、如此重复,直至每组值只剩下一个信源符号为止5、信源符号所对应的码符号序列即为费诺码三、设计流程图四、程序运行及结果五、心得体会这次的课程设计,我们复习信源熵的求法和费诺编码方法。

这次课程设计,我们对费诺编码有了一个更全面的认识。

这次我们选用的样本很简单,我在编程上还不能顺利写出,到后来程序还是同组同学写的,我认识到自己在编程上的不足。

学习本就是一个从不会到会的过程,这次考完二级C,一定要好好练习编程,各种课程设计,各种功能实现都是需要编程,编程是这么重要,只学些理论知识是不行的,必须学以致用能做出东西来才行,这次还好同学之间的合作,我们才顺利完成课程设计。

理论是为实践服务的,学好理论才能去接触实践,因为学时所限制,我们在课堂上学习的东西仅仅是皮毛。

信息论与编码,需要大量地概率论与数理统计的只是作为依托,所以数学是基础。

任何一门课程都不会独立与其他课程之外。

当然还有重要的C编程,一定要会的!作为一个工科的学生一定要把所学用于实践,相信我下次能做的更好。

参考文献[1]曹雪虹,张宗橙.《信息论与编码》北京.清华大学出版社.2009.2[2]Stanley B.Lippman,Josee Lajoie,Barbara E.Moo著,李师贤,蒋爱军,梅晓勇,林瑛译.《C++ Primer中文版》.北京.人民邮电出版社.2006.3附录:源程序/*统计字符个数与计算信源熵*/#include <stdio.h>#include <stdlib.h>#include<math.h>/*计数程序*/int strcount(char str[],int count[]){int i;for (i=0;str[i]!='\0';i++){count[str[i]-' ']++;}return i;}/*主程序*/int main(){ int i,j=0,count[91]={0};float s=0;float z;/*int h=1,t=N; float temp;*/FILE *fp,*fp1;char str[1000];if((fp=fopen("3.txt","r"))==NULL)printf("no file found!");fgets(str,1000,fp);z=strcount(str,count);printf("字符总数z=:%f\n",z); fp1 = fopen("1.txt", "w");for(i=0;i<91;i++)if(count[i]!=0){printf("字符%c出现的次数为:%d\n",' '+i,count[i]);s=s+(-3.322*(count[i]/z)*log10(count[i]/z));printf("字符%c出现的概率为%f\n",' '+i,count[i]/z);fprintf(fp1, "%f\n", count[i]/z);j++;}printf("共有%d种字符\n",j);printf("文本信源熵s为:%f\n",s);}/*菲诺编码源程序*/#include<stdio.h>#include<math.h>#include<stdlib.h>#define N 24struct event {int n;double x;int code[N];int low; };FILE *fp1,*fp2;struct event A[N+1];void inputcode(struct event *a,int b)/*input code*/ { a->code[a->low]=b;(a->low)++; }void outcode(struct event a)/*output code*/{ int i;for(i=0;i<a.low;i++)fprintf(fp2,"%d",a.code[i]); }double getsum(int h,int t,struct event a[])/*get sum*/ { int i=h;double sum=0.0;for(i=h;i<=t;i++){ sum=sum+a[i].x;}return sum;}int getbreakpoint(struct event a[],int h,int t)/*all right*/{ int n,t1;double f[N+1],temp=0.0;for(n=h;n<t;n++){ f[n]=fabs(getsum(h,n,a)-getsum(n+1,t,a));}temp=f[h];t1=h;for(n=h;n<t;n++){if(f[n]<temp){ temp=f[n];t1=n; }}return t1;}void group(int h,int t,struct event a[]){ int i,breakpoint,zero=0,one=1;if(t==h+1){inputcode(&a[h],zero);inputcode(&a[t],one);}elseif(t==h)else{breakpoint=getbreakpoint(a,h,t); for(i=h;i<=breakpoint;i++){inputcode(&a[i],zero);}for(i=breakpoint+1;i<=t;i++){ inputcode(&a[i],one); }group(h,breakpoint,a);group(breakpoint+1,t,a);} }void sort(struct event a[]){ int i,j;struct event t;for(i=1;i<N;i++)for(j=1;j<N-i+1;j++)if(a[j].x<a[j+1].x){ t=a[j]; a[j]=a[j+1]; a[j+1]=t; }}void main(){int j; int h=1,t=N; float temp; /*input data*/if((fp1=fopen("1.txt","rb"))==NULL){ printf("不能打开文件!\n"); exit(1); }if((fp2=fopen("2.txt","a"))==NULL){ printf("不能打开文件!\n");exit(1); }for(j=1;j<=N;j++){ fscanf(fp1,"%f",&temp);A[j].x=temp; } /*initialize*/sort(A);for(j=1;j<=N;j++){ A[j].n=j; A[j].low=0; }group(h,t,A); /*Out put result*/for(j=1;j<=N;j++){ fprintf(fp2,"%.4f:",A[j].x);outcode(A[j]);fprintf(fp2,"\n");}fclose(fp1); fclose(fp2); printf("费诺编码成功!\n"); }。

相关主题