前言
由于这一专栏算是我本科通信专业知识的总结,构建一个完备的通信系统是我的目标,且信源编码又是其中非常重要的一节,所以必须总结一下。但又由于不同的信源系统对应的信源编码是大相径庭的。所以这篇文章就作类似科普一般的文章,并且会附上基于MATLAB实现的Huffman Coding,希望通信小白可从这篇文章构建信源编码的知识网并实现Huffman Coding。
目录
4.2 完整的Huffman Coding编码译码MATLAB实现
一、信源编码
正如在本专栏量化一篇中讲到,信源编码是高度关系到信源的,不同的信源可能对应完全不同的信源编码方案。信源编码的首要目的如 移动通信原理与系统 一书中所表述的一样: “通常,对于一个数字通信系统而言,信源编码位于从信源到信宿的整个传输链路中的第一个环节,其首要目的就是通过压缩信源产生的冗余信息,降低传递这些不必要信息的开销,从而提高整个传输链路的有效性。” 打个比方,你想要的从你的电脑上发送 Game of Thrones 给你的另一台设备,假设一个字母一个字节(8bits),想想你得传多少个bits。但是我们知道,小说里字母出现的概率是很不一样的,通常来说e出现的次数最多,z出现次数最少,而出现次数最多的e理论上最好用更少的比特数去表示,这样就有可能减少传输的比特数。这就是一个简单的信源编码思想。
而目前非常广为流传的编码技术主要有以下三种:
1. Huffman Coding
2. 算数编码
3. LZ 编码(注意,LZ编码是一系列编码,常见的如LZ-78)
还是如上所说,不同信源可能对应完全不同的方案,如3G系统中视频信源编码主要是H.264,2G/3G 系统中的话音信源编码有CELP,AMR等。它们根据信源的特点设计了更行之有效的编码技术。但是这不代表上三种没有学习必要,他们能用于非常广泛的领域,比如我们今天MATLAB实现的Huffman Coding会用于zip压缩技术中。
二、Huffman Coding - 按步骤直接实现
2.1 Huffman Coding步骤
首先我们来按直觉实现一次Huffman Coding,然后再介绍如何用二叉树思想实现,你会发现二叉树思想实现地会更方便简单。
Huffman Coding是一种Prefix-free Coding,若要从数学上深度学习Source Coding可以看下面这个MIT的网课:
麻省理工 数字通信原理 I (MIT 6.450, Principles of Digital Communications I)【英】_哔哩哔哩_bilibilihttps://www.youtube.com/playlist?list=PL2AD004D035C24F21讲师:Prof. Lizhong Zheng, Prof. Robert Gallager课程地址:https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-450-principles-of-dihttps://www.bilibili.com/video/BV1Qt411Y7BA在Chapter2 和 Chapter3章节,有足够的数学细节。而且是全英文的可以锻炼自己的听力(好像有中英字幕版)。在此推荐一下。而这篇文章就不涉及更多的数学细节了。
Huffman Coding的主要流程非常简单,就以下三步:
1. 计算出你要编码的所有符号的出现概率,并按从大到小(从小到大也可以)降序排列。
[MATLAB] 对应MATLAB可以使用以下函数:
sort(A,dim,mode); A 是矩阵,dim=1则按列,dim=2则按行,mode可为'ascend' ,‘descend’
sortrows(A,mode); 和上面不同的是,sort会每一列/行都排序,而sortrows只排序第一列/行,其他列/行会像随从一样跟着动。
2.把最小的两个概率相加,形成新的一个合并概率,并将这个合并概率与原来的除最小两个概率的其他概率进行相同的排序方式。(注意,若合并概率和原来的概率有数值相同的,则将合并概率放在上面,原来的概率放下面)
[MATLAB] 算法
一般正常的方法是,等全部概率操作完,也即合并概率变为1时,再从最远处开始编码。但是我在MATLAB实现中,每两个概率相加就进行编码,这时候分四种情况和应对手段:
1.若这两个概率都不是合并概率,则给这两个概率所表示的字符编码'0'或'1'(比如概率大的为1小的为0,反之亦可),并且将这两个概率所表示的字符存储起来。(为什么存储起来后面就知道了)【比如下面我将全部以概率大的编码'1',小的编码'0'来操作】
2.若这两个概率都是合并概率,意味着它们一定来源于先前编码的字符的加和,所以分别给这两个合并概率的来源字符编码'0'或'1'。所以在第一步会有存储字符的操作,因为到时候我们要给来源编码,我们得知道来源。
3.一个是合并概率一个不是合并概率的情况有两种,也即合并概率数值较大或者较小,应对方法就是对合并概率的来源进行'0'或'1'的编码,并对另一个概率代表的字符编码'0‘或'1‘。
3. 计算到合并概率为1时,停止编码。(意味着到头了)