0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

压缩算法的类型和应用

FPGA开源工作室 来源:FPGA开源工作室 2024-10-21 13:50 次阅读

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压缩率较低,算法复杂度和内存消耗中等,但是压缩和解压速度,尤其是解压速度远超其他算法。因为其综合性能优秀,在LinuxAndroid中的内存压缩技术一般使用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’x85Rx82Gx86Bx03ABCD’,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!
");
        printf("Compressed data size: %d
", 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!
");
            printf("Decompressed data: %s
", decompressed_data);
        } else {
            printf("Error decompressing data!
");
        }
    } else {
        printf("Error compressing data!
");
    }

    return 0;
}

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ARM
    ARM
    +关注

    关注

    134

    文章

    9040

    浏览量

    366724
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62409
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68321
  • 压缩算法
    +关注

    关注

    1

    文章

    21

    浏览量

    10488

原文标题:压缩算法简介

文章出处:【微信号:leezym0317,微信公众号:FPGA开源工作室】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文解析网络压缩算法的原理实现及结果

    引言 网络压缩在AI加速中可以说起到四两拨千斤的作用,网络参数的减小不仅仅降低了存储和带宽,而且使计算逻辑简单,降低了LUT资源。从本篇开始,我们就一起挖掘一下网络压缩算法类型,原理
    的头像 发表于 11-14 10:51 2474次阅读
    一文解析网络<b class='flag-5'>压缩</b><b class='flag-5'>算法</b>的原理实现及结果

    FPGA实现滑动平均滤波算法和LZW压缩算法

    采集数据中的量化噪声,在进行数据压缩前采用滤波的预处理技术。介绍LZW算法和滑动滤波算法的基本理论,详细阐述用单片FPGA实现两种算法的方法。最终测试结果表明,该设计方案能够有效滤除数
    发表于 04-24 09:05

    关于语音芯片音频压缩算法研究

    大家好,我是做语音芯片的。最近想研究一种压缩率高,音质好,并且解码简单。最好能用8位机跑5M可以解码的算法。编码可以复杂一些。最也参考了很多国外关于语音压缩算法,但是感觉好点的
    发表于 09-18 17:33

    语音压缩算法研究

    希望广大DSP大侠们帮我出出主意,怎么才能写一个好的音频压缩算法,最好是在时域的压缩。频域的压缩发现都相对比较复杂。大家好,我是做语音芯片的。最近想研究一种
    发表于 09-18 17:38

    【案例分享】经典的压缩算法Huffman算法

    前两天发布那个rsync算法后,想看看数据压缩算法,知道一个经典的压缩算法Huffman算法
    发表于 07-17 04:30

    什么是压缩算法呢?压缩算法又是怎么定义的呢?

    认识压缩算法想必都有过压缩和解压缩文件的经历,当文件太大时,我们会使用文件压缩来降低文件的占用空间。比如微信上传文件的限制是100MB,有个
    发表于 07-28 07:22

    认识压缩算法

    压缩算法认识压缩算法我们想必都有过压缩和 解压缩文件的经历,当文件太大时,我们会使用文件
    发表于 07-28 08:12

    什么是压缩算法

    什么是压缩算法呢?压缩算法又是怎么定义的呢?
    发表于 10-19 07:25

    压缩算法是怎么定义的呢

    什么是压缩算法呢?压缩算法又是怎么定义的呢?文件是如何存储的?
    发表于 10-19 07:01

    啃论文俱乐部 | 压缩算法团队:我们是如何开展对压缩算法的学习

    关于OpenHarmony 啃论文俱乐部压缩算法团队大家好!我是上海工程技术大学交通运输专业的一名大二学生,同时在 OpenAtom OpenHarmony(以下简称“OpenHarmony”)啃
    发表于 06-21 11:05

    基于小波变换的干涉图压缩算法?

    基于小波变换的干涉图压缩算法? 摘要:在研究小波变换和分层树集合分割排序算法的基础上,将小波图像压缩技术应用于干涉图的压缩.根据小波分解系
    发表于 05-12 09:13 30次下载

    基于ADPCM的语音压缩算法研究

    摘 要 ADPCM算法目前已成为很受用的语音压缩算法之一。给出PCM概念。讨论DPCM,DM,ADM与ADPCM的 压缩算法原理以及
    发表于 04-08 11:20 84次下载

    Linux 5.7将支持Zstd压缩算法

    Linux 5.6 引入了可选的 F2FS 透明数据压缩支持,并通过 LZO 和 LZ4 压缩算法实现。现在,Linux 5.7 内核正在支持 Zstd 压缩
    的头像 发表于 03-26 15:15 2805次阅读

    数据压缩算法的介绍

    在RPC通信数据的传输场景下,当通信报文数据传输较大时,会对数据包进行压缩传输,根据不同传输场景,常用的压缩算法有Zlib、Gzip、Bzip2、Deflater、Lz4、Lzo、Snappy
    的头像 发表于 02-28 14:25 1252次阅读
    数据<b class='flag-5'>压缩</b><b class='flag-5'>算法</b>的介绍

    压缩机的类型和区别

    压缩机的类型和区别  压缩机是一种用于提高气体压缩和输送能力的机械设备。根据不同的工作原理和应用需求,压缩机可分为多种
    的头像 发表于 02-01 14:36 2907次阅读