?

一種ARGB數據無損壓縮解壓算法的FPGA設計

2024-02-29 04:22孫國慶
計算機測量與控制 2024年2期
關鍵詞:壓縮算法字符字節

尹 明,孫國慶

(1.青島科技大學 信息學院,山東 青島 266100;2.西安電子科技大學廣州研究院,廣州 510000)

0 引言

在GPU、AI等芯片設計領域,存儲器訪問往往是系統性能的瓶頸,提高存儲器的訪問效率對提升芯片性能的意義重大,其中對顏色緩沖區數據(AGRB)的頻繁讀寫性能的影響很大[1]。從數據壓縮算法的角度,通過減少訪問顏色緩沖區的數據量來提高存儲器的帶寬和訪問效率[2-3]。

圖像壓縮是一種通過使用更緊湊的方式來存儲和傳輸圖像數據的技術。在進行無損圖像壓縮時,通常會對圖像的各個通道(包括紅色通道(R)、綠色通道(G)、藍色通道(B)以及透明度通道(A))進行處理,這些通道數據通常是基于AGRB格式。數據壓縮的原理來自于信息內存在的數據冗余。文獻[4]提出一種多級流水的Gzip壓縮設計架構。利用并行處理窗口的設計實現數據壓縮的并行處理,通過匹配選擇消除了并行處理的相關性[4]。文獻[5]使用了計算速度與擬合精度更有優勢的自注意力機制模型,同時引入字典編碼的優勢,以字節對編碼(Byte-pair Encoding)的形式生成字典,以模型計算數據集統計信息,輔以算術編碼AC進行壓縮,能夠達到吞吐率與壓縮比都更高的無損壓縮模型[5]。文獻[6]提出了一種在FPGA平臺上實現Huffman編碼以及高速存入DDR3SDRAM存儲器的研究方案[6]。文獻[7]根據LZ77和LZW壓縮算法的基本原理,通過分析多種影響LZ77和LZW壓縮性能的關鍵因素,提出諸如雙Hash函數查找方式、并行匹配處理方法、更有效的LZ77數據存儲格式、高效數據拼接器以及并行Hash函數查找方式等多種加速方法及其硬件結構,并設計出相應的LZ77和LZW硬件壓縮電路[7]。但是Deflate壓縮算法有缺陷,Huffman的存儲結構也需要進行優化。根據香農提出的信息論中的率失真理論,可以利用這種冗余來實現圖像的壓縮,即在保持圖像質量的前提下,減小圖像數據的存儲或傳輸所需的空間或帶寬。通過壓縮算法和技術,可以消除圖像中的冗余信息,包括空間冗余(由于圖像中的相鄰像素之間的相似性)和統計冗余(由于像素值分布的規律性),從而實現高效的圖像壓縮。

對于GPU而言,對圖像的訪問并不限于整張圖片。GPU具有強大的隨機訪問能力,因此在處理壓縮后的圖像時,可以僅改變部分區域而無需修改整個圖像[8]。為了實現這一點,壓縮后的文件需要提供每個壓縮區域的位置信息。通過解壓縮文件并根據索引找到特定位置,可以修改相應區域的像素數據。為了滿足這一需求,開發了一種圖像單元的壓縮算法,該壓縮算法能夠對圖像的特定區域進行快速壓縮和解壓縮操作。通過這種壓縮算法,能夠快速改變圖像的特定區域,并且有效減小傳輸帶寬的占用。

1 無損壓縮算法的設計思路

1.1 優化Deflate壓縮算法流程圖

Deflate壓縮算法的實現流程如下:

1)通過使用LZ77算法,找到輸入數據中的重復片段,并用指針和長度來表示這些重復片段。

2)使用哈夫曼編碼對指針和長度進行編碼,將它們轉換為更短的比特序列。

3)在進行哈夫曼編碼之前,還會構建一個動態的哈夫曼樹,根據輸入數據的頻率來調整編碼方式,以實現更高效地壓縮。

4)將編碼后的數據和一些元數據一起打包成壓縮數據格式,并輸出壓縮結果。

通過這一系列的步驟,Deflate壓縮算法能夠實現對數據的高效壓縮,以減小數據的存儲空間占用。

