随机数值数据最有效的无损压缩?

问题描述 投票:0回答:3

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

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

任何人都可以建议一种 FOSS 数据压缩方法,它可以为我提供最大程度的遥测数据压缩吗?

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

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

compression
3个回答
6
投票

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

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

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


4
投票

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

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

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

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

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

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


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


3
投票

此用例的最先进算法是pcodec。它在 Rust 中作为 FOSS 实现。

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

LZ77/78 算法每个数字大约需要 24 位,因为它们查看字节级别,并且会丢失尾数位中的大部分可压缩信息。

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

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

如果您的数字变化缓慢(例如,相邻值相似),pco 将应用 Delta 编码。根据数据变化的速度,这可能会以 dK 精度使用每个数字 2-8 位

© www.soinside.com 2019 - 2024. All rights reserved.