嵌入式以太网社区

?找回密码
?立即注册
搜索
365bet官网足球官方开户网利用Python来控制STM32365bet官网足球官方开户网365bet官网足球官方开户网
STM32高速USB数据传输方案,支持多系统!STM32全速USB数据传输方案,支持多系统!Flash高速烧写方案STM32 HID IAP/Bootloader升级方案
查看: 22908|bet365体-在线体育投注_365体育投注地址_365体育投注登录: 90
打印 上一主题 下一主题

发一个单片机可用的无损数据压缩算法(miniLZO)源码及测试工程

? [复制链接]

1108

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149577
QQ
跳转到指定楼层
楼主
发表于 2015-7-22 18:04:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 飞鸿踏雪 于 2015-8-18 18:41 编辑

前言:
最近在做大数据通信的相关项目,数据很多都是重复的,严重影响数据传输带宽,所以就想找一个单片机可用的无损数据压缩算法来压缩下数据,终于找到了,分享给大家。

LEO:
? ? LZO 是致力于解压速度的一种数据压缩算法,LZO 是 Lempel-Ziv-Oberhumer 的缩写。这个算法是无损算法,参考实现程序是线程安全的。 实现它的一个自由软件工具是lzop。最初的库是用 ANSI C 编写、并且遵从 GNU通用公共许可证发布的。现在 LZO 有用于 Perl、Python 以及 Java 的各种版本。代码版权的所有者是 Markus F. X. J. Oberhumer。
特点:
LZO 库实现了许多有下述特点的算法:
* 解压简单,速度非常快。
* 解压不需要内存。
* 压缩相当地快。
* 压缩需要 64 kB 的内存。
* 允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。
* 包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。
* 另外还有一个只需要 8 kB 内存的压缩级别。
* 算法是线程安全的。
* 算法是无损的。
LZO 支持重复压缩以及原地解压。
LZO 是块压缩算法——压缩解压成块的数据。压缩与解压所用块的大小必须一样。
LZO 将数据块压缩成匹配数据(滑动字典)与非匹配文字的序列。LZO 对于较长的匹配数据以及较长的非匹配文字序列有专门的处理,这样对于高度冗余的数据能够取得很好的效果,并且对于不可压缩的数据也能得到可以接受的效果。
当处理不可压缩数据的时候,LZO 将每个 1024 字节的输入数据块扩展 16 字节。
据报道 LZO 也在 AIX、 ConvexOS、IRIX、Mac OS、Palm OS、 PS1(PlayStation)、Solaris、SunOS、TOS (Atari ST) 以及 VxWorks 上得到实现。

不过我这里使用的是LZO的一个简化版本,miniLZO,效果还不错。

效果:

源码:
[C] 纯文本查看 复制代码
/**
* @brief  Main routine for MSC class application
* @param  None
* @retval int
*/
int main(void)
{
  int r;
  lzo_uint in_len;
  lzo_uint out_len;
  lzo_uint new_len;
  /*!< At this stage the microcontroller clock setting is already configured, 
  this is done through SystemInit() function which is called from startup
  file (startup_stm32fxxx_xx.s) before to branch to application main.
  To reconfigure the default setting of SystemInit() function, refer to
  system_stm32fxxx.c file
  */  
  
  DebugInit(USART1,115200);
  printf("\x0c");printf("\x0c");//超级终端清屏
  printf("\033[1;40;32m");//设置超级终端背景为黑色,字符为绿色
  printf("\r\n*******************************************************************************");
  printf("\r\n************************ Copyright 2009-2014, EmbedNet ************************");
  printf("\r\n*************************** [url=http://www.embed-net.com]http://www.embed-net.com[/url] **************************");
  printf("\r\n***************************** All Rights Reserved *****************************");
  printf("\r\n*******************************************************************************");
  printf("\r\n");
  
  printf("\nLZO real-time data compression library (v%s, %s).\n\r",
         lzo_version_string(), lzo_version_date());
  printf("Copyright (C) 1996-2015 Markus Franz Xaver Johannes Oberhumer\n\rAll Rights Reserved.\n\n\r");


/*
* Step 1: initialize the LZO library
*/
  if (lzo_init() != LZO_E_OK)
  {
      printf("internal error - lzo_init() failed !!!\n\r");
      printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)\n\r");
      return 3;
  }

