基于MATLAB的香农编码和哈夫曼编码的实现P22214038丁文锐,P22214039郭城俊

1. 引言

在信息理论和数据压缩领域,香农编码和哈夫曼编码是两种经典的压缩算法。它们通过利用符号出现的概率分布来实现数据的高效编码,从而在传输和存储数据时节省空间和带宽。本报告将对这两种编码方法进行深入分析和比较。

2. 香农编码(Shannon编码)

2.1 原理

香农编码,又称为Shannon编码,是由克劳德·香农(Claude Shannon)于1948年提出的。其基本原理是根据每个符号的出现概率来分配最优的编码长度,使得整体的编码长度最短。

2.2 特点与应用

  • 信息熵:信息熵是香农编码的核心概念,表示信息的平均不确定性或信息量。对于符号 X 的信息熵 H(X),可以用概率 P(X) 来计算:

  • 其中,P(xi)是符号xi​ 的概率。

  • 编码过程:根据信息熵,香农编码可以将出现频率高的符号用较短的编码表示,出现频率低的符号用较长的编码表示,从而实现高效的数据压缩。

  • 特点:香农编码是一种理论上的最优编码方法,能够接近信息熵的极限,但需要事先知道符号的概率分布。

  • 应用:常用于无损数据压缩、通信系统中的数据传输、以及数据存储等领域,如JPEG图像压缩中的霍夫曼编码部分。

2.3 基于MATLAB的代码实现
  • 代码:

    function [codes, lengths] = shannonCoding(data)  
        % 计算每个字符的频率  
        [uniqueChars, ~, idx] = unique(data);  
        prob = accumarray(idx, 1) / numel(data);  
          
        % 计算每个字符的码字长度  
        lengths = ceil(-log2(prob));  
          
        % 生成香农码  
        codes = cell(numel(uniqueChars), 1);  
        for i = 1:numel(uniqueChars)  
            % 生成二进制码,确保唯一性(这里简单使用数字索引作为二进制码示例)  
            % 在实际应用中,你可能需要更复杂的策略来确保码的唯一性和前缀性  
            
            codes{i} = dec2bin(i-1, lengths(i))';  
        end  
          
        % 返回码字和长度  
    end

    例子:

    close all
    clc
    data = [99, 2, 3, 2, 1, 3, 2, 1, 3, 2, 3, 1];  
      
    % 香农编码  
    [shannonCodes, shannonLengths] = shannonCoding(data);  
    disp('Shannon Codes:');  
    disp(shannonCodes);  
    disp('Shannon Lengths:');  
    disp(shannonLengths);  

    得到结果:

3. 哈夫曼编码(Huffman编码)

3.1 原理

哈夫曼编码是由大卫·哈夫曼(David A. Huffman)在1952年提出的一种数据压缩技术,其基本思想是根据符号的出现频率构建一棵最优的前缀编码树。

  • 编码过程:哈夫曼编码的过程分为构建哈夫曼树和生成编码两个步骤:
    • 构建哈夫曼树:根据符号的频率构建一棵二叉树,频率越高的符号越靠近根节点。
    • 生成编码:从根节点到每个符号的路径上分配编码,左子树路径为0,右子树路径为1,最终得到每个符号的哈夫曼编码。

3.2 特点与应用
  • 特点:哈夫曼编码是一种贪心算法,能够产生最优的前缀编码,且不需要事先知道符号的概率分布。

  • 应用:广泛应用于数据压缩领域,如文本文件压缩、音频编码(如MP3)、图像压缩(如PNG)、以及通信系统中的信道编码等。

3.3 基于MATLAB的代码实现
clear all
close all
clc
inData = 'cbacd';

    %%%字符频率统计
uniqueCharacter=unique(inData);%计算有多少个不重复的字符串
for i=1:length(uniqueCharacter)
uniqueCharacter_num(i)=length(strfind(inData,uniqueCharacter(i))); %统计字符的数目
uniqueCharacter_p(i) = uniqueCharacter_num(i)/length(inData)%不同字符出现的概率
end
uniqueCharacter %显示字符
uniqueCharacter_num %显示个数
uniqueCharacter_p  %显示不同字符出现的概率

