信息论实验用matlab实现哈夫曼码编译码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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'); %先解决上一列最后两个