我正在寻找一种可以在STM32L4上运行的无损数据压缩算法实现。数据是ECG曲线(因此基本上是一组16位数值,彼此相对接近)。
我发现了不同的实现,例如Miniz,但它们都使用动态存储分配(我想避免),而且也非常复杂和消耗资源。
我读过这篇文章,但没有真正的答案。我希望避免修改现有实现以摆脱动态分配,因为此功能(数据压缩)不是我的主要优先事项。
我不需要最先进的算法,而是需要一个简单的、资源有限的算法,以便在通过空中发送数据时节省一些带宽,即使压缩比不是最好的。
你有什么合适的算法吗?
根据您的数据示例,您可以进行自己的非常简单的压缩,无需外部库,速度更快,压缩比可能更好。
如果查看数据,数字之间的差异通常小于8位整数(int8\u t)的大小,该整数可以处理-128之间的数字。。127
这意味着,如果范围在-127之间,则可以始终存储这些数字之间的差值。。127
数字-128(0xff)可以是魔法,这意味着该数字后面将跟一个16位数字。这个神奇的数字也将被用作同步数字和开始。
或者使用8位数字代替4位数字(但这将稍微复杂一些)(幻数将为-8,它将范围存储在-7.7中。您将两个数字存储在一个字节中。
所以,在你的例子中:
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位数字(未压缩数字)的数量
但一切都取决于你的数据。
我正在使用https://github.com/pfalcon/uzlib
它使用malloc,但很容易修改和使用固定大小的缓冲区。
看一看,试试看。
我目前正试图为我正在从事的一个项目实现一种无损数据压缩算法。目标是压缩浮点值的固定大小列表。代码必须用C编写,不能使用动态内存分配。这让我很伤心,因为大多数无损算法(如果不是全部的话)都需要一些动态分配。 我一直在研究的两个主要算法是哈夫曼算法和算术算法。如果没有动态内存分配,这个任务可能吗?你们有什么方法或想法吗?如果您认为不可能,请告诉我原因:-) 任何帮助/建议都会有帮助!
本文向大家介绍C语言 动态内存分配详解,包括了C语言 动态内存分配详解的使用技巧和注意事项,需要的朋友参考一下 C语言 动态内存分配详解 动态内存分配涉及到堆栈的概念:堆栈是两种数据结构。堆栈都是数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆(操作系
本文向大家介绍C语言实现树的动态查找实例代码,包括了C语言实现树的动态查找实例代码的使用技巧和注意事项,需要的朋友参考一下 C语言实现树的动态查找实例代码 本例演示一种树数据结构存储记录集合时的动态查找方法。首先程序通过construct()函数,利用已经存在的结构体数组数据建立一个二叉树,建立树的过程中,要保证每个节点的值都大于它的左子树上节点的值而小于它右子树所有节点的值,该函数返回建立树的根
本文向大家介绍C语言完美实现动态数组代码分享,包括了C语言完美实现动态数组代码分享的使用技巧和注意事项,需要的朋友参考一下 我们知道,C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量。 这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源。 请实现一个简单的动态数组,能够随时改变大小,不会溢出,也不会浪费内存空间。 下面的代码实现了简单的动态数组: 运行结果:
这是我的问题,简单来说: < li >我有一个C/C代码,C代表服务,C代表处理。 < li >我在C中有一个接口,它返回一个包含循环更新信息的结构RawData。 我有一个虚拟的母亲课程“动物” 我有一个已知的从母类继承的动物名单。 我有一个类“Building”,其中只有一个动物,但当我实例化该建筑时,我不知道它的类型 这就是我挣扎的地方: < li >在建筑物实例化期间,在不知道动物类型的情
本文向大家介绍go语言通过zlib压缩数据的方法,包括了go语言通过zlib压缩数据的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言通过zlib压缩数据的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Go语言程序设计有所帮助。