嵌入式数据采集压缩系统的设计
2020-08-12李醒飞杨少波李洪宇
魏 鹏,李醒飞,2,,3,杨少波,2,3,李洪宇
(1.天津大学,精密测试技术及仪器国家重点实验室,天津 300072;2.青岛海洋科学与技术试点国家实验室海洋观测与探测联合实验室,山东青岛 266237;3.天津大学青岛海洋技术研究院,山东青岛 266237;4.山东科技大学 机械电子工程学院,山东青岛 266590)
0 引言
剖面浮标作为一种海洋观测平台,其上搭载多种传感器,旨在通过在全球海洋布放卫星跟踪浮标,快速、准确、大范围地收集全球海洋上层的海水温度、盐度等剖面资料[1]。在剖面浮标嵌入式系统的数据采集、存储、通信过程中存在着诸多问题。例如剖面浮标在上浮过程中按照预定的时间间隔采集的海水温度、盐度、深度、标体内部电压、电流、气压等大量数据均存储在容量有限的TF卡中,一方面造成了数据冗余,存储空间使用紧张,通信效率低下,另一方面由于卫星通信方式费用高、单次通信容量有限(一般不超过几百个字节)[2],导致了较高的通信成本。因此,将剖面浮标的采集数据进行无失真压缩,是降低通信费用、提高通信效率、减少数据存储空间的一种行之有效的方法。
虽然目前已经开发了许多成熟的数据压缩算法,如基于统计模型的香农算法、Huffman算法、游程编码等,基于字典模型的LZ系列及其改进型的算法,国际上也制定了很多数据压缩标准,但针对不同的数据资料,其所包含的信源概率模型和冗余度表现形式都不一定相同,每种压缩方式都有其优越性和局限性,且嵌入式系统一般不具备PC机的环境,因此,本文根据海洋监测平台的数据特点,在两种不同压缩模型中各选取了一种较有代表性的压缩算法,开展对剖面浮标数据存储、通信数据的压缩应用研究[3]。
1 数据采集系统设计
剖面浮标嵌入式数据采集系统以球形玻璃浮体为传感器搭载平台,以STM32F429微控制器为主控单元,将传感器采集的数据进行解析、存储和发送。整个系统由电平转换电路、STM32控制器最小系统、数据存储模块、通信模块和电源模块组成,系统总体框图如图1所示。由于剖面浮标平台搭载多种传感器,本文选取较有代表性的温盐深仪(CTD)为例介绍数据采集过程。
图1 系统总体框图
1.1 电平转换电路
CTD传感器、铱星通信模块与主控板通过RS232串口通信,由于二者使用TTL电平,故需要经过MAX3232电平转换电路之后连接至主控板。MAX3232适用电压3~5.5 V,可以实现RS232到TTL电平转换。电平转换电路如图2所示。
图2 电平转换电路图
1.2 主控制器模块
STM32F429集成了Cortex-M4内核,工作频率为180 MHz,片上集成了多达20个通信接口,包括4个USART、4个速度达11.25 Mbit/s的UART、6个速度达45 Mbit/s的SPI、3个具有新型可选数字滤波器功能的I2C、2个CAN以及SDIO接口;它包含2个12位DAC、3个速度为2.4 MSPS或7.2 MSPS(交错模式下)的12位ADC;定时器多达17个,使用灵活的存储控制器可以轻松扩展存储范围,该控制器通过一个32位的并行接口可达到90 MHz的频率,能支持Compact Flash、SRAM、PSRAM、NOR、 NAND以及现在的SDRAM存储器[4]。STM32F429资源丰富,能够满足浮标体整体功能的需求。
1.3 数据存储模块
存储模块使用容量为8 GB的TF卡。TF卡又称microSD,是一种极细小的快闪存储器卡,体积小,容量较大,存取速度快,采用SanDisk最新NAND MLC技术及控制器技术。控制器对SD卡进行通信操作采用SDIO(安全数字输入/输出)接口。为了方便对数据的存储和管理,在主控系统中引入了串行Flash文件系统FatFs,它是建立在存储介质上的一种组织结构,这些结构包括操作系统引导区、目录和文件,是一个为小型嵌入式系统设计的通用FAT(file allocation table)文件系统模块[5]。存储模块电路图如图3所示。
图3 存储模块电路图
1.4 电源模块
剖面浮标采用大容量锂电池,输出电压可达28 V,需要降压之后才能供各模块正常使用。系统需要将电源电压VCC降至12 V后为CTD、铱星通讯模块供电、由12 V降至5 V后为浮标其他模块供电、由5 V降至3.3 V后为主控板、MAX3232、TF卡供电,电路图如图4所示。其中LMR33630是一种同步降压直流/直流转换芯片,能够使用高达36 V的输入电压驱动高达3 A的负载电流;MAX604是低压差线性稳压器,具有预置3.3 V电压的输出方式,其输出电流可达500 mA,功耗很低。
2 数据压缩系统设计
(a)VCC转12 V电路
(b)12 V转5 V电路
(c)5 V转3.3 V电路图4 电源模块电路
本系统设计中,采用的软件开发平台为集成开发环境Keil5软件,并使用ST官方的集成开发库。应用程序中主程序完成系统各个模块的初始化;数据采集及处理程序依据各传感器的通信协议,将采集的数据解析、存储;数据压缩模块将存储在TF卡中的TXT文件进行压缩;通信模块使用铱星通信,将压缩数据通过卫星传至岸站接收端,软件总体功能框图如图5所示。现将数据压缩程序部分作为重点做详细介绍。
图5 软件总体功能框图
数据压缩技术主要分为无损数据压缩和有损数据压缩两大类,为保证海洋监测数据的准确性,只能采用无损数据压缩技术。无损压缩从压缩原理上大体可以分为基于统计的压缩算法和基于字典的压缩算法[6]。针对剖面浮标传感器采集的数据特点和嵌入式系统的资源限制,在两种模型中选取较有代表性的Huffman算法和miniLZO算法,对剖面浮标传感器采集的数据进行压缩对比并分析。
2.1 Huffman算法及实现
Huffman编码是根据数据信息中字符重复出现的概率生成的一种前缀编码方法。是目前用于压缩的最普遍方法之一。它的核心是构造二叉树,是一种自下向上的、非自适应的编码算法,其思想是将经常出现的字母赋予较短的编码,而不经常出现的字母赋予较长的编码[7]。
对于剖面浮标数据文件来说,文件系统存储的数据主要是ASCII码0~9,且每个字符均有概率出现,对该类数据分析比较简单,因此可采用Huffman算法对数据文件进行压缩。
Huffman编码步骤为:
(1)统计信源符号出现的概率,并按从大到小的顺序排列。
(2)给两个频率最小的信源符号各分配一个码元“0”和“1”,然后将这两个信源符号合并成一个新符号,并用这两个最小的频率之和作为新符号的频率,结果得到一个只有n-1个信源符号的新信源(假设原来所需编码的符号数为n,称为信源的第一次缩减信源S1;
(3)将缩减信源S1的符号仍按频率从大到小的顺序进行排列,重复步骤2,得到只含n~2个符号的缩减信源S2;
(4)重复上述步骤,直至缩减信源只剩2个符号为止,此时所剩2个符号的频率之和必为1,将这2个符号各分配一个码元“0”和“1”后,从最后一级缩减信源开始,依编码路径向前返回,就得到各信源符号所对应的Huffman码字,形成压缩数据。
图6为Huffman算法实现流程图。经过编码后的压缩文件,主要包含2部分信息,第一部分为数据的统计信息,即Huffman码表,另一部分为数据内容部分。当解压数据时,首先从数据中提取Huffman码表重建编码树,然后对压缩码进行解压缩。在构建二叉树时,将其定义为一个结构体可以方便的实现节点的遍历和置换。
图6 Huffman算法实现流程图
2.2 miniLZO算法及实现
LZO算法是一种基于字典的快速的无损数据压缩解压算法,其中LZO是lempel-ziv-oberhumer的缩写[8],其原理是以较长的字符串或经常出现的字母组合构成字典中的各个词条,并且用相对较短的数字或符号来表示,当再次遇到相同字符串或字母组合时,使用已知的字典中对应的数字或符号表示,如此反复,最后输出经过字典翻译后的压缩数据。
miniLZO是一个轻量级的压缩/解压缩库,使用miniLZO的目的是为了某些只需包含一个小型的压缩/解压缩功能,而不包含LZO全部代码的程序。编译后的miniLZO库少于5 KB,非常适合内嵌在主程序中。
在剖面浮标数据文件中包含大量重复性数据,譬如温度、盐度、电流、壳内气压等数据,往往在一定的时间段内数值变化范围很小,甚至相同,这为miniLZO算法提供了压缩空间。
miniLZO算法的执行步骤为:
(1)读入带压缩文件,前两字节无须压缩直接输出。
(2)初始化数据流指针并设定查询窗口大小、最小匹配串长度。
(3)使用匹配函数在输入数据流的前向缓冲区中查找与窗口中最长匹配串。
(4)判断最长匹配串长度是否不小于最小匹配串长度,如果是,则用(重复长度L,指回距离D)代替最长匹配串,如果否,则输出原来的字符串并将其写入字典中等待下一次匹配过程。
(5)根据前向缓冲区是否为空循环执行步骤(3)~(5)。miniLZO算法执行流程图如图7所示。
图7 miniLZO算法实现流程图
3 数据测试和分析
本文测试数据选取于“大洋4 000米深海自持式剖面浮标”项目在南海北部水域投放的一套剖面浮标。此套浮标使用铱星卫星通信,其单包通信数据长度是定长的260字节,包含的信息有时间、温度、盐度、深度、外油囊油量、电压、电流。在剖面浮标的数据文件中随机选取100组在ARM嵌入式系统中进行测试,对每组数据分别使用Huffman算法和miniLZO算法测试压缩效果,其中压缩率是衡量一个压缩算法性能的重要指标,是压缩后数据文件的大小与压缩前源文件大小之比[9]。测试结果如图8所示。
图8 2种算法压缩率比较
通过2种算法的测试结果分析,可以得出以下几个判断:
(1)Huffman算法对浮标观测数据的压缩率在50%左右,miniLZO算法对浮标观测数据的压缩率在20%左右,2种方法均能对通信数据进行有效压缩。
(2)从压缩率角度分析,miniLZO算法的压缩效果明显优于Huffman算法。分析认为出现这种现象的原因是采集的数据中,重复的长字符串较多,部分采集参数数据变化缓慢,甚至变化的只是小数点之后的内容,因而能够大量采用(重复长度L,指回距离D)代替较长的字符串。
(3)从压缩率稳定性角度分析,2种压缩算法压缩率均具有一定的波动性,但Huffman算法的稳定性要强于miniLZO算法,在没有单包数据量限制的情况下尤其明显。分析认为,随着数据组的增加,各数据包中字符出现概率趋于平稳,而在随机取出的单个数据包中,各测量要素波动范围增大,造成已出现的字符串的长度变化增大,因而压缩率波动范围较大。
(4)从算法复杂度上分析,miniLZO算法略优于Huffman算法。首先,在时间复杂度上,由于每次发送的数据量较小,故而每次调用压缩函数处理数据的时间都很少,甚至可以忽略不计;其次,在空间复杂度上,2种算法在处理数据的过程中都会产生类似于字典性质的数据存储空间,但miniLZO算法在数据传输的过程中不需要此字典,而Huffman算法需要通过此字典来进行解码,故miniLZO算法在空间复杂度方面要略优于Huffman算法,因此总体上miniLZO算法复杂度略优于Huffman算法。
4 结束语
本文将基于2种不同模型的数据压缩算法应用在剖面浮标嵌入式数据采集压缩系统中,并取得了较好的实际应用效果。实验证明,2种算法均能能够满足剖面浮标数据压缩的需求,在压缩率方面,miniLZO算法的压缩效果明显好于Huffman算法。值得注意的是,在选择压缩算法时,要充分考虑压缩耗时、内存及算法复杂度,根据具体情况进行选择,结合自身所使用的软硬件资源,达到数据压缩的目的