/*
* Step 2: prepare the input block that will get compressed.
*         We just fill it with zeros in this example program,
*         but you would use your real-world data here.
*/
  in_len = IN_LEN;
  lzo_memset(in,0,in_len);

/*
* Step 3: compress from 'in' to 'out' with LZO1X-1
*/
  r = lzo1x_1_compress(in,in_len,out,&out_len,wrkmem);
  if (r == LZO_E_OK){
      printf("compressed %lu bytes into %lu bytes\n\r",
          (unsigned long) in_len, (unsigned long) out_len);
  }else{
      /* this should NEVER happen */
      printf("internal error - compression failed: %d\n\r", r);
      return 2;
  }
  /* check for an incompressible block */
  if (out_len >= in_len)
  {
      printf("This block contains incompressible data.\n\r");
      return 0;
  }

/*
* Step 4: decompress again, now going from 'out' to 'in'
*/
  new_len = in_len;
  r = lzo1x_decompress(out,out_len,in,&new_len,NULL);
  if (r == LZO_E_OK && new_len == in_len){
      printf("decompressed %lu bytes back into %lu bytes\n\r",
          (unsigned long) out_len, (unsigned long) in_len);
  }else{
      /* this should NEVER happen */
      printf("internal error - decompression failed: %d\n\r", r);
      return 1;
  }

  printf("\nminiLZO simple compression test passed.\n\r");
  while (1)
  {
 
  }
}


源码下载:
STM32F4xx版本: STM32F4xx.rar (574.28 KB, 下载次数: 303, 售价: 10 金币)
VS2010版本: VS2010.rar (93.23 KB, 下载次数: 390, 售价: 5 金币)

LZO官方源码下载地址:http://www.oberhumer.com/opensource/lzo/

人生到处知何似,应似飞鸿踏雪泥。

1108

帖子

173

主题

14万

金币

超级版主

Rank: 8Rank: 8

积分
149577
QQ
沙发
?楼主| 发表于 2015-7-22 18:27:23 | 只看该作者
可能大家对其速度比较敢兴趣,那么我就搞几组数据测试下
压缩前字节数 压缩后字节数 压缩耗时 解压耗时 数据说明
10*1024 68 17ms 2.8ms
全是0
10*1024 324 17ms 3.3ms
0到0xFF重复的数据
10*1024 332 17ms 2.9ms 一半是0,一半是0到0xFF重复的数据

注:
单片机使用STM32F407,168M主频

综合来看,数据压缩的速度还是不是很理想,不过也很不错了,不过数据解压的速度还是挺不错的,而且数据解压还不需要太多的缓冲区就能实现。

在单片机程序使用时,代码编译优化等级不要开高了,否则容易出现进入HardFault_Handler的问题,我跟踪调试了下,主要是在数据拷贝的时候,指针地址不是偶数造成的,目前还没找到解决办法,不开启优化就OK。
人生到处知何似,应似飞鸿踏雪泥。

31

帖子

0

主题

0

金币

新手上路

Rank: 1

积分
31
板凳
发表于 2015-8-7 14:50:42 | 只看该作者
不错,感谢楼主分享

22

帖子

0

主题

12

金币

新手上路

Rank: 1

积分
34
地板
发表于 2015-8-17 20:50:48 | 只看该作者
感谢楼主分享

18

帖子

2

主题

9

金币

新手上路

Rank: 1

积分
27
5#
发表于 2015-8-19 11:25:49 | 只看该作者
感谢楼主分享

18

帖子

2

主题

9

金币

新手上路

Rank: 1

积分
27
6#
发表于 2015-8-19 13:01:46 | 只看该作者
:):)

29

帖子

1

主题

21

金币

注册会员

Rank: 2

积分
50
7#
发表于 2015-8-21 06:49:27 | 只看该作者
也只有F4能用这个了..

7

帖子

0

主题

6

金币

新手上路

Rank: 1

积分
23
8#
发表于 2015-10-10 08:59:08 | 只看该作者
很好的学习,下载学习学习。

