通信原理板块——数字数据压缩编码之霍夫曼编码

2023-10-21 07:12

本文主要是介绍通信原理板块——数字数据压缩编码之霍夫曼编码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、数字数据压缩编码基本原理
数据分为数字数据和模拟数据,此处的数据指的是数字数据或数字化后的模拟数据
(1)数字数据压缩编码要求
数据与语音或图像不同,对其压缩是不允许有任何损失,只能采用无损压缩的方式。压缩编码选用一种高效的编码表示信源数据,以减小信源数据的冗余度,即减小其平均比特数。并且,这种高效编码必须易于实现和能逆回原信源编码。
(2)熵编码
信源的熵的定义,表示信源中每个符号所含信息量的统计平均值。减小信源数据的冗余度,相当于增大信源的熵。编码称为熵编码
(3)信源字符表
一个有限离散信源可以用一组不同字符xi(i=1,2,……,N)的集合X(N)表示。X(N)称为信源字符表,表中的字符为x1,x2,……,xn。信源字符表可以是二进制的,也可使多字符的,非二进制字符可以通过一个字符编码表映射为二进制码字。标准的字符二级制码字是等长的
(4)等长码和变长码
等长码中表示每个字符的码字长度是相同的,但是各字符所含有的信息量是不同的。含信息量小的字符的等长码字必然有更多的冗余度。
为了压缩,通常采用变长码。变长码中每个码字的长度是不等的,字符的码长反比于此字符出现的概率。当多有字符以等概率出现时,编码才是等长的。
等长码可以通过计数的方法确定字符的分界,但变长码则不可以,接收端收到一长串变长码,不一定能确定每个字符的分界。
为了压缩数据,常采用变长码,以求获得高的压缩效果,常见编码方式有霍夫曼(Huffman)编码、香农-费诺编码等
2、霍夫曼编码(Huffman)
霍夫曼编码是一种无前缀变长码。对于给定熵的信源,霍夫曼编码能得到最小平均码长。在最小码长意义上,霍夫曼编码是最佳编码,也是效率最高的编码。
(1)一个霍夫曼编码的示例
以8个字符的信源字符表来说明下霍夫曼编码的编码方式
设信源的输出字符为x1,x2,x3,x4,x5,x6,x7,x8
对应概率分别为
P(x1)=P(x2)=1/4
P(x3)=P(x4)=1/8
P(x5)=P(x6)=P(x7)=P(x8)=1/16
采用霍夫曼编码的过程
①将8个字符按照概率不增大的次序排序
②将概率最小的两个信源字符x7和x8合并,将x7分配二进制“0”作为其码字的最后一个码元;x8分配二进制“1”作为其码字的最后一个码元
③x7和x8合并后的复合字符的概率为P(x7)+P(x8)=1/8,并将新得到一组字符按照概率不增大的次序排列,注意:新复合字符与x3和x4概率相同,可放置在x2和x5之间的任何位置,此例子放置在x4之后,替换x5;
④将排序后的x6和x7合并,按照概率不增大的次序排列;
⑤最终得到一个下述的树状图;
⑥从树的最右端向左追踪,即可得到编码输出码字
以x5的码字获得来描述下,图中红线为x5的路径,从树的最右端向左追踪可得到编码为0010;其余类似
在这里插入图片描述
(2)压缩比和编码效率
用压缩比和编码效率来反映压缩编码性能的指标
压缩比是压缩前(采用等长码)每个字符的平均码长与压缩后每个字符的平均码长之比
编码效率等于编码后的字符平均信息量(熵)与编码平均码长之比
以上述霍夫曼编码示例来计算
若采用等长码对信源字符编码,由于存在8(2^3)种字符,故码长为3
编码后的字符平均信息量(熵)的计算
H(x)=
P(x1)[-log2(P(x1))]+P(x2)[-log2(P(x2))]+
P(x3)[-log2(P(x3))]+P(x4)[-log2(P(x4))]+
P(x5)[-log2(P(x5))]+P(x6)[-log2(P(x6))]+
P(x7)[-log2(P(x7))]+P(x8)[-log2(P(x8))]
=2×1/4×[-log2(1/4)]+2×1/8×[-log2(1/8)]
+4×1/16×[-log2(1/16)]
= 2.75(b)
编码平均码长
n1×P(x1)+n2×P(x2)+n3×P(x3)+n4×P(x4)+
n5×P(x5)+n6×P(x6)+n7×P(x7)+n8×P(x8)
=2×0.25+2×0.25+3×0.125+3×0.125
+4×0.0625+4×0.0625+4×0.0625+4×0.0625
=2.75
故压缩比=
(压缩前(采用等长码)每个字符的平均码长)/压缩后每个字符的平均码长
=3/2.75=1.09
编码效率=
(编码后的字符平均信息量(熵))/(编码平均码长)
=2.75/2.75=100%

这篇关于通信原理板块——数字数据压缩编码之霍夫曼编码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/252793

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

java字符串数字补齐位数详解

《java字符串数字补齐位数详解》:本文主要介绍java字符串数字补齐位数,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java字符串数字补齐位数一、使用String.format()方法二、Apache Commons Lang库方法三、Java 11+的St

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Java的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente