还记得在上一篇博客中,我们讨论的离散无记忆信源的等长编码吗,我们最后得到的结论是 —— 如果使用等长编码,那么对典型序列编码的编码效率是最高的。然而,要满足较高的编码效率,同时还要保证误码率的情况下,等长编码中要求的 JJJ 将会相当大。这显然在实际中是难以实现的,不仅占用的缓存大而且会造成延时。
但换一个思路:在实际信源中,每一个符号出现的概率都不一定相等,如果我们把出现概率高的符号,用更短的码字表示;对出现概率较低的符号用较长的码字表示,这样编码效率不就上去了吗!这就是不等长编码。本文主要介绍霍夫曼编码的具体流程。


我们直接以一个例子开始讲解霍夫曼编码:

对于一个离散信源 [Si:S1S2S3S4S5S6P(Si):0.240.200.180.160.140.08]\begin{bmatrix} S_i: & S_1 & S_2 & S_3 & S_4 & S_5 & S_6 \\ P(S_i): & 0.24 & 0.20 & 0.18 & 0.16 & 0.14 & 0.08 \end{bmatrix}[Si​:P(Si​):​S1​0.24​S2​0.20​S3​0.18​S4​0.16​S5​0.14​S6​0.08​]如果我们要用一个三进制(D=3D = 3D=3)的码元集:{C:0,1,2}\{C: 0, 1, 2\}{C:0,1,2} 进行编码。

【第一步】我们首先将离散信源的概率降序排列。如下:(本题只是恰好他给出来的就是降序的)

【第二步】:然后,我们把概率最低的 D 个符号分别记为 C0,C1,C2C_0, C_1, C_2C0​,C1​,C2​,然后把这最小的 D 个概率相加。如下:

【第三步】现在因为合并了三个最小的概率,所以我们现在只剩下四个概率值:0.24, 0.20, 0.18和0.38。那么还是按照第一步的办法,继续将这四个概率降序排列。

【第四步】按照第三步的方法,对概率值最小的 D 个符号分别用 C0,C1,C2C_0, C_1,C_2C0​,C1​,C2​ 表示,然后把这三个最小的概率相加:

【第五步】现在我们发现:最后就只剩下两个概率值了。但是我们一般希望合并到最后能够剩下 DDD 个概率值。也就是现在还差一个概率。这时,我们可以就要回到第一步,首先对信源进行改造—— 给它额外加上一个虚假符号 S7′S_7'S7′​,这个虚假符号的概率值是 0.如下:

[Si:S1S2S3S4S5S6S7′P(Si):0.240.200.180.160.140.080]\begin{bmatrix} S_i: & S_1 & S_2 & S_3 & S_4 & S_5 & S_6 & S_7' \\ P(S_i): & 0.24 & 0.20 & 0.18 & 0.16 & 0.14 & 0.08 & 0 \end{bmatrix}[Si​:P(Si​):​S1​0.24​S2​0.20​S3​0.18​S4​0.16​S5​0.14​S6​0.08​S7′​0​]
【第六步】:重新执行一开始的【第一步】 至 【第四步】得:

【第七步】回溯,编码。我们先从最后的 0.54, 0.24 和 0.22看起。首先看 0.54,它的编码现在是0对吧。然后我们看 0.54是哪里来的—— 噢!是第二层 0.20 + 0.16 + 0.18 的结果,因此,第二层的 0.20 目前的编码就是 00;0.18的编码就是 01;0.16的编码 02;然后我们看第二层的 0.20是哪里来的 —— 噢!他直接就是第一层 S2S_2S2​ 的 0.20,所以 S2S_2S2​ 的编码就是 00。以此类推。


\quad


至此,霍夫曼编码就完成啦!那么大家可能会有疑问—— 为啥霍夫曼编码要加上虚假符号呢?其实,通过增加虚假符号,可以减少码字的平均字长,从而提高编码性能。因此通过刚刚的流程我们也有了一个直观的认识:概率越小的符号,他被合并的次数越多,从而对他编码的环节也越多,导致概率小的符号所编码出来的码字长度比较长。那么,如果加上了虚假符号,就可以使得大概率的那些符号所经过的编码环节尽可能少,那么大概率符号的码字长度就减小了。从而编码有效性就上去了。

上例中,增加了虚假符号之后的编码输出的平均码长(单位是:码字符号/信源符号)为:0.24×1+0.20×2+0.18×2+0.16×2+0.14×2+0.08×2+0×2=1.760.24\times 1 + 0.20\times 2 + 0.18 \times 2 + 0.16 \times 2 + 0.14 \times 2 + 0.08 \times 2 + 0 \times 2 = 1.760.24×1+0.20×2+0.18×2+0.16×2+0.14×2+0.08×2+0×2=1.76

而如果不加虚假符号,输出的平均码长是 2(码字符号 / 信源符号)

最后需要注意的是:在对合并后的信源进行重新降序排列时,应使合并得到的局部概率和尽量处于相同概率值的最高位置。这样可以使得合并的元素重复编码次数减少,使得码字长度更为均匀。