10

帖子

0

主题

35

金币

注册会员

Rank: 2

积分
61
9#
发表于 2015-10-25 21:16:14 来自手机 | 只看该作者
以前想找一个压缩算法,一直设找到

36

帖子

0

主题

7

金币

注册会员

Rank: 2

积分
79
10#
发表于 2015-11-3 13:41:17 | 只看该作者
这个压缩算法真真是好

29

帖子

0

主题

66

金币

注册会员

Rank: 2

积分
147
11#
发表于 2015-12-4 11:32:22 | 只看该作者
一直在找这样的压缩算法,非常感谢!
对于采集的AD数据压缩后传输敢兴趣

59

帖子

15

主题

91

金币

中级会员

Rank: 3Rank: 3

积分
406
12#
发表于 2015-12-10 08:37:42 | 只看该作者
以前想弄无损压缩LZW,最后弄到一半被其他项目,就搁浅了!

68

帖子

0

主题

56

金币

新手上路

Rank: 1

积分
250
13#
发表于 2015-12-17 14:21:58 | 只看该作者
学习一下。

59

帖子

15

主题

91

金币

中级会员

Rank: 3Rank: 3

积分
406
14#
发表于 2015-12-18 08:08:29 | 只看该作者
,最近搞搞看看如何?

25

帖子

0

主题

79

金币

注册会员

Rank: 2

积分
144
15#
发表于 2015-12-30 09:08:28 | 只看该作者
感谢楼主分享,收藏啦。

9

帖子

0

主题

0

金币

新手上路

Rank: 1

积分
27
16#
发表于 2016-1-4 13:26:05 | 只看该作者
厉害厉害,顶顶顶

1

帖子

0

主题

10

金币

新手上路

Rank: 1

积分
13
17#
发表于 2016-1-19 14:59:04 | 只看该作者
感谢分享,收藏了

22

帖子

0

主题

12

金币

注册会员

Rank: 2

积分
72
18#
发表于 2016-1-25 01:55:38 | 只看该作者
谢谢楼主!回头试下

1

帖子

0

主题

5

金币

新手上路

Rank: 1

积分
8
19#
发表于 2016-1-26 10:44:28 | 只看该作者

不错,感谢楼主分享

8

帖子

0

主题

16

金币

新手上路

Rank: 1

积分
34
20#
发表于 2016-1-26 16:15:25 | 只看该作者
谢谢哈??看看了??

16

帖子

1

主题

6

金币

新手上路

Rank: 1

积分
40
21#
发表于 2016-1-26 21:02:45 | 只看该作者
确实是一个牛B的算法

12

帖子

0

主题

3

金币

新手上路

Rank: 1

积分
29
22#
发表于 2016-2-2 11:03:48 | 只看该作者
楼主大神,厉害楼主

1

帖子

0

主题

3

金币

新手上路

Rank: 1

积分
10
23#
发表于 2016-2-25 22:42:01 | 只看该作者
怒赞十分赞

1

帖子

0

主题

0

金币

新手上路

Rank: 1

积分
8
24#
发表于 2016-3-1 15:18:47 | 只看该作者
下来试一下。

47

帖子

0

主题

31

金币

注册会员

Rank: 2

积分
146
25#
发表于 2016-3-25 17:23:52 | 只看该作者
感谢楼主分享

42

帖子

0

主题

32

金币

注册会员

Rank: 2

积分
144
26#
发表于 2016-4-26 23:55:26 | 只看该作者
感谢楼主分享

14

帖子

1

主题

355

金币

中级会员

Rank: 3Rank: 3

积分
406
27#
发表于 2016-5-7 21:13:39 | 只看该作者
这个好,但感觉对于单片机应用来说,RAM的需要还是有点大啊.

4

帖子

0

主题

1

金币

新手上路

Rank: 1

积分
13
28#
发表于 2016-5-11 13:40:16 | 只看该作者

以前想弄无损压缩LZW,最后弄到一半不会了

2

帖子

0

主题

15

金币

新手上路

Rank: 1

积分
21
29#
发表于 2016-6-20 15:35:00 | 只看该作者
楼主我也有测,哈哈哈

