**************主函数:************************%Huffman编码
clear;clc;close all;
[word,prob]=statistics(); %对文本中的信息进行统计
huff=Code(prob); %编码for i=1:length(prob)len(i)=length(find(abs(huff(i,:))~=32));%检测编码长度并进行标记
endave=sum(prob*len')   %计算平均码长
HX=sum(prob.*(-log2(prob)))  %计算信源熵
efficiency=HX/ave  %计算编码效率
r=1-efficiency   %计算冗余度
————————————————
版权声明:本文为CSDN博主「路遇春山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_56647551/article/details/127752235

编码主函数

输入文本文件xx.txt

*****************字符统计************************function [word,prob] = statistics()  %统计文档中信源及个数
data=textread('D:\desktop\Huffman\xx.txt','%s', 'whitespace','');
x=cell2mat(data);
x=x';
tab=tabulate(x);
w=char(tab(:,1));  %字符表
dimension=size(w);
word(1:dimension(1),1)=char(tab(:,1));
word(dimension(1)+1,1)=' ';
for i=1:dimension(1)+1count(i)=length(find(x==word(i)));
end
prob=count/sum(count); %各字符的概率end
————————————————
版权声明:本文为CSDN博主「路遇春山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_56647551/article/details/127752235
*********************编码函数code()*********************function huff = Code(prob)
%进行Huffman编码
n=length(prob);
p=prob
loca=zeros(n-1,n);
%loca用于记录每行最小两概率叠加后概率的排列次序
for i=1:n-1[p,index]=sort(p)      %进行概率值排序loca(i,:)=[index(1:n-i+1),zeros(1,i-1)]     %每一次排序求和后都会少一个概率值,对有值的赋予排列次序,其余赋0p=[p(1)+p(2),p(3:n),1]    %对经过求和处理的概率第一项赋两最小概率的和值,对3-n项概率照搬,其余概率赋1
end
for i=1:n-1   %循环生成一个N-1行、n^2列数组C,每行可看作n个段,每段长为n,记录一个码字(每个码字的长度不会超过n)code(i,1:n*n)=blanks(n*n)
endcode(n-1,n)='0' % 给code矩阵的N-1行的第一个段赋值0
code(n-1,2*n)='1' % 第二个段赋值1。(这两个码字对应编码中最后相加为一的两个概率)
for i=2:n-1   %主要的程序,循环N-2次code(n-i,1:n-1)=code(n-i+1,n*(find(loca(n-i+1,:)==1))-(n-2):n*(find(loca(n-i+1,:)==1)))code(n-i,n)='0' %在分支的第一个元素最后补0code(n-i,n+1:2*n-1)=code(n-i,1:n-1)code(n-i,2*n)='1' %在分支的第一个元素最后补1%每一行值都从下一行值得到,找到在下一行码字中相加本行最小两个概率得到的概率的对应码字,%本行两个最小概率对应码字分别为此码字最后加“0”,加“1”for j=1:i-1code(n-i,(j+1)*n+1:(j+2)*n)=code(n-i+1,n*(find(loca(n-i+1,:)==j+1)-1)+1:n*find(loca(n-i+1,:)==j+1))end
endfor i=1:nhuff(i,1:n)=code(1,(find(loca(1,:)==i)-1)*n+1:find(loca(1,:)==i)*n)
end
end
————————————————
版权声明:本文为CSDN博主「路遇春山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_56647551/article/details/127752235
********************* 输出码书**********************
fid=fopen('codeBook.txt','w+');
for i=1:length(prob)fprintf(fid,'%s',word(i));for j=1:length(word)fprintf(fid,'%s',huff(i,j));endfprintf(fid,'\n');
end
fclose(fid);
————————————————
版权声明:本文为CSDN博主「路遇春山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_56647551/article/details/127752235

输出码书

*********************输出二进制比特流**************************
huffcode=[];
for i=1:length(x)  temp=huff(find(word==x(i)),:);  %temp存放当前字符对应的Huffman编码loc=find(abs(temp)~=32);  %找到不是空格的第一个0或者1new=temp(loc(1):length(word));  %取出码字huffcode=[huffcode,new] %拼接码字
end
fid=fopen('codeFile.txt','w+');
fprintf(fid,'%s\n',huffcode);
fclose(fid);****************输出每个码字码长********************
lenth=[];
for i=1:length(x)  lenth=[lenth,len(find(word==x(i)))];
end
fid=fopen('Length.txt','w+');
for i=1:length(lenth)fprintf(fid,'%d',lenth(i));
end
fclose(fid);
————————————————
版权声明:本文为CSDN博主「路遇春山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_56647551/article/details/127752235

编码结果

计算压缩效率:

读入codeFile.txt,编写霍夫曼编码的译码程序,进行译码,验证编码正确性。

***************Huffman译码********************%Huffman译码
clear;clc;close all;
code=textread('codeFile.txt','%c');
book=textread('codeBook.txt','%s');
n=length(book);
book(n+1)=book(n);
% book(n)=cellstr(' ');
word_code=zeros((n+1)/2,(n+1)/2);
word_code=char(word_code);
for i=1:(n+1)/2word_code(i,:)=blanks((n+1)/2);
end%存放字符字典
for i=1:(n-1)/2 word(i)=cell2mat(book(2*(i-1)+1));
end
word((n+1)/2)=' ';for i=1:(n+1)/2 %存放字符码字字典word_code(i,1:length(cell2mat(book((2*i)))))=cell2mat(book((2*i)));
end
%开始译码
for i=1:(n+1)/2 %计算每个码字的长度temp=find(word_code(i,:)==32);len(i)=temp(1)-1;
end
unit=[]
decoding=[]
for i=1:length(code)unit=[unit,code(i)]for j=1:(n+1)/2if length(unit)==len(j)if double(sum(unit==word_code(j,1:len(j))))==length(unit)decoding=[decoding,word(j)]unit=[]endendend
end
%输出译码结果
fid=fopen('Decode.txt','w+');
fprintf(fid,'%s\n',decoding);
fclose(fid);
————————————————
版权声明:本文为CSDN博主「路遇春山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_56647551/article/details/127752235

译码代码如上

译码结果与原文本一致

接下来设计交互界面(使用MATLAB自带的Appdesigner)

在输入栏中输入所需编码的文本文件名,点击Button对.txt文件所在文件夹进行选择,即可对文件进行霍夫曼编码,码书显示于表格,编码结果(2进制比特流)保存于同一文件夹下的’AppCode.txt’。

function ButtonPushed(app, event)clc;srcDir=uigetdir('','选择需要进行编码的文本');loc=app.EditField_2.Value;location=fullfile(srcDir,[loc]);[word,prob]=statistics_App(location); %对文本中的信息进行统计huff=Code(prob); %编码chuff=cellstr(huff);cword=cellstr(word);xlswrite('D:\desktop\MATLAB\zyh\Huffman\Book.xlsx',[cword,chuff]);t=readtable('Book.xlsx');app.UITable.Data=[cword,chuff];s = uistyle('HorizontalAlignment','center');addStyle(app.UITable,s,'table','');data=textread(location,'%s', 'whitespace','');x=cell2mat(data);huffcode=[];for i=1:length(x)  temp=huff(find(word==x(i)),:);  %temp存放当前字符对应的Huffman编码loc=find(abs(temp)~=32);  %找到不是空格的第一个0或者1new=temp(loc(1):length(word));  %取出码字huffcode=[huffcode,new] %拼接码字endfid=fopen('AppCode.txt','w+');fprintf(fid,'%s\n',huffcode);fclose(fid);endend————————————————
版权声明:本文为CSDN博主「路遇春山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_56647551/article/details/127752235

回调函数如上

输出比特流展示

Huffman编码MATLAB实现相关推荐

  1. matlab完成信源编码译码,Huffman编码和译码的MATLAB实现.doc

    Huffman编码和译码的MATLAB实现.doc Huffman编码及译码的MATLAB实现 沈逸峰 (上海师范大学 信息与机电工程学院,上海 200333) 摘要:本论文首先介绍了Huffman编 ...

  2. matlab实现数据压缩,【Matlab】Huffman编码如何实现数据压缩

    Huffman编码可用于数据压缩已经是人所共知的事实.但是具体说到如何实现编码,至少作者在实验中是遇到问题了的! 对数值串: [22006 22006 44004 87999 175989] --1* ...

  3. matlab霍夫曼图像压缩,用matlab仿真huffman编码在jpg图像压缩中的应用崔微微

    <用matlab仿真huffman编码在jpg图像压缩中的应用崔微微>由会员分享,可在线阅读,更多相关<用matlab仿真huffman编码在jpg图像压缩中的应用崔微微(3页珍藏版 ...

  4. Huffman编码的Matlab实现--用于单导联ECG数据的压缩和解压缩

    dataProcess.m ----主程序 norm2huff.m ----编码 huff2norm.m ----解码 (注意上面两个函数文件的末尾附有子函数) Lead1.mat ----单导联数据 ...

  5. Huffman编码用MTLAB的实现及编码注释----------Matlab

    一.实验内容 1.用Matlab实现Huffman编码算法程序: 2.要求程序输出显示所有的码字以及编码效率: 3.设计简单的输入界面(可以是简单的文字提示信息),程序运行时提示用 户输入代表信源符号 ...

  6. Matlab实现Huffman编码

    一.实验目的: (1)了解信源变长码的编码方法: (2)掌握哈夫曼编码方法: (3)掌握MATLAB的编程.                                               ...

  7. Huffman编码、Shannon编码、Fano编码——《小王子》文本压缩与解压

    一.实验要求: 1 采用熵编码对<小王子>文本进行压缩,生成压缩文件: 2 将压缩文件解压,并与源文件比较: 3 从香农编码.Huffman编码.Fano编码中选择一种: 4 计算编码效率 ...

  8. 香农编码与Huffman编码之间的对比

    目录 一.[上机目的] 二.[环境] 三.[上机原理] 四.[上机内容] 五.设计思路 5.1霍夫曼编码特点 5.2霍夫曼编码原理 5.3二进制哈夫曼编码过程 5.4计算结果 5.5霍夫曼编码的MAT ...

  9. 信道编码Huffman编码信息论与编码

    信道编码Huffman编码信息论与编码 MATLAB做的信息论与编码的实验一小部分 结果编码是数字数组,还可计算平均码长,编码效率,编码后信息传输速率 话不多说,直接代码 function [W,L, ...

最新文章

  1. Twitter Heron 实时流处理系统简介
  2. iview标签页的点击方法_18页PPT:6个高手常用的自我介绍套路,很是得人心,学习...
  3. WTM框架使用技巧之:CI/DI(持续集成/持续部署)
  4. java file_java开发之File类详细使用方法介绍
  5. [luoguP4142]洞穴遇险
  6. java中servlet知识_jsp_Servlet常用知识总结
  7. UVA11040 Add bricks in the wall【数学】
  8. 统计学习中常用的损失函数
  9. [转]GDI+ 中发生一般性错误解决方案
  10. IT之家学院:最详细的IPv6获取教程,开启64位短码地址
  11. MAC docker 使用阿里加速器
  12. oracle 给权限语句,oracle权限语句大全
  13. 《C语言程序设计》江宝钏主编-习题6-8-斐波那契部分和!!!!!
  14. 【校招VIP】产品设计分析之文案功底考察
  15. 调用MapReduce对文件各个单词出现的次数进行统计
  16. Acrobat如何将PDF拆分为多个文档
  17. Overview Screen-Android 6.0开发者文档
  18. 你一定从未看过如此通俗易懂的YOLO系列(从v1到v5)模型解读 (中)
  19. 惠普m1005mfp说明书_惠普HP LASERJET M1005一体机怎么使用?
  20. 01背包问题-动态规划算法(最简洁)

热门文章

  1. gdb 如何调试内存地址
  2. Resources的部分方法使用
  3. removeAttribute
  4. Bidirectional RNN (BRNN)
  5. 网页计数器 javabean session application 多种方法实现
  6. 机器学习笔记 - 信息增益和香农熵
  7. OpenWrt——修改软件源
  8. 唯品会求职面试经过(含面试题)
  9. milvus问答系统部署
  10. GSM短信编码与协议分析