国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

一種ARGB數(shù)據(jù)無損壓縮解壓算法的FPGA設計

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

尹 明,孫國慶

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

0 引言

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

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

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

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

1.1 優(yōu)化Deflate壓縮算法流程圖

Deflate壓縮算法的實現(xiàn)流程如下:

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

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

3)在進行哈夫曼編碼之前,還會構(gòu)建一個動態(tài)的哈夫曼樹,根據(jù)輸入數(shù)據(jù)的頻率來調(diào)整編碼方式,以實現(xiàn)更高效地壓縮。

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

通過這一系列的步驟,Deflate壓縮算法能夠?qū)崿F(xiàn)對數(shù)據(jù)的高效壓縮,以減小數(shù)據(jù)的存儲空間占用。

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

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

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

圖1 該壓縮算法流程圖

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

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

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

1.2 差分預測編碼

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

圖2 壓縮塊示例

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

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

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

1.3 LZ77壓縮算法

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

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

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

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

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

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

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

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

ucharcomplbuff[256];

ucharcompsignbuff[256];

ucharcompslbuff [256];

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

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

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

Hash加速如下:

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

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

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

1.5 對off和len的優(yōu)化

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

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

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

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

字典區(qū):a b c d e f b c d e f g

待編碼區(qū):a b c d e f g h

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

根據(jù)前面設定的marethan的大小,發(fā)現(xiàn)最佳匹配串大于了morethan的值,那么就將其保存在對應的數(shù)組之中。那么待編碼區(qū)的字符還剩下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表示匹配長度。會發(fā)現(xiàn),源字符的后7個字符可以壓縮成a[8,6]。最終的編碼為a b c d e f [5,5]g h a [8,6],這樣壓縮后的字符編碼會比之前的更小。

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

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

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表中,并使用下一個字符作為待編碼區(qū)的起始字符。這樣比較此次字符作為待編碼區(qū)的首字母的匹配長度和下一字符做待編碼區(qū)首字符的編碼長度,這兩個長度哪個長就是用哪一個長度保存在壓縮的數(shù)組之中。

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

1.6 優(yōu)化Huffman算法

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

1)統(tǒng)計符號頻率:遍歷待壓縮的數(shù)據(jù),統(tǒng)計每個符號(如字符、字節(jié)等)出現(xiàn)的頻率。

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

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

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

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

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

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

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

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

1)統(tǒng)計符號頻率:統(tǒng)計每個符號的出現(xiàn)頻率。

‘A’:1

‘B’:2

‘C’:3

‘D’:4

‘E’:5

2)構(gòu)建霍夫曼樹:根據(jù)符號頻率構(gòu)建霍夫曼樹。

從最小頻率開始構(gòu)建樹:

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

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

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

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

得到以下霍夫曼樹:

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

‘A’:編碼為:0000

‘B’:編碼為:0001

‘C’:編碼為:001

‘D’:編碼為:01

‘E’:編碼為:1

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

原始數(shù)據(jù):“ABBCCCDDDDEEEEE”

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

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

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

2 壓縮算法的FPGA設計

2.1 FPGA平臺

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

圖3 時延結(jié)果

2.2 壓縮算法的FPGA功能仿真

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

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}

壓縮后的數(shù)據(jù)為:

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語言進行仿真,得到的結(jié)果是正確的,然后進行FPGA仿真。

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

圖4 對測試數(shù)據(jù)1的功能仿真結(jié)果

圖5 對測試數(shù)據(jù)1的功能仿真結(jié)果

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

對于C仿真,使用的測試輸入數(shù)據(jù)如下:

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}

解壓后的數(shù)據(jù)如下:

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 解壓單元對測試數(shù)據(jù)1的功能仿真結(jié)果

圖7 解壓單元對測試數(shù)據(jù)1的功能仿真結(jié)果

2.4 時序仿真結(jié)果

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

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

圖8 壓縮單元的時序仿真結(jié)果

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

3 測試結(jié)果

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

表1 圖片和壓縮率表

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

表2 圖片和壓縮率表

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

4 結(jié)束語

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

猜你喜歡
壓縮算法字符字節(jié)
尋找更強的字符映射管理器
No.8 字節(jié)跳動將推出獨立出口電商APP
字符代表幾
基于參數(shù)識別的軌道電路監(jiān)測數(shù)據(jù)壓縮算法研究
一種USB接口字符液晶控制器設計
電子制作(2019年19期)2019-11-23 08:41:50
No.10 “字節(jié)跳動手機”要來了?
消失的殖民村莊和神秘字符
簡談MC7字節(jié)碼
更正聲明
電訊技術(2017年4期)2017-04-16 04:16:03
PMU數(shù)據(jù)預處理及壓縮算法
阳高县| 阳西县| 湄潭县| 双牌县| 炎陵县| 桃源县| 芮城县| 深圳市| 林周县| 深泽县| 淮南市| 新津县| 新河县| 磐石市| 彰武县| 高唐县| 惠来县| 龙门县| 达州市| 屯昌县| 石棉县| 宜都市| 黑山县| 弥勒县| 民权县| 突泉县| 永善县| 上犹县| 宕昌县| 江西省| 襄垣县| 陆川县| 中西区| 余干县| 平罗县| 芦溪县| 电白县| 宜宾县| 普定县| 商丘市| 许昌市|