http://www.amobbs.com/thread-5619913-1-1.html

12

帖子

0

主题

48

金币

注册会员

Rank: 2

积分
84
30#
发表于 2016-7-7 11:41:52 | 只看该作者
不错,谢谢!

16

帖子

2

主题

23

金币

注册会员

Rank: 2

积分
76
31#
发表于 2016-7-7 14:38:30 | 只看该作者
参考学习下哈

10

帖子

0

主题

67

金币

注册会员

Rank: 2

积分
85
32#
发表于 2016-8-12 15:18:56 | 只看该作者
谢谢分享



2

帖子

0

主题

0

金币

新手上路

Rank: 1

积分
6
33#
发表于 2016-8-22 17:14:54 | 只看该作者

2

帖子

0

主题

94

金币

注册会员

Rank: 2

积分
100
34#
发表于 2016-8-22 21:19:05 | 只看该作者
多谢楼主的分享!!!

8

帖子

0

主题

21

金币

新手上路

Rank: 1

积分
45
35#
发表于 2016-8-24 13:36:58 | 只看该作者

谢谢哈??看看了??

7

帖子

0

主题

12

金币

新手上路

Rank: 1

积分
29
36#
发表于 2016-8-25 22:23:32 | 只看该作者
不错,这种算法找了好久了

5

帖子

0

主题

9

金币

新手上路

Rank: 1

积分
24
37#
发表于 2016-9-20 21:47:46 | 只看该作者
好东西,下来看看!!!赞一个!

5

帖子

0

主题

9

金币

新手上路

Rank: 1

积分
24
38#
发表于 2016-9-23 16:57:05 | 只看该作者
这个压缩软件真好用,谢谢了!

1

帖子

0

主题

5

金币

新手上路

Rank: 1

积分
8
39#
发表于 2016-9-26 17:02:38 | 只看该作者
学习 学习 学习压缩算法 stm32??正合适

6

帖子

0

主题

0

金币

新手上路

Rank: 1

积分
18
40#
发表于 2016-9-27 11:19:14 | 只看该作者
东西不错,正好用上

1

帖子

0

主题

6

金币

新手上路

Rank: 1

积分
11
41#
发表于 2016-9-27 12:10:39 | 只看该作者
请问楼主这个需要多少内存才能跑起来?

9

帖子

0

主题

22

金币

新手上路

Rank: 1

积分
43
42#
发表于 2016-10-31 16:57:08 | 只看该作者
压缩速度如何呢。。。都是单片机了,速度提不上来也没用

3

帖子

0

主题

7

金币

新手上路

Rank: 1

积分
16
43#
发表于 2016-11-7 10:47:54 | 只看该作者
正好需要,学习一下,数据量太大了

196

帖子

1

主题

1959

金币

金牌会员

Rank: 6Rank: 6

积分
2506
44#
发表于 2016-11-7 14:43:39 | 只看该作者
这个确实不错。数据压缩

1

帖子

0

主题

45

金币

新手上路

Rank: 1

积分
48
45#
发表于 2016-11-7 15:34:23 | 只看该作者
谢谢分享,希望能看到更多的好用源码,大家一起学习讨论

6

帖子

0

主题

12

金币

新手上路

Rank: 1

积分
30
46#
发表于 2016-11-7 17:25:35 | 只看该作者
学习一下,谢谢楼主

5

帖子

0

主题

277

金币

中级会员

Rank: 3Rank: 3

积分
290
47#
发表于 2016-11-7 18:08:18 | 只看该作者
自己做了一个,压缩中挂掉了

15

帖子

0

主题

2

金币

新手上路

Rank: 1

积分
31
48#
发表于 2016-11-7 18:53:40 | 只看该作者
过来赚金币

6

帖子

0

主题

12

金币

新手上路

Rank: 1

积分
30
49#
发表于 2016-11-8 09:22:31 | 只看该作者
F4版本的代码编译后测试没有任何信息,压缩的是全0,我换成字符串压缩后,再解压缩出来的结果就不是原来的字符串了,有什么问题吗?

6

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
26
50#
发表于 2016-11-15 10:36:27 | 只看该作者
这个以后可以用用

6

帖子

0

主题

36

金币

注册会员

Rank: 2

积分
52
51#
发表于 2017-1-27 14:44:25 | 只看该作者
资料是好,还需要积攒些金币啊

126

帖子

1

主题

438

金币

金牌会员

Rank: 6Rank: 6

积分
1041
52#
发表于 2017-2-15 17:03:45 | 只看该作者
资源完好, 谢谢分享

1

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
11
53#
发表于 2017-3-20 20:31:54 | 只看该作者
但是我使用L0的内存不够呀,咋整

196

帖子

1

主题

1959

金币

金牌会员

Rank: 6Rank: 6

积分
2506
54#
发表于 2017-3-20 22:15:21 | 只看该作者
好好学习,天天向上

87

帖子

16

主题

184

金币

中级会员

Rank: 3Rank: 3

积分
492
55#
发表于 2017-3-21 08:58:59 | 只看该作者
谢谢楼主,真的不错。

7

帖子

0

主题

25

金币

新手上路

Rank: 1

积分
42
56#
发表于 2017-4-23 11:47:45 | 只看该作者
表示太贵,只能下来VS10版的看看

12

帖子

1

主题

12

金币

注册会员

Rank: 2

积分
50
57#
发表于 2017-4-27 15:01:01 | 只看该作者
这个不错,收藏之

2

帖子

0

主题

4

金币

新手上路

Rank: 1

积分
10
58#
发表于 2017-4-27 15:20:53 | 只看该作者
好东西,收藏。

2

帖子

0

主题

4

金币

新手上路

Rank: 1

积分
10
59#
发表于 2017-4-27 15:24:36 | 只看该作者
但是不明白,楼主您为啥要用超级终端,为啥不直接将这个源代码放入单片机中运行?

36

帖子

0

主题

10

金币

注册会员

Rank: 2

积分
76
60#
发表于 2017-6-6 20:10:40 | 只看该作者

谢谢楼主分享

1

帖子

0

主题

20

金币

新手上路

Rank: 1

积分
23
61#
发表于 2017-7-20 16:50:44 | 只看该作者
赚个积分,谢谢楼主

1

帖子

0

主题

100

金币

注册会员

Rank: 2

积分
103
62#
发表于 2017-7-21 09:34:32 | 只看该作者
好算法 正在研究中 就是太占内存了 要是能用stm32f103就更好了。

75

帖子

0

主题

156

金币

中级会员

Rank: 3Rank: 3

积分
355
63#
发表于 2017-7-22 09:09:07 | 只看该作者
感谢楼主分享

196

帖子

1

主题

1959

金币

金牌会员

Rank: 6Rank: 6

积分
2506
64#
发表于 2017-7-22 11:03:25 | 只看该作者
标记一下就可以了

12

帖子

0

主题

66

金币

注册会员

Rank: 2

积分
100
65#
发表于 2017-8-10 10:01:59 | 只看该作者
很轻巧,收下来备用,以后可以拿来做压缩

2

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
14
66#
发表于 2017-12-8 16:09:20 | 只看该作者
想问下楼主,怎么配置成只使用8k的压缩模式???现在用stm32f103内存很小

2

帖子

0

主题

8

金币

新手上路

Rank: 1

积分
14
67#
发表于 2017-12-8 17:03:09 | 只看该作者
刚刚找到了 这个??#define LZO1X_1_MEM_COMPRESS? ? ((lzo_uint32_t) (8192L * lzo_sizeof_dict_t))
但是这么设置貌似是 32kB吧??并不是 8KB

8

帖子

0

主题

4

金币

新手上路

Rank: 1

积分
22
68#
发表于 2017-12-16 10:07:30 | 只看该作者
很好的资料

66

帖子

2

主题

238

金币

中级会员

Rank: 3Rank: 3

积分
415
69#
发表于 2017-12-25 11:43:19 | 只看该作者
楼主给了好多帮助,感谢!

8

帖子

0

主题

35

金币

注册会员

Rank: 2

积分
59
70#
发表于 2018-1-30 11:35:18 | 只看该作者
谢谢分享!试用一下

3

帖子

0

主题

6

金币

新手上路

Rank: 1

积分
15
71#
发表于 2018-3-8 15:12:23 | 只看该作者
请问楼主还有其他的压缩算法吗,急用

2

帖子

0

主题

1

金币

新手上路

Rank: 1

积分
7
72#
发表于 2018-4-9 16:07:16 | 只看该作者
感谢超级版主

2

帖子

0

主题

1

金币

新手上路

Rank: 1

积分
7
73#
发表于 2018-4-9 16:17:00 | 只看该作者

1

帖子

0

主题

4

金币

新手上路

Rank: 1

积分
11
74#
发表于 2018-4-10 14:12:23 | 只看该作者
谢谢,正好项目用到,,,,,,,,,,,,,,,,

198

帖子

1

主题

621

金币

金牌会员

Rank: 6Rank: 6

积分
1163
75#
发表于 2018-5-14 16:56:36 | 只看该作者
不错,谢谢!

1

帖子

0

主题

5

金币

新手上路

Rank: 1

积分
8
76#
发表于 2018-5-26 22:31:48 | 只看该作者
不错,谢谢分享

3

帖子

0

主题

0

金币

新手上路

Rank: 1

积分
9
77#
发表于 2018-7-23 11:57:46 | 只看该作者
好东西,多谢分享啦啦

4

帖子

0

主题

3

金币

新手上路

Rank: 1

积分
15
78#
发表于 2018-9-20 10:56:50 | 只看该作者
积分不够不能下载,很想看看单片机能用的压缩算法。
www.littlebutler.top

4

帖子

0

主题

3

金币

新手上路

Rank: 1

积分
15
79#
发表于 2018-9-20 11:20:31 | 只看该作者
代码下来后,看定义#define IN_LEN? ?? ?(10*1024ul)
10K的空间才能拿来压缩吗?
能不能小一些,我用的单片机才4Kram,能拿出来2K就很多了。
www.littlebutler.top

3

帖子

0

主题

10

金币

新手上路

Rank: 1

积分
19
80#
发表于 2018-11-7 15:48:48 | 只看该作者
有点贵啊,买不起哟

3

帖子

0

主题

10

金币

新手上路

Rank: 1

积分
19
81#
发表于 2018-11-7 15:51:32 | 只看该作者
BMP的压缩率是要根据图像的复杂度的吧

3

帖子

0

主题

10

金币

新手上路

Rank: 1

积分
19
82#
发表于 2018-11-8 09:23:37 | 只看该作者
需要金币呀。啦啦啦

21

帖子

0

主题

16

金币

注册会员

Rank: 2

积分
79
83#
发表于 2018-11-29 16:30:55 | 只看该作者
楼主牛逼,学习一下

3

帖子

0

主题

17

金币

新手上路

Rank: 1

积分
26
84#
发表于 2018-12-24 14:59:20 | 只看该作者
学习一下。

1

帖子

0

主题

5

金币

新手上路

Rank: 1

积分
8
85#
发表于 2019-4-15 15:44:41 | 只看该作者
好帖子,给题主顶一下,好好学习一下。。。。。。

3

帖子

0

主题

0

金币

新手上路

Rank: 1

积分
9
86#
发表于 2019-4-21 17:10:56 | 只看该作者
多谢楼主分享,学习了

33

帖子

0

主题

4

金币

注册会员

Rank: 2

积分
87
87#
发表于 2019-4-28 22:29:31 | 只看该作者
暂时用不上,学习了解一下

1

帖子

0

主题

5

金币

新手上路

Rank: 1

积分
8
88#
发表于 2019-10-16 11:49:33 | 只看该作者
十分感谢,刚好需要用到这个压缩算法传输数据。不知道单单使用解压缩会占用多少flash空间
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|嵌入式以太网社区 ( 渝ICP备14007427号 )?

GMT+8, 2019-11-5 18:06 , Processed in 0.239325 second(s), 37 queries .

Powered by Discuz! X3.2

? 2001-2013 Comsenz Inc.

快速bet365体-在线体育投注_365体育投注地址_365体育投注登录 返回顶部 返回列表