信息论与编码课程设计报告.docx
《信息论与编码课程设计报告.docx》由会员分享,可在线阅读,更多相关《信息论与编码课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
信息论与编码课程设计报告
信息论与编码课程设计报告
设计题目:
统计信源熵与香农编码
专业班级:
电子信息工程1604
学号:
201608000801
学生姓名:
萧翎
指导教师:
成凌飞
教师评分:
目录
一、设计任务与要求3
1、统计信源熵3
2、香农编码3
二、设计思路3
1、统计信源熵3
2、香农编码:
4
三、设计流程图5
1、统计信息熵5
2、香农编码6
四、程序运行及结果7
1、统计信息熵7
2、香农编码8
五、心得体会9
六、参考文献10
附录11
一、设计任务与要求
1、统计信源熵
要求:
统计任意文本文件中各字符(区分大小写)数量,计算字符概率,并计算信源熵。
2、香农编码
要求:
任意输入消息概率,利用香农编码方法进行编码,并计算信源熵和编码效率。
二、设计思路
本次课程设计中主要运用C语言编程以实现任务要求,分析所需要的统计量以及相关变量,依据具体公式和计算步骤编写语句,组成完整C语言程序。
运行环境为VC++6.0。
1、统计信源熵
定义:
信源各个离散消息的自信息量的数学期望为信源的平均信息量,一般称为信源的信息熵,也叫信源熵或香农熵,有时称为无条件熵或熵函数,简称熵,记为H(X)。
计算公式:
。
统计信源熵就是对一篇英文文章,或者是输入一段字符串,通过对其中的a,b,c,d/A,B,C,D.....(区分大小写)和数字符号1,2,3,4…以及各个符号如:
,。
!
等统计符号的个数N和每一个符号的数目n,有这个公式P=n/N可得每个字母的概率,最后又信源熵计算公式
,可计算出信源熵H,所以整体步骤就是先统计出英文段落的总字符数,或者是输入字符串的总个数。
包括字母(区分大小写)、数字、标点等,然后再统计每个字符的个数,即每遇到同一个字符就++1,直到算出每个字符的个数,进而算出每个字符的概率,再由信源熵计算公式计算出信源熵。
2、香农编码:
香农编码主要通过一系列步骤支出平均码长与信源之间的关系,同时使平均码长达到极限值,即选择的每个码字的长度
满足下式:
具体步骤如下:
1.将信源消息符号按其概率从大到小排列
2.确定满足下列不等式的整数码长Ki
3.令P1=0,计算第i个消息的累加概率
4.将累加概率Pi变换成二进制数,取小数点后Ki位为该消息的码字
在香农编码中对于求解编码效率主要是依靠这个公式:
R=H(X)/K,其中
对于求解信源熵主要依靠公式:
三、设计流程图
1、统计信息熵
开始
输入字符
不计入统计
否
输入是否为字符
结束
计算信息熵并输出
计算并输出每
个字符的概率
统计同一字符
出现的次数并输出
是
统计字符数量
2、香农编码
开始
输入X的个数
输入P(x)的概率分布
重新输入
累加概率是否为1
结束
输出
计算信息熵和编码效率
计算码字和码长
把概率重新排序
是
四、程序运行及结果
1、统计信息熵
2、香农编码
五、心得体会
这真是一次有意义的学习旅程。
在设计期间,我和我的团队一直沉浸于探索、探讨之中,各种有意思的想法层出不穷。
我们总是想尽可能的把课程设计做的足够的完美,足够的精彩,可是同时又不得不面临一个又一个的技术难题。
有些经过我们的努力,通过不断地修改不断的翻阅资料得以解决,可是仍有好多的的问题是我们苦思冥想所参索不透的!
真是知识用时方恨少啊!
课程设计很是考察个人能力和团队合作协调能力,在面对自己所不熟悉甚至不了解的问题时,是怎样一步步的设计完成给定的任务,及时有成效的解决面临的问题的。
从整体的分析设计到后面语句变量的敲定最终完成课题是对自己极其有益的锻炼,从中收获的不仅是知识上的,也是学习经验的积累和思维能力的提升,虽然一次课程设计任务不是那么繁重,可是认真去完成其中的一个个细节也是一种难得的体验。
还有就是在此过程中,经常遇到自己不能解决的问题,就会请教其他组员,一起共同讨论,直到解决,这是的我们充分认识到了团队协作的重要性,也体验到了在问题得到解决的时候所独有的那份喜悦。
也体会到了与队友的合作更是一件快乐的事情,只有彼此都付出,彼此都努力维护才能将作品做的更加完美。
在此次课程设计中,我们主要是做了统计信源熵与香农编码这两个题目,初一看题目感觉应该很简单,但真正的去做的时候才发现并不是想象的那么简单,本次课设的困难主要集中在程序的编写上。
我们团队是基于C语言编写的程序。
C语言虽然一直都在用,可每次都感觉非常难。
虽然我们的思路是正确的、明确的,可是由于变量的定义,语法的不规范,以及指针的指向错误等等一系列问题阻碍了我们走向胜利。
不过我们是不会轻易放弃的。
我们起早贪黑,熬夜到半夜一点,翻书翻了好几本。
我认为本次课程设计是成功的,在这学期的课程设计中,在收获知识的同时,还收获了阅历,收获了成熟,在此过程中,我们通过查找大量资料,请教学长,以及不懈的努力,不仅培养了独立思考,在各种其它能力上也都有了提高。
更重要的是,在课程设计上,我们学会了很多学习的方法。
而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践
六、参考文献
[1]曹雪虹,张宗橙.信息论与编码.北京:
清华大学出版社,2009.
[2]杨永国,张冬明.VisualC++6.0实用教程.北京:
清华大学出版社,2007.
[3]贾宗璞,许合利.《C语言程序设计》人民邮电出版社.2014.
附录
1、统计信息熵
#include
#include
#include
#defineN1000
intmain(void)
{
chars[N],M[N];
inti=0,j=0,n=0,L=0;
intlen,num[95]={0};
doubleresult=0,p[95]={0};
FILE*f;
chartemp[N];
charc;
intsum=0;
printf("pleaseinputanessay:
\n");
gets(s);
sum=strlen(s);
printf("%d",sum);
for(i=0;i{
if(s[i]>=''&&s[i]<='~')
num[s[i]-32]++;
}
printf("英文文本文件中各字符数量:
\n");
for(j=0;j<95;j++)
{
M[j]=num[j];
printf("%4c:
%d\t",j+32,M[j]);/*输出格式,%4c在该字符前在空三个空格*/
L++;
if(L==15)/*输出格式,每行十五个字符*/
{
printf("\n");
L=0;
}
}
/*****计算各个字符出现概率****/
printf("\n文本文件中各个字符概率:
\n");
for(i=0;i<95;i++)
{
p[i]=(double)num[i]/sum;
printf("P(%c)=%f\t",i+32,p[i]);
n++;
if(n==5)/*输出格式,每行五个字符概率*/
{
printf("\n");
n=0;
}
}
for(i=0;i<95;i++)/*计算信源熵*/
{
if(p[i]!
=0)
result=result+p[i]*log(p[i])*1.433;/*信源熵,I(x)=-logp(x)*/
}
result=-result;
printf("信源熵为:
%f",result);
printf("\n");
return0;
}
2、香农编码
#include
#include
voidmain()
{
inti,n,j,k;
floatsum=0;
floatb[100]={0};
floatp[100]={0};
floatm,H1=0,H2=0;
floatPi[100]={0};
intL[100];
charc[100][100];
printf("输入X的个数\n");
scanf("%d",&n);
printf("\n");
printf("输入P[i]的概率分布\n");
for(i=0;iscanf("%f",&p[i]);
for(i=0;isum=sum+p[i];
if(fabs(sum-1)>1e-6)
{
sum=0;
printf("错误输入,请重新输入\n");
printf("输入X的个数\n");
scanf("%d",&n);
printf("\n");
printf("输入P[i]的概率分布\n");
for(i=0;iscanf("%f",&p[i]);
for(i=0;i<=n;i++)
sum=sum+p[i];
}
for(j=0;j{
for(i=0;iif(p[i]
{
m=p[i];
p[i]=p[i+1];
p[i+1]=m;
}
}
Pi[0]=0;
for(j=1;j{
Pi[j]=Pi[j-1]+p[j-1];
}
for(i=0;i{
m=log(1/p[i])/log
(2);
b[i]=m;
if(m==(int)m)
L[i]=(int)m;
else
L[i]=(int)(m+1);
}
for(i=0;i{
m=Pi[i];
for(k=0;k{
m=m*2.00;
if(m>=1)
{
m=m-1.00;
c[i][k]='1';
}
else
c[i][k]='0';
}
}
printf("P[i]序列为累加概率pi为-logp(x)为码长L为\t");
printf("码字为\n");
for(i=0;i{
printf("%5.2f\t%5.2f\t\t%5.2f\t\t%d\t",p[i],Pi[i],b[i],L[i]);
for(k=0;kprintf("%c",c[i][k]);
printf("\n");
}
for(i=0;i{
H1=H1-p[i]*log10(p[i])/log10
(2);
H2=H2+p[i]*L[i];
}
printf("信息熵为:
%0.3f\n",H1);
printf("平均码长为:
%0.3f\n",H2);
printf("编码效率为:
%0.3f\n",H1/H2);
}