压缩算法简介

FPGA开源工作室 2024-06-21 11:31

1 概述

压缩算法是一种通过减少数据量来节省存储空间或传输数据的技术。压缩算法可以分为两种类型:有损压缩和无损压缩。
有损压缩算法会牺牲一定的数据精度或质量,在压缩数据的同时丢失一些信息。这种算法适用于音频、视频等多媒体数据,例如JPEG和MP3等格式。
无损压缩算法则能够完全还原原始数据,不会造成数据丢失。这种算法适用于需要准确还原数据的场景,如文档、代码等,例如ZIP和GZIP等格式。
常见的压缩算法包括哈夫曼编码、Lempel-Ziv算法、Run-Length Encoding(RLE)等。这些算法通过不同的方式对数据进行编码和解码,以实现数据压缩和解压缩的目的。

2 压缩算法的应用

压缩算法在各种领域广泛应用,包括但不限于以下几个方面:
文件传输和存储:压缩算法可以减少文件的大小,使文件传输更加高效快速。在网络传输、电子邮件附件、云存储等场景下,压缩算法可以节省带宽和存储空间。
多媒体数据:音频、视频等多媒体数据通常是体积较大的,使用压缩算法可以减少文件大小,提高数据的传输速度和播放效果。常见的视频压缩算法包括H.264、HEVC等;音频压缩算法包括MP3、AAC等。
数据库压缩:在数据库管理系统中,数据通常存储在磁盘上,通过压缩算法可以减少数据占用的存储空间,并提高数据库的性能和响应速度。
图像处理:在数字图像处理中,压缩算法可以减小图像文件的大小,在图像传输和存储中起到重要作用。常见的图像压缩算法包括JPEG、PNG等。
网页内容压缩:为了减少网页加载时间和用户访问流量,网站通常会使用压缩算法对HTML、CSS、JavaScript等网页内容进行压缩,提高用户体验和网站性能。
总的来说,压缩算法在信息技术领域的各个方面都有广泛的应用,可以有效地节省存储空间、提高数据传输效率和优化性能。

3适合ARM跑的压缩算法

ARM架构是一种广泛应用于移动设备、嵌入式系统和物联网设备中的处理器架构。在运行在ARM处理器上的设备或系统上选择合适的压缩算法,需要考虑算法的性能、资源消耗和适应性。
以下是一些适合与ARM跑的压缩算法:
Zstandard(Zstd):Zstandard是一种快速的压缩算法,性能优秀,并且可以在ARM处理器上高效运行。它具有适应性强,可以在不同的场景下应用,如数据传输、数据库压缩等。
LZ4:LZ4是一种高速压缩算法,适合于需要快速压缩和解压的场景。它具有低延迟和高吞吐量的特点,适合在ARM处理器上运行。LZ4是一种LZ系列压缩算法,着重于压缩和解压的速度,压缩率相对较低。LZ4压缩率较低,算法复杂度和内存消耗中等,但是压缩和解压速度,尤其是解压速度远超其他算法。因为其综合性能优秀,在Linux、Android中的内存压缩技术一般使用LZ4压缩算法。LZ4 HC,有着更好的压缩率,但是算法复杂度大幅提升,且压缩速度也大幅减慢,但是依然有着很好的解
Brotli:Brotli是由Google开发的一种通用压缩算法,特点是高压缩率和较好的性能。它在文件传输、网络传输等场景下表现优异,也可以在ARM处理器上高效运行。
Snappy:Snappy是Google开发的一种快速压缩算法,适合于需要高速压缩和解压的场景。它在ARM处理器上表现优秀,适用于数据传输、日志压缩等应用。
Deflate(如zlib):Deflate是一种常见的无损压缩算法,广泛应用于各种领域。zlib是实现Deflate算法的一个流行库,也可以在ARM处理器上使用,并具有较好的性能。
这些压缩算法在ARM处理器上都有良好的性能表现,可以根据具体的应用场景和需求选择合适的算法。值得注意的是,优化算法的实现、调整参数和选择合适的压缩级别,也可以进一步提高在ARM处理器上的性能表现。
Huffman霍夫曼(Huffman)编码使用变长编码表对源符号进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用较长的编码,这便使编码之后的字符串的平均长度、期望值降低,从而达到无损压缩数据的目的。霍夫曼编码使用的编码表,使用霍夫曼树来进行存储,让出现概率最高的编码最容易查找,以提升解码速度。霍夫曼编码算法的压缩率分布在20%-90%,因为要扫描整个数据来构建霍夫曼树,所以其压缩速度较慢,且需要一定的内存来存储编码表,但是解压速度较快。霍夫曼的算法复杂度较简单。
RLE(Run Length Encoding),也称为行程编码,压缩算法是一种无损压缩算法。算法特点:简单、易实现。使用RLE压缩方法可以将 RRRRRGGBBBBBBABCD 压缩为 5R2G6B1A1B1C1D。基于RLE算法升级,可以将RRRRRGGBBBBBBABCD可以压缩为b’\x85R\x82G\x86B\x03ABCD’,0x85表示后面有5个相同的字符,0x03表示后面有3个不连续的字符。RLE的实现非常简单,针对一些图片颜色少或重复字符多的文件有非常好的压缩率,RLE的适用场景比较少,通用压缩率较差。
LZ77是一种基于字典的算法,它将长字符串(也称为短语)编码成短小的标记,用小标记代替字典中的短语,从而达到压缩的目的。LZ77算法的压缩率、速度、内存消费都是中等,但是代码复杂度较低,适用于MCU的使用。
LZO压缩算法采用(重复长度L,指回距离D)代替当前已经在历史字符串中出现过的字符串。LZO致力于解压速度,不同的参数下的LZO压缩率不同。LZO内存消耗中等,解压速度较快,压缩速度较快,但是代码复杂度较低,适用于Bootloader等追求压缩率和解压速度的场景。

4性能排序

在实际应用中,不同的压缩算法因为适用场景、数据类型、硬件平台等因素的不同,其性能表现也会有所差异。以下是一些常见的压缩算法按照一般趋势的性能排序:
压缩率(从高到低):
有损压缩:JPEG2000 > WebP > H.265 (HEVC) > H.264 (AVC) > JPEG
无损压缩:FLIF > Brotli > Zstandard > LZMA (7-Zip) > DEFLATE (zlib)
压缩速度(从快到慢):
Snappy > LZ4 > Zstandard > Deflate (zlib) > Brotli
这里的快慢仅作为一般参考,具体情况因数据大小、数据类型、硬件性能等因素可能有所不同。
解压速度(从快到慢):
Snappy > LZ4 > Zstandard > Deflate (zlib) > Brotli
同样,解压速度也会受到实际场景的影响,不同算法适用于不同的应用需求。
内存消耗(从少到多):
Snappy > LZ4 > Zstandard > Deflate (zlib) > Brotli
内存消耗较低的压缩算法可以在受限制的环境下更好地工作,如嵌入式设备等。

5 压缩算法代码示例

以下是一个简单的使用zlib库进行数据压缩和解压缩的C语言示例代码:


```c

```c
#include
#include
#include
#include

#define CHUNK 16384

int compress_data(unsigned char* data, int data_len, unsigned char* compressed_data, int* compressed_len) {
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;

if(deflateInit(&strm, Z_BEST_COMPRESSION) != Z_OK) {
return -1;
}

strm.avail_in = data_len;
strm.next_in = data;
strm.avail_out = *compressed_len;
strm.next_out = compressed_data;

int ret = deflate(&strm, Z_FINISH);
*compressed_len = strm.total_out;

deflateEnd(&strm);

return ret == Z_STREAM_END ? 0 : -1;
}

int decompress_data(unsigned char* compressed_data, int compressed_len, unsigned char* decompressed_data, int* decompressed_len) {
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;

if(inflateInit(&strm) != Z_OK) {
return -1;
}

strm.avail_in = compressed_len;
strm.next_in = compressed_data;
strm.avail_out = *decompressed_len;
strm.next_out = decompressed_data;

int ret = inflate(&strm, Z_NO_FLUSH);
*decompressed_len = strm.total_out;

inflateEnd(&strm);

return ret == Z_STREAM_END ? 0 : -1;
}

int main() {
unsigned char data[] = "Hello, this is a test message!";
int data_len = strlen(data);

int compressed_size = compressBound(data_len);
unsigned char compressed_data[compressed_size];
int compressed_len = compressed_size;

if(compress_data(data, data_len, compressed_data, &compressed_len) == 0) {
printf("Data compressed successfully!\n");
printf("Compressed data size: %d\n", compressed_len);

unsigned char decompressed_data[data_len];
int decompressed_len = data_len;

if(decompress_data(compressed_data, compressed_len, decompressed_data, &decompressed_len) == 0) {
printf("Data decompressed successfully!\n");
printf("Decompressed data: %s\n", decompressed_data);
} else {
printf("Error decompressing data!\n");
}
} else {
printf("Error compressing data!\n");
}

return 0;
}

在这个示例代码中,我们使用了zlib库提供的函数进行数据压缩和解压缩操作。压缩函数 compress_data 将输入数据进行压缩,并将压缩后的数据存储在 compressed_data 中,返回压缩后的数据长度;解压缩函数 decompress_data 对压缩后的数据进行解压缩,并将解压缩后的数据存储在 decompressed_data 中,返回解压缩后的数据长度。在主函数中,我们对一个简单的字符串进行压缩和解压缩操作,并输出结果。

请注意,这段示例代码使用了zlib库,因此在编译时需要链接zlib库。在Linux系统下,可以使用 -lz 选项进行链接。


FPGA开源工作室 知识,创新,创艺,FPGA,matlab,opencv,数字图像,数字信号,数字世界。传递有用的知识,传递创艺的作品。FPGA开源工作室欢迎大家的关注。
评论 (0)
  • 欧盟法规(Directive (EU) 2022/2380)强制要求可携式电池供电设备和充电器须统一使用USB Type-C接头充电,并在条款中新增了一组新的基本要求。该条款参照了EN IEC 62680标准,法规将于2024年12月28日正式生效,笔记本电脑则于2026年4月28日生效。厂商迫切需要展示其产品符合欧盟通用充电器指令设备规则的基本要求,包括:整合USB Type-C®插座、线缆和连接器及充电器,以及USB PD充电协议。USB Compliance Test Specificat
    百佳泰测试实验室 2024-07-18 14:10 65浏览
  • 我们知道,许多旗舰手机,在宣传拍摄能力的强悍时,厂商往往都在强调——使用了索尼的IMX???图像传感器。为什么?这是因为,索尼是全球CMOS图像传感器遥遥领先的王者——无论是技术实力亦或是市场份额,CMOS图像传感器是摄像头的最核心器件。传感器专家网https://www.sensorexpert.com.cn专注于传感器技术领域,致力于对全球前沿市场动态、技术趋势与产品选型进行专业垂直的服务,是国内领先的传感器产品查询与媒体信息服务平台。基于传感器产品与技术,对广大电子制造从业者与传感器制造者
    传感器专家网 2024-07-17 19:41 81浏览
  •         FPGA新手入门的简单小例子第二个,这几个例子主要给入门的新手建立时间或者说时序的概念,最近看了不少的资料基本上都是以点灯为例,估计是大家对嵌入式开发和FPGA的普遍共识,这两天逛B站发现了也不少比较好的视频教程,我就在这里二次提炼一下,做上几篇文章,为大家的学习垫上两块砖头,现在这一篇是第二篇。实验之前:(1)默认对应的FPGA外部输入时钟为50MHz,这样对应的时钟周期就为20ns(当然其他的频率也可以,这里以50MHz时钟来举例);(
    商风 2024-07-17 20:13 107浏览
  • 各大Logo更新汇报 | NEW百佳泰为ISO/IEC17025实验室,亦获得国际协会授权,可提供超过30种标准认证测试,特为您整理2024年7月各大Logo的最新规格信息。Bluetooth▶新版蓝牙认证流程已于2024年7月1日生效。详情请参阅QPRDv3和常见问题解答 (FAQ)。https://www.bluetooth.com/download/qprd-document/https://qualification.support.bluetooth.com/hc/en-us/arti
    百佳泰测试实验室 2024-07-18 14:22 72浏览
  • 产业上游该如何应对新能源汽车市场增长带来的“好”和市场竞争带来的“卷”?  汽车市场承压,但车灯仍然被认为是有潜力的细分零部件? 行业专家认为,作为汽车的细分零部件,车灯能超越整体行业增长,其背后很大原因来自于技术升级带来的车灯价值量提升。 毕竟,作为与消费者用户体验强相关的零部件,消费者愿意为更智能、更美观、更具个性、更节能的车灯付出更高的成本。当下,车灯已然从视觉件向个性化交互表达载体升级。  1、向好的底层逻辑? 首先,
    艾迈斯欧司朗 2024-07-17 17:25 44浏览
  • 在汽车行业迈向智能化、自动化的今天,自动驾驶技术也在快速发展。为了进一步让自动驾驶更加“智能化”,像老师傅一样进行开车,离不开对车辆周围环境的全面认识。面对复杂的感知任务,单一传感器的局限性逐渐显现,比如相机对目标的颜色和纹理比较敏感,但易受光照、天气条件的影响。LiDAR以获得目标精确的3D信息,但无法获得目标纹理,易产生噪点等情况。多传感器数据融合技术应时而生,通过整合不同传感器的优势,为车辆提供了一个全面、立体的感知维度。一、多传感器融合的先决条件当多种传感器装在同一辆车上时,使用同一个系
    康谋 2024-07-18 14:33 68浏览
  •         FPGA新手入门的简单小例子,主要给入门的新手建立时间或者说时序的概念,最近看了不少的资料基本上都是以点灯为例,估计是大家对嵌入式开发和FPGA的普遍共识,这两天逛B站发现了也不少比较好的视频教程,我就在这里二次提炼一下,做上几篇文章,为大家的学习垫上两块砖头。实验目标及简介:(1)默认对应的FPGA外部输入时钟为50MHz,这样对应的时钟周期就为20ns(当然其他的频率也可以,这里以50MHz时钟来举例);(2)不限制开发板类型、IDE类
    商风 2024-07-17 20:00 100浏览
  • 光电探测器光电测试   光电探测器一般需要先对晶圆进行测试,封装后再对器件进行二次测试,完成最终的特性分析和分拣操作;光电探测器在工作时,需要施加反向偏置电压来拉开光注入产生的电子空穴对,从而完成光生载流子过程,因此光电探测器通常在反向状态工作;测试时比较关注暗电流、反向击穿电压、结电容、响应度、串扰等参数。 利用数字源表进行光电探测器光电性能表征   实施光电性能参数表征分析的最佳工具之一是数字源表(SMU)。数字源表作为独立的电压源或电流源,可输出恒压、恒流、或者脉
    普赛斯仪表 2024-07-17 16:18 117浏览
  • 近日,教育行业“网红”张雪峰旗下公司峰学蔚来化身LP,认缴出资额1600万元入股永鑫融耀基金,正式官宣进军“创投圈”,激起千层浪。作为一个超级IP,一个话题性人物,从教育行业转入VC圈,张雪峰再次出圈引起媒体关注。而这个风投基金的指向还不一般,不是投资教育、金融、房产,而是一个以半导体芯片等为主的硬科技风投资金。传感器专家网https://www.sensorexpert.com.cn专注于传感器技术领域,致力于对全球前沿市场动态、技术趋势与产品选型进行专业垂直的服务,是国内领先的传感器产品查询
    传感器专家网 2024-07-17 19:37 73浏览
  • 科技云报道原创。OpenAI再度扔出重磅炸弹。近期,OpenAI公司在社交平台上宣布,其收购了领先实时分析数据库公司Rockset。OpenAI强调,OpenAI将在其产品中整合Rockset技术,基于Rockset提供的数据索引和查询功能,使公司能够将其数据转化为可操作的智能(Actionable Intelligence)。Rockset主打实时搜索和数据分析,是基于RocksDB,Rockset将RocksDB搬到云上进行云原生化,为用户提供了更加灵活、可扩展、低成本的数据库解决方案,并且
    科技云报到 2024-07-17 14:45 146浏览
  •         晶振是什么?在电路中起到什么作用呢?晶振产品是一个具有压电效应的产品,即在晶片两极外加电压后晶体会产生变形,反过来如外力使晶片变形,则两极上金属片又会产生电压。如果给晶片加上适当的交变电压,晶片就会产生谐振(谐振频率与石英斜面倾角等有关系,且频率一定)。晶振利用一种能把电能和机械能相互转化的晶体,在共振的状态下工作可以提供稳定、精确的单频振荡。在通常工作条件下,普通的晶振频率绝对精度可达百万分之二十。利用该特性,晶振可以提供较稳定
    SJK晶科鑫 2024-07-18 10:12 79浏览
  • 现代人的日常生活当中,microSD & SD Card (Secure Digital Memory Card)几乎是人手多片。其小巧大容量的优点,不但便于数据的储存,更适合用在小型装置上的应用。 谈到SD card的发展,打从最早期的SD 1.0开始,SD Card一共经历了2.0 (SD/SDHC/SDXC)/ 3.0(UHS-I)/4.x(UHS-II)/5.x & 6.0(UHS-III)的发展,一直到近期的7.x (PCIe Gne3) 及8.0(PCIe Gne4)的版本,其运作
    百佳泰测试实验室 2024-07-18 14:36 72浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