整数时间序列压缩

时间:2014-10-02 20:36:09

标签: algorithm stream compression delta

是否有一个众所周知的(正)整数流/时间序列压缩的文档算法,它将:

  • 具有可变位长
  • 处理deltas

我的输入数据是来自传感器的温度测量流(更具体地说是由Arduino读出的TMP36)。在测量之间发生大的跳跃(传感器的时间常数)在物理上是不可能的。因此,我认为我的压缩算法应该适用于增量(基于流启动设置,然后只与下一个值建立差异)。由于间隙有限,我想要可变比特长度,因为低于4的差异适合2比特,低于3比特等等......但是在流中告知下一个增量的比特大小和只是工作,比方说,3比特的增量,只有当比较大时才能说出大小。

知道什么算法比一个算法解决了吗?

3 个答案:

答案 0 :(得分:1)

使用variable-length integers对值之间的增量进行编码,并将其提供给zlib以进行压缩。

答案 1 :(得分:0)

首先,存在不同的格式。我首先要做的一件事是摆脱这个标志。在考虑压缩时,标志通常会分散注意力。我通常使用这样的方案,其中每个正数为2 * v,每个负值仅为2 *( - v)-1。所以0 = 0,-1 = 1,1 = 2,-2 = 3,2 = 4 ....

由于使用该方案,您没有像0b11111111 = -1这样的前导位消失了。现在您可以考虑如何压缩这些符号/数字。您可以做的一件事是创建一个代表性样本并使用它来训练静态霍夫曼代码。这应该可以满足你的芯片限制。另一个更简单的方法是使用霍夫曼码进行比特长度并将比特写入流。所以0 =比特长度0,-1 =比特长度1,2,3 =比特长度长度2,....通过使用霍夫曼代码来描述这个比特长度,你就会变得非常紧凑。

我通常使用混合物。我使用最频繁的符号/值作为原始值,并通过使用实际值的位长+位模式使用不那么频繁的数字。这样你就可以保持紧凑,不必处理过多的表(64位长度只有64个符号)。

还有其他方案,例如前导位,例如每个字节的第一位(或最高位)标记值的最后一个字节,因此只要该位置位,整数就会有另一个字节。如果它为零,则为该值的最后一个字节。

我通常会为此目的训练静态霍夫曼代码。它很简单,甚至可以编码和解码成为源代码/从代码中生成源代码(只需创建ifs / switch语句并将代码写入代码中的数组)。

答案 2 :(得分:0)

您可以将整数压缩方法与增量编码的增量或增量一起使用,如TurboPFor Integer Compression中所使用的那样。如果增量值非常小,也可以使用Gamma编码。