计算信源熵和香农编码C语言,Word版可编辑-信息论与编码课程设计报告统计信源熵与香农编码精心整理.doc...

本文详细介绍了如何使用C语言实现信息论中的统计信源熵计算与香农编码,包括文件字符统计、概率计算、信源熵公式应用及香农编码过程。通过实际操作,展示了课程设计中可能遇到的问题与解决策略,强调了编程实践与理论知识的结合

44cb7578e1df5412b94317daaa3307ba.gifWord版可编辑-信息论与编码课程设计报告统计信源熵与香农编码精心整理.doc

下载提示(请认真阅读)1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。

2.下载的文档,不会出现我们的网址水印。

3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。

文档包含非法信息?点此举报后获取现金奖励!

下载文档到电脑,查找使用更方便

10

积分

还剩页未读,继续阅读

关 键 词:Word

编辑

信息论

编码

课程设计

报告

统计

信源

香农

精心

整理

资源描述:

河南理工大学课程设计报告

信息论与编码课程设计报告

设计题目: 统计信源熵与香农编码

专业班级 电 信 12-06

学 号

学生姓名

指导教师

教师评分

2015年 3 月 30日

目 录

一、设计任务与要求2

二、设计思路2

三、设计流程图3

四、程序运行及结果4

五、心得体会6

参考文献7

附录:源程序8

- 12 -

一、设计任务与要求

1.统计信源熵

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

2.香农编码

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

二、设计思路

本次课程设计中主要运用C语言编程以实现任务要求,分析所需要的统计量以及相关变量,依据具体公式和计算步骤编写语句,组成完整C程序。

1、信源熵

定义:信源各个离散消息的自信息量的数学期望为信源的平均信息量,一般称为信源的信息熵,也叫信源熵或香农熵,有时称为无条件熵或熵函数,简称熵,记为H()。

计算公式:

2、香农编码过程:

(1)将信源消息符号按其出现的概率大小依次排列为

(2)确定满足下列不等式的整数码长为

(3)为了编成唯一可译码,计算第i个消息的累加概率

(4)将累计概率变换成二进制数。

(5)取二进制数的小数点后位即为该消息符号的二进制码字。

3、 设计流程图

1、 统计信源熵

开始

读取给定文件

判断文件是否打开 否

并且不为空

统计文本字符,直 关闭文件

至文本字符读完。

统计同一字符(不分

大小写)出现的次数

计算字符概率

计算信源熵

输出

结束

2、香农编码

开始

输入概率

计算累加概率

计算码字

计算码长

计算平均码长

计算信源熵

计算编码效率

输出

结束

四、 程序运行及结果

1、统计信源熵

2、 香农编码

五、心得体会

通过这次课程设计明显的体会到知识匮乏所带来的种种问题,首先是对C语言编程的不熟练,课程知识在与C语言的结合中没有清晰的思路,具体实现程序语言的编写较为困难。在程序的调试中出现的问题无法及时快速的解决,有些错误甚至无法找到合适的解决方法,以至于不断的修改程序,浪费了大量的时间。

在设计期间出现的问题还是非常多的,要求熟悉相关软件的操作使用,需要不断的搜集所需的各种资料,及时解决遇到的问题。课程设计很是考察个人能力和团队合作协调能力,在面对自己所不熟悉甚至不了解的问题时,是怎样一步步的设计完成给定的任务,及时有成效的解决面临的问题的。从整体的分析设计到后面语句变量的敲定最终完成课题是对自己极其有益的锻炼,从中收获的不仅是知识上的,也是学习经验的积累和思维能力的提升,虽然一次课程设计任务不是那么繁重,可是认真去完成其中的一个个细节也是一种难得的体验。

参考文献

[1]曹雪虹,张宗橙.《信息论与编码》清华大学出版社.2009.

[2]贾宗璞,许合利.《C语言程序设计》人民邮电出版社.2010.

[3]盛骤,谢式千,潘承毅.《概率论与数理统计》[M].高等教育出版.1989.

附录:源程序

1、 统计信源熵

#include #include #include /*memcpy所需头文件*/

#include #define N 1000/*宏定义N,此处N代表读取文本文件最大字符数为1000*/

int main(void)

{

char s[N],M[N];

int i = 0,j=0,n=0,L=0;

int len, num[27] = {0};

double result=0,p[27]= {0};

FILE *f;

char temp[N];

/********打开文件.txt*******/

if(!(f = fopen("D:\\VC++6.0\\text518.txt","rb")))

{ printf("文件打开失败!\n");

return 0;

}

while(!feof(f))/*feof检查文件是否结束。如结束,否则返回0.*/

{

len=fread(temp,1,1000,f);/*fread返回读取的字符个数。从f锁指定的文件中读取长度为1的1000个数据项,存到temp所指向的内存区。返回所读取的数据个数。*/

}

fclose(f);/*关闭f所指向的文件*/

temp[len]=\0;/*将temp数组元素清空(\0空字符)*/

memcpy(s,temp,sizeof(temp)); /*从temp中拷贝sizeof个字节到目标s中。sizeof返回一个对象或者类型所占的内存字节数*/

/*****计算各个字母、空格出现数目*****/

for(i=0; i=a&&s[i]<=z)

num[s[i]-97]++;

else

if(s[i]>=A&&s[i]<=Z)

num[s[i]-65]++;

}

printf("文本文件中各字符(不区分大小写)数量:\n");

for(j=0; j<26; j++)

{

M[j]=num[j];

printf("%4c:%d\t",j+65,M[j]);/*输出格式,%3c在该字符前在空三个空格*/

L++;

if(L==5)/*输出格式,每行五个字母*/

{

printf("\n");

L=0;

}

}

printf("空格:%d\t",num[26]);

/*****计算各个字母、空格出现概率****/

printf("\n文本文件中各个字符概率:\n");

for(i=0; i<26; i++)

{

p[i]=(double)num[i]/strlen(s); printf("%3c:%f\t",i+65,p[i]);

n++;

if(n==5)/*输出格式,每行五个字母概率*/

{

printf("\n");

n=0;

}

}

p[26]=(double)num[26]/strlen(s);

printf("空格:%f\t",p[26]);

printf("\n");

/**********计算信源熵**********/

for(i=0; i<27; 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");

return 0;

}

2、 香农编码

#include #include #include #define max_CL 10 /*最大容量的代码的长度*/

#define max_PN 6 /*输入序列的个数*/

typedef float datatype;

typedef struct SHNODE {

datatype pb; /*第i个消息符号出现的概率*/

datatype p_sum; /*第i个消息符号累加概率*/

int kl; /*第i个消息符号对应的码长*/

int code[max_CL]; /*第i个消息符号的码字*/

struct SHNODE *next;

}shnolist;

datatype sym_arry[max_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_arry[i]);

sum=sum+sym_arry[i];

}

/*判断序列的概率之和是否等于1在实现这块模块时scanf()对float数的缺陷故只要满

足0.991.0001||sum<0.99)

{ printf("sum=%f,sum must (<0.999max)

{

max=sym_arry[j];

pos=j;

}

sym_arry[pos]=sym_arry[i];

sym_arry[i]=max;

}

}

void codedisp(shnolist *L)

{

int i,j;

shnolist *p;

datatype hx=0,KL=0; /*hx存放序列的熵的结果KL存放序列编码后的平均码字的

结果*/

p=L->next;

printf("num\tgailv\tsum\t-lb(p(ai))\tlenth\tcode\n");

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->code[j]);

printf("\n");

hx=hx-p->pb*3.332*log10(p->pb); /*计算消息序列的熵*/

KL=KL+p->kl*p->pb; /*计算平均码字*/

p=p->next;

}

printf("H(x)=%f\tKL=%f\nR=%fbit/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;//87

for(i=0;ipb=a[i];

p->next=NULL;

r->next=p;

r=p;

}

return(head);

}

void valuelist(shnolist *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->code[i]=0;

for(i=0;ikl;i++)

{

p->code[i]=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);

}

展开阅读全文

温馨提示:

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。

2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。

3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。

4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。

5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。

6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。

7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

bb6249c6567dd4384e6ab3556cfc22ed.gif 

人人文库网所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。

关于本文

本文标题:Word版可编辑-信息论与编码课程设计报告统计信源熵与香农编码精心整理.doc

链接地址:https://www.renrendoc.com/p-34969447.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值