寻找没有动态分配STM32的C数据压缩实现

时间:2018-08-03 08:57:25

标签: stm32 lossless-compression

我正在寻找可以在STM32L4上运行的无损数据压缩算法实现。数据是ECG曲线(因此基本上是一组彼此相对接近的16位数值)。

我发现了不同的实现方式,例如miniz,但是它们都使用动态内存分配(我想避免这种方式),并且也非常复杂且消耗资源。

我已经读过this post,但实际上并没有答案。我想避免修改现有实现以摆脱动态分配,因为该功能(数据压缩)不是我的主要任务。

我不需要先进的算法,而是一种简单的,资源有限的算法,即使在压缩率不是最佳的情况下,通过空中发送数据时也可以节省一些带宽。

您对适合的算法有任何想法吗?

2 个答案:

答案 0 :(得分:1)

我正在使用https://github.com/pfalcon/uzlib

它使用malloc,但是很容易修改和使用固定大小的缓冲区。

尝试一下。

答案 1 :(得分:0)

根据您的数据示例,您可以进行自己的非常简单的压缩,没有外部库,速度更快,并且压缩率可能更高。

如果查看数据,数字之间的差异通常小于8位整数(int8_t)的大小,整数可以处理-128 .. + 127之间的数字。

这意味着,如果范围在-127 .. + 127之间,则可以始终存储这些数字之间的差异。

数字-128(0xff)可能是魔术,这意味着该数字后面将带有一个16位数字。这个幻数还将在开始时用作同步数。

或者使用而不是8位数字4位数字(但这会稍微复杂一点)(魔术数字将为-8,并将范围存储在-7 .. +7中。您将一个数字存储在两个字节中。 / p>

因此,在您的示例中:

input    |  output 8bit  |  output 4bit
int16    |  int8  int16  |  int4  int16
---------+---------------+---------------
  -12    |  -128    -12  |    -8    -12
  -12    |     0         |     0
  -12    |     0         |     0
  -11    |     1         |     1
  -15    |    -4         |    -4
   -8    |     7         |     7
  -16    |    -8         |    -8    -16
  -29    |   -13         |    -8    -29
   28    |    57         |    -8     28
  169    |  -128    169  |    -8    141
  327    |  -128    327  |    -8    158
  217    |  -110         |    -8    217
  -79    |  -128    -79  |    -8    -79
  -91    |   -12         |    -8
  -59    |    32         |    -8    -59
  -41    |    18         |    -8    -41
  -36    |     5         |     5
  -29    |     7         |     7
  -26    |     3         |     3
  -24    |     2         |     2
  -22    |     2         |     2
  -19    |     3         |     3
  -14    |     5         |     5
  -14    |     0         |     0
  -12    |     2         |     2
  -10    |     2         |     2
  -10    |     0         |     0
   -5    |     5         |     5
   -2    |     3         |     3
    1    |     3         |     3
    5    |     4         |     4
   10    |     5         |     5
   15    |     5         |     5
   17    |     2         |     2
   21    |     4         |     4
   22    |     1         |     1
   20    |    -2         |    -2
   20    |     0         |     0
   15    |    -5         |    -5
    9    |    -6         |    -6
    2    |    -7         |    -7
   -6    |    -8         |    -8    -6
---------+---------------+---------------------
   42    |    42      4  |    42    11     count
   84    |    42      8  |    21    22     bytes
   84    |        50     |       43        bytes total
  100%   |        60%    |       51%       compression ratio

因此,如您所见,使用非常简单的算法,您可以获得很好的结果。

还可以找到该算法的其他改进,例如将相同数据分组,或者还可以在幻数之后压缩16位数据。例如,在幻数之后,您可以指定后跟16位的数字(未压缩的数字)

但是一切都取决于您的数据。