文档详情

河南理工大学信息论及编码课设.ppt

发布:2018-12-15约2.62千字共24页下载文档
文本预览下载声明
信息论与编码 课程设计 * * 小组成员: 课程设计内容基本情况介绍: 任务一:统计信源熵 要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率,并计算信源熵。 * * * * 任务二:费诺编码 要求:任意输入消息概率,利用上述编码方法进行编码,并计算信源熵和编码效率。 * * 离散信源熵 离散信源熵的计算方法: H(x)= * * 统计信源熵基于vc6.0平台的分析: 主体部分:完成对文本中字符个数的统计。 思路分析:设计出一个程序段。使其能够对阿斯卡马表中所有的字符可以进行统计,并且分别输出。 注:由于英文文段中只是出现小写a~z,大写A~Z,空格(space),逗号句号,叹号等字符。所以只需使用阿斯卡马表中第三十二个(space)到第122(z)个,总共91个字符。这将在程序中有所显示。 * * /*计数程序*/ int strcount(char str[],int count[]) { int i; for (i=0;str[i]!=\0;i++) {count[str[i]- ]++;}return i; } * * /*主程序*/ int main() { int i,/*k=0,*/count[91]={0};float s=0;float z;/*int h=1,t=N; float temp;*/ int j; int h=1; float temp; FILE *fp,*fp1; char str[100]; if((fp=fopen(3.txt,r))==NULL) printf(no file found!); fgets(str,100,fp); z=strcount(str,count);printf(字符总数z=:%f\n,z); * * fp1 = fopen(1.txt, w); for(i=0;i91;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);k++; } printf(共有%d种字符\n,k);/*此处对下一个费诺编码程序不可缺少*/ printf(文本信源熵s为:%f\n,s); * * 费诺编码基于vc6.0平台的分析: 分析:由于费诺编码涉及到各个字符变量及其出现的概率、费诺编码的结果。所以,可以采用结构体变量进行编程处理。 * * 思路:首先,将信源符号以概率递减的次序排列进来,将排列好的信源符号划分为两大组,使第组的概率和近于相同,并各赋于一个二元码符号”0”和”1”.然后,将每一大组的信源符号再分成两组,使同一组的两个小组的概率和近于相同,并又分别赋予一个二元码符号。依次下去,直至每一个小组只剩下一个信源符号为止。这样,信源符号所对应的码符号序列则为编得的码字即为所要求的编码。 * * #includestdio.h /*费诺编码源程序*/ #includemath.h #includestdlib.h #define N 27 struct 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)/*输入概率*/ { a-code[a-low]=b; (a-low)++; } void outcode(struct event a)/*输出编码*/ { int i; for(i=0;ia.low;i++) fprintf(fp2,%d,a.code[i]); } * * double getsum(int h,int t,struct event a[])/*求和比较并分组*/ { 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*/ {
显示全部
相似文档