我正在寻找可以在STM32L4上运行的无损数据压缩算法实现。数据是ECG曲线(因此基本上是一组彼此相对接近的16位数值)。
我发现了不同的实现方式,例如miniz,但是它们都使用动态内存分配(我想避免这种方式),并且也非常复杂且消耗资源。
我已经读过this post,但实际上并没有答案。我想避免修改现有实现以摆脱动态分配,因为该功能(数据压缩)不是我的主要任务。
我不需要先进的算法,而是一种简单的,资源有限的算法,即使在压缩率不是最佳的情况下,通过空中发送数据时也可以节省一些带宽。
您对适合的算法有任何想法吗?
答案 0 :(得分:1)
答案 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位的数字(未压缩的数字)
但是一切都取决于您的数据。