將圖像的特定區域稱為“tile”,并實現了對該區域的壓縮和解壓縮功能。設置了不同大小的tile,包括4×4、8×8和16×16像素的塊,對應的字節大小分別為64、256和1 024字節。主要目的是實現對圖片區域的壓縮和解壓縮,所以每次壓縮的數據量并不大,僅限于這3種字節大小。

針對Deflate壓縮算法,在進行LZ77壓縮之后,如果按照傳統方式使用Huffman算法進行壓縮,保存Huffman編碼表所需的內存空間較大。所以Huffman再對LZ77壓縮的結果進行壓縮提升的壓縮率不明顯。為此,對Deflate算法進行了優化,將LZ77和Huffman算法的執行過程并行化,以提高壓縮效率[9]。

本算法的流程如圖1所示。

圖1 該壓縮算法流程圖

使用v4頭部格式的位圖文件。v4bmp是一種位圖文件格式的擴展,它具有更豐富的信息和功能,特別適用于支持RGBA顏色空間的圖像。包含AGRB共4個顏色的通道。對文件的壓縮和解壓基于此文件展開壓縮和解壓的。

算法開始之后,對bmp文件的文件頭進行讀取并保存,獲得了圖片的高度和寬度,然后按順序讀取所有的AGRB像素數據并保存。再從保存的AGRB數據中讀取一個圖像區域,對其進行差分預測編碼之后再進行LZ77壓縮,并且對此圖像區域進行Huffman壓縮,比較兩個壓縮算法完成后的文件大小,判斷其是否都小于256字節,如果都小于256字節,那么就將其中較小的寫入壓縮文件,否則就直接把原始的圖像區域寫入壓縮文件,這樣可以獲得較小的壓縮率。

壓縮后的文件給出了圖像的寬度和高度,以便解壓時可以完整地還原原始的圖像信息。應該注意到壓縮后的文件中的TileCount和DataInfo兩個數據,正如之前所說的GPU具有強大的隨機訪問的性能,在某些領域的圖像更改不需要改變所有的圖像信息。因此,當某個圖像區域需要改變時,只需要知道壓縮后其所在壓縮圖像的位置,將其從壓縮后的文件中取出后解壓并改變像素數據即可。TileCount和DataInfo便是找到壓縮后圖像數據所在位置的關鍵信息,他能夠起到索引作用。

1.2 差分預測編碼

對于給定的圖像,可以將其AGRB數據進行區域劃分,主要介紹按照8*8像素的單位進行劃分。這意味著將圖像劃分為許多8*8的小塊,如果需要對圖像進行修改,也需要按照這個8*8像素的單位進行變動[10-11]。圖像劃分格式如圖2所示。

圖2 壓縮塊示例

每個圖像的“tile”,也就是8*8的小塊,包含了64個像素數據。按照8*8像素的方式對圖像進行讀取,這樣就可以獲取256個字節的AGRB數據。需要注意的是,這64個像素并不是按照順序排列的,而是按照圖2所示的方式進行讀取。采取這樣的讀取方式是因為對于一張圖片來說,這樣的區域內的像素之間具有較高的相關性。因此,獲取并壓縮這樣的數據單元可以達到較好的壓縮效果。在得到一個單元的AGRB數據之后,進行差分預測編碼。

差分預測編碼的實現:差分預測編碼(Differential Predictive Coding)是一種常用的無損壓縮技術,用于壓縮數字信號和圖像數據。差分預測編碼的基本思想是通過對信號或圖像中的樣本進行預測,然后用預測值與實際值之間的差異進行編碼。它利用了信號或圖像中的相鄰樣本之間的相關性,將差分值進行編碼,而不是直接對原始樣本進行編碼。

觀察到這些數據沒有重復項,這意味著在壓縮算法中存在很少的冗余。為了充分利用數據的特點,采用了差分預測編碼的方法。通過差分預測編碼,可以對每個像素值與其相鄰像素值之間的差異進行編碼。這樣可以進一步提高數據的冗余性,并提高壓縮算法的效率。差分預測編碼是一種算法,在該算法中,通過獲取一個像素值后,利用預測方法來預測下一個像素的值。采用了使用上一個像素的值作為本次讀取像素的預測,并計算本次讀取的像素值與上一次讀取的像素值之間的差值。這種方式可以有效地減少數據的冗余性,并實現對圖像數據的壓縮。通過差分預測編碼,引入了更多的重復數據,增加了數據的冗余度。然而,這種冗余度的增加使得壓縮變得更加容易。利用這些重復的數據,可以更有效地進行壓縮,因為重復的數據可以被更緊湊地表示和存儲,從而達到更高的壓縮率。

