Floating point IEEE-754数据压缩算法

Floating point IEEE-754数据压缩算法,floating-point,compression,ieee-754,Floating Point,Compression,Ieee 754,有人推荐一种能很好地处理双精度浮点值的压缩算法吗?我们发现,浮点值的二进制表示法导致普通压缩程序(如Zip、RAR、7-Zip等)的压缩率非常低 我们需要压缩的数据是以单调递增顺序排序的8字节值的一维数组。这些值以开尔文表示温度,量程通常小于100度。值的数量从几百个到最多64K不等 澄清 数组中的所有值都是不同的,但由于浮点数的表示方式,字节级上确实存在重复 由于这是科学数据,因此需要一种无损算法。如果存储效率显著提高,则可以接受转换为具有足够精度(~5小数)的定点表示 更新 我发现了一篇

有人推荐一种能很好地处理双精度浮点值的压缩算法吗?我们发现,浮点值的二进制表示法导致普通压缩程序(如Zip、RAR、7-Zip等)的压缩率非常低

我们需要压缩的数据是以单调递增顺序排序的8字节值的一维数组。这些值以开尔文表示温度,量程通常小于100度。值的数量从几百个到最多64K不等

澄清

  • 数组中的所有值都是不同的,但由于浮点数的表示方式,字节级上确实存在重复

  • 由于这是科学数据,因此需要一种无损算法。如果存储效率显著提高,则可以接受转换为具有足够精度(~5小数)的定点表示

更新

我发现了一篇关于这个主题的有趣的文章。不确定该方法是否适用于我的要求


可以在相邻值之间进行增量计算吗?
测量值之间的变化量是否有限制?将此更改限制在某个最大速率值(以引入一些平滑为代价)是否可以接受

显然,来自热传感器的值的实际精度有一个限制,您需要存储64位精度,还是最好存储一个整数,比如0.01开尔文单位

如果你能忍受更多的错误,并且增长相对平稳,那么最好只将函数拟合到数据中,并只存储函数的几个项

编辑:
查看典型数据集,并查看相邻值之间的差异范围。然后看看你需要什么样的准确度来表示这一点

例如。 如果两个读数之间的最大差值为1deg,则可以将其中1/256的变化存储在一个字节中。如果需要存储更大的范围或更高的精度,请使用短距离除以某些因子。

因此,下一个读数将是=last_reading+(float)increment/256.0

您可以考虑使用熵编码器(Huffman、Shannon Fano、算术编码)对数据进行重新编码。但这只能在数据点多次重复并且知道哪些符号以何种概率出现的情况下提供良好的结果。

压缩算法依赖于重复和规则,而浮点数在这方面做得并不好

第一个问题是是否可以使用单精度浮点值,这将立即提供50%的压缩。很少有温度计精确到七位数,指数表示的温度远远低于我告诉你的实际温度

如果没有,你能过滤你的温度,把它们四舍五入到相当于N位的数字(更可能是N/.301位)吗?这可能会引入足够的规则性,使其变得有用


如果你真的需要为每个温度读数存储64位信息,并且所有的位都是有效的,并且不能从其他位预测,那么你就不能有效地压缩它

首先要考虑的是:在将数据转换为双精度之前,尝试压缩数据。请回复David Thornley,除非您的红外成像ADC有24个有效位,否则32位浮点应有足够的精度;只有您需要准确地保留后续处理产生的噪声,这才是一个问题。如果做不到这一点,可以想象,通过确定生成的值表并存储该表的索引,对处理进行反向工程是可行的

第二:如果你的压缩算法知道你的数据是8字节的数据块,它会更有效;这是因为它不会将最高有效字节与最低有效字节一起抛出。作为一种粗略的预处理方法,您可以尝试在每个double前面加上一个独特的字节(可能是ASCII逗号?),然后再通过基于字节的压缩器(如gzip)进行管道传输;这将导致更好的总压缩,即使中间流大12%。更简单但更努力的是编写适合此任务的压缩——可能使用8级树来表示双字节中每个字节的预期值


第三:由于图像数据高度冗余,某种形式的增量编码或其他与图像相关的压缩应该可以节省一些空间。然而,如果你要求无损压缩,它不会给你带来很大的收益,因为图像噪声本质上是不可压缩的。此外,正如上面所解释的,它也不能帮助您处理double的低有效位中的伪随机散列。

您列出的所有编码器都是面向字节的,并且被double的一些属性抛弃。一个是12位指数/符号的布局不能很好地处理字节边界,另一个是输入的噪音。第一部分很容易以多种方式处理,第二部分将限制任何无损压缩的有效性。我认为即使是最好的结果也不太令人惊讶,我不知道你的数据,但我怀疑你可以指望节省25%,或多或少

从我的头上看,也许没用,因为你已经想到了清单上的每件事

  • 将流视为64位整数,并对相邻值进行增量编码。如果有相同指数的值运行,它将有效地将其归零,可能还有一些高尾数位。会有溢出,但数据仍然只需要64位,操作可以重新设置

  • 在此阶段,您可以选择尝试一些粗略的整数预测,