霍夫曼编码简介

本专栏目录:全球SAR卫星大盘点与回波数据处理专栏目录

算法科普:有趣的霍夫曼编码

前言

霍夫曼编码 ( Huffman coding ) 是一种可变长的前缀码。霍夫曼编码使用的算法是 David A. Huffman 还是在 MIT 的学生时提出的,并且在 1952 年发表了名为《 A Method for the Construction of Minimum-Redundancy Codes 》的文章。

编码这种编码的过程叫做霍夫曼编码,它是一种普遍的熵编码技术,包括用于无损数据压缩领域。

霍夫曼编码过程

霍夫曼编码使用一种特别的方法为信号源中的每个符号设定二进制码。出现频率更大的符号将获得更短的比特,出现频率更小的符号将被分配更长的比特,以此来提高数据压缩率,提高传输效率。

以字符串 ” ABAABACD “ 为例进行说明。

首先,按照字符出现的比例,从高往低对字符进行排序。


然后,按出现比例低的顺序查找两个字母。在这种情况下,它是 “ C ” 12.5% 和 “ D ” 12.5% 。

通过一条线连接两个字母拼构成一个树状结果。将两个字母合并为 “ C 或 D”,并将出现比率相加起来。


按照同样的操作,将合并后的 “ C 或 D ” 视为一个字符,重复相同的操作。

在 “ A " “B” " C 或 D " 三个中,按照出现比例低的顺序查找两个字母。


这样,所有的字母都变成了" A 或 B 或 C 或 D" ,出现的比率为 100% 。

图 4 就是霍夫曼编码的树结构。

接下来再次显示各个字母出现的比率,同时使用 0 和 1 进行编码,代码 0 和 1 分别分配给上下延伸的分支。


分配完毕后,从树的根部遍历每个字符并确定相应的代码。

  • 在 ” A “ 的情况下,被分配的代码为 ” 0 “
  • 在 ” B “ 的情况下,被分配的代码为 ” 10 “
  • 在 ” C “ 的情况下,被分配的代码为 ” 110 “
  • 在 ” D “ 的情况下,被分配的代码为 ” 111 “


就这样,通过这样的编码规则, ” ABAABACD “ 的二进制编码就变成了 ” 01000100110111 “,只需要 14 个比特就能表示,比单纯的使用 2 比特表示一个字符缩短了很多。

转载自:https://zhuanlan.zhihu.com/p/63362804

### 基于BSC信道的霍夫曼编码MATLAB实验 #### 1. 霍夫曼编码简介 霍夫曼编码是一种用于数据压缩的有效前缀码,通过构建霍夫曼树来分配较短的代码给更频繁出现的数据项。这种方法可以显著减少传输所需的信息量。 #### 2. BSC信道特性概述 二进制对称信道(Binary Symmetric Channel, BSC)是一个具有两个可能输入和输出状态{0, 1}的理想化模型,在该信道中比特翻转的概率为p,保持不变的概率为(1-p)[^1]。 #### 3. 实现过程描述 为了完成此实验,需要先定义消息源的概率分布并据此创建相应的霍夫曼字典;接着模拟经过BSC后的接收端解码流程。下面给出具体实现方法: - **生成随机序列**:按照指定的消息源概率分布产生一系列待发送位串; - **应用霍夫曼编码器**:依据预先建立好的映射关系将原始信号转换成变长编码形式; - **引入噪声干扰**:假设存在一个已知交叉误差几率p的BSC环境作用于此编码流之上; - **执行译码操作**:尝试恢复原样或尽可能接近真实的发射内容; - **评估性能指标**:统计误码率等参数以衡量整个系统的有效性[^1]。 #### 4. MATLAB代码实例 以下是完整的MATLAB脚本示例,展示了上述各阶段的具体实施方式: ```matlab % 参数设置 source_prob = [0.9 0.1]; % 消息源符号发生概率 num_bits = 1e5; % 总共产生的bit数 error_rate = 0.1; % 设定BSC中的错误概率 p % 步骤一:根据给定概率生成随机序列 data_stream = randi([0 1], num_bits, 1); for i=1:length(data_stream) if data_stream(i)==0 && rand< source_prob(2)/(sum(source_prob)) data_stream(i)=1; elseif data_stream(i)==1 && rand<source_prob(1)/ (sum(source_prob)) data_stream(i)=0; end end % 步骤二:构造霍夫曼表 & 编码 symbols = {'A','B'}; [sym_code,huffman_dict]=huffmandict(symbols,source_prob); encoded_signal = huffmanenco(char(double(data_stream)+65), huffman_dict); % 步骤三:添加BSC影响 noisy_encoded_signal = encoded_signal; flip_indices = randperm(length(encoded_signal)); num_flips = round(error_rate * length(flip_indices)); if ~isempty(num_flips) noisy_encoded_signal(flip_indices(1:num_flips))=~double(noisy_encoded_signal(flip_indices(1:num_flips))); end % 步骤四:解码接收到的数据包 decoded_data=huffmandeco(noisy_encoded_signal,huffman_dict)-65; % 步骤五:计算BER ber=sum(abs(int8(decoded_data-data_stream')))/length(data_stream) disp(['The Bit Error Rate is ', num2str(ber)]); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lightninghenry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值