当前位置: 首页 > 知识库问答 >
问题:

嵌入式轻量级(de)压缩算法

梁巴英
2023-03-14
    null
  • 解压缩算法的重要指标是数据的大小加上算法的大小(因为它们将驻留在相同的有限内存中)。
  • 可用于解压的RAM很少;可以将单个字形的数据解压缩到RAM中,但不能更多。
  • 为了使事情变得更加困难,算法必须在32位微控制器(ARM Cortex-M core)上非常快,因为字形在被绘制到显示器上时需要解压缩。每八位元组十个或二十个机器循环是可以的,一百个肯定太多了。
  • 为了使事情变得更容易,完整的数据语料库是先验已知的,并且在压缩阶段有大量的处理能力和可用内存。

结论和思考

  • 由于熵相对较高,仅仅通过某种变长编码对每个八位字节进行打包的幼稚方法不会产生好的结果。
  • 任何利用先前解压缩的数据的算法似乎都是不可能的,因为它不可能存储其他字形的解压缩数据。这使得LZ算法的效率较低,因为它们只能引用少量数据。
  • 对处理能力的限制似乎排除了大多数按位操作,即解压缩应该逐个字节地处理数据。这使得哈夫曼编码变得困难,算术编码变得不可能。
  • 这个问题似乎是静态字典编码的一个很好的候选问题,因为所有数据都是预先知道的,而且数据本质上有些重复(不同的字形共享相同的形状)。
    null

为了给出一些背景信息,我已经能够计算出的最好的有用算法如下:

  • 单个字形字体数据中的所有示例都串联(扁平化)到一维数组(向量、表)中。
  • 每个示例有三种可能的状态:0、255和“其他”。
  • 此信息被一次将五个连续的样本打包成一个5位数的基数为3的数字(0..3^5)。
  • 由于在八位元组(2^8=256,3^5=243)中有一些额外的值可用,所以它们用来表示0和255的较长字符串。
  • 对于每个“其他”值,实际值(1..254)存储在一个单独的向量中。

该数据解压缩速度很快,因为可以通过一个较小的(243×3=729个八位字节)查找表将基-3值解码为基-4值。压缩比高度依赖于字体大小,但在我的典型数据中,我可以得到大约1:2。由于这比LZ变体(约为1:3),我想尝试静态字典方法

当然,通常的LZ变体使用霍夫曼或算术编码,这自然会使压缩数据更小。另一方面,我有所有可用的数据,压缩速度不是问题。这将使找到更好的词典成为可能。

由于数据的性质,我可以使用有损算法,但在这种情况下,最有可能的有损算法将减少像素数据中的量化级别的数量。这不会太多地改变潜在的压缩问题,我想避免由此产生的位对齐麻烦。

共有1个答案

姚韬
2023-03-14

您可以考虑使用已经为类似于您的场景开发的东西

https://github.com/atomicobject/heatshrink

https://spin.atomicobject.com/2013/03/14/heatshrink-embedded-data-compression/

 类似资料:
  • 本文向大家介绍Android图片压缩(质量压缩和尺寸压缩),包括了Android图片压缩(质量压缩和尺寸压缩)的使用技巧和注意事项,需要的朋友参考一下 在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成

  • 我希望使用log4j2 RollingFileAppender和定制的压缩算法(ZStd)。 目前为止支持的压缩算法似乎是FileExtension枚举(zip,gz,bz2,...)中的压缩算法,请参见https://github.com/apache/logging-log4j2/blob/efa64bfad3f67c5b5fed6b25d65ef5ca2212011b/log4j-core/

  • 我试图找到一种压缩算法,我可以使用它来编码一个blob,只使用16个固定长度的符号(0b0000-0b1111)。 在没有任何压缩的情况下,我可以使用这16个符号对其各自的位值进行编码(例如,符号5(0b0101)对位0101进行编码,因此如果我的blob是100位长,我需要25个符号来表示它-但这样做不会提供压缩。 我认为我需要的是一个反向霍夫曼(在某种意义上,代码是固定长度的,但它代表可变长度

  • DEFLATE 是同时使用了哈夫曼编码(Huffman Coding)与 LZ77 算法的一个无损数据压缩算法,是一种压缩数据流的算法。任何需要流式压缩的地方都可以用。目前 zip 压缩文件默认使用的就是该算法。 关于算法的原理,以及 哈夫曼编码(Huffman Coding)与 LZ77 算法,感兴趣的读者可以查询相关资料,这里推荐 GZIP压缩原理分析——第五章 Deflate算法详解 序列文

  • 目录 1. 回调到php中 2. 错误处理 3. 初始化php 4. 覆写INI_SYSTEM和INI_PERDIR选项 5. 捕获输出 6. 同时扩展和嵌入 7. 小结 php的嵌入式能够提供的可不仅仅是同步的加载和执行脚本. 通过理解php的执行模块 各个部分是怎样组合的, 甚至给出一个脚本还可以回调到你的宿主应用中. 本章将涉及 SAPI层提供的I/O钩子带来的好处, 展开你已经从前面的主题

  • 通常没有必要改变这个对话框的设置,而且允许 WinRAR 自动选择优化参数是安全的。请注意不正确的使用这个对话框可能导致非常严重的运行和压缩损失,所以只有在您清楚您所作的时候,才能改变它的参数。 下面的这些设置大部分仅被 RAR 4.x 压缩格式支持。这些设置都不可用于 ZIP。只有 delta 压缩和 32 为可执行压缩可用于 RAR 5.0 压缩文件。 这个对话框包含下列选项。 文本压缩/(自