1.3 LZ77壓縮算法

Deflate壓縮算法是由Abraham Lempel和Jacob Ziv提出,是基于字典的無損壓縮算法的基礎,也是無損壓縮領域中的主流算法。LZ77算法基于字典匹配的原理,通過尋找重復出現的數據序列并用指向其前一個出現位置和長度的指針來表示,從而實現數據的壓縮[12-13]。

LZ77算法會先創建一個字典區和待編碼區。LZ77 壓縮是一個循環迭代的過程,LZ77編碼器在字典區查找,直到找到匹配的字符串。匹配字符串的開始位置與離字典區右邊的距離稱為“偏移值”,匹配字符串的長度稱為“匹配長度”。LZ77在編碼時,會一直在字典區中搜索,直到找到最大匹配字符串,然后輸出一個三元組(off,len,char),off表示偏移值,len表示匹配長度,char為待編碼區第一個等待編碼的字符。編碼輸出為(0,0,A),接著,文本序列會向前移動,編碼輸出為:(1,1,A)。文本序列繼續前移一位,編碼輸出為:(0,0,B)。文本序列繼續前移一位,編碼輸出為:(3,1,B)。文本序列繼續前移,直到待編碼區為空。所以最后的文本輸出為:

(0,0,A),(1,1,A),(0,0,B),(0,0,C),(2,1,B),(3,1,B),(5,3,A)

經過上面的編碼會發現,實際輸入的文本共有9個字節,而輸出共有7×3=21個字節,這就會導致壓縮后的數據膨脹,并沒有實現壓縮的功能。以上只是LZ77算法的基本原理,根據以上原理進行了算法的改動。

對于上述的流程可以發現,字典區越長,待編碼區的字符在字典區能夠被搜索到的概率越高,也就是匹配的概率越高。然而也并非將待編碼區的字符全部替換成(off,len,char)合適。因為保存一個off要一個字節,保存一個len要一個字節,保存一個char也要一個字節,這樣壓縮之后的數據就會變得膨脹。為此,設置一個界限,當len的長度大于2的時候再進行編碼,否則進行原樣輸出。這樣一來,壓縮的效率會大大提高。

同時,算法所針對的壓縮數據也就是一個圖像區域,也就是256個字節。倘若再進行上節所講的字典區為5,待編碼區為3的算法壓縮,那么很難找到長度大于2的編碼。為此將256字節的一部分作為字典區剩余的另一部分作為待編碼區,這樣就極大地增加了字符被編碼的概率。

獲得一個tile之后,先將前兩個字符設置為字典,然后再到后面的字符中取字符,在前面的字典區查找,如果找得到,那么就保存其off偏移值,len長度,以及字符char。

在這里,定義以下3個uchar(unsigned char,下同)數組:

ucharcomplbuff[256];

ucharcompsignbuff[256];

ucharcompslbuff [256];

其中complbuff儲存的是字典區匹配到的字符,compsignbuff是標志位字符,compslbuff是存儲len和off的數組。對以上3個數組進行解釋,如果待編碼區的字符在字典區沒有找到,那么就將其保存在complbuff中,并將標志位符設置為0,表示字典區查找不到。如果能在字典區查找到該字符,并且能匹配到的長度大于二,那么就對其保存off和len,并將標志符設置為1,表示能在字典區找到。

1.4 hash表進行對算法進行加速

根據上述的匹配機制可知,如果直接對字典區和待編碼區進行暴力匹配,那么算法的復雜度是O(mn),它的算法復雜度為O(mn),其中m是待匹配字符串的長度,n是目標字符串的長度。在hash算法匹配之前,也嘗試了KMP算法進行加速,但是效果不是很好,而hash匹配函數,可以較好地完成算法加速的功能[14-15]。

Hash加速如下:

依然是使用上面的字符為例,依舊按照上面所述的流程,將字符的前兩個保存在hash表中,當待編碼區的2過來時,發現hash里面有2,其位置為2,那么待編碼區的字符2直接到字典區的2的位置進行匹配,發現匹配長度為1,不能作為LZ77編碼的輸出,那么將待編碼區的2保存在hash表中,數據前移。

