信息论实验用matlab实现哈夫曼码编译码

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

信息论与编码基础课程

实验报告

实验名称:Huffman码编译码实验

姓名:学号:

组别:专业:

指导教师:班队:

完成时间:成绩:

Huffman码编译码实验

一.实验目的和要求

熟悉matlab软件编程环境及工具箱,掌握Huffman码编译码方法的基本步骤,利用matlab实现Huffman码的编译码。

二.试验内容和原理

内容:利用matlab编程实现文本的二进制Huffman码的编译码。

任务:构造Huffman树。

原理:在各字符出现概率不均匀的情况下,根据这些概率构造一棵用于编码的Huffman树。它用最短的二进制位表示出现概率最高的字符,而用较长的为表示出现概率低的字符,从而使平均码长缩短,并且保持编码的唯一可译性。三.操作方法和实验步骤

对一随机英文文本文件进行Huffman编译码仿真,给出各个字母的概率,码字,平均信息量,平均码长,编码效率以及编码序列输出。

(一)编码序列获取

使用fopen函数读取.txt文本文件中的数据存储为字符串,使用length获取其长度,使用unique获取字符个数。

(二)获取编码概率矩阵

使用strfind函数获取字符个数并计算各个符号的概率,根据哈夫曼编码原理依次获得各步骤中得到的概率,赋值给概率矩阵,使用find查

找合并概率在的下标并存储到该列的最后一位,如有两个以上优先存储较

大的那个下标。

(三)获取编码矩阵

依据哈夫曼编码原理,根据获取的概率矩阵倒序编码。最后一列直接编码0和1,取出最后一行中记录合并概率下标的数,由于该合并概率在

上一列中肯定在最后两行,故优先编码,在字符串尾部加0和1;剩余编

码直接平移,使用if 条件控制由于合并概率位置不同带来的平移方法不同。

(四)计算平均码长、自信息等

使用公式计算平均码长、自信息、编码效率

平均码长

自信息

编码效率

(五)依据编码表编码

由于是单符号信源,故使用strrep 字符替换函数直接替换

(六)反向译码

哈夫曼码是前向译码,遍历编码表,使用strncmpi 比较传输信息前x 个字符,如返回值为真直接译码,传输信息截取已经译码的部分,码字添加到译码信息中。

四.实验数据记录和处理

close all ;clear all ;clc;%关闭所有图形窗口,清楚工作空间所有变量,清除命令行

%%%%%%%%%文件数据读取%%%%%%%%%%

code=fopen( '\test02.txt'); %打开文件

mail=fscanf(code, '%c'); %读取文件的数据,并将数据存入矩阵,输出字符串 mms=unique(mail); %unique 函数去除重复字符,计算出字符串的种类 % disp(xulie); %输出文档中包含的字符

n=length(mms); %n 为需要编码元素个数,length 函数获取字符串长度 for i=1:n

count(i)=length(strfind(mail,mms(i)));

r

L

S 2log /)(H =

η符号

码元/l p L q

1

i i i ∑==码元

/bit p log p H(S)q

1

i i 2i ∑=-=

%统计各字符个数复制给count(i),strfind为字符查找函数,返回值为查找个数

end

P=count./sum(count); %计算各字符的概率

for i=1:n

PP{i,1}=mms(i);

PP{i,2}=P(i);

end

PP=sortrows(PP,-2);

T=sort(P,'descend'); %降序排列P,为减少对P的影响,复制排序后的P为T %%%%%%%%%%%%%编码准备(概率矩阵生成)%%%%%%%%%%

B=zeros(n,n-1);

%B为空的编码概率矩阵,第一列n个,最后一列2个故用n*(n-1)

for i=1:n

B(i,1)=T(i); %生成编码表的第一列(即为复制T)

end

r=B(i,1)+B(i-1,1); %最后两个元素相加

T(n-1)=r; %将两个元素相加之和赋给倒数第二个数

T(n)=0; %最后一个数置零

T=sort(T,'descend'); %对第一次相加后的T排序

t=n-1; %置数t,用来表示当前概率序列中不为零的个数

for j=2:n-1 %生成编码表的其他各列(从第二列开始)for i=1:t

B(i,j)=T(i); %将上一次处理后的概率序列复制给下一列end

K=find(T==r);

%找到r在T中的位置并置给K(K是向量,记录的是位置信息所在列数)

B(n,j)=K(1);

%从第二列开始,每列的最后一个元素记录上一列相加后的数在该列的位置,取概率之首可以减少码长方差

r=(B(t-1,j)+B(t,j)); %最后(小)两个概率相加

T(t-1)=r;

T(t)=0; %重复动作,相加最小两数,并将后一位置零

T=sort(T,'descend'); %对T再排序

t=t-1; %每次处理后t自减(需处理的概率自减)

end

%%%%%%%%%%%%%%编码部分%%%%%%%%%%%%%%%

m=n-1; %为简便引入m,表示码字最长可能,也是列数等

huffman{1,m}='0';

huffman{2,m}='1';

t=2; %t是实时本列的概率元素个数,也表示下一列第一个合并概率的行数for j=m:-1:2 %j是实时的列数

k=B(n,j);

huffman{t,j-1}=strcat(huffman{k,j},'0'); %先解决上一列最后两个

相关文档
最新文档