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

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

相关文章

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源