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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录

一:实验原理----------------------------1

二:程序源代码--------------------------1

三:实验分析-----------------------------6

四:实验结论---------------------------7

赫夫曼编码

一:实验原理

哈夫曼编码的具体步骤归纳如下:

①概率统计(如对一幅图像,或m幅同种类型图像作灰度信号统计),得到n个不同概率的信息符号。

②将n个信源信息符号的n个概率,按概率大小排序。

③将n个概率中,最后两个小概率相加,这时概率个数减为n-1个。

④将n-1个概率,按大小重新排序。

⑤重复③,将新排序后的最后两个小概率再相加,相加和与其余概率再排序。

⑥如此反复重复n-2次,得到只剩两个概率序列。

⑦以二进制码元(0.1)赋值,构成哈夫曼码字。编码结束。

哈夫曼码字长度和信息符号出现概率大小次序正好相反,即大概信息符号分配码字长度短,小概率信息符号分配码字长度长。

C、哈夫曼编码的特点

(1)哈夫曼编码的构造顺序明确,但码不是唯一的(因以大赋1还是小的赋1而异;

(2)哈夫曼编码的字长参差不齐,硬件实现不方便;

(3)只有在概率分布很不均匀时,哈夫曼编码才有显著的效果,而在信源分布均匀时,一般不使用哈夫曼编码。

二:程序源代码:

#define MAXV ALUE 10000

#define MAXLEAF 30

#define MAXNODE 59

#define MAXBIT 10

#define LENTH 30

#include "stdio.h"

#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[MAXV ALUE];

HNodeType HuffNode[MAXNODE];

void savetofile()

{

FILE *fp;

if((fp=fopen("datafile.txt","wb"))==NULL)

{

printf("打开失败....");

return;

}

if(fwrite(&filedata,sizeof(filedata),1,fp)!=1)

printf("写入文件失败....");

fclose(fp);

}

void openfile()

{ FILE *fp;

if((fp=fopen("datafile.txt","rb"))==NULL)

{

return;

}

fread(&filedata,sizeof(filedata),1,fp);

}

void translate()

{

char c;

int i,j,k=0,m,n=0;

printf("请输入你想要译码的二进制序列");

printf("\n");

getchar();

scanf("%c",&c);

for(i=0;(i

{ code[i]=c;

scanf("%c",&c);

}

printf("对应的信源符号为:");

for(j=0;j<=MAXV ALUE&&HuffNode[j].parent!=-1;j++) m=j+1;

for(j=0,k=m;j<=i;j++)

{

if(code[j]=='0')

{

n=HuffNode[k].lchild;

if(n==-1)

{

printf("%c",HuffNode[k].ch);

k=m;j--;continue;

}

k=n;

}

else

{

n=HuffNode[k].rchild;

if(n==-1)

{

printf("%c",HuffNode[k].ch);

k=m;j--;continue;

}

k=n;

}

}

}

void Huffman()

{

HCodeType HuffCode[MAXLEAF],cd;

int i,j,m1,m2,x1,x2,c,p,m;

if(filedata.count==0)

{ printf("\n输入信源符号总数: ");

scanf("%d",&m);

filedata.count=m;

for(i=0;i<2*m-1;i++)

{ HuffNode[i].gailv=0;

HuffNode[i].parent=-1;

HuffNode[i].flag=0;

HuffNode[i].lchild=-1;

HuffNode[i].rchild=-1;

HuffNode[i].ch='a';

}

for(i=0;i

{ printf("请输入(概率,信源符号):");

scanf("%f %c",&HuffNode[i].gailv,&HuffNode[i].ch);

filedata.mydata[i].gailv=HuffNode[i].gailv;

filedata.mydata[i].letter=HuffNode[i].ch;

savetofile();

}

}

else

{ m=filedata.count;

for(i=0;i<2*m-1;i++)

{ HuffNode[i].gailv=0;

HuffNode[i].parent=-1;

HuffNode[i].flag=0;

HuffNode[i].lchild=-1;

HuffNode[i].rchild=-1;

HuffNode[i].ch=3;

}

for(i=0;i

{ HuffNode[i].gailv=filedata.mydata[i].gailv;

相关文档
最新文档