首页 > 其他分享 >MATLAB实现huffman编码及译码

MATLAB实现huffman编码及译码

时间:2023-12-17 13:56:01浏览次数:32  
标签:end fwrite selected 译码 length MATLAB shuju huffman txt2

使用前将建立input.txt放在和该.m文件同一文件夹中运行即可
最后运行结果:
1.文本统计过后的信源空间
2.信源空间对应的柱状图
3.编码结果
4.译码结果

对彩色图像进行huffman编码,解码,显示原图像

clc;
close all;
clear all;

%数据读取
txt=fopen('input.txt');
shuju=fscanf(txt,'%c');
%去重
selected_shuju=unique(shuju);
selected_shuju=selected_shuju';
%长度
len=length(selected_shuju);
%求出信源符号的个数
for i=1:len
    count(i)=length(strfind(shuju,selected_shuju(i)));
end
p=count./sum(count);
n=length(p);
q=p;







%构建概率矩阵
m=zeros(n-1,n);
for i=1:n-1%合并n-1次
    [q,e]=sort(q);%E是个行向量 值代表q中该位置的概率在原序列中的位置
    m(i,:)=[e(1:n-i+1),zeros(1,i-1)]; 
    %m的特点:第一行n个非零元素,逐行递减,n-1行2个非零元素 
    q=[q(1)+q(2),q(3:n),1]; 
end







%构建编码矩阵 
for i=1:n-1
    c(i,1:n*n)=blanks(n*n); %c矩阵特点 与m对应  每一个n块对应一个概率的符号 第一行有n个 n-1行有2个 其余为空
end
%开始编码 因为哈夫曼编码不唯一 自规定概率小的赋值1 概率大的赋值0
c(n-1,n)='1'; 
c(n-1,2*n)='0'; 
for i=2:n-1
    %被合并的前两个需要分配0和1
    index=find(m(n-i+1,:)==1);%下一行对应位置为1 则为该行较小的两个概率合并以后的总概率
    c(n-i,1:n-1)=c(n-i+1,n*(index)-(n-2):n*index);%前缀是对应的合并后概率的编码值 注意:1:n-1的维度和取的前缀的维度要一致
    c(n-i,n)='1'; 
    c(n-i,n+1:2*n-1)=c(n-i,1:n-1); %合并为同一个概率 前缀相同
    c(n-i,2*n)='0'; 
    
    %未合并的 从每一行第三个开始编码 无需新分配0 1 直接继承上一个节点的编码
    for j=1:i-1
        index=find(m(n-i+1,:)==j+1);%从index=2开始到index=i结束 i=3 即n-3行 就是index从2到3
         c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(index-1)+1:n*index);
    end
end 
for i=1:n
    index=find(m(1,:)==i);
    h(i,1:n)=c(1,n*(index-1)+1:index*n); %将与输入概率对应的编码放入h中
    is0=abs(h(i,:));%abs()将字符变为ASCII码 空为32
    len(i)=length(find(is0~=32)); %非空符号的个数为码长
end









disp('编码结果');
[selected_shuju,h]
disp('平均码长');
e=sum(p.*len)   %计算平均码长
xinxiliang=sum(p.*log2(1./p));    %计算平均信息量
disp('平均信息量');
disp([num2str(xinxiliang),'bit/sym']);      
disp('编码效率');
eta=(sum(p.*log2(1./p)))./e                        %计算编码效率

%将结果写入文件中
txt2=fopen('tongji_result.txt','w+','n','GB2312');
fwrite(txt2,"symbols:   ");
fprintf(txt2,'\n');
for i=1:length(selected_shuju)
    fwrite(txt2,selected_shuju(i));
    fwrite(txt2,':  ');
    fwrite(txt2,num2str(p(i)));
    fprintf(txt2,'\n');
end
fprintf(txt2,'\n');

fwrite(txt2,"Huffman_Result:  ");
fprintf(txt2,'\n');

for i=1:length(selected_shuju)
    fwrite(txt2,[selected_shuju(i)]);
    fwrite(txt2,':  ');
    for j=1:length(h)
        fwrite(txt2,h(i,j));
    end
    fprintf(txt2,'\n');
end
fwrite(txt2,'averge_lenth:  ');
fwrite(txt2,num2str(sum(p.*len)));
fprintf(txt2,'\n');
fwrite(txt2,'averge_bit:  ');
fwrite(txt2,[num2str(xinxiliang),'bit/sym']);
fprintf(txt2,'\n');
fwrite(txt2,'eta:  ');
fwrite(txt2,num2str(eta));
fclose(txt2);

%文本编码和译码
%文本编码结果
txt333=fopen('bianma_result.txt','w+');
RESULT=[selected_shuju,h];
for i=1:length(shuju)
    for j=1:length(selected_shuju)
        if shuju(i)==selected_shuju(j)
            for o=1:length(h)
                if h(j,o)~=' '
                    fwrite(txt333,h(j,o));
                end
            end
            fwrite(txt333,' ');
        end
    end