%%创建哈夫曼树
%对字符出现的概率按照从低到高排序
p = uniqueCharacter_p
[a,b]=sort(p); %对p概率矩阵进行排列
m(1,:) = b;
for i = 1:length(a)
    c(i) = uniqueCharacter(b(i));%更新字符队列的排序
end
q = sort(p); %更新概率顺序
n = length(uniqueCharacter_p);
for i = 2:n
    matrix(i-1,2) = c(1);   %在matrix中记录左孩子
    matrix(i-1,3) = c(2);   %在matrux中记录右孩子
    matrix(i-1,1) = double(i-1);                %在matrix中记录根节点
    c(2) = double(i-1);%此处补充数值1,目的是为了以后排序该位置总排在最后,不被处理
    q(2) = q(1) + q(2);     %更新根节点数值
    q(1) = 1;
    %对新的概率组合进行排序   
    [a,b]=sort(q);
    [a1,b1] = sort(b); 
    m(i,:)=b1; %%进行两次sort排记录记录概率对应的位置
    temp_c = c;  %引入中间变量
    temp_q = q;
    for i = 1:length(a1)
         c(i) = temp_c(b(i));%更新字符队列的排序
         q(i) = temp_q(b(i));
         
    end
end
e = (sum(uniqueCharacter_num)*8)/sum(len.*uniqueCharacter_num)


 实现结果:

4. 比较分析

4.1 理论上的优劣
  • 最优性:香农编码在已知符号概率时是最优的,能够达到信息熵的下界;而哈夫曼编码在未知概率时也能生成接近最优的编码。

  • 实现复杂度:哈夫曼编码的构建相对较简单,只需通过频率构建树并生成编码;香农编码需要计算信息熵并设计最优编码。

4.2 实际应用中的选择
  • 数据特性:对于已知概率分布的数据,如文本文件,香农编码更为适合;对于未知概率分布的数据,如音频或图像数据,哈夫曼编码更为实用。

  • 应用场景:根据具体的应用场景和数据特性选择合适的编码方法,以实现最佳的压缩效果和性能表现。

5. 结论

        香农编码和哈夫曼编码作为数据压缩领域的经典算法,在理论和实际应用中都具有重要的地位。理解它们的原理、特点和适用场景,有助于在实际工程中选择合适的方法,提高数据的传输效率和存储效率。

 

 

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、问题背景: 1949年香农在《有噪声时的通信》一文中提出了信道容量的概念和信道编码定理,为信道编码奠定了理论基础。无噪信道编码定理(又称香农第一定理)指出,码字的平均长度只能大于或等于信源的熵。有噪信道编码定理(又称香农第二定理)则是编码存在定理。它指出只要信息传输速率小于信道容量,就存在一类编码,使信息传输的错误概率可以任意小。随着计算技术和数字通信的发展,纠错编码和密码学得到迅速的发展。 2、课题分析: 运用matlab编写程序求解任给信源符号概率的香农编码。给定一组信源符号概率,通过所编写的程序对信源符号概率编码,求出此信源符号概率对应的香农编码。 3、编程方法: 据课本上的介绍编码香农码的方法。 首先,给定信源符号概率,要先判断信源符号概率是否满足概率分布,即各概率之和是否为1,如果不为1就没有继续进行编码的必要,虽然任可以正常编码,但编码失去了意义。 其次,对信源符号概率进行从小到大的排序,以便进行下一步。从第一步就知道信源符号的个数n,于是构造一个nx4的零矩阵D,以便储存接下来运算的结果。把排好序的信源符号概率以列的形式赋给D的第一列。 再次,做编码的第二步,求信源符号概率的累加概率(方法见程序),用来编写码字。 接着求各信源符号概率对应的自信息量,用于求解码长k。 然后,我们对刚求的自信息量对无穷方向取最小正整数,得到的最小正整数就是该信源符号所对应编码的码长k,有了码长,接下来就可以求解码字。 最后,对所求到的累加概率求其二进制,取其小数点后的数,所取位数由该信源符号对应的码长决定,所用的步骤结束,依次得到各信源符号的香农编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值