0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

壓縮算法的類型和應(yīng)用

FPGA開(kāi)源工作室 ? 來(lái)源:FPGA開(kāi)源工作室 ? 2024-10-21 13:50 ? 次閱讀

1 概述

壓縮算法是一種通過(guò)減少數(shù)據(jù)量來(lái)節(jié)省存儲(chǔ)空間或傳輸數(shù)據(jù)的技術(shù)。壓縮算法可以分為兩種類型:有損壓縮和無(wú)損壓縮。
有損壓縮算法會(huì)犧牲一定的數(shù)據(jù)精度或質(zhì)量,在壓縮數(shù)據(jù)的同時(shí)丟失一些信息。這種算法適用于音頻、視頻等多媒體數(shù)據(jù),例如JPEG和MP3等格式。
無(wú)損壓縮算法則能夠完全還原原始數(shù)據(jù),不會(huì)造成數(shù)據(jù)丟失。這種算法適用于需要準(zhǔn)確還原數(shù)據(jù)的場(chǎng)景,如文檔、代碼等,例如ZIP和GZIP等格式。
常見(jiàn)的壓縮算法包括哈夫曼編碼、Lempel-Ziv算法、Run-Length Encoding(RLE)等。這些算法通過(guò)不同的方式對(duì)數(shù)據(jù)進(jìn)行編碼和解碼,以實(shí)現(xiàn)數(shù)據(jù)壓縮和解壓縮的目的。

2 壓縮算法的應(yīng)用

壓縮算法在各種領(lǐng)域廣泛應(yīng)用,包括但不限于以下幾個(gè)方面:
文件傳輸和存儲(chǔ):壓縮算法可以減少文件的大小,使文件傳輸更加高效快速。在網(wǎng)絡(luò)傳輸、電子郵件附件、云存儲(chǔ)等場(chǎng)景下,壓縮算法可以節(jié)省帶寬和存儲(chǔ)空間。
多媒體數(shù)據(jù):音頻、視頻等多媒體數(shù)據(jù)通常是體積較大的,使用壓縮算法可以減少文件大小,提高數(shù)據(jù)的傳輸速度和播放效果。常見(jiàn)的視頻壓縮算法包括H.264、HEVC等;音頻壓縮算法包括MP3、AAC等。
數(shù)據(jù)庫(kù)壓縮:在數(shù)據(jù)庫(kù)管理系統(tǒng)中,數(shù)據(jù)通常存儲(chǔ)在磁盤上,通過(guò)壓縮算法可以減少數(shù)據(jù)占用的存儲(chǔ)空間,并提高數(shù)據(jù)庫(kù)的性能和響應(yīng)速度。
圖像處理:在數(shù)字圖像處理中,壓縮算法可以減小圖像文件的大小,在圖像傳輸和存儲(chǔ)中起到重要作用。常見(jiàn)的圖像壓縮算法包括JPEG、PNG等。
網(wǎng)頁(yè)內(nèi)容壓縮:為了減少網(wǎng)頁(yè)加載時(shí)間和用戶訪問(wèn)流量,網(wǎng)站通常會(huì)使用壓縮算法對(duì)HTML、CSS、JavaScript等網(wǎng)頁(yè)內(nèi)容進(jìn)行壓縮,提高用戶體驗(yàn)和網(wǎng)站性能。
總的來(lái)說(shuō),壓縮算法在信息技術(shù)領(lǐng)域的各個(gè)方面都有廣泛的應(yīng)用,可以有效地節(jié)省存儲(chǔ)空間、提高數(shù)據(jù)傳輸效率和優(yōu)化性能。

3適合ARM跑的壓縮算法