end
fclose(txt333);
%文本译码
txt444=fopen('yima_result.txt','w+');
txt333=fopen('bianma_result.txt','r');
bianma_code=fscanf(txt333,'%c');
s='';
plll=0
%开始译码:
for i=1:length(bianma_code)
   
    
    
    
    if bianma_code(i)==' '
        flag=1;
        for j=1:length(h)
            flag=1;
            for m=1:length(h)
                if(h(j,m)==' ')
                    plll=plll+1;
                    continue;
                end
                if(length(h)-plll~=length(s))
                    flag=0;
                    break;
                end
                for o=m:length(h)%比较每个字符串是否对应相等
                    if h(j,o)~=s(o-plll)
                            flag=0;
                    end
                end
            end
            plll=0;
            if(flag==1)
                fwrite(txt444,selected_shuju(j));
            end
        end
         s='';
    end
    
    
    
    
    if(bianma_code(i)~=' ')
        s=[s,bianma_code(i)];
    end
end
fclose(txt444);
fclose(txt333);
           





%数据可视化
x=1:length(selected_shuju);
bar(x,p)
set(gca,'XTick',1:length(selected_shuju))
%下面是x轴的刻度值
set(gca,'XTickLabel',selected_shuju(1:1:end))
title('信源符号——概率图');
xlabel('信源符号');
ylabel('概率');

 

标签:end,fwrite,selected,译码,length,MATLAB,shuju,huffman,txt2
From: https://www.cnblogs.com/bbhhh/p/17909000.html

相关文章

  • MATLAB 函数句柄Function handle的用法
    函数句柄的作用是可以把函数句柄直接设置为参数然后执行  函数句柄(Functionhandle)是MATLAB的一种数据类型。引入函数句柄是为了使feval及借助于它的泛函指令工作更可靠;使“函数调用”像“变量调用”一样方便灵活;提高函数调用速度,特别在反复调用情况下更显效率;提高软件重用性,......
  • Matlab读取UCI数据集Iris中数据
    >> [attrib1,attrib2,attrib3,attrib4,class]=textread('data\iris.data','%f%f%f%f%s', 'delimiter',',');>> attrib=[attrib1';attrib2';attrib3';attrib4']';>>a......
  • Matlab 用sort函数排序 二维数组
    在Matlab中排序某个向量(一维)时,可以使用sort(A),其中A为待排序的向量,如果仅是用来排序A,那么直接使用sort(A)即可,如果排序后还需要保留原来的索引可以用返回值,即[B,ind]=sort(A),计算后,B是A排序后的向量,A保持不变,ind是B中每一项对应于A中项的索引。排序是按升序进行的。 由于在sort函......
  • Matlab指针
    Matlab指针第一印象貌似是Matlab中不存在指针,所有变量与函数的赋值都是按值传递的,不会对参数进行修改。其实Matlab提供了handle类作为指针代替品。只要我们利用handle子类,就可以像使用指针一样来操作对象中包含的数据。handle类可参考 MatlabObject-OrientedProgrammingR20......
  • G-Rilling EMD HHT Matlab 开源代码
    downpackage_emd/EMDs/cemdc.m , 2354package_emd/EMDs/cemdc2.m , 2362package_emd/EMDs/cemdc2_fix.m , 2312package_emd/EMDs/cemdc_fix.m , 2305package_emd/EMDs/emd.m , 22275package_emd/EMDs/emd_local.m , 9897package_emd/EMDs/emd_online.m , 26315pack......
  • 基于小波神经网络的网络流量预测算法matlab仿真
    1.算法运行效果图预览   2.算法运行软件版本matlab2022A 3.算法理论概述       网络流量能直接反映网络性能的好坏,网络流量的建模与预测对于大规模网络的规划设计、网络资源管理以及用户行为的调节等方面都具有积极意义。本课题首先介绍了网络流量的特征......
  • 基于FPGA的图像形态学腐蚀算法实现,包括tb测试文件和MATLAB辅助验证
    1.算法运行效果图预览 将FPGA的仿真结果导入到MATLAB,结果如下所示:   2.算法运行软件版本vivado2019.2 matlab2022a 3.算法理论概述      基于FPGA的图像形态学腐蚀算法实现主要依赖于图像处理的基本原理和数学形态学的基础知识。在图像处理中,形态学操......
  • matlab绘制纹理图并用图案填充或斑点填充区域
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 基于WTMM算法的图像多重分形谱计算matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述       基于WTMM算法的图像多重分形谱计算是一种利用小波变换模极大值(WTMM)方法,对图像进行多重分形分析的方法。下面将详细介绍这种方法的原理和数学公式。 3.1、WTMM算法概述   ......
  • 基于AlexNet深度学习网络的智能垃圾分类系统matlab仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a 3.算法理论概述       基于AlexNet深度学习网络的智能垃圾分类系统是一种利用深度学习技术,对垃圾图像进行分类的系统。下面将详细介绍这种系统的原理和数学公式。 3.1、基于AlexNet深度学习网络的......