繼續重復上述的過程,發現字符在字典區沒有找到,那么直接將其插入到hash表中。當下一個字符2進行編碼時,在hash表中發現其有位置2、3,那么程序會執行以下過程,首先在hash表中找字符2的位置,為2,那么就從字典區的第二個位置找起。字典區的指針向后移動一個位置,待編碼區的指針也向后移動一個位置,直到兩個指針位置后面的字符不再相等,就停止移動,并退出字符匹配。同時更新hash表。該表表示將待編碼區已經被匹配的2,2字符也插入到了hash表中。

對于已經被匹配的字符2,2使用compslbuff []保存其位置2和長度2。并設置標志字符為1,并保存在數組compsignbuff[]中。如果要對其解壓,就讀取compsignbuff[]數組,如果值為1,就直接讀取compslbuff[]兩個字節即可,讀取的第一個字節為位置,第二個字節為長度。

1.5 對off和len的優化

對于這樣的一個字符串,a b a b a b a b a b a b a b a b a b a b a b a b a b會發現如果按照上面的方式進行壓縮,那么輸出的編碼在compslbuff[]的儲存為[0,2][0,4][0,8]......這就導致每來一個a,b字符就會輸出一個位置和長度,然而匹配的大小為2,這就導致LZ77算法對這樣的一個字符無能為力。為此需要對off和len重新設計[16]。

做出如下的改變,使用新的變量jmp和lgth。將壓縮后的文件寫成ab[0,12],這個的含義是在字典區的位置為0的字符開始,這樣的字符執行了12次。

這樣就對于off和len舍棄使用新的變量進行壓縮和解壓縮的表示。

尋找最長匹配,假如說找到這樣的一個序列:

字典區:a b c d e f b c d e f g

待編碼區:a b c d e f g h

目前最佳匹配串:a b c d e f

根據前面設定的marethan的大小,發現最佳匹配串大于了morethan的值,那么就將其保存在對應的數組之中。那么待編碼區的字符還剩下g h 兩個字符,因為其長度小于marethan,那么就會被算法保存在complbuff之中。最終的a b c d e f b c d e f g h a b c d e f g的編碼就會變成a b c d e f [5,5]g h [13,5]g h 。中括號前面的5表示距離前面的匹配的字符的距離,后面的5表示匹配長度。會發現,源字符的后7個字符可以壓縮成a[8,6]。最終的編碼為a b c d e f [5,5]g h a [8,6],這樣壓縮后的字符編碼會比之前的更小。

之所以會造成這樣的浪費是因為算法只關心前面的這個字符,并不關心將這個字符后面的字符作為匹配,為此對算法的另一個步驟就是尋找最長匹配。

當前字符在匹配時產生的匹配長度(簡稱當前匹配長度)和下一個字符在匹配時產生的長度(簡稱下一個長度)有以下幾種關系:

1)當前匹配長度>下一個長度:

例:當前上文為a a aa b bb c cc當前下文為a a a b bb,當前最佳匹配串:a a a b bb

下一個上文為:a a a b bb c cca下一個下文為:a a b bb,下一個最佳匹配串為 a a b bb

在這種情況下,下一個最佳匹配串的長度小于當前最佳匹配串的長度。

2)當前長度=下一個長度:

例:當前上文為a a a b bb a a b bbc,當前下文為a a a b bbc,當前最佳匹配串:a a a b bb

下一個上文為:a a a b bb a a b bbc下一個下文為:a a b b b c,下一個最佳匹配串:a a b bb c

此時下一個最佳匹配串的長度與當前最佳匹配串的長度相等。

3)當前長度<下一個長度:

例:當前上文為a a a b bb a a b bb c d,當前下文為a a a b bb c d,當前最佳匹配串:a a a b bb

下一個上文為:a a a b bb a a b bb c d a下一個下文為:a a b bb c d,下一個最佳匹配串:a a b bb c d

此時下一個最佳匹配串的串長大于當前最佳匹配串的串長。

顯而易見的是:

①在第一種情況下,輸出下一個最佳匹配串將是多余的。

②在第二種情況下,輸出任何最佳匹配串都不會造成浪費。

③在第三種情況下,輸出當前最佳匹配串將是浪費的。

因此,只需要對第三種情況進行判斷即可。在獲取當前最佳匹配串的同時,獲取下一個最佳匹配串,并進行判斷。

