嵌入式系统数据无损压缩

嵌入式系统中的数据无损压缩,主要是来源于对于数据传输或者存贮的空间的需求,另外由于嵌入式系统的资源限制,因此对于压缩效率,MIPS和内存的需求是选择一个压缩/解压算法的需要平衡的三个条件.

对于嵌入式系统来说,通常可能在以下一些场合需要使用压缩和解压缩算法:

1)FIRMWARE

2)需要传输或者保存的数据

3)字库的压缩

4)GUI系统的图片的压缩

1)FIRMWARE

对于FIRMWARE的压缩,常用易用的压缩/解压缩算法是ZLIB,这个压缩算法比较好的均衡了压缩率和解压时间,通常,压缩率大概在50%左右,解压的过程大概在1KB/S/MIPS,需要的解压的内存是比较小的,通常在几十KB.

如果你希望获取比ZLIB更高的压缩效率,可以尝试使用LZMA,LZMA对于一般的FIRMWARE的压缩效率比ZLIB要高一些,基本上可以压缩到原大小的1/3左右,但是对于嵌入式系统来说,不要去尝试使用这个压缩工具进行压缩,压缩需要的MIPS和时间是比较长的,基本上低MIPS的系统是很难忍受的,但是解压是另外的一面,解压的速度比ZLIB要慢不少,有时候为了获取高压缩率,这个压缩算法也是可以值得尝试的.

另外一种可以尝试的压缩方法是LZO,压缩率比较低,大概只能压缩到原来的文件大小的2/3,但是它提供了超快的解压速度和0内存需求,实际测试由ADS编译出来的ARM系统的FIRMEWARE解压速度可以到10KB/S/MIPS,也就是说如果你有一个200MHz的CPU,一般情况下你可以在一秒内解压2MB的FIRMWARE,这个对于很多系统来说是足够了.

2)需要传输或者保存的数据

对于类似文本类的或者其它相关性强的数据,如果考虑到存储空间或者传输效率,有时候使用压缩算法也是一个比较好的选择,LZO是首选,当然你也可以使用ZLIB, CMMB的ESG数据就是使用ZLIB进行压缩的.

3)字库的压缩

对于需要使用中文界面的嵌入式系统来说,字库对于整个FIRMWARE大小是贡献比较大的,一般小型的GUI是无法使用矢量字库的,因此常见的情况是使用某个特定大小的字库,如果字库是按照GBK方式进行排序的,那么字库相对来说会小一些,因为GBK是连续的,但是如果使用UNICODE方式排序的字库,那么字库的压缩是一件比较麻烦的事情.

常用的字库的压缩包括了分段法和字库本身的压缩,但是考虑到嵌入式系统的CPU的速度,一般字库本身不大会去压缩.

4)GUI系统的图片的压缩

使用BMP图片对于一个希望用很多图片的系统是蛮可怕的,虽然BMP的DRAW相对很简单,但是实在是太大了.

如果CPU速度还不错,内存也蛮多的,那么PNG的格式应该是个很好的选择,无损,又支持ALPHA

但是对于一些嵌入式系统来说,可能更希望直接能ON TIME DRAW的图像,这些图像在实际的应用中不希望每次都先去解码然后再DRAW,那么可以参考PNG的方式对原始的点阵图像进行压缩,并在DRAW的时候复原图像,由于仅仅使用了简单的算术编码方式,所以DRAW的速度实际上证明也是相当快的,一下是一个DRAW的函数,你应该可以猜出反向的算法:

//直接填充一块RLE图片,need make sure it is the same size
void CL_RLE_DRAW(unsigned short sx, unsigned short sy, unsigned short width, unsigned short heigh, unsigned short *pGRAM,const unsigned short *pIcon)
{
unsigned short i,j;

unsigned short Val,Count;

i=0;
j=0;

while(j<heigh)
{
Val=*pIcon;
if(Val&0x8000)
{
Count = (Val & 0x7fff) + 1;
while (Count–)
{
*pIcon++;
Val=pIcon;
pGRAM[320
(sy+j)+(sx+i)] =Val;
i++;
if(i==width)
{
j++;
i=0;
}

}
*pIcon++;

}
else
{

Count=Val+1;
*pIcon++;

Val=pIcon;
while(Count–)
{
pGRAM[320
(sy+j)+(sx+i)] =Val;
i++;
if(i==width)
{
j++;
i=0;
}
}
*pIcon++;
}
}

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CVTE是一家专注于消费电子产品的公司,嵌入系统是其主要技术领域之一。在嵌入开发中,压缩算法是一个非常重要的技术,可以帮助节省存储空间和提高传输效率。以下是我对CVTE嵌入笔试题中压缩算法的回答。 在压缩算法中,常用的方法有有损压缩无损压缩两种。有损压缩会在压缩过程中丢失一些数据,达到压缩的效果,适用于一些对数据准确性要求不高的场景,如图像压缩无损压缩则会保留所有数据,但通过一些算法技巧,使得数据能够更紧凑地存储,适用于对数据准确性要求较高的场景,如音频压缩。 CVTE嵌入笔试题中的压缩算法可以是通过对特定数据进行处理,以减少存储或传输所需的空间。例如,可以使用哈夫曼编码进行无损压缩。哈夫曼编码通过根据数据出现的频率,为频率较高的数据分配较短的编码,从而减少存储空间。在解压缩时,根据编码的规则,重新还原数据。这种压缩算法适用于对数据准确性要求高且可以进行无损压缩的场景。 除了哈夫曼编码,还有其他的压缩算法可以使用,如LZ77和LZ78。这些算法主要通过找到数据中的重复模,并用较短的编码来代替重复的部分,从而减少存储空间和传输带宽。这种压缩算法适用于对数据准确性要求不高的场景,如对文本文件的压缩。 在实际的嵌入开发中,为了满足不同的需求,可能需要综合使用多种压缩算法,并根据实际情况进行优化。压缩算法的选择通常需要考虑存储空间、传输效率、数据准确性等因素,以满足具体应用场景的需求。 总之,CVTE嵌入笔试题中的压缩算法可以使用无损压缩的方法,如哈夫曼编码,也可以使用其他的压缩算法,如LZ77和LZ78。具体的选择应根据实际需求来确定,以提高存储效率和传输效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值