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

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

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

设计题目:计算信源熵、哈夫曼编码

专业班级

学号

学生姓名

指导教师

教师评分

年月日

目录

一、课程设计目的 ................................................................................... 错误!未定义书签。

二、课程设计思路、流程及结果........................................................ 错误!未定义书签。

(1) 题目一: (1)

2.1设计思路 (1)

2.2程序流程图 (2)

2.3程序运行及结果 (3)

(2) 题目二: (4)

2.1设计思路 (4)

2.2程序流程图 (5)

2.3程序运行及结果 (6)

三、心得体会 (6)

参考文献 ......................................................................................................................................... 附录:源程序 ................................................................................................................................

一、课程设计目的

进一步让学生深刻理解信源熵的概念以及最佳码哈夫曼编码的原理,信源熵的计算方法以及哈夫曼编码过程。让学生掌握利用程序编程的原理实现信源熵计算和最佳码哈夫曼编码,增加学生的自主动手能力,培养学生的编程能力。

二、课程设计思路、流程及结果

(1)题目一

计算信源熵:

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

2.1设计思路

使用c语言进行程序编写,利用c语言中的文件打开函数fopen()打开记事本文件,再利用fgetc()函数将记事本中的字母读取出来放在一个数组中,同时用一个变量记录读取的字母的个数,最后通过信源熵计算公式进行信源熵计算。

2.2程序流程图

2.3程序运行及结果

(2)题目二

哈夫曼编码:

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

2.1设计思路

利用c语言中的结构体进行程序编写,建立两个结构体,用来存放哈夫曼树的节点和存放哈夫曼码。

设置一个结构数组TreeNode 保存哈夫曼树中各结点的信息。根据二叉树的性质可知,具有n个叶子结点的哈夫曼树共有2n-1 个结点,所以数组TreeNode 的大小设置为2n-1 。TreeNode 结构中有weight, lchild, rchild 和parent 域。其中,weight 域保存结点的权值, lchild 和rchild 分别保存该结点的左、右孩子的结点在数组HuffNode 中的序号,从而建立起结点之间的关系。为了判定一个结点是否已加入到要建立的哈夫曼树中,可通过parent 域的值来确定。初始时parent 的值为-1。当结点加入到树中去时,该结点parent 的值为其父结点在数组HuffNode 中的序号,而不会是-1 了。

求哈夫曼码:

设置一个结构体数组TreeType保存哈夫曼码,TreeType结构中有bit,start。bit 字符数组用来保存哈夫曼码,start用来保存码长。根据哈夫曼树的节点中的parent 找到父节点,根据父节点中的lchild和rchlid给TreeType中的bit赋值0或者1,然后根据parent结构体中的parent找到下一个节点重复上边的步骤,知道parent 的值为-1,表示该概率的码字结束。

2.2程序流程图

N

2.3程序运行及结果

三、心得体会

本次课程设计,我主要担任程序设计任务,在编写程序之前我先看了一下以前学过的c语言程序书,复习一下c语言的基本语法知识。第一个题目的程序设计主要用到了一个fopen函数来打开文本文件,将里边的字符读取出来进行处理。第二个题目编写起来有些难度,参考了网上的一些哈夫曼树建立的一些理论知识和程序,其中在建立树节点联系中比较困难,最后通过两个结构体数组分别保存对方的数组的数组序号建立联系。设计中也遇到了其他的困难,但最终在我和小伙伴的努力下共同克服困难,完成了最终的课程设计,心里还是比较高兴的。

参考文献

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

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

附录

源程序1:

#include

#include

#include

main()

{

FILE *fp; //设置文件指针

char c,filename[30];

int a[26]={0},m,j;

float b[26]={0},sum=0.0;

double H=0;

printf("Enter a file name:");

scanf("%s",filename);

if ((fp=fopen(filename,"r"))==NULL) //文件打开

{

printf("File %s can't open\n",filename);

exit(0);

}

while ((c=fgetc(fp))!=EOF) //顺序读取文件中的字符并将各个字母的统计值放在a中

{

sum++;

if (c>='a'&&c<='z')

{

int i;

m='a';

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

{

if(c==m)

{

a[i]++;

break;

}

else

m++;

}

}

else if (c>='A'&&c<='Z')

{

int i;

m='A';

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

{

if (c==m)

{

a[i]++;

break;

}

else

m++;

}

}

}

for (j=0;j<26;j++) //计算各个字母的概率{

b[j]=a[j]/sum;

}

for (j=0;j<26;j++) //计算信源熵

{

if(b[j]!=0)

H+=-b[j]*log10(b[j])/log10(2);

}

for (j=0;j<26;j++) //输出显示

{

printf(" %c&%c=%-3d ",j+'a',j+'A',a[j]);

printf("P(%c)=%f\n",j+'a',b[j]);

}

printf (" H=%lf\n",H);

fclose(fp);

}

源程序2:

#include

#include

#include

#define kMaxBit 20 //码字的最大长度

#define kMaxLeaf 50 //输入概率的最多个数#define kMaxNode kMaxLeaf*2-1 //节点的最大值

#define kMaxValue 1

typedef struct //码树节点结构体

{

int parent;

float weight;

int lchild;

int rchild;

}TreeNode;

typedef struct //码字结构体

{

char bit[kMaxBit];

int start;

}TreeType;

CreatTree(TreeNode TNode[kMaxNode],int n) //码树构建函数{

int x1,x2,i,j;

float m1,m2;

for(i=0;i<2*n-1;i++) //所有码树节点机构体初始化

{

TNode[i].parent=-1;

TNode[i].weight=0.0;

TNode[i].lchild=-1;

TNode[i].rchild=-1;

}

for(i=0;i

{

printf("请输入第%d个节点的概率:\n",i);

scanf("%f",&TNode[i].weight);

}

for(i=0;i

m1=m2=kMaxValue;

x1=x2=0;

for(j=0;j

{

if(TNode[j].weight

{

m2=m1;

x2=x1;

m1=TNode[j].weight;

x1=j;

}

else if(TNode[j].weight

{

m2=TNode[j].weight;

x2=j;

}

}

TNode[x1].parent=n+i;

TNode[x2].parent=n+i;

TNode[n+i].weight=TNode[x1].weight+TNode[x2].weight;

TNode[n+i].lchild=x1;

TNode[n+i].rchild=x2;

}

}

main()

{

TreeNode TN[kMaxNode];

TreeType Code[kMaxLeaf],cd;

int n,i,j,c,p,cdnum;

float H,K; //设置信源熵

H=K=0;

printf("请输入数据的总量:\n");

scanf("%d",&n);

CreatTree(TN,n);

for(i=0;i

{

cdnum=n-1;

c=i;

p=TN[i].parent;

while(p!=-1)

{

if(TN[p].lchild==c)

cd.bit[cdnum]='1';

else

cd.bit[cdnum]='0';

c=p;

p=TN[p].parent;

cdnum--;

}

for(j=0;j

{

Code[i].bit[j]=cd.bit[cdnum+1+j];

Code[i].start=n-1-cdnum;

}

}

for(i=0;i

{

printf("%f ",TN[i].weight);

if(TN[i].weight!=0)

H+=(-(TN[i].weight)*log10(TN[i].weight))/log10(2);

K+=(TN[i].weight)*Code[i].start;

for(j=0;j

printf("%c",Code[i].bit[j]);

printf("\n");

}

printf("信源熵H=%f\n",H);

printf("平均码长K=%f\n",K);

printf("编码效率R=%f\n",H/K);

}

信息论与编码课程报告

Turbo码编码与译码方法 一、前言: Turbo码自1993年被提出以来,就以其优异的纠错性能而备受关注,并被主要通信标准所采纳。Turbo码是用短码构造等效意义的长码,以达到长码 的纠错性能而减少解码复杂度。在强噪声低洗澡比的条件下,如E b/N0=0.7dB, 采用编码效率R=1/2的Turbo码,经过18次迭代解码后,仍然具有极低的误 码率。Turbo码得这一特性对于强噪声环境下数字通信与数字信号传输具有重 要的应用价值。Turbo码的发现,标志着信道编码理论与技术的研究进入了一 个崭新的阶段,对现代编码理论的发展起着重要的作用。 二、Turbo码的编码原理: Turbo码编码器由两个递归系统卷积吗编码器(RSC1和RSC2)通过一个交织器并行级联而成,编码后经过删除或复用,产生不同码率的码字,进入传输 信道。Turbo码编码器结构框图如图1所示,信息序列d={d1,d2,…d N}经过N 位交织器,形成一个新序列 d‘={d1’,d2’,…,d N’}(长度与内容没变,但比特位置经过重新排列)。d和d‘分 别传送到两个分量码编码器(RSC1和RSC2)。一般情况下,这两个分量码编 码器结构相同,生成序列X1p和X2p。为了提高误码率,序列X1p和X2p需要经过 删除器,采用删除技术从这两个校验序列中周期地删除一些校验位,形成校验 位序列X P与编码序列u(为方便表述,也用X S表示)经过复用,生成Turbo 码序列。例如,假如图中两个分量编码器的码率均是1/2,为了得到1/2码率 的Turbo码,可以采用这样的删除矩阵:P=[10,01],即删除来自RSC1的校验 序列X1p的偶数位置比特,与来自RSC2的校验序列X2p的奇数位置比特。 S X 图1 交织器在Turbo码中起关键作用。表面上看,它仅仅是将信息序列中的N个比特的位置进行随机置换,实际上,它很大程度上影响了Turbo码的性能。通过随机交织,使得编码序列在长为2N和3N(不使用删除)比特的范围内具有记忆性,从而有简单的短码得到近似长码。当交织器充分大时,Turbo码就具有近似于随机长码的特性。 三、Turbo码的译码原理:

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

目录 一:实验原理----------------------------1 二:程序源代码--------------------------1 三:实验分析-----------------------------6 四:实验结论---------------------------7

赫夫曼编码 一:实验原理 哈夫曼编码的具体步骤归纳如下: ① 概率统计(如对一幅图像,或m幅同种类型图像作灰度信号统计),得到n个不同概率的信息符号。 ② 将n个信源信息符号的n个概率,按概率大小排序。 ③ 将n个概率中,最后两个小概率相加,这时概率个数减为n-1个。 ④ 将n-1个概率,按大小重新排序。 ⑤ 重复③,将新排序后的最后两个小概率再相加,相加和与其余概率再排序。 ⑥ 如此反复重复n-2次,得到只剩两个概率序列。 ⑦ 以二进制码元赋值,构成哈夫曼码字。编码结束。 哈夫曼码字长度和信息符号出现概率大小次序正好相反,即大 概信息符号分配码字长度短,小概率信息符号分配码字长度长。 C、哈夫曼编码的特点 (1)哈夫曼编码的构造顺序明确,但码不是唯一的(因以大赋1还是小的赋1而异;

(2)哈夫曼编码的字长参差不齐,硬件实现不方便; (3)只有在概率分布很不均匀时,哈夫曼编码才有显著的效果,而在信源分布均匀时,一般不使用哈夫曼编码。 二:程序源代码: #define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE 59 #define MAXBIT 10 #define LENTH 30 #include "" #include typedef struct{ float gailv; int flag; int parent; int lchild; int rchild; char ch; int t; }HNodeType; typedef struct{ int bit[MAXBIT]; int start; }HCodeType; typedef struct{ float gailv; char letter; }mytype; /*it's the type of data save in file*/ typedef struct filehuff{ int count; mytype mydata[MAXLEAF]; filehuff(){count=0; }; }; filehuff filedata; char code[MAXVALUE]; HNodeType HuffNode[MAXNODE]; void savetofile() { FILE *fp;

网页制作课程设计报告

网页制作课程设计报告 学院: 专业班级: 姓名: 学号: 成绩: 阅卷教师:

目录 1.设计目的 (1) 2.设计思想 (1) 2.1网站整体结构规划思想 (1) 2.2 主页设计思想 (1) 2.3子页的设计思想 (1) 3网页详细设计分析 (1) 4结论 (2)

1.设计目的 阐述该个人网站的设计意图和创意,简单介绍自己的个人网站。 2.设计思想 阐述网站的整体设计思想,包括: 2.1网站整体结构规划思想 要求阐述网站整体结构的选择、设计的思想,绘制网站结构草图。 2.2 主页设计思想 要求对主页的布局思路进行阐述和分析。 2.3子页的设计思想 要求对子页的设计以及网页对象的选取思路进行阐述和分析。 3网页详细设计分析 要求选取一张网页,对网页的设计实现过程进行阐述和分析,详细说明制作该网页的步骤,所使用的网页对象以及该网页对象的操作方法。

4结论 对整个设计报告做归纳性总结,并分析设计过程中的困难及如何解决的,最后提出展望。 一、设计目的 本课程的设计目的是通过实践使同学们经历Dreamweaver cs3开发的全过程和受到一次综合训练,以便能较全面地理解、掌握和综合运用所学的知识。结合具体的开发案例,理解并初步掌握运用Dreamweaver cs3可视化开发工具进行网页开发的方法;了解网页设计制作过程。通过设计达到掌握网页设计、制作的技巧。了解和熟悉网页设计的基础知识和实现技巧。根据题目的要求,给出网页设计方案,可以按要求,利用合适图文素材设计制作符合要求的网页设计作品。熟练掌握Photoshop cs3、Dreamweaver cs3等软件的的操作和应用。增强动手实践能力,进一步加强自身综合素

信息论与编码实验报告.

本科生实验报告 实验课程信息论与编码 学院名称信息科学与技术学院 专业名称通信工程 学生姓名 学生学号 指导教师谢振东 实验地点6C601 实验成绩 二〇一五年十一月二〇一五年十一月

实验一:香农(Shannon )编码 一、实验目的 掌握通过计算机实现香农编码的方法。 二、实验要求 对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。 三、实验基本原理 给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、将信源消息符号按其出现的概率大小排列 )()()(21n x p x p x p ≥≥≥ 2、确定满足下列不等式的整数码长K i ; 1)(l o g )(l o g 22+-<≤-i i i x p K x p 3、为了编成唯一可译码,计算第i 个消息的累加概率 ∑ -== 1 1 )(i k k i x p p 4、将累加概率P i 变换成二进制数。 5、取P i 二进制数的小数点后K i 位即为该消息符号的二进制码。 四、源程序: #include #include #include #include #include using namespace std; int main() { int N; cout<<"请输入信源符号个数:";cin>>N; cout<<"请输入各符号的概率:"<

int i,j; for(i=0;i

信息论与编码课程设计..

吉林建筑大学 电气与电子信息工程学院信息理论与编码课程设计报告 设计题目:哈夫曼编码的分析与实现专业班级:电子信息工程101 学生姓名: 学号: 指导教师:吕卅王超 设计时间:2013.11.18-2013.11.29

一、设计的作用、目的 《信息论与编码》是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充。其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能,提高实践技能,培养独立分析问题、解决问题及实际应用的能力。 通过完成具体编码算法的程序设计和调试工作,提高编程能力,深刻理解信源编码、信道编译码的基本思想和目的,掌握编码的基本原理与编码过程,增强逻辑思维能力,培养和提高自学能力以及综合运用所学理论知识去分析解决实际问题的能力,逐步熟悉开展科学实践的程序和方法 二、设计任务及要求 通过课程设计各环节的实践,应使学生达到如下要求: 1. 理解无失真信源编码的理论基础,掌握无失真信源编码的基本方法; 2. 掌握哈夫曼编码/费诺编码方法的基本步骤及优缺点; 3. 深刻理解信道编码的基本思想与目的,理解线性分组码的基本原理与编码过程; 4. 能够使用MATLAB 或其他语言进行编程,编写的函数要有通用性。 三、设计内容 一个有8个符号的信源X ,各个符号出现的概率为: 编码方法:先将信源符号按其出现的概率大小依次排列,并取概率最小的字母分别配以0和1两个码元(先0后1或者先1后0,以后赋值固定),再将这两个概率相加作为一个新字母的概率,与未分配的二进制符号的字母重新排队。并不断重复这一过程,直到最后两个符号配以0和1为止。最后从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即为对应的码字。 哈夫曼编码方式得到的码并非唯一的。在对信源缩减时,两个概率最小的符号合并后的概率与其他信源符号的概率相同时,这两者在缩减中的排序将会导致不同码字,但不同的排序将会影响码字的长度,一般讲合并的概率放在上面, 12345678,,,,, ()0.40.180.10.10.070.060.050.04X x x x x x x x x P X ????=????????

WEB个人主页课程设计

Web应用开发技术 实验报告 专业:计算机科学与技术 班级: 学号: 姓名:

一、设计题目 个人网站 二、目的 1、本次设计是学生在学完ASP动态网站开发课程后的一次实践性很强的课程设计,是对ASP进行动态网站开发所学知识的综合运用。 2、掌握使用ASP技术进行网站开发设计。 3、通过本次实习,使学生加深所学知识内容的理解,并能积极地调动学生的学习兴趣,结合实际应用操作环境,真正做到理论与实际相结合。 三、功能需求描述 此网站可以对主人留言,来发表自己的心情,也可以把自己的联系方式写入其中,达到和睦相处、心灵的驿站的目的等。 四、总体设计

五、详细设计 (一)、我的主页 此页面为网站的主页,通过发布新心情,点击通讯录可以查看通讯录好友信息,点击留言板可以查看好友留言。 主要代码: 个人空间