為此,將此次的字符放入hash表中,并使用下一個字符作為待編碼區的起始字符。這樣比較此次字符作為待編碼區的首字母的匹配長度和下一字符做待編碼區首字符的編碼長度,這兩個長度哪個長就是用哪一個長度保存在壓縮的數組之中。

在圖2所示的代碼中,對兩個匹配長度進行比較,得到長度最長的字符串。lgth1是下一字符作為待編碼區開頭字符時得到的匹配長度,lgth是此次字符作為待編碼區開頭字符時得到的匹配長度。

1.6 優化Huffman算法

霍夫曼壓縮算法的簡要步驟如下:

1)統計符號頻率:遍歷待壓縮的數據,統計每個符號(如字符、字節等)出現的頻率。

2)構建霍夫曼樹:根據符號頻率構建一顆霍夫曼樹。頻率較低的符號作為葉子節點,頻率較高的符號位于樹的較低層。通過合并最小頻率的節點來構建樹,直到只剩下一個根節點。

3)分配編碼:從根節點開始,沿著樹的路徑為每個符號分配唯一的二進制編碼。一般而言,向左子樹走表示編碼為0,向右子樹走表示編碼為1。

4)生成編碼數據:遍歷原始數據,將每個符號替換為對應的編碼,生成壓縮后的編碼數據。

5)存儲壓縮數據:將壓縮后的編碼數據保存到文件或傳輸給接收方。

6)解壓縮時,使用相同的霍夫曼樹和編碼表,根據編碼逐步還原原始數據。

霍夫曼壓縮算法通過根據符號頻率賦予不同長度的編碼,實現了高頻符號使用短編碼的效果,從而在保證數據完整性的前提下,實現了較高的數據壓縮率。它廣泛應用于文件壓縮、圖像壓縮、音頻壓縮等領域。

以下是Huffman壓縮編碼的一個舉例:

假設我們有以下字符串需要進行壓縮:“ABBCCCDDDDEEEEE”。

1)統計符號頻率:統計每個符號的出現頻率。

‘A’:1

‘B’:2

‘C’:3

‘D’:4

‘E’:5

2)構建霍夫曼樹:根據符號頻率構建霍夫曼樹。

從最小頻率開始構建樹:

①合并頻率為1的‘A’和‘B’,得到新節點‘AB’:頻率=3

②合并頻率為3的‘AB’和‘C’,得到新節點‘ABC’:頻率=6

③合并頻率為4的‘D’和‘ABC’,得到新節點‘DABC’:頻率=10

④合并頻率為5的‘E’和‘DABC’,得到新節點‘E(DABC)’:頻率=15

得到以下霍夫曼樹:

3)分配編碼:從根節點開始,沿著左子樹走為0,沿著右子樹走為1,為每個符號分配編碼。

‘A’:編碼為:0000

‘B’:編碼為:0001

‘C’:編碼為:001

‘D’:編碼為:01

‘E’:編碼為:1

4)生成編碼數據:使用編碼表,將原始數據替換為對應的編碼。

原始數據:“ABBCCCDDDDEEEEE”

替換為編碼:“00000001_00010010_01001010_1010 1111_11”

通過霍夫曼壓縮算法,原始字符保存下來共需要15個字節,現在只需要5個字節就可以?,F在原始字符串被壓縮為較短的編碼字符串,從而實現了數據的壓縮。在解壓縮時,使用相同的霍夫曼樹和編碼表,根據編碼逐步還原原始數據。

主要是改進Huffman的存儲結構,由于是對某一圖像區域進行壓縮,因此這個區域的字節數不會太大,對于8*8的tile塊,設定的是256字節。如果根據上面的分析可知,壓縮和解壓縮都需要得到字符出現的概率,以便構建Huffman樹和獲得Huffman編碼。但是由于如果保存一個字符,一個出現的概率,那么如果256個字節中出現了N種字符,那么就需要至少2N的字節保存Huffman字符頻率,如果N大于128,那么編碼表都比原字符要大了,這樣就造成了浪費。于是設置一個標記位,在統計到2N+0.5N>256時,就不在使用Huffman壓縮算法,從而保證了壓縮速度。同時計算出Huffman文件的大小,如果壓縮后的數據大于tile的大小,直接給(*outputsize)賦予一個大于tile的值。

2 壓縮算法的FPGA設計

2.1 FPGA平臺

該算法實現平臺是 Xillinx 的 VivadoHLS2019.1 高級綜合工具。接下來主要介紹總體設計結構的實現和優化、功能仿真結果和時序仿真結果。將前幾章闡述的算法結構進行實現和優化,通過添加C仿真驗證算法的正確性,在此基礎上進行硬件電路的實現和優化[17-18]。在 HLS 工具中用到的FPGA是Xilinx的Zynq UltraScale+ MPSoC(多處理器系統級芯片)系列(xczu3cg-sfvc784-1-i)[19-20]。將壓縮設計的結構直接通過高級綜合工具默認的約束進行綜合,得到的時延結果如圖3所示。

圖3 時延結果

2.2 壓縮算法的FPGA功能仿真

對VIVADO HLS生成的電路進行功能仿真。設置輸入的塊數據為:

Unsigned char input[256]={

1,5,1,9,2,0,3,8,3,3,8,4,4,7,8,111,

8,1,4,4,3,8,9,66,74,47,1,3,7,9,5,1,

32,38,47,43,40,1,1,1,1,1,1,2,2,38,1,5,

1,9,2,0,3,8,3,3,8,4,4,7,8,111,1,6,

6,7,8,1,6,9,66,74,47,1,3,7,32,38,47,43,

40,1,1,1,1,1,2,2,3,7,8,100,102,10,15,222,

33,8,65,60,63,44,52,12,14,18,19,1,5,1,9,2,

0,3,8,3,3,8,4,4,7,8,111,1,6,6,7,8,

1,6,9,74,47,1,3,72,7,3,5,9,5,1,32,38,

47,43,40,1,1,1,1,1,1,2,2,3,7,8,1,5,

1,9,2,0,3,8,3,3,8,4,4,7,8,111,1,6,

6,7,8,1,6,9,4,4,3,8,1,3,7,8,2,7,

3,5,9,5,1,32,38,47,43,40,1,1,1,1,1,1,

1,5,1,9,2,0,3,8,3,3,8,4,4,7,8,111,

1,6,6,7,8,1,6,9,4,4,3,8,9,6,78,47,

1,3,7,8,2,7,3,5,9,5,1,32,38,47,43,40}

壓縮后的數據為:

nsigned char refer[256]={

20,118,82,1,5,1,9,1,4,251,71,189,25,8,217,1,

255,2,5,0,254,0,41,241,2,99,187,30,207,247,251,3,

4,255,251,46,216,254,42,210,0,6,250,253,4,252,214,0,

253,7,252,5,248,1,7,29,250,7,39,218,29,219,0,37,

227,255,252,107,152,2,248,7,6,3,254,36,230,239,251,2,

1,6,1,255,27,4,3,62,193,4,4,58,193,44,210,7,

50,243,223,246,253,0,149,3,73,189,36,98,122,94,208,245,

66,254,193,2,2,255,8,39,217,4,0,2,0,0,34,64,

32,0,16,36,85,14,194,15,183,180,65,18,210,1,2,11,

2,28,5,14,2,52,3,36,3,11,2,50,5,48,3,28,

5,65,2,93,2,88,5,27,2,36,3,72,3,98,3,85,

6,46,2,50,5,119,2,49,3,61,2,113,6,112,3,93,

2,138,6,179,2,139,3,36,3,72,2,98,4,85,5,11,

2,50,5,49,3,113,6,112,3,104,2,138,6,139,3,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

首先利用C語言進行仿真,得到的結果是正確的,然后進行FPGA仿真。

壓縮電路的功能仿真結果如圖4和圖5所示。從圖4和5可以看出功能仿真完成正確。

圖4 對測試數據1的功能仿真結果

圖5 對測試數據1的功能仿真結果

2.3 解壓縮算法的FPGA功能仿真

對于C仿真,使用的測試輸入數據如下:

Unsigned char input[256]={

20,118,82,1,5,1,9,1,4,251,71,189,25,8,217,1,

255,2,5,0,254,0,41,241,2,99,187,30,207,247,251,3,

4,255,251,46,216,254,42,210,0,6,250,253,4,252,214,0,

253,7,252,5,248,1,7,29,250,7,39,218,29,219,0,37,

227,255,252,107,152,2,248,7,6,3,254,36,230,239,251,2,

1,6,1,255,27,4,3,62,193,4,4,58,193,44,210,7,

50,243,223,246,253,0,149,3,73,189,36,98,122,94,208,245,

66,254,193,2,2,255,8,39,217,4,0,2,0,0,34,64,

32,0,16,36,85,14,194,15,183,180,65,18,210,1,2,11,

2,28,5,14,2,52,3,36,3,11,2,50,5,48,3,28,

5,65,2,93,2,88,5,27,2,36,3,72,3,98,3,85,

6,46,2,50,5,119,2,49,3,61,2,113,6,112,3,93,

2,138,6,179,2,139,3,36,3,72,2,98,4,85,5,11,

2,50,5,49,3,113,6,112,3,104,2,138,6,139,3}

解壓后的數據如下:

Unsigned char refer[256]={

1,5,1,9,2,0,3,8,3,3,8,4,4,7,8,111,

8,1,4,4,3,8,9,66,74,47,1,3,7,9,5,1,

32,38,47,43,40,1,1,1,1,1,1,2,2,38,1,5,

1,9,2,0,3,8,3,3,8,4,4,7,8,111,1,6,

6,7,8,1,6,9,66,74,47,1,3,7,32,38,47,43,

40,1,1,1,1,1,2 ,2,3,7,8,100,102,10,15,222,

33,8,65,60,63,44,52,12,14,18,19,1,5,1,9,2,

0,3,8,3,3,8,4,4,7,8,111,1,6,6,7,8,

1,6,9,74,47,1,3,72,7,3,5,9,5,1,32,38,

47,43,40,1,1,1,1,1,1,2,2,3,7,8,1,5,

1,9,2,0,3,8,3,3,8,4,4,7,8,111,1,6,

6,7,8,1,6,9,4,4,3,8,1,3,7,8,2,7,

3,5,9,5,1,32,38,47,43,40,1,1,1,1,1,1,

1,5,1,9,2,0,3,8,3,3,8,4,4,7,8,111,

1,6,6,7,8,1,6,9,4,4,3,8,9,66,78,47,

1,3,7,8,2,7,3,5,9,5,1,32,38,47,43,40}

解壓電路的功能仿真如圖6和圖7所示。

圖6 解壓單元對測試數據1的功能仿真結果

圖7 解壓單元對測試數據1的功能仿真結果

2.4 時序仿真結果

HLS導出RTL代碼后進行了時序仿真,在這里設置的時鐘頻率是100 MHz。

由圖8可以看出,最壞路徑的建立時間裕量為2.679 ns,那么可以估計出單元的最高時鐘頻率約為136 MHz。

圖8 壓縮單元的時序仿真結果

同理對于解壓縮單元,最壞路徑的建立時間裕量為6.264 ns,同樣也可以估計出解壓縮單元的最高時鐘頻率約為267 MHz。

3 測試結果

使用了33張測試圖片,在Linux系統下對本算法進行了測試,測試的圖片和壓縮率如表1所示。

表1 圖片和壓縮率表

在Linux系統下對Deflate算法進行了測試,測試的圖片和壓縮率如表2所示。

表2 圖片和壓縮率表

接下來對該算法與Deflate算法進行相應的比較?;谶M行的圖片壓縮測試結果,本算法在處理那些具有豐富細節的圖片時,其壓縮性能表現相對較差。然而,當處理那些相對平坦且細節不太豐富的圖片時,該算法展現出了較為出色的壓縮效果。而對于Deflate算法來說,其壓縮率相對集中,對細節豐富的圖片壓縮得較好,然而平均壓縮率不如該算法。

4 結束語

使用C語言實現了一種針對圖像的區域壓縮算法,并采用Huffman算法和LZ77算法分別對壓縮區域進行壓縮。通過選擇較小的壓縮文件來實現更高的壓縮率。為了驗證算法的功能可實現性使用VIVADO HLS工具進行功能仿真驗證算法在不同壓縮區域大小下的壓縮和解壓功能性,從而確保算法在硬件實現中的功能正確性,為圖像壓縮領域的進一步研究和應用提供了有力支持。

猜你喜歡
壓縮算法字符字節
尋找更強的字符映射管理器
No.8 字節跳動將推出獨立出口電商APP
字符代表幾
基于參數識別的軌道電路監測數據壓縮算法研究
一種USB接口字符液晶控制器設計
No.10 “字節跳動手機”要來了?
消失的殖民村莊和神秘字符
簡談MC7字節碼
更正聲明
PMU數據預處理及壓縮算法
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合