【通信原理 入坑之路】—— 信息论部分 离散无记忆信源的不等长编码 之 霍夫曼编码过程详解相关推荐

  1. 【通信原理 入坑之路】——信息论部分 之 离散无记忆信源的等长编码

    课本上的讲解公式实在是太多啦!看得人头大,那么本文试图从繁杂的公式中梳理一下几种等长编码的方法,并在最后给出一些解题技巧.我们开始吧! 文章目录 离散无记忆信源的等长编码 1.1 单符号等长编码 1. ...

  2. 【通信原理 入坑之路】—— 信号的包络分析2 包络分析的意义以及OQPSK调制的引入

    本篇 B l o g Blog Blog 是接上一篇未完的分析而作的,主要是继续深入理解信号包络以及包络的意义.同时,本篇 B l o g Blog Blog 是<深入浅出通信原理>的学习 ...

  3. 【通信原理 入坑之路】—— 详解IQ调制以及星座图原理

    写在前面:本博客是<深入浅出通信原理>的学习笔记,仅供个人学习参考使用 文章目录 一. IQ调制与解调的原理与过程 1.1 利用旋转向量理解IQ调制(正交调制) 1.2 利用旋转向量理解I ...

  4. 【通信原理 入坑之路】—— 理解 4G,5G中的天王山:OFDM【学习笔记4】

    今天将要讨论的部分个人感觉非常绕,博主也是在阅读了大量相关书籍和文献之后才有所体悟.如有表述不当之处欢迎大家在评论区斧正! 在上一篇博文中,我们知道串并转换使得OFDM的符号速率降低了,可是总体符号传 ...

  5. 【通信原理 入坑之路】——深入、详细地理解通信里面“卷积”概念

    文章目录 一.多项式乘法和"卷积" 二."卷积"的计算公式 2.1 实例:利用卷积计算两个信号相乘 三.卷积的生动理解 3.1 卷积能够用来解决什么问题? 3. ...

  6. 【通信原理 入坑之路】—— 模拟信号的数字编码 之 PCM编码(A律13折线和μ律15折线的编译码剖析)

    引言: 在我们的数字通信系统中,一般要发送的绝大多数都是模拟信号.而所谓数字通信,传递的就应该是数字信号.因此,我们首先要对这个待发送的模拟信号进行采样(这在我之前<信号与系统>的相关博客 ...

  7. 【通信原理 入坑之路】—— 数字载波传输系统 之 2PSK(二进制相移键控)2ASK(二进制幅度键控)的超详细分析

    在之前的文章里面,我们讨论过数字基带传输系统,他们指的是传输二进制脉冲成型信号.然而,在绝大部分场合,我们需要将数字基带信号装载到高频载波上(也就是我们所说的调制),通过天线等将高频波发射出去.这就是 ...

  8. 信息论霍夫曼编码c语言,霍夫曼编码

    <信息论与编码>课程实验报告 姓 名 学 号 单 位 专 业 2014 年 12 月 4 日 实验一 一.实验目的 1.理解信源编码的意义: 2.掌握霍夫曼编码的方法及计算机实现: 二.实 ...

  9. 信息论 哈夫曼编码 与 菲诺编码的实现(对一幅BMP格式的灰度图像(个人 证件照片)进行二元霍夫曼编码和译码。并进行编码效率的计算,对一幅BMP格式的灰度图像进行二 元Fano编码、译码 )

    信息论 哈夫曼编码 与 菲诺编码的实现(对一幅BMP格式的灰度图像(个人 证件照片)进行二元霍夫曼编码和译码.并进行编码效率的计算,对一幅BMP格式的灰度图像进行二 元Fano编码.译码 ) 原始图片 ...

最新文章

  1. 01--安装Activiti流程设计器eclipse插件
  2. 配置Memcache服务器并实现主从复制功能(repcached)
  3. 如何通过httpd和DVD ISO在RHEL上配置yum本地源
  4. 中小企业邮件系统选型攻略
  5. [教程指导]索尼官方4.0.3系统一键root方法! [复制链接]
  6. 嵌入式linux段错误,在嵌入式Linux上使用C Std Lib时出现异常的段错误
  7. Python Hello World入门 - Python零基础入门教程
  8. android post、get请求数据
  9. Linux学习教程,Linux入门教程(超详细)| 网址推荐
  10. golang 线程 Java线程_Java线程只能有上千个,而Go的Goroutine能有上百万个
  11. 华为首次赶超苹果;拼多多遭调查;Google 计划推中国版搜索引擎 | 极客头条
  12. centos6.8 配置mysql赋予mysql远程连接权限
  13. 使用Mapnik生成地形图——thematicmapping.org译文(四)
  14. Mongoose学习参考文档
  15. JAVA 汉字转化中文拼音
  16. 计算机图形学概论论文5000字,关于计算机图形学探究的论文
  17. C语言编程>第十六周 ① 给定程序的功能是求1/4的圆周长。函数通过形参得到圆的直径,函数返回1/4的圆周长(圆周长公式为:L=Πd,在程序中定义的变量名要与公式的变量相同)。
  18. google hacking
  19. 卫星追踪利器 OpenATS简介
  20. 资料分享:TI AM5708平台特点和典型应用

热门文章

  1. 用Matlab的.m文件运行 Simulink 搭建的子系统,对子函数进行输入赋值,运行,输出读取
  2. 向量组等价、矩阵等价与方程组可互推的关系
  3. 超级计算机方程式,超级计算机重建宇宙从大爆炸到今天
  4. 访问他人mysql数据库_怎么连接访问他人的MYSQL数据库?
  5. 药品计算机系统培训试题,药品经营质量管理规范培训测试题
  6. 2020年中国工业传感器市场年度报告
  7. 【设计模式】抽象工厂模式 Abstract Factory Pattern
  8. 调优之网络调优-网卡绑定
  9. 嵌入式和Python(一):python环境搭建的详细步骤
  10. linux操作记事簿