信息论与编码实验报告Word文档格式.docx

上传人:b****6 文档编号:20435032 上传时间:2023-01-23 格式:DOCX 页数:23 大小:146.48KB
下载 相关 举报
信息论与编码实验报告Word文档格式.docx_第1页
第1页 / 共23页
信息论与编码实验报告Word文档格式.docx_第2页
第2页 / 共23页
信息论与编码实验报告Word文档格式.docx_第3页
第3页 / 共23页
信息论与编码实验报告Word文档格式.docx_第4页
第4页 / 共23页
信息论与编码实验报告Word文档格式.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

信息论与编码实验报告Word文档格式.docx

《信息论与编码实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《信息论与编码实验报告Word文档格式.docx(23页珍藏版)》请在冰豆网上搜索。

信息论与编码实验报告Word文档格式.docx

(1).三进制赫弗曼编码原理:

对于多进制赫夫曼编码,为了提高编码效率,就要是长码的符号数量尽量少、概率尽量小,所以信源符号数量最好满足n=(m-1)*k+r,其中m为进制数,k为缩减的次数。

设计步骤如下:

[1]将信源符号按概率从大到小的顺序排列,令

p(x1)≥p(x2)≥…≥p(xn)

[2]给两个概率最小的信源符号p(xn-1)和p(xn)各分配一个码位“0”和“1”,将这两个信源符号合并成一个新符号,并用这两个最小的概率之和作为新符号的概率,或者在新添加一个信源符号,令其概率为0,则个分配一个码位“0”、“1”和“2”,将其合并,结果得到一个只包含(n-1)个信源符号的新信源。

称为信源的第一次缩减信源,用S1表示。

[3]将缩减信源S1的符号仍按概率从大到小顺序排列,此后每次合并3个信源符号,得到只含(n-3)个符号的缩减信源S2。

[4]重复上述步骤,直至最后,此时所剩符号的概率之和必为1。

然后从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的码字。

(2).编码及注解(见附页2)

(3).例题:

对如下单符号离散无记忆信源编三进制赫夫曼码。

这里:

m=3,n=8

令k=3,m+k(m-1)=9,则s=9-n=9-8=1

所以第一次取m-s=2个符号进行编码。

由计算可得:

平均码长为:

(3.1)

信息率为:

(3.2)

编码效率为:

(3.3)

(4).验证结果截图:

四.实验总结:

用C语言实现二进制赫夫曼编码对信源无失真编码。

由于课本知识点的不太理解,一点都不知道编码的过程,后来通过阅读<

<

信息论与编码>

>

课本、网上查阅资料,最后才对本次设计有了一定的理解,详细理解了赫夫曼的具体编码过程。

经过理解,发现这种编码其实挺简单的,最重要的是怎样用程序把他实现,这对我们的编程能力也是一次考验。

设计要求中要求计算信源熵,这又考察了现代通信原理的知识。

以C++语言实现三进制赫夫曼编码来诠释多进制赫夫曼编码,其实不论是几进制的赫夫曼编码,只要掌握了编码的原理,是非常简单的。

通过这次课程设计,我又重新的将信息论编码与设计的教材翻看了一遍,在网上也搜到了不少相关的知识,知识有提升不少。

在这次课程设计中,最让人难懂的就是C++的编程,让我找了不少相关的书籍,上网查阅了不少的程序,对以前学过的编程又进一步巩固和提高了。

在编程中,要涉及到编制赫夫曼树,平均码长,编码效率,信息率,信源熵。

通过同学,网上查阅资料,终于得到解决,虽然仍有一些问题,但是大体上自己能编程出来,是对自己的考验。

而且由网上得知:

赫夫曼码对信源的统计特性没有特殊要求,编码效率比较高,对编码设备的要求也比较简单,因此综合性能优于香农码和费诺码。

赫夫曼编码在具体实用时,设备较复杂。

在编码器中需要增加缓冲寄存器,因为每个信源符号所对应的码符号长度不一,负责会造成输入和输出不能保持平衡。

对于自己来说,编程能力尚有欠缺,自主编程能力较差,希望以后多加学习,掌握基础语言的编程基础。

附页1:

#include<

stdio.h>

string.h>

math.h>

#defineMAX100

//定义全局变量h存放信息熵

doubleh=0;

//定义结构体用于存放信源符号,数目及概率

typedefstruct{

//不同的字符

charSOURCECODE;

//不同字符出现的次数

intNUM;

//不同字符出现的概率

doublePROBABILITY;

//赫夫曼编码符号

intCode[MAX];

intstart;

//赫夫曼树的父结点

intparent;

//赫夫曼树的左右子结点

intlchild;

intrchild;

//赫夫曼编码的长度

intlengthofhuffmancode;

}Hcode;

HcodeINFORMATION[MAX];

//该函数用来求信源所包含的符号,以及不同符号出现的次数和概率

intPofeachsource(charinformationsource[MAX],inta)

{

inti,j=1,m,flag=0;

chartemp;

//预先存入第一个字符,便于与后面的字符进行比较

//统计不同的字符存入结构体数组中

//利用flag标签来标记每个字符是否出现过,若出现过标记为1,否则置为零

INFORMATION[0].SOURCECODE=informationsource[0];

for(i=1;

i<

a;

i++){

for(m=0;

m<

i;

m++){

flag=0;

if(informationsource[m]==informationsource[i]){

flag=1;

break;

}

}

if(flag==1)

continue;

else

INFORMATION[j++].SOURCECODE=informationsource[i];

}

INFORMATION[j].SOURCECODE='

\0'

;

printf("

信源符号数为:

%d\n"

j);

//统计相同的字符出现的次数

//每做一个字符出现次数的统计都将结构体数组里的NUM置为零

for(i=0;

j;

INFORMATION[i].NUM=0;

m++)

if(informationsource[m]==INFORMATION[i].SOURCECODE)

INFORMATION[i].NUM++;

//统计每个字符出现的概率

i++)

INFORMATION[i].PROBABILITY=(float)INFORMATION[i].NUM/a;

//将每个不同字符出现的次数概率都显示出来

i++)

printf("

TheNUMandPROBABILITYofCode'

%c'

is%dand%.3f\n"

INFORMATION[i].SOURCECODE,INFORMATION[i].NUM,INFORMATION[i].PROBABILITY);

returnj;

}

//求信源符号的熵

voidH(inta){

inti;

i++){

h+=((-1)*(INFORMATION[i].PROBABILITY)*(log(INFORMATION[i].PROBABILITY)/log

(2)));

//赫夫曼编码函数

voidHuffman(inta)

Hcodecd;

inti,j,m=0,lm=0,p,c;

doublemin,lmin;

//顺序初始化每个信源父子结点为-1

{

INFORMATION[i].parent=-1;

INFORMATION[i].lchild=-1;

//循环构造Huffman树

a-1;

//min,lmin中存放两个无父结点且结点权值最小的两个结点

min=lmin=MAX;

//找出所有结点中权值最小、无父结点的两个结点,并合并之为一颗二叉树

for(j=0;

j<

a+i;

j++)

if((INFORMATION[j].PROBABILITY<

min)&

&

(INFORMATION[j].parent==-1))

lmin=min;

lm=m;

min=INFORMATION[j].PROBABILITY;

m=j;

elseif((INFORMATION[j].PROBABILITY<

lmin)&

lmin=INFORMATION[j].PROBABILITY;

lm=j;

//设置找到的两个子结点m、lm的父结点信息

INFORMATION[m].parent=a+i;

INFORMATION[lm].parent=a+i;

INFORMATION[a+i].PROBABILITY=INFORMATION[m].PROBABILITY+INFORMATION[lm].PROBABILITY;

INFORMATION[a+i].parent=-1;

INFORMATION[a+i].lchild=m;

INFORMATION[a+i].rchild=lm;

for(i=0;

cd.start=a-1;

c=i;

p=INFORMATION[c].parent;

while(p!

=-1)/*父结点存在*/

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

cd.Code[cd.start]=1;

else

cd.Code[cd.start]=0;

cd.start--;

/*求编码的低一位*/

c=p;

/*设置下一循环条件*/

//保存求出的每个叶结点的赫夫曼编码和编码的起始位

for(j=cd.start+1;

m;

{INFORMATION[i].Code[j]=cd.Code[j];

INFORMATION[i].start=cd.start;

}

main()

//定义存放信源符号的数组

charinformationsource[MAX];

inti,j,m;

doubleaverageofhuffmancode=0.0,Eita,cV=0.0;

pleaseinputthesourceofinformation:

"

);

scanf("

%c"

&

informationsource[i]);

if(informationsource[i]=='

\n'

break;

informationsource[i]='

信源序列为:

//显示已输入的一串信源符号

puts(informationsource);

//返回不同信源符号的数目

m=Pofeachsource(informationsource,i);

//求信源的符号熵

H(m);

信源的符号熵:

H(X)=%.3f(比特/符号)\n"

h);

Huffman(m);

//输出已保存好的所有存在编码的赫夫曼编码

sHuffmancodeis:

"

INFORMATION[i].SOURCECODE);

for(j=INFORMATION[i].start+1;

%d"

INFORMATION[i].Code[j]);

INFORMATION[i].lengthofhuffmancode=m-INFORMATION[i].start-1;

\n"

//求赫夫曼编码的平均码长和编码效率

averageofhuffmancode+=INFORMATION[i].PROBABILITY*INFORMATION[i].lengthofhuffmancode;

赫夫曼编码的平均码长为:

%lf(码元/信源符号)\n"

averageofhuffmancode);

Eita=h/averageofhuffmancode;

赫夫曼编码的编码效率为:

%lf\n"

Eita);

//求赫弗曼编码的码方差

cV+=INFORMATION[i].PROBABILITY*INFORMATION[i].lengthofhuffmancode*INFORMATION[i].lengthofhuffmancode;

cV-=averageofhuffmancode*averageofhuffmancode;

赫弗曼编码的码方差为:

cV);

附页2

#include<

iostream.h>

stdlib.h>

vector>

//为了使用vector容器

usingnamespacestd;

///vector属于std命名域,因此使用全局命名域方式

structHuffman_InformationSource//信源类型

charInformationSign[10];

//信源符号

doubleProbability;

//概率

charCode[10];

//编码结果

intCodeLength;

//码长

};

structHuffNode//赫夫曼树的节点类型

HuffNode*LeftSubtree,*middleSubtree,*RightSubtree,*Next;

classCHuffman_3//三进制赫夫曼编码

public:

CHuffman_3()//初始化

ISNumber=0;

AvageCodeLength=0.0;

InformationRate=0.0;

CodeEfficiency=0.0;

~CHuffman_3()

DestroyBTree(HuffTree);

voidHuffman_Input();

//输入信息

voidHuffman_Sort();

//排序

voidHuffman_Tree();

//构造赫夫曼树

voidHuffman_Coding();

//生成赫夫曼编码

voidHuffman_CodeAnalyzing();

//结果分析

voidHuffman_Display();

//显示结果信息

voidDestroyBTree(HuffNode*TreePointer);

//释放资源

private:

vector<

Huffman_InformationSource>

ISarray;

//声明ISarray数组,初始时为空

intISNumber;

//符号个数

doubleAvageCodeLength;

//平均码长

doubleInformationRate;

//信息率

doubleCodeEfficiency;

//编码效率

HuffNode*HuffTree;

//赫夫曼树

voidHuffman_Code(HuffNode*TreePointer);

//输入信源信息如果需要添加信源信息在这里修改即可

voidCHuffman_3:

:

Huffman_Input()

Huffman_InformationSourcetemp1={"

A"

0.40,"

0};

ISarray.push_back(temp1);

Huffman_InformationSourcetemp2={"

B"

0.18,"

ISarray.push_back(temp2);

Huffman_InformationSourcetemp3={"

C"

0.10,"

ISarray.push_back(temp3);

Huffman_InformationSourcetemp4={"

D"

ISarray.push_back(temp4);

Huffman_InformationSourcetemp5={"

E"

0.07,"

ISarray.push_back(temp5);

Huffman_InformationSourcetemp6={"

F"

0.06,"

ISarray.push_back(temp6);

Huffman_InformationSourcetemp7={"

G"

0.05,"

ISarray.push_back(temp7);

Huffman_InformationSourcetemp8={"

H"

0.04,"

ISarray.push_back(temp8);

ISNumber=ISarray.size();

//按概率“从大到小”排序:

Huffman_Sort()

Huffman_InformationSourcetemp;

inti,j;

ISNumber-1;

for(j=i+1;

ISNumber;

if(ISarray[i].Probability<

ISarray[j].Probability)

{

temp=ISarray[i];

ISarray[i]=ISarray[j];

ISarray[j]=temp;

//基于ISarray数组构造赫夫曼树

Huffman_Tree()

HuffNode*ptr1,*ptr2,*ptr3,*ptr4,*temp1,*temp2;

//

(1):

基于数组,创建单向链表

ptr1=newHuffNode;

strcpy(ptr1->

InformationSign,ISarray[0].InformationSign);

ptr1->

Probability=ISarray[0].Probability;

Code,ISarray[0].Code);

LeftSubtree=NULL;

middleSubtree=NULL;

RightSubtree=NULL;

Next=NULL;

HuffTree=ptr1;

//赋给数据成员HuffTree

i++)

ptr2=newHuffNode;

strcpy(ptr2->

InformationSign,ISarray[i].InformationSign);

ptr2->

Probability=ISarray[i].Probability;

Code,ISarray[i].Code);

Next=ptr1;

ptr1=ptr2;

//结果:

链表的表头为数组的最小元素。

//使HuffTree指向链表头

//

(2):

基于链表,构造赫夫曼树

intk;

//树的层次

ints;

//需要添加的无用符号的数目。

k=ceil((double)(ISNumber-3)/(3-1));

//“3”:

表示三进制

//ceil函数:

向上取整;

//floor函数:

向下取整

s=3+k*(3-1)-ISNumber;

if(s==1)//第一次取m-s=3-1=2个符号

//合并概率最小的二个节点p

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

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1