香农编码--信息论大作业.docx

上传人:scccc 文档编号:14629094 上传时间:2022-02-10 格式:DOCX 页数:7 大小:111.39KB
返回 下载 相关 举报
香农编码--信息论大作业.docx_第1页
第1页 / 共7页
香农编码--信息论大作业.docx_第2页
第2页 / 共7页
香农编码--信息论大作业.docx_第3页
第3页 / 共7页
香农编码--信息论大作业.docx_第4页
第4页 / 共7页
香农编码--信息论大作业.docx_第5页
第5页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《香农编码--信息论大作业.docx》由会员分享,可在线阅读,更多相关《香农编码--信息论大作业.docx(7页珍藏版)》请在三一文库上搜索。

1、信息论与编码课程大作业香农编码*题 目:学生姓名:学 号:专业班级:*&*2013年5 月10 日香农编码1 .香农编码的原理/步骤香农第一定理指出了平均码长与信源之间的关系,同时也指出了可以通过编码使 平均码长达到极限值,这是一个很重要的极限定理。如何构造这种码香农第一定理指出, 选择每个码字的长度 K将满足式I(x i)&KIp(x i)+1就可以得到这种码。这种编码方 法就是香农编码。香农编码步骤如下:(1)将信源消息符按从大到小的顺序排列。计算pi累加概率;(3)确定满足自身要求的整数码长;(4)将累加概率变为二进制数;(5)取Pi二进制数的小数点后Ki位即为该消息符号的二进制码字。2

2、 .用C语言实现#include #include #include #define max_CL 10 /*maxsize of length of code*/#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;shnolis

3、t;datatype sym_arrymax_PN; /* 序列的概率 */void pb_scan(); /*得到序列概率*/void pb_sort(); /*序列概率排序*/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

4、, 在实现这块模块时, scanf() 对 float 数的缺陷, 故只要满足|sum printf(sum=%f,sum must (sum,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;dataty

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

6、/code,hx,KL,hx/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;for(i=0;ipb=ai;p-next=NULL;r-next=p;r=p;return(head);void valuelist(shnolist *L)s

7、hnolist *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=*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_s

8、ort();head=my_creat(sym_arry,max_PN);valuelist(head);codedisp(head);3 .运行结果及分析input 6 possible?0.12 0,23 0.15 6.17 S.13 0.2codenurngallusumlb(p(ai.) lenth2.1267233080al用.2392.3289683001!0-1700.4302.5641443811a3团2,7-152643im0.1300,7502.?52341311。0.1203.弼841110Hx5-2-554619KL3.1200081R=0.8187B8bit/codePress any key tocontinue本程序先定义了码字长度的最大值和信源概率的个数,然后有设定了概率的和的 范围。除此之外,程序采用多个函数求出每个概率的自信息量,采用结构化编程的思想 将问题细分成多个模块,再利用数学方法求得累加概率对应的码字长度,在此基础上,利用循环函数求得对应的码字长度。这样就得到了所需的结果。再利用循环依次表达出来即可。4 . 心得体会通过这次大作业,我觉得自己对 C该好好学习了,还有一些基本知识,导致编写程序出现困难。编码的原理虽然知道,但是操作出现困难。对信息论的认识也得到加强和巩固。

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

当前位置:首页 > 社会民生


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