信息论综合性实验报告 Huffman编码及译码 代码
时间:2025-04-30
时间:2025-04-30
里面有完整的实验报告及代码
Xx大学yy学院 综合性设计性实验报告
专 业 班 级:
学 号 :
姓 名:实验所属课程:实验室(中心):
指 导 教 师 :
实验完成时间: 信息论与编码技术 信息科学与工程学院软件中心 2012 年 12 月 9 日
里面有完整的实验报告及代码
一、 设计题目:
Huffman编码及译码
二、 实验内容及要求:
<一>实验内容:对所给的字符串进行huffman的编译码;译码对应原始序列,在将编码
进行移位操作时,再进行译码输出,得出误码率。 <二>实验要求:自己设计一段信源序列,利用Huffman编码对其进行编码,然后利用相
应的译方法进行译码,同时考察译码错误对后续序列带来的影响。
三、 实验过程(详细设计):
<一> huffman编码原理:
Huffman编码是一种紧致编码,但编码序列的码并非是唯一的。它是根据源数据各信号发生的概率进行编码,在源数据中出现的概率越大的信号,分配的码字越短;出现概率越小的信号,其码字越长,从而达到用尽可能少的码字表示源数据的目的。 Huffman编码的步骤如下:设信源X有m个符号(消息),信源概率分布如下: X x1, x2 ,..., xm p1 2 ,..., pm
( )把信源 X 中的消息按概率从大到小的顺序排列;
(2)把最后两个出现概率最小的消息合并成一个消息,从而使信源的消息数减少,并同时再按信源符号(消息)出现的概率从大到小排列;
(3)重复上述 2 个步骤,直到信源最后为一个序列只有一个1; (4)将被整合的消息分别赋予 1 和 0,并对最后的两个消息也相应地赋予 1 和 0. (5)通过以上步骤即可完成编码操作。 <二> huffman译码原理:
通过在刚开始生成的随机编码序列,得到列出的0 1 序列与源字符串一一对应,就完成了译码。而对错位后的编码序列,我只是只错位了前两个进行译码,效果不是很明显。
<三>算法设计:
1、编码部分:
里面有完整的实验报告及代码
(1)主函数主要用于调用前面所编写的各个函数模块,按照主函数(主函数代码如下)所列出来的调用顺序,进行一一叙述。
function []=huffmanmain()
disp('请输入待编码序列');
s=input('','s');%调用概率统计函数,输出各码元的概率分布矩阵;
pro=getpro(s);%调用生成huffmantree函数,输出基本树,及完整huffmantree; [HuffmanTree,pro2]=huffmantree(pro);%调用编码函数,输出码表,编码序列平
均码长,信息熵,编码效率;
[Codenumber,huffmantable,Code2]=huffmanencode221(HuffmanTree,pro2,s); %调用译码函数,输出译码序列以及误码率;
decodenumber=huffmandecode221(Codenumber,huffmantable,Code2,pro2,
s); %调用函数,使编码序列中的0 1错位
Codenumber1=yiweicodenumber(Codenumber); %调用译码函数,对错位后的编码
序列进行译码
decodenumber=huffmandecode(Codenumber1,huffmantable,Code2,pro2,s);
(2)通过编写函数pro=getpro(s)函数来完成对字符串中的各字符的统计,并列出其概
率分布矩阵,返回pro矩阵,其主要代码如下: for i=1:b %进行概率计算; for j=1:a
if S(i)==s(j) c(i)=c(i)+1; else continue; end; end; end;
pro=c./a;
(3)由
Huffman 编码要求,得到的概率分布矩阵要按照从大到小得顺序来排列,
所以需要编写函数来得到顺序排列的概率分布矩阵。我们需要从 pro(1,:)中找到两个最小的概率值,所以需要编写找出两个最小值的函数[min1,min2]=getmin(tree),其中 tree 是在进行 Huffman 编码过程中产生的 Huffman 树(包含 pro 信息,具体下面介绍),并且在 min1 与 min2 中若两者值相等,则在 pro 中概率序号在前的概率值赋予min1,概率序号在后的概率值赋予 min2,详细说明见其下面的代码注释;此部分函数代码主要如下:
LL=length(pro1); %构建基础二叉树
[p1,p2]=sort(pro1,'descend'); pro2=zeros(2,LL); pro2(1,:)=p1; pro2(2,:)=p2; n0=size(pro2,2);
n1=ceil(log2(n0)); %二叉树的深度; n=LL;
tree=ones(6,2*n-1); %建立其6*2*n-1的单位1矩阵,用以存储二叉树中各个结
点,父节点,以及各个结点的编号;
tree(1,:)=1:(2*n-1); %用以编号并存储二叉树中的结点; tree(5,(n+1):end)=0; %用以存放其根结点;
里面有完整的实验报告及代码
tree(2,1:n)=pro2(1,:); %用以存放概率分布;
tree(6,1:n)=pro2(2,:); %用以存放每个概率对应的符号的下标; tree(6,n+1:end)=0;
disp('基本树形式:');
disp(tree); %显示构建其的基本树形式;
%对概率分布矩阵进行运算,每次进行最小两个值相加,其和赋予其中一个,另外一个置1,重复操作,
%将其每一次输出的结果存于s1矩阵中,至最后两个概率和为1结束; s1=ones(n-1,2*n-1); s1(1,:)=sort(tree(2,:)); for i=2:n
s1(i,:)=[s1(i-1,1)+s1(i-1,2),1,s1(i-1,3:2*n-1)]; s1(i,:)=sort(s1(i,:)); end;
%对基础二叉树进行操作,完整构造; m1 …… 此处隐藏:7794字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:演讲稿团队的力量
下一篇:安监站站长工作职责安监员职责