ARM架構(gòu)是一種廣泛應(yīng)用于移動(dòng)設(shè)備、嵌入式系統(tǒng)物聯(lián)網(wǎng)設(shè)備中的處理器架構(gòu)。在運(yùn)行在ARM處理器上的設(shè)備或系統(tǒng)上選擇合適的壓縮算法,需要考慮算法的性能、資源消耗和適應(yīng)性。
以下是一些適合與ARM跑的壓縮算法:
Zstandard(Zstd):Zstandard是一種快速的壓縮算法,性能優(yōu)秀,并且可以在ARM處理器上高效運(yùn)行。它具有適應(yīng)性強(qiáng),可以在不同的場(chǎng)景下應(yīng)用,如數(shù)據(jù)傳輸、數(shù)據(jù)庫(kù)壓縮等。
LZ4:LZ4是一種高速壓縮算法,適合于需要快速壓縮和解壓的場(chǎng)景。它具有低延遲和高吞吐量的特點(diǎn),適合在ARM處理器上運(yùn)行。LZ4是一種LZ系列壓縮算法,著重于壓縮和解壓的速度,壓縮率相對(duì)較低。LZ4壓縮率較低,算法復(fù)雜度和內(nèi)存消耗中等,但是壓縮和解壓速度,尤其是解壓速度遠(yuǎn)超其他算法。因?yàn)槠渚C合性能優(yōu)秀,在Linux、Android中的內(nèi)存壓縮技術(shù)一般使用LZ4壓縮算法。LZ4 HC,有著更好的壓縮率,但是算法復(fù)雜度大幅提升,且壓縮速度也大幅減慢,但是依然有著很好的解
Brotli:Brotli是由Google開(kāi)發(fā)的一種通用壓縮算法,特點(diǎn)是高壓縮率和較好的性能。它在文件傳輸、網(wǎng)絡(luò)傳輸?shù)葓?chǎng)景下表現(xiàn)優(yōu)異,也可以在ARM處理器上高效運(yùn)行。
Snappy:Snappy是Google開(kāi)發(fā)的一種快速壓縮算法,適合于需要高速壓縮和解壓的場(chǎng)景。它在ARM處理器上表現(xiàn)優(yōu)秀,適用于數(shù)據(jù)傳輸、日志壓縮等應(yīng)用。
Deflate(如zlib):Deflate是一種常見(jiàn)的無(wú)損壓縮算法,廣泛應(yīng)用于各種領(lǐng)域。zlib是實(shí)現(xiàn)Deflate算法的一個(gè)流行庫(kù),也可以在ARM處理器上使用,并具有較好的性能。
這些壓縮算法在ARM處理器上都有良好的性能表現(xiàn),可以根據(jù)具體的應(yīng)用場(chǎng)景和需求選擇合適的算法。值得注意的是,優(yōu)化算法的實(shí)現(xiàn)、調(diào)整參數(shù)和選擇合適的壓縮級(jí)別,也可以進(jìn)一步提高在ARM處理器上的性能表現(xiàn)。
Huffman霍夫曼(Huffman)編碼使用變長(zhǎng)編碼表對(duì)源符號(hào)進(jìn)行編碼,其中變長(zhǎng)編碼表是通過(guò)一種評(píng)估來(lái)源符號(hào)出現(xiàn)機(jī)率的方法得到的,出現(xiàn)機(jī)率高的字母使用較短的編碼,反之出現(xiàn)機(jī)率低的則使用較長(zhǎng)的編碼,這便使編碼之后的字符串的平均長(zhǎng)度、期望值降低,從而達(dá)到無(wú)損壓縮數(shù)據(jù)的目的。霍夫曼編碼使用的編碼表,使用霍夫曼樹(shù)來(lái)進(jìn)行存儲(chǔ),讓出現(xiàn)概率最高的編碼最容易查找,以提升解碼速度。霍夫曼編碼算法的壓縮率分布在20%-90%,因?yàn)橐獟呙枵麄€(gè)數(shù)據(jù)來(lái)構(gòu)建霍夫曼樹(shù),所以其壓縮速度較慢,且需要一定的內(nèi)存來(lái)存儲(chǔ)編碼表,但是解壓速度較快?;舴蚵乃惴◤?fù)雜度較簡(jiǎn)單。
RLE(Run Length Encoding),也稱為行程編碼,壓縮算法是一種無(wú)損壓縮算法。算法特點(diǎn):簡(jiǎn)單、易實(shí)現(xiàn)。使用RLE壓縮方法可以將 RRRRRGGBBBBBBABCD 壓縮為 5R2G6B1A1B1C1D?;赗LE算法升級(jí),可以將RRRRRGGBBBBBBABCD可以壓縮為b’x85Rx82Gx86Bx03ABCD’,0x85表示后面有5個(gè)相同的字符,0x03表示后面有3個(gè)不連續(xù)的字符。RLE的實(shí)現(xiàn)非常簡(jiǎn)單,針對(duì)一些圖片顏色少或重復(fù)字符多的文件有非常好的壓縮率,RLE的適用場(chǎng)景比較少,通用壓縮率較差。
LZ77是一種基于字典的算法,它將長(zhǎng)字符串(也稱為短語(yǔ))編碼成短小的標(biāo)記,用小標(biāo)記代替字典中的短語(yǔ),從而達(dá)到壓縮的目的。LZ77算法的壓縮率、速度、內(nèi)存消費(fèi)都是中等,但是代碼復(fù)雜度較低,適用于MCU的使用。
LZO壓縮算法采用(重復(fù)長(zhǎng)度L,指回距離D)代替當(dāng)前已經(jīng)在歷史字符串中出現(xiàn)過(guò)的字符串。LZO致力于解壓速度,不同的參數(shù)下的LZO壓縮率不同。LZO內(nèi)存消耗中等,解壓速度較快,壓縮速度較快,但是代碼復(fù)雜度較低,適用于Bootloader等追求壓縮率和解壓速度的場(chǎng)景。

4性能排序

在實(shí)際應(yīng)用中,不同的壓縮算法因?yàn)檫m用場(chǎng)景、數(shù)據(jù)類型、硬件平臺(tái)等因素的不同,其性能表現(xiàn)也會(huì)有所差異。以下是一些常見(jiàn)的壓縮算法按照一般趨勢(shì)的性能排序:
壓縮率(從高到低):
有損壓縮:JPEG2000 > WebP > H.265 (HEVC) > H.264 (AVC) > JPEG
無(wú)損壓縮:FLIF > Brotli > Zstandard > LZMA (7-Zip) > DEFLATE (zlib)
壓縮速度(從快到慢):
Snappy > LZ4 > Zstandard > Deflate (zlib) > Brotli
這里的快慢僅作為一般參考,具體情況因數(shù)據(jù)大小、數(shù)據(jù)類型、硬件性能等因素可能有所不同。
解壓速度(從快到慢):
Snappy > LZ4 > Zstandard > Deflate (zlib) > Brotli
同樣,解壓速度也會(huì)受到實(shí)際場(chǎng)景的影響,不同算法適用于不同的應(yīng)用需求。
內(nèi)存消耗(從少到多):
Snappy > LZ4 > Zstandard > Deflate (zlib) > Brotli
內(nèi)存消耗較低的壓縮算法可以在受限制的環(huán)境下更好地工作,如嵌入式設(shè)備等。

5 壓縮算法代碼示例

以下是一個(gè)簡(jiǎn)單的使用zlib庫(kù)進(jìn)行數(shù)據(jù)壓縮和解壓縮的C語(yǔ)言示例代碼:

```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;
}

在這個(gè)示例代碼中,我們使用了zlib庫(kù)提供的函數(shù)進(jìn)行數(shù)據(jù)壓縮和解壓縮操作。壓縮函數(shù) compress_data 將輸入數(shù)據(jù)進(jìn)行壓縮,并將壓縮后的數(shù)據(jù)存儲(chǔ)在 compressed_data 中,返回壓縮后的數(shù)據(jù)長(zhǎng)度;解壓縮函數(shù) decompress_data 對(duì)壓縮后的數(shù)據(jù)進(jìn)行解壓縮,并將解壓縮后的數(shù)據(jù)存儲(chǔ)在 decompressed_data 中,返回解壓縮后的數(shù)據(jù)長(zhǎng)度。在主函數(shù)中,我們對(duì)一個(gè)簡(jiǎn)單的字符串進(jìn)行壓縮和解壓縮操作,并輸出結(jié)果。

請(qǐng)注意,這段示例代碼使用了zlib庫(kù),因此在編譯時(shí)需要鏈接zlib庫(kù)。在Linux系統(tǒng)下,可以使用 -lz 選項(xiàng)進(jìn)行鏈接。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    9005

    瀏覽量

    366018
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4256

    瀏覽量

    62223
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4694

    瀏覽量

    68074
  • 壓縮算法
    +關(guān)注

    關(guān)注

    1

    文章

    21

    瀏覽量

    10478

原文標(biāo)題:壓縮算法簡(jiǎn)介

文章出處:【微信號(hào):leezym0317,微信公眾號(hào):FPGA開(kāi)源工作室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    一文解析網(wǎng)絡(luò)壓縮算法的原理實(shí)現(xiàn)及結(jié)果

    引言 網(wǎng)絡(luò)壓縮在AI加速中可以說(shuō)起到四兩撥千斤的作用,網(wǎng)絡(luò)參數(shù)的減小不僅僅降低了存儲(chǔ)和帶寬,而且使計(jì)算邏輯簡(jiǎn)單,降低了LUT資源。從本篇開(kāi)始,我們就一起挖掘一下網(wǎng)絡(luò)壓縮算法類型,原理
    的頭像 發(fā)表于 11-14 10:51 ?2391次閱讀
    一文解析網(wǎng)絡(luò)<b class='flag-5'>壓縮</b><b class='flag-5'>算法</b>的原理實(shí)現(xiàn)及結(jié)果

    FPGA實(shí)現(xiàn)滑動(dòng)平均濾波算法和LZW壓縮算法

    采集數(shù)據(jù)中的量化噪聲,在進(jìn)行數(shù)據(jù)壓縮前采用濾波的預(yù)處理技術(shù)。介紹LZW算法和滑動(dòng)濾波算法的基本理論,詳細(xì)闡述用單片F(xiàn)PGA實(shí)現(xiàn)兩種算法的方法。最終測(cè)試結(jié)果表明,該設(shè)計(jì)方案能夠有效濾除數(shù)
    發(fā)表于 04-24 09:05

    關(guān)于語(yǔ)音芯片音頻壓縮算法研究

    大家好,我是做語(yǔ)音芯片的。最近想研究一種壓縮率高,音質(zhì)好,并且解碼簡(jiǎn)單。最好能用8位機(jī)跑5M可以解碼的算法。編碼可以復(fù)雜一些。最也參考了很多國(guó)外關(guān)于語(yǔ)音壓縮算法,但是感覺(jué)好點(diǎn)的
    發(fā)表于 09-18 17:33

    語(yǔ)音壓縮算法研究

    希望廣大DSP大俠們幫我出出主意,怎么才能寫一個(gè)好的音頻壓縮算法,最好是在時(shí)域的壓縮。頻域的壓縮發(fā)現(xiàn)都相對(duì)比較復(fù)雜。大家好,我是做語(yǔ)音芯片的。最近想研究一種
    發(fā)表于 09-18 17:38

    【案例分享】經(jīng)典的壓縮算法Huffman算法

    前兩天發(fā)布那個(gè)rsync算法后,想看看數(shù)據(jù)壓縮算法,知道一個(gè)經(jīng)典的壓縮算法Huffman算法。
    發(fā)表于 07-17 04:30

    什么是壓縮算法呢?壓縮算法又是怎么定義的呢?

    認(rèn)識(shí)壓縮算法想必都有過(guò)壓縮和解壓縮文件的經(jīng)歷,當(dāng)文件太大時(shí),我們會(huì)使用文件壓縮來(lái)降低文件的占用空間。比如微信上傳文件的限制是100MB,有個(gè)
    發(fā)表于 07-28 07:22

    認(rèn)識(shí)壓縮算法

    壓縮算法認(rèn)識(shí)壓縮算法我們想必都有過(guò)壓縮和 解壓縮文件的經(jīng)歷,當(dāng)文件太大時(shí),我們會(huì)使用文件
    發(fā)表于 07-28 08:12

    什么是壓縮算法

    什么是壓縮算法呢?壓縮算法又是怎么定義的呢?
    發(fā)表于 10-19 07:25

    壓縮算法是怎么定義的呢

    什么是壓縮算法呢?壓縮算法又是怎么定義的呢?文件是如何存儲(chǔ)的?
    發(fā)表于 10-19 07:01

    啃論文俱樂(lè)部 | 壓縮算法團(tuán)隊(duì):我們是如何開(kāi)展對(duì)壓縮算法的學(xué)習(xí)

    關(guān)于OpenHarmony 啃論文俱樂(lè)部壓縮算法團(tuán)隊(duì)大家好!我是上海工程技術(shù)大學(xué)交通運(yùn)輸專業(yè)的一名大二學(xué)生,同時(shí)在 OpenAtom OpenHarmony(以下簡(jiǎn)稱“OpenHarmony”)啃
    發(fā)表于 06-21 11:05

    基于小波變換的干涉圖壓縮算法?

    基于小波變換的干涉圖壓縮算法? 摘要:在研究小波變換和分層樹(shù)集合分割排序算法的基礎(chǔ)上,將小波圖像壓縮技術(shù)應(yīng)用于干涉圖的壓縮.根據(jù)小波分解系
    發(fā)表于 05-12 09:13 ?30次下載

    基于ADPCM的語(yǔ)音壓縮算法研究

    摘 要 ADPCM算法目前已成為很受用的語(yǔ)音壓縮算法之一。給出PCM概念。討論DPCM,DM,ADM與ADPCM的 壓縮算法原理以及
    發(fā)表于 04-08 11:20 ?84次下載

    Linux 5.7將支持Zstd壓縮算法

    Linux 5.6 引入了可選的 F2FS 透明數(shù)據(jù)壓縮支持,并通過(guò) LZO 和 LZ4 壓縮算法實(shí)現(xiàn)?,F(xiàn)在,Linux 5.7 內(nèi)核正在支持 Zstd 壓縮
    的頭像 發(fā)表于 03-26 15:15 ?2775次閱讀

    數(shù)據(jù)壓縮算法的介紹

    在RPC通信數(shù)據(jù)的傳輸場(chǎng)景下,當(dāng)通信報(bào)文數(shù)據(jù)傳輸較大時(shí),會(huì)對(duì)數(shù)據(jù)包進(jìn)行壓縮傳輸,根據(jù)不同傳輸場(chǎng)景,常用的壓縮算法有Zlib、Gzip、Bzip2、Deflater、Lz4、Lzo、Snappy
    的頭像 發(fā)表于 02-28 14:25 ?1202次閱讀
    數(shù)據(jù)<b class='flag-5'>壓縮</b><b class='flag-5'>算法</b>的介紹

    壓縮機(jī)的類型和區(qū)別

    壓縮機(jī)的類型和區(qū)別? 壓縮機(jī)是一種用于提高氣體壓縮和輸送能力的機(jī)械設(shè)備。根據(jù)不同的工作原理和應(yīng)用需求,壓縮機(jī)可分為多種
    的頭像 發(fā)表于 02-01 14:36 ?2546次閱讀