huffuman实验报告带流程图及详细程序.docx
- 文档编号:23472558
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:14
- 大小:128.23KB
huffuman实验报告带流程图及详细程序.docx
《huffuman实验报告带流程图及详细程序.docx》由会员分享,可在线阅读,更多相关《huffuman实验报告带流程图及详细程序.docx(14页珍藏版)》请在冰豆网上搜索。
huffuman实验报告带流程图及详细程序
重庆交通大学信息科学与工程学院
信息论与编码课程设计实验报告
班级:
2010级通信一班
姓名(学号):
实验项目名称:
huffuman编译码
实验室(中心):
信息科学与工程学院软件中心
指导教师:
实验完成时间:
2012年12月8日
一、题目(课程设计题目)
Huffuman编译码
二、功能描述(对系统要实现的功能进行描述)
设计一段信源序列,利用Huffman编码对其进行编码,然后利用相应的译方法进行译码,同时考察译码错误对后续序列带来的影响
三、概要设计(根据功能描述,建立系统的体系结构,即将整个系统分解成若干子功能模块,并用框图表示各功能模块之间的衔接关系,并简要说明各模块的功能。
)
1、对随机生成的字符序列进行概率统计
2、根据字符的概率构建一棵huffuman树
3、根据构建的huffuman树对输入的字符进行huffuman编码
4、结合编码的规则,按相同规则对编码过后的序列进行译码观察是否能够准确的恢复原信号
5、随机对编码过后的序列产生一些误码,然后对有错误的字符进行译码,观察译码出的结果。
四、详细设计(详细说明各功能模块的实现过程,包括用流程图对算法进行描述,所用到的数据结构等)
1、对随机输入的字符进行概率统计
首先输入一段字符放入h中,其次用h1=unique(h);把输入字符中不重复的字符提取出来。
n=length(h);m=length(h1);temp(i)用于存放第i个字符出现的个数
首先初始化temp
其次统计各字符出现的次数
最后计算各字符出现的概率
2、构造huffuman树
用一个[2*n-1,6]列的矩阵存放huffuman树的相关信息。
概率的顺序
概率
父节点
左孩子
右孩子
此概率是否已被合并
初始化所有的单元为-1;再令第一列为1:
2*n-1,第二列的前n个为各概率(从小到大排列)当某行最后一列被合并了时将其修改为1.合并时遵循左孩子的概率小于右孩子
以0.25000.37500.12500.2500为例
构造的huffuman树如下
节点标号概率父节点左孩子右孩子是否合并过
1
0.125
5
-1
-1
1
2
0.25
5
-1
-1
1
3
0.25
6
-1
-1
1
4
0.375
6
-1
-1
1
5
0.375
7
1
2
1
6
0.625
7
3
4
1
7
1
-1
5
6
-1
3、对各字符进行编码
从叶子节点开始向上遍历,直到遍历到根节点为止,根据huffuman树的构造原理,第1:
n行即为叶子节点,根节点的判决条件为父节点是否为-1,-1即为根节点。
假设构建的huffuman树的各行各列信息存放在c中
注释:
huff(i).ch表示第i个字符的字符号
huff(i).code表示某个字符对应的编码
其编码过程如下
最后对所有输入的码字进行编码,编码过后的码字存放在datastream中
4、对编码好的字符序列进行译码
逐个的取编码好的01序列,将取出的01序列与各字符对应的编码序列相比较,如果相等者译为对应的输入字符
因循环层数比较多,流程图画起来比较繁琐,故将程序解释如下
[transcode]=decoding(datastream,huff,n)
k=datastream;%为要进行译码的01序列
transcode=[];len=0;%transcode用来存储解码过后的序列
while(length(k)~=0)%程序一直运行到将所有01序列译完
d=k
(1);%首先取第一个码元
forL=1:
length(k)%因为有可能第一个码元不是一个码字,此时就再在后面加上一个码元,以此类推
symbol=0;%标识没有找到对应的码字
fori=1:
n逐个与各个码字进行比较,如果相等的话则译出
if(length(d)==length(huff(i).code))
if(length(find(d==huff(i).code))==length(d))
transcode=[transcode,huff(i).ch];
k=k(length(d)+1:
end);%因为已将此码元或此几个译出,故将此段码元截取,以
%免重复译码
symbol=1;%改变标识位,让程序满足此条件时跳出循环
end
end
ifsymbol==1
break;
end
end
ifsymbol==1
break;
else
len=length(d);
d=[d,k(len+1)];%如果当前取得所有码元不能组成一个正确的码字,则再加入一位码元重新进行%译码
end
end
end
disp(transcode);
5、使编码的某些位产生错误,然后再重复上面第四步。
观察译码的结果并与之前正确的译码相比较
五、测试结果及存在的问题(说明系统的运行效果(附上运行界面图片)、存在哪些不足以及预期的解决办法)
六、课程设计心得体会(谈谈自己在课程设计过程中的心得体会)
Huffuman编码是一种即时码,编码的效率也非常的高,可以达到百分之九十几甚至百分之百。
以前有用c语言实现过huffuman得编码,发现其实matlab语言有许多比c语言更方便的地方。
当然两者之间也有很多可以通用的地方。
比如我发现结构体在matlab里也是支持的。
通过huffuman的编译码实验让我在进一步熟悉matlab的情况下,对huffuman的编译码原理也有了更进一步的了解。
希望自己以后通过实验设计可以学到更多的东西。
七、附录(附上本文完成的代码)
对输入字符进行编码
function[p,h1,h]=zifutongji()
h=input('请输入字符串','s');
h1=unique(h);
n=length(h);
m=length(h1);
fori=1:
m
temp(i)=0;
end
fori=1:
n
forj=1:
m
if(h(i)==h1(j))
temp(j)=temp(j)+1;
end
end
end
fori=1:
m
p(i)=temp(i)/n;
end
构建huffuman树
function[c,n]=hufftree(p,h1)
n=length(p);
fori=1:
n-1
forj=i:
n
ifp(i)>=p(j)
P=p(i);p(i)=p(j);p(j)=P;
T=h1(i);h1(i)=h1(j);h1(j)=T;
end
end
end
Q=sort(p);
c=-ones(2*n-1,6);
c(:
1)=1:
2*n-1;
c(1:
n,2)=Q;q=Q;
m=zeros(1,2*n-1);
fori=n+1:
2*n-1
c(i,2)=q
(1)+q
(2);
temp1=find(c(:
2)==q
(1)&c(:
6)~=1,1);
c(temp1,6)=1;
temp2=find(c(:
2)==q
(2)&c(:
6)~=1,1);
c(temp2,6)=1;
c(i,4)=temp1;
c(i,5)=temp2;
c(temp1,3)=i;
c(temp2,3)=i;
Q=[Q,q
(1)+q
(2)];
q=[q
(1)+q
(2),q(3:
end)];
q=sort(q);
end
end
3、对输入的字符串进行编码
function[datastream,huff]=charsencoding(c,p,h,h1,n)
fori=1:
n
huffcode=[];
p=c(i,3);
j=i;
while(p~=-1)
if(c(p,4)==j)
huffcode=[0,huffcode];
else
huffcode=[1,huffcode];
end
j=p;
p=c(j,3);
end
huff(i).ch=h1(i);
huff(i).code=huffcode;
disp('字符及其对应的编码为');
disp(huff(i).ch);
disp(huff(i).code);
end
datastream=[];
fori=1:
length(h)
forj=1:
n
ifh(i)==h1(j)
datastream=[datastream,huff(j).code];
end
end
end
disp('ÊäÈë×Ö·û´®Îª£º');
disp(h);
disp('¶ÔÓ¦µÄ±àÂëΪ£º');
disp(datastream);
4、对编码的信号进行解码
function[transcode]=decoding(datastream,huff,n)
k=datastream;
transcode=[];len=0;
while(length(k)~=0)
d=k
(1);
forL=1:
length(k)
symbol=0;
fori=1:
n
if(length(d)==length(huff(i).code))
if(length(find(d==huff(i).code))==length(d))
transcode=[transcode,huff(i).ch];
k=k(length(d)+1:
end);
symbol=1;
end
end
ifsymbol==1
break;
end
end
ifsymbol==1
break;
else
len=length(d);
d=[d,k(len+1)];
end
end
end
disp(transcode);
5、主函数
functionhuffumain()
[p,h1,h]=zifutongji();
disp('输入的字符串');
disp(h);
disp('各不同的字符');
disp(h1);
disp('字符对应的统计概率');
disp(p);
[c,n]=hufftree(p,h1);
disp('生成的huffuman树');
disp(c);
[datastream,huff]=charsencoding(c,p,h,h1,n);
[transcode]=decoding(datastream,huff,n);
disp('对应的译码为');
disp(transcode);
%考察部分码元出错对后续序列的影响
errdatastream=datastream;
a=rand(1,4);
a=find(a>0.5);
errdatastream(a)=~datastream(a);
disp('产生部分错误码元的接收序列');
disp(errdatastream);
[transcode1]=decoding(errdatastream,huff,n);
disp('部分错误码元的译码');
disp(transcode1);
disp('正确的译码为');
disp(transcode);
end
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- huffuman 实验 报告 流程图 详细 程序