信息论与编码课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;