嵌入式处理器之间使用哪种压缩(已知字节分布)

时间:2014-03-05 19:59:58

标签: c embedded compression

我正在开展无线电到无线电通信,其中带宽非常宝贵。这一切都完成了金属C代码(没有操作系统,小型atmel 8位微处理器)。因此,压缩的想法对于一些大型但罕见的传输变得很有吸引力。

我不是压缩专家。我已经使用命令行工具来缩小文件,看看我得到了多少。多年来连接了一两个图书馆。但从来没有这么低的水平。

在一个例子中,我想在处理器之间移动大约28K。如果我只是在一个代表性文件上做一个简单的bzip2 -9,我得到原始大小的65%。

但我很好奇我是否可以做得更好。我(天真地?)的印象是大多数基本压缩格式必须是前面的元数据声明,它描述了如何对随后的比特流进行充气。我不知道元数据本身占用了多少空间。我直方图说了同样的文件和其他一些文件,并发现由于传输的性质,直方图几乎总是大致相同。所以我很好奇我是否可以在我的代码中硬编码这些频率,以便它不再是动态的,但也不是作为数据包的一部分传输的。

例如,我对霍夫曼编码的理解是,通常预先有一个“字典”,然后是比特流。如果压缩器按块执行,每个块都有自己的字典。

除此之外,它是一个小型处理器,占用空间小,我想保持我做的小,简单和直接。

所以我想基本的问题是,你会在这种环境/场景中实现什么(如果有的话)基本压缩算法。特别是考虑到,你基本上可以预编译每个传输的字节代表直方图。

1 个答案:

答案 0 :(得分:0)

你所建议的,提供预设的频率数据,将会有所帮助。或者更可能会受到伤害,因为你会因为不使用最佳代码而受到打击。作为示例,在放气块的开始处仅需要大约80个字节来表示文字/长度和距离霍夫曼码。例如,18 KB的压缩数据略有增加可能很容易取消。

使用zlib,您可以使用代表性的28K消息之一作为字典来搜索匹配的字符串。如果您的消息中有许多常见字符串,这可以帮助压缩很多。请参阅deflateSetDictionary()inflateSetDictionary()