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

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实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1

redis和redission分布式锁原理及区别说明

《redis和redission分布式锁原理及区别说明》文章对比了synchronized、乐观锁、Redis分布式锁及Redission锁的原理与区别,指出在集群环境下synchronized失效,... 目录Redis和redission分布式锁原理及区别1、有的同伴想到了synchronized关键字

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理