5

我的数据实际上并不是完全随机的。我正在寻找压缩遥测测量值,这些测量值往往在同一范围内(例如温度变化不大)。但是,我寻求一种适用于多种应用的解决方案,因此我可能会在一天发送温度,下一天发送电压,等等。

我想通过低数据速率卫星链路发送测量结果。SatCom 相当昂贵,所以我想尽可能地削减每一分钱。我不介意花费计算资源来打包和解包数据,因为没有什么是时间紧迫的(传输 192 个字节可能需要 30 秒)。

任何人都可以建议一种 FOSS 数据压缩方法,它会给我最大的遥测数据压缩吗?

值得尝试吗?我可以期待什么样的百分比收益?

抱歉,我无法更准确地了解数据的性质 - 只是一般的遥测测量,如温度、纬度/经度 GPS 位置、液体流速等。

4

3 回答 3

5

真正随机的数据是不可压缩的。

由于您无法透露数据的详细信息,因此最好的办法是在一些样本数据上测试几种不同的压缩算法。

一个很好的起点是DEFLATE 算法,它是 LZ77 滑动窗口压缩和 Huffman 编码的行业标准组合。它由许多特定的压缩包实现,GZIP就是一个突出的例子。

于 2012-11-15T02:32:34.213 回答
4

也许最好的解决方案是使用 DEFLATE 库并在大数据块上运行它并使用高压缩设置。

如果您想推出自己的流压缩算法,您可以应用适用于声音文件的相同算法:直接发送第一个测量值,然后对每个样本与前一个样本之间的差异进行编码(增量编码)。

现在,最佳编码会根据数据变化的速度而有所不同:

如果数据变化足够快,请使用自适应 Huffmann 树。如果差异不相关(数据+噪声),这将使您从熵中每个样本最多获得一位。

如果几个连续的数据样本可能彼此相等(数据变化不是很快并且没有 HF 噪声),则使用一棵 Huffmann 树对每个非零差异进行编码,并使用第二个 Huffmann 树编码零的数量. 这将使您每次运行最多获得两位。

您甚至可以仅将差异编码为一位(向上或向下),但是您需要能够对零长度运行进行编码。


我的建议:增量编码一次或两次以获得不相关的条目,然后使用库进行 DEFLATE。

于 2012-11-15T02:35:19.043 回答
2

这个用例的完美算法是分位数压缩。它在 rust 中以 FOSS 的名义实现q-compress

例如,假设您要无损传输一些 32 位浮点数据,例如温度,它们都是开尔文均匀分布在 275-300 范围内。

LZ77/78 算法每个数字大约需要 24 位,因为它们查看字节级别,并且会遗漏尾数位中的大部分可压缩信息。您可以在链接的博客文章中看到一个示例。

分位数压缩将使用每个数字大约 20 位(分布的实际熵;您需要 23 个尾数位中的大约 20 个,指数 8 对应于 256-512 范围来编码这些开尔文)。

您可以离散化以做得更好。在此示例中,32 位浮点数将为您提供小数点后 15 位的精度。如果您只关心 mK 的精度,则可以改为传输mK 的数值。这些将在 275000 和 300000 之间,并且分位数压缩可以将这些压缩到每个数字大约 15 位。如果您只关心开尔文的 dK (1/10) 精度,您可以缩小到每个数字 8 位

如果您的数字变化缓慢(例如,相邻值相似),您可以在离散化和分位数压缩之间进行Delta 编码。根据您的数据变化的速度,可以想象,这可以在 dK 精度下使用每个数字 2-8 位。

于 2021-09-18T15:46:40.183 回答