4

我需要一个针对受限资源环境(如二进制(十六进制数据)上的嵌入式系统)优化的 FAST 解压缩例程,具有以下特征:

  1. 数据面向 8 位(字节)(数据总线为 8 位宽)。
  2. 字节值的范围不是从 0 到 0xFF,而是在每个 DataSet 中具有泊松分布(钟形曲线)。
  3. 数据集是高级固定的(要刻录到 Flash 中),每组很少 > 1 - 2MB

压缩可能需要尽可能多的时间,但在最坏的情况下,一个字节的解压缩应该需要 23uS,并且内存占用最少,因为它将在嵌入式系统(3Mhz - 12Mhz 内核,2k 字节 RAM)等受限资源环境中完成.

什么是好的减压程序?

基本的运行长度编码似乎太浪费了——我可以立即看到,在压缩数据中添加一个标头集以使用未使用的字节值来表示经常重复的模式会带来惊人的性能!

对于只投入了几分钟的我来说,肯定已经存在来自喜欢这些东西的人的更好的算法吗?

我想有一些“准备就绪”的示例在 PC 上试用,以便我可以比较基本 RLE 的性能。

4

6 回答 6

4

如果您有预设的值分布,这意味着每个值的概率在所有数据集上都是固定的,您可以使用固定代码创建霍夫曼编码(代码树不必嵌入到数据中)。

根据数据,我会尝试使用固定代码或 lz77 的 huffman(参见 Brian 的链接)。

于 2009-08-29T17:37:12.973 回答
4

当性能是唯一关注点时,我使用的两种解决方案:

  • LZO拥有 GPL 许可证。
  • liblzf拥有 BSD 许可证。
  • miniLZO.tar.gzLZO只是重新打包成更适合嵌入式开发的“缩小”版本。

解压时两者都非常快。我发现这将创建比大多数情况下LZO略小的压缩数据。liblzf您需要对速度进行自己的基准测试,但我认为它们“基本相同”。两者都比 快光年zlib,尽管两者都没有压缩(如您所料)。

LZO, 特别是miniLZO, 并且liblzf都非常适合嵌入式目标。

于 2009-09-12T04:07:20.433 回答
2

好吧,我想到的主要两种算法是HuffmanLZ

第一个基本上只是创建一个字典。如果您充分限制字典的大小,它应该会非常快......但不要指望非常好的压缩。

后者通过向输出文件的重复部分添加反向引用来工作。这可能需要很少的内存来运行,除了您需要使用文件 i/o 来读取反向引用或将最近读取的数据块存储在 RAM 中。

如果重复的部分往往彼此靠近,我怀疑 LZ 是你最好的选择。正如您所提到的,霍夫曼的工作原理是拥有一本经常重复的元素的字典。

于 2009-08-28T19:55:39.493 回答
2

由于这似乎是音频,我会查看差分 PCM 或 ADPCM 或类似的东西,这会将其减少到 4 位/样本而不会造成太大的质量损失。

使用最基本的差分 PCM 实现,您只需存储当前样本和累加器之间的 4 位有符号差异,并将该差异添加到累加器并移动到下一个样本。如果差异超出 [-8,7],则必须限制该值,并且累加器可能需要几个样本才能赶上。解码速度非常快,几乎不使用内存,只需将每个值添加到累加器并输出累加器作为下一个样本。

对基本 DPCM 的一个小改进是使用查找表将 4 位值解码到更大的非线性范围,以帮助累加器在信号变得更大声和更高音调时更快地赶上,在该范围内它们仍然相距 1,接近于零,但以更大的增量向极限增加。和/或您可以保留其中一个值来切换乘数。决定何时使用它由编码器决定。通过这些改进,您可以获得更好的质量,或者每个样本使用 3 位而不是 4 位。

如果您的设备具有非线性 μ-law 或 A-law ADC,您可以获得与 11-12 位和 8 位样本相当的质量。或者你可以在你的解码器中自己做。http://en.wikipedia.org/wiki/M-law_algorithm

可能有便宜的芯片已经为你做了这一切,这取决于你在做什么。我没有调查任何。

于 2009-08-29T20:10:49.797 回答
1

您应该使用带有命令行开关的压缩软件工具或可以尝试不同算法的压缩库来尝试不同的压缩算法。为您的应用使用典型数据。然后您就知道哪种算法最适合您的需求。

于 2009-08-29T17:54:41.800 回答
1

我在嵌入式系统中使用 zlib 作为引导加载程序,它在启动时将应用程序映像解压缩到 RAM。许可证非常宽松,没有 GPL 废话。它确实进行了一次 malloc 调用,但在我的情况下,我只是用一个返回指向静态块的指针的存根和相应的 free() 存根替换了它。我通过监视它的内存分配使用来获得正确的大小来做到这一点。如果你的系统可以支持动态内存分配,那就简单多了。

http://www.zlib.net/

于 2009-09-05T13:01:46.670 回答