專利名稱:一種動態(tài)Huffman編碼硬件實現(xiàn)系統(tǒng)及其實現(xiàn)方法
技術領域:
本發(fā)明涉及數(shù)據(jù)壓縮技術。尤其涉及一種動態(tài)Huffman編碼硬件實現(xiàn)系統(tǒng)及其實現(xiàn)方法。
背景技術:
在云計算的海量數(shù)據(jù)處理中,數(shù)據(jù)的壓縮、解壓縮是非常重要的手段,可以大幅度的降低數(shù)據(jù)的存儲空間,提升數(shù)據(jù)傳輸?shù)耐掏侣省?br>
Huffman 一種基于統(tǒng)計模式的無損壓縮算法,主要包括以下幾個基本的步驟a) 統(tǒng)計字符的頻率。b)構造Huffman樹。c)創(chuàng)建Huffman表。d)編碼輸出。最終,在數(shù)據(jù)流中出現(xiàn)頻率最高的字符給予最短的編碼,而出現(xiàn)頻率最低的給予最長的編碼,這樣就可以得到壓縮的效果。
使用軟件結構實現(xiàn)Huffman樹的過程中,需要采用二叉樹數(shù)據(jù)結構,因此,我們需要定義一個結構體去表示Huffman樹中的每一個節(jié)點,在硬件描述語言Verilog及VHDL中沒有數(shù)據(jù)結構。為了實現(xiàn)動態(tài)Huffman編碼的結構,因此這里給出了 Huffman編碼的硬件實現(xiàn)系統(tǒng)并給出了 Huffman編碼硬件實現(xiàn)方法及加速方法。
傳統(tǒng)的Huffman實現(xiàn)方式中,一般是基于軟件平臺的實現(xiàn)方式,編碼過程是串行處理的過程,而在Huffman編碼的硬件實現(xiàn)過程中,采用了快速的字符統(tǒng)計方法、頻率緩存單元提前清空等技術使得數(shù)據(jù)吞吐率有了明顯的提升。發(fā)明內容
本發(fā)明要解決的一個技術問題是提供了一種動態(tài)Huffman編碼硬件實現(xiàn)系統(tǒng)及其實現(xiàn)方法,能夠利用極少的組合邏輯、時序邏輯以及存儲器資源加以實現(xiàn)。
本發(fā)明為實現(xiàn)上述目的,采用如下技術方案一種動態(tài)Huffman編碼硬件實現(xiàn)系統(tǒng),其特征在于,所述系統(tǒng)包括一個頻率緩存單元,用于存放數(shù)據(jù)流中每一個字符出現(xiàn)的頻率;一個最小堆緩存單元,用于維護頻率緩沖單元中出現(xiàn)頻率不為O的字符,使得這些字符在存儲方式上呈現(xiàn)連續(xù)的形式,而這些字符在邏輯關系上呈現(xiàn)二叉樹的形式,并且使得這棵二叉樹滿足左節(jié)點和右節(jié)點都大于或者等于本節(jié)點,為輔助構造Huffman樹的過程做好準備,其中葉子節(jié)點除外;一個父親節(jié)點緩存單元,用于存放Huffman樹中每一個節(jié)點的父親節(jié)點;一個深度緩存單元,用于存放整個Huffman樹中每一個節(jié)點的深度,其中根節(jié)點的深度最大,葉子節(jié)點的深度是O ;一個碼字值緩存單元,用于存放Huffman樹中每一個葉子節(jié)點對應的Huffman編碼的值;一個碼字長度緩存單元,用于存放Huffman樹中每一個節(jié)點對應的Huffman編碼的碼字長度;一個乘法器單元,用于計算對待壓縮數(shù)據(jù)塊經(jīng)過動態(tài)Huffman編碼之后數(shù)據(jù)塊的大一個數(shù)據(jù)統(tǒng)計單元,用于統(tǒng)計待壓縮數(shù)據(jù)流中每一個字符出現(xiàn)的頻率,并將統(tǒng)計的結果存放在頻率緩存單元中;一個主控狀態(tài)機部分,根據(jù)頻率緩存單元中存放的每一個字符的頻率,通過最小堆緩存單元、父親節(jié)點緩存單元、深度緩存單元來構造Huffman樹及Huffman表,分別存放在碼字值緩存單元及碼字長度緩存單元中;三個多路選擇器單元,分別用于控制頻率緩存單元在不同的工作階段由主控狀態(tài)機或者是由數(shù)據(jù)統(tǒng)計單元控制,和碼字值緩存單元、碼字長度緩存單元在不同的工作階段分別由主控狀態(tài)機或者是由數(shù)據(jù)打包輸出單元進行控制;一個數(shù)據(jù)打包輸出單元,用于查詢待編碼的數(shù)據(jù)塊中每一個字符查詢碼字值緩存單元及碼字長度緩存單元得到每一個字符的Huffman編碼并打包輸出;一個加法器單元,用于快速的字符統(tǒng)計,統(tǒng)計結果存放在頻率緩存單元中。
一種動態(tài)Huffman編碼硬件實現(xiàn)方法,包括下述步驟(1)掃描待壓縮的原始數(shù)據(jù),并快速統(tǒng)計每一個字符出現(xiàn)的頻率,依次存放在頻率緩存單元;(2)主控狀態(tài)機讀取頻率緩存單元的數(shù)據(jù)并把出現(xiàn)頻率不為O的字符順序的放進最小堆緩存單元進行維護;(3)利用最小堆緩存單元、父親節(jié)點緩存單元、深度緩存單元構造Huffman樹,其中 Huffman樹的信息最終也是存放在最小堆緩存單元中;(4)遍歷Huffman樹,得到Huffman樹中每一個葉子節(jié)點的碼字長度;(5)統(tǒng)計每一個非O碼字長度字符的數(shù)目;(6)根據(jù)每一個非O碼字長度字符的數(shù)目去計算出每一個字符的Huffman碼字值;(7)統(tǒng)計數(shù)據(jù)塊經(jīng)過Huffman編碼之后的數(shù)據(jù)塊的大小;(8)主控狀態(tài)機部分把碼字值緩存單元、碼字長度緩存單元控制權交給數(shù)據(jù)打包單元;(9)數(shù)據(jù)打包單元在得到碼字值緩存單元及碼字長度緩存單元的控制權之后,開始對原始的數(shù)據(jù)進行Huffman編碼,并打包輸出;(10)主控狀態(tài)機在進行對新的數(shù)據(jù)塊進行統(tǒng)計之前對頻率緩存單元的提前清空。
其進一步特征在于所述步驟(I)中字符快速統(tǒng)計通過加法器和頻率緩存單元完成。
所述步驟(2)中最小堆緩存單元進行維護過程為把頻率緩存單元中的字符出現(xiàn)頻率依次順序的讀出,并加以判斷,如果不為0,就把該字符放進最小堆緩存單元中,一直到頻率緩存單元中所有的葉子節(jié)點都讀取并判斷完畢,如果為O就不放進最小堆緩存單元中, 在把字符依次存進最小堆緩存單元中的同時記錄最小堆的長度,即最小堆緩存單元中有效的字符的數(shù)目,這些字符在邏輯關系上呈現(xiàn)二叉樹的形式;從最小堆緩存單元中數(shù)據(jù)元素個數(shù)的一半開始一直到最小堆緩存單元的頂部依次調整這棵二叉樹,使得這課二叉樹中的每一個節(jié)點都滿足左節(jié)點和右節(jié)點都大于或者等于本節(jié)點,其中葉子節(jié)點除外。
所述步驟(3)中構造Huffman樹的過程中從最小堆緩存單元的頂部讀取第一個元素,并把這個元素存入最小堆緩存單元底部開始的第一個未被占用的單元中,此時最小堆緩存單元的長度減1,并將最小堆緩存單元的最后一個元素放進最小堆緩存單元的第一個元素的位置上,從第一個元素位置開始調整這棵二叉樹,使得這棵二叉樹中的每一個節(jié)點都滿足左節(jié)點和右節(jié)點大于或者等于本節(jié)點,其中葉子節(jié)點除外;從最小堆緩存單元的頂部再讀取第一個元素并把這個元素存入最小堆緩存單元底部開始的第一個未被占用的單元中,把最小堆緩存單元的長度減1,把從最小堆緩存單元中連續(xù)讀取的元素組合成一個新的節(jié)點,這個新的節(jié)點的權值為兩個連續(xù)讀取的元素的權值的和,這個的新節(jié)點在整個Huffman樹中的深度為兩個連續(xù)讀取元素中較大深度加1,并在父親節(jié)點緩存單元中設置好兩個連續(xù)讀取的葉子節(jié)點的父親節(jié)點為這個新得到的節(jié)點;把新得到的節(jié)點放入最小堆緩存單元的頂部,并把最小堆緩存單元的長度加1,從最小堆緩存單元的頂部開始依次調整最小堆中二叉樹的節(jié)點,使得這棵二叉樹滿足左節(jié)點和右節(jié)點大于或者等于本節(jié)點,其中葉子節(jié)點除外;判斷最小堆緩存單元的長度是否為O,若不為O,表示Huffman樹未建好,繼續(xù)Huffman 樹的建立;若為0,表示Huffman樹已經(jīng)全部建好,把讀取的最后一個節(jié)點存入最小堆緩存單元底部開始第一個未被占用的單元中。
所述步驟(4)遍歷Huffman樹,得到Huffman樹中每一個葉子節(jié)點的碼字長度過程中Huffman樹已經(jīng)建好,并存放在最小堆緩存單元中,從最小堆緩存單元中最新存入的那個單元開始,并在碼字長度緩存單元中設置其對應的碼字長度為0,并從Huffman樹的根節(jié)點開始,依次遍歷最小堆緩存單元中存放的Huffman樹中剩余的每一個節(jié)點,依次設置好每一個葉子節(jié)點的碼字長度,依次對應存放在碼字長度緩存單元中。
所述步驟(5)統(tǒng)計每一個非O碼字長度字符的數(shù)目過程中在遍歷Huffman樹,得到每一個節(jié)點的碼字長度時,主控狀態(tài)機會同時統(tǒng)計出每一個碼字長度的節(jié)點的個數(shù),為計算Huffman編碼的值作好準備。
所述步驟(6)根據(jù)每一個非O碼字長度字符的數(shù)目去計算出每一個字符的 Huffman碼字值的過程是為了得出Huffman樹中每一個節(jié)點的碼字值,統(tǒng)計出了每一個非O 碼字長度的個數(shù),從Huffman樹的最頂層依次向下進行推出Huffman樹中每一個節(jié)點的碼字值,并將葉子節(jié)點的碼字值保存在碼字值緩存單元中。
所述步驟(7)統(tǒng)計數(shù)據(jù)塊經(jīng)過Huffman編碼之后的數(shù)據(jù)塊的大小過程是為了在得到每一個葉子節(jié)點碼字長度的過程中,同時讀取對應的頻率緩存單元中對應字符的頻率信息,通過乘法器單元計算出對頻率緩存單元中字符進行Huffman編碼之后的長度,同時計算出累計Huffman編碼的長度;在得出每一個Huffman葉子節(jié)點的碼字長度之后,也就得到了固定長度的數(shù)據(jù)塊經(jīng)過Huffman編碼之后總大小。
所述步驟(10) Huffman編碼統(tǒng)計之前對頻率緩存單元的提前清空過程為數(shù)據(jù)打包單元啟動,開始編碼輸出,同時主控狀態(tài)機開始把頻率緩存單元開始清空處理,為下一個數(shù)據(jù)塊的Huffman編碼開始做好準備。
本發(fā)明通過硬件實現(xiàn)了 Huffman編碼,并在Huffman編碼的硬件實現(xiàn)過程中,采用了快速的字符統(tǒng)計方法、頻率緩存單元提前清空等技術使得數(shù)據(jù)吞吐率有了明顯的提升。
圖I給出了一種動態(tài)Huffman編碼硬件實現(xiàn)系統(tǒng)的結構示意圖。
圖2給出了一種動態(tài)Huffman編碼硬件實現(xiàn)方法的狀態(tài)轉換圖。
具體實施方式
下面參照附圖用本發(fā)明的示例性實施例對本發(fā)明進行更全面的描述和說明。
如圖I所示,一種動態(tài)Huffman編碼硬件實現(xiàn)系統(tǒng)的結構示意圖包括數(shù)據(jù)打包單元100,數(shù)據(jù)選擇器單元101,頻率緩存單元102,數(shù)據(jù)選擇器單元103,碼字長度緩存單元 104,數(shù)據(jù)選擇器單元105,碼字值緩存單元106,主控狀態(tài)機107,父親節(jié)點緩存單元108,深度緩存單元109,最小堆緩存單元110,數(shù)據(jù)統(tǒng)計單元111。
數(shù)據(jù)打包單元100,用于把待壓縮的數(shù)據(jù)通過查詢碼字長度緩存單元104及碼字值緩存單元106得到每一個字符的Huffman編碼并打包輸出。
數(shù)據(jù)選擇器單元101,用于選擇頻率緩存單元的控制權,在Huffman編碼之前,數(shù)據(jù)選擇器單元101選擇數(shù)據(jù)統(tǒng)計單元111去控制頻率緩存單元102 ;在構造Huffman編碼過程中,數(shù)據(jù)選擇器單元101選擇主控狀態(tài)機單元107去控制頻率緩存單元102的控制權。
頻率緩存單元102,用于存放Huffman樹中每一個葉子節(jié)點的頻率。
數(shù)據(jù)選擇器單元103,用于控制碼字長度緩存單元104的控制權,在得到Huffman 樹中每一個葉子節(jié)點的碼字長度及碼字值之前,數(shù)據(jù)選擇器單元103選擇主控狀態(tài)機單元 107去控制碼字長度緩存單元104 ;在得到Huffman樹中每一個葉子節(jié)點的碼字長度及碼字值之后,數(shù)據(jù)選擇器單元103選擇數(shù)據(jù)打包單元100去控制碼字長度緩存單元104的控制權。
碼字長度緩存單元104,用于存放Huffman樹中每一個葉子節(jié)點的碼字長度。
數(shù)據(jù)選擇單元105,用于控制碼字值緩存單元106的控制權,在得到Huffman樹中每一個葉子節(jié)點的碼字長度及碼字值之前,數(shù)據(jù)選擇器單元105選擇主控狀態(tài)機單元107 去控制碼字值緩存單元106 ;在得到Huffman樹中每一個葉子節(jié)點的碼字長度及碼字值之后,數(shù)據(jù)選擇單元105選擇數(shù)據(jù)打包單元100去控制碼字值緩存單元106。
主控狀態(tài)機單元107,通過借助父親節(jié)點緩存單元108,深度緩存單元109,最小堆緩存單元110,去構建Huffman樹,通過遍歷Huffman樹,得到Huffman樹中每一個節(jié)點的碼字長度,再根據(jù)碼字長度去計算Huffman樹中所有的葉子節(jié)點的碼字值存放在碼字值緩存單元106中,對應的葉子節(jié)點的碼字長度存放于碼字長度緩存單元104中。
父親節(jié)點緩存單元108,用于存放Huffman樹中每一個節(jié)點的父親節(jié)點,根節(jié)點除外。
深度緩存單元109,用于存放Huffman樹中每一個節(jié)點的深度,其中葉子節(jié)點的深度是0,根節(jié)點的深度最大。
最小堆緩存單元110,用于維護Huffman樹中所有的節(jié)點,使得這些節(jié)點在邏輯上構成一棵二叉樹,并且滿足左節(jié)點和右節(jié)點大于或者等于本節(jié)點,其中葉子節(jié)點除外。
數(shù)據(jù)統(tǒng)計單元111,在Huffman主控狀態(tài)機構造Huffman樹之前,由數(shù)據(jù)統(tǒng)計單元 111去統(tǒng)計每一個葉子節(jié)點出現(xiàn)的頻率,并把這個統(tǒng)計的每一個字符的頻率信息存放在頻率緩存單元102中。
如圖2所示,一種動態(tài)Huffman編碼硬件實現(xiàn)方法的狀態(tài)轉換圖,主要狀態(tài)包括: 狀態(tài)000(Γ狀態(tài)0010在狀態(tài)0000,圖1中主控狀態(tài)機單元107通過數(shù)據(jù)選擇單元101獲得頻率緩存單元102 的控制權,并把頻率緩存單元中每一個數(shù)據(jù)存儲單元都清空為0,為數(shù)據(jù)統(tǒng)計做好準備,并進入狀態(tài)0001。
在狀態(tài)0001,圖1中主控狀態(tài)機單元107通過數(shù)據(jù)選擇單元101開始釋放頻率緩存單元102的控制權,此時頻率緩存單元102的控制權交給數(shù)據(jù)統(tǒng)計單元111并進入狀態(tài) 0002。
在狀態(tài)0002,圖1中數(shù)據(jù)統(tǒng)計單元111開始對掃描待壓縮的原始數(shù)據(jù),并統(tǒng)計每一個字符出現(xiàn)的頻率,依次存放在頻率緩存單元102中,當原始數(shù)據(jù)塊掃描完畢時,主控狀態(tài)機單元107通過數(shù)據(jù)選擇單元101回收頻率緩存單元102的控制權,并開始進入狀態(tài)0003。
在狀態(tài)0003,主控狀態(tài)機單元開始從頻率緩存單元102中依次順序的讀取數(shù)據(jù), 并把出現(xiàn)頻率不為O的字符順序的放進最小堆緩存單元110中,每存放一個元素最小堆的長度就加1,一直到把頻率緩存單元中的數(shù)據(jù)讀取完畢為止,在讀取的過程中會進行判斷如果一個字符沒有出現(xiàn),那么該字符的碼字長度為0,此時主控狀態(tài)機單元107開始把碼字長度緩存單元104中對應的單元填寫為O ;如果出現(xiàn)了那么該字符定是葉子節(jié)點其深度為0, 此時主控狀態(tài)機單元開始把深度緩存單元109中對應的單元設置為0,重復執(zhí)行狀態(tài)0003, 直到所有的節(jié)點讀取完畢,并開始進入狀態(tài)0004。
在狀態(tài)0004,主控狀態(tài)機開始處理最小堆緩存單元110中存放的每一個字符,使得這些字符物理上呈現(xiàn)順序存放,在邏輯上又構成了一棵二叉樹,并且這棵二叉樹滿足左節(jié)點和右節(jié)點大于或者等于本節(jié)點,其中葉子節(jié)點除外。在狀態(tài)0004重復處理這個過程, 直到最小堆中所有的葉子節(jié)點都滿足左節(jié)點和右節(jié)點大于或者等于本節(jié)點,葉子節(jié)點除外,最小堆緩存單元110中的數(shù)據(jù)處理好了之后,主控狀態(tài) 機單元開始進入狀態(tài)0005。
在狀態(tài)0005,主控狀態(tài)機開始從最小堆的頂部讀取一個字符,此時最小堆緩存單元的長度減I,主控狀態(tài)機單元107把這個字符從最小堆緩存單元110的底部開始順序的向頂部存放,并把最小堆的有效字符的最后一個字符放進最小堆的頂部,此時最小堆的長度加1,并開始調整最小堆緩存單元110中的元素,使得最小堆緩存單元110中的每一個元素都滿足左節(jié)點和右節(jié)點大于或者等于本節(jié)點,葉子節(jié)點除外,調整好之后,主控狀態(tài)機單元107再從最小堆緩存單元110中讀取一個元素,此時最小堆的長度再次減1,主控狀態(tài)機單元107再把這個新讀取的字符從最小堆緩存單元110的底部順序的向最小堆的頂部順序的存放,并把兩個連續(xù)讀取的元素構成一個新的Huffman節(jié)點,即中間節(jié)點,并開始設置頻率緩存單元102中這個新的節(jié)點的權值為連續(xù)讀取的兩個元素的權值之和,在深度緩存單元109中開始設置這個新節(jié)點的深度為連續(xù)讀取的兩個元素的深度最大值加1,主控狀態(tài)機單元107此時還會在父親節(jié)點緩存單元中設置之前連續(xù)讀取元素的父親節(jié)點為這個新得到的節(jié)點,處理完之后主控狀態(tài)機單元107開始判斷最小堆的長度是否為0,如果為O就表示Huffman樹已經(jīng)建好并順序的從最小堆的底部向最小堆的頂部存放,并開始準備進入狀態(tài)0006,否則就繼續(xù)進入狀態(tài)0005重復執(zhí)行上述過程。
在狀態(tài)0006中,主控狀態(tài)機單元107把最后一個存進最小堆緩存單元110中的節(jié)點讀取出來,設置其碼字長度為0,進入狀態(tài)0007。
在狀態(tài)0007中,繼續(xù)從最小堆緩存單元110中讀取出一個元素,并在碼字長度緩存單元104中設置其碼字長度為其父親節(jié)點的碼字長度加1,每設置好一個節(jié)點的碼字長度的同時主控狀態(tài)機單元107會判斷該節(jié)點是不是Huffman樹中的葉子節(jié)點,如果是葉子節(jié)點主控狀態(tài)機單元107就從頻率緩存單元102中把該節(jié)點對應的頻率讀取出來,利用乘法器單元計算出采用Huffman編碼待壓縮數(shù)據(jù)塊中所有的該節(jié)點最后總得長度是多長,重復執(zhí)行步驟0007,在重復執(zhí)行的過程中主控狀態(tài)機單元107同時會統(tǒng)計出每一種碼字長度所對應的節(jié)點的個數(shù),當設置好Huffman樹中所有節(jié)點的碼字長度后就進入狀態(tài)0008。
在狀態(tài)0008中,主控狀態(tài)機單元107根據(jù)在狀態(tài)0007中得出的每一種碼字長度的個數(shù)去計算出所有節(jié)點的碼字值,并分別存放在碼字值緩存單元106中,并開始進入狀態(tài)0009。
在狀態(tài)0009中,主控狀態(tài)機單元107就通過數(shù)據(jù)選擇單元103、105釋放對碼字長度緩存單元104及碼字值緩存單元106的控制權,并把碼字長度緩存單元104、碼字值緩存單元106的控制權交給數(shù)據(jù)打包單元100,進入狀態(tài)0010。
在狀態(tài)0010中,數(shù)據(jù)打包單元100開始工作,并依次讀取原始待壓縮數(shù)據(jù)塊中的每一個字符,通過查詢圖I中碼字長度緩存單元104及碼字值緩存單元106開始輸出壓縮之后的數(shù)據(jù)。在狀態(tài)0010中,數(shù)據(jù)打包單元開始工作的同時,主控狀態(tài)機單元107也把頻率緩存單元102中的每一個存儲單元給清除。如果編碼輸出完成并且頻率緩存單元102中的每一個單元都被清除那么,主控狀態(tài)機就通過圖I中數(shù)據(jù)選擇單元103、105去獲得圖I 中碼字長度緩存單元104、碼字值緩存單元106的控制權,并進入狀態(tài)0000。
在發(fā)明中,數(shù)據(jù)存儲及數(shù)據(jù)控制部分構成的一個完成的系統(tǒng),結構清晰,利于分析和設計,Huffman樹及Huffman表的構造過程是由主控狀態(tài)機去控制存放在各個數(shù)據(jù)緩存單元中的數(shù)據(jù)進行的,狀態(tài)轉換過程清晰。
盡管本發(fā)明此處具體化一些特定的例子示出和描述,然而本發(fā)明不限制于所示出的細節(jié),因為在不偏離本發(fā)明的精神以及在權利要求的范圍和等同范圍內,可以作出多種改進和結構變化。因此,寬范圍地并且如權利要求中所闡明的在某種意義上與本發(fā)明的范圍一致地解釋附加的權利要求是適當?shù)摹?br>
權利要求
1.一種動態(tài)Huffman編碼硬件實現(xiàn)系統(tǒng),其特征在于,所述系統(tǒng)包括 一個頻率緩存單元,用于存放數(shù)據(jù)流中每一個字符出現(xiàn)的頻率; 一個最小堆緩存單元,用于維護頻率緩沖單元中頻率不為O的字符,使得這些字符在存儲方式上呈現(xiàn)連續(xù)的形式,而這些字符在邏輯關系上呈現(xiàn)二叉樹的形式,并且使得這棵二叉樹滿足左節(jié)點和右節(jié)點都大于或者等于本節(jié)點,為輔助構造Huffman樹的過程做好準備; 一個父親節(jié)點緩存單元,用于存放Huffman樹中每一個節(jié)點的父親節(jié)點,根節(jié)點除外;一個深度緩存單元,用于存放整個Huffman樹中每一個節(jié)點的深度,其中根節(jié)點的深度最大,葉子節(jié)點的深度是O ; 一個碼字值緩存單元,用于存放每一個字符對應的Huffman編碼的值; 一個碼字長度緩存單元,用于存放每一個字符對應的Huffman編碼值所對應的碼字長度; 一個乘法器單元,用于計算對待壓縮數(shù)據(jù)塊采用動態(tài)Huffman編碼之后數(shù)據(jù)塊的大小; 一個數(shù)據(jù)統(tǒng)計單元,用于統(tǒng)計待壓縮數(shù)據(jù)流中每一個字符出現(xiàn)的頻率,并將統(tǒng)計的結果存放在頻率緩存單元中; 一個主控狀態(tài)機部分,根據(jù)頻率緩存單元中存放的每一個字符的頻率,通過最小堆緩存單元、父親節(jié)點緩存單元、深度緩存單元來構造Huffman樹及Huffman表,分別存放在碼字值緩存單元及碼字長度緩存單元中; 三個多路選擇器單元,分別用于控制頻率緩存單元在不同的工作階段由主控狀態(tài)機或者是由數(shù)據(jù)統(tǒng)計單元控制,和碼字值緩存單元、碼字長度緩存單元在不同的工作階段分別由主控狀態(tài)機或者是由數(shù)據(jù)打包輸出單元進行控制; 一個數(shù)據(jù)打包輸出單元,用于查詢待編碼的數(shù)據(jù)塊中每一個字符查詢碼字值緩存單元及碼字長度緩存單元得到每一個字符的Huffman編碼并打包輸出; 一個加法器單元,用于快速的字符統(tǒng)計,統(tǒng)計結果存放在頻率緩存單元中。
2.—種動態(tài)Huffman編碼硬件實現(xiàn)方法,包括下述步驟 (1)掃描待壓縮的原始數(shù)據(jù),并快速統(tǒng)計每一個字符出現(xiàn)的頻率,依次存放在頻率緩存單元; (2)主控狀態(tài)機讀取頻率緩存單元的數(shù)據(jù)并把出現(xiàn)頻率不為O的字符順序的放進最小堆緩存單元進行維護; (3)利用最小堆緩存單元、父親節(jié)點緩存單元、深度緩存單元構造Huffman樹,其中Huffman樹的信息最終也是存放在最小堆緩存單元中; (4)遍歷Huffman樹,得到Huffman樹中每一個葉子節(jié)點的碼字長度; (5)統(tǒng)計每一個非O碼字長度字符的數(shù)目; (6)根據(jù)每一個非O碼字長度字符的數(shù)目去計算出每一個字符的Huffman碼字值; (7)統(tǒng)計數(shù)據(jù)塊經(jīng)過Huffman編碼之后的數(shù)據(jù)塊的大小; (8)主控狀態(tài)機部分把碼字值緩存單元、碼字長度緩存單元控制權交給數(shù)據(jù)打包單元; (9)數(shù)據(jù)打包單元在得到碼字值緩存單元及碼字長度緩存單元的控制權之后,開始對原始的數(shù)據(jù)進行Huffman編碼,并打包輸出; (10)主控狀態(tài)機在進行對新的數(shù)據(jù)塊進行統(tǒng)計之前對頻率緩存單元的提前清空。
3.根據(jù)權利要求2所述的動態(tài)Huffman編碼硬件實現(xiàn)方法,其特征在于 所述步驟(I)中字符快速統(tǒng)計通過加法器和頻率緩存單元完成。
4.根據(jù)權利要求2所述的動態(tài)Huffman編碼硬件實現(xiàn)方法,其特征在于所述步驟(2)中最小堆緩存單元進行維護過程為把頻率緩存單元中的字符出現(xiàn)頻率依次順序的讀出,并加以判斷,如果不為0,就把該字符放進最小堆緩存單元中,一直到頻率緩存單元中所有的葉子節(jié)點都讀取并判斷完畢,如果為O就不放進最小堆緩存單元中,在把字符依次存進最小堆緩存單元中的同時記錄最小堆的長度,即最小堆緩存單元中有效的字符的數(shù)目,這些字符在邏輯關系上呈現(xiàn)二叉樹的形式; 從最小堆緩存單元中數(shù)據(jù)元素個數(shù)的一半開始一直到最小堆緩存單元的頂部依次調整這棵二叉樹,使得這課二叉樹中的每一個節(jié)點都滿足左節(jié)點和右節(jié)點都大于或者等于本節(jié)點,其中葉子節(jié)點除外。
5.根據(jù)權利要求2所述的動態(tài)Huffman編碼硬件實現(xiàn)方法,其特征在于 所述步驟(3)中構造Huffman樹的過程中從最小堆緩存單元的頂部讀取第一個元素,并把這個元素存入最小堆緩存單元底部開始的第一個未被占用的單元中,此時最小堆緩存單元的長度減1,并將最小堆緩存單元的最后一個元素放進最小堆緩存單元的第一個元素的位置上,從第一個元素位置開始調整這棵二叉樹,再次使得這棵二叉樹中的每一個節(jié)點都滿足左節(jié)點和右節(jié)點大于或者等于本節(jié)點,其中葉子節(jié)點除外; 從最小堆緩存單元的頂部再讀取第一個元素并把這個元素存入最小堆緩存單元底部開始的第一個未被占用的單元中,把最小堆緩存單元的長度減1,把從最小堆緩存單元中連續(xù)讀取的元素組合成一個新的節(jié)點,這個新的節(jié)點的權值為兩個連續(xù)讀取的元素的權值的和,這個的新節(jié)點在整個Huffman樹中的深度為兩個連續(xù)讀取元素中較大深度加1,并在父親節(jié)點緩存單元中設置好兩個連續(xù)讀取的葉子節(jié)點的父親節(jié)點為這個新得到的節(jié)點,即中間節(jié)點或者是根節(jié)點; 把得到的新的節(jié)點放入最小堆緩存單元的頂部,并把最小堆緩存單元的長度加1,從最小堆緩存單元的頂部開始依次調整最小堆中二叉樹的節(jié)點,使得這棵二叉樹滿足左節(jié)點和右節(jié)點大于或者等于本節(jié)點; 判斷最小堆緩存單元的長度是否為O,若不為O,表示Huffman樹未建好,繼續(xù)Huffman樹的建立;若為0,表示Huffman樹已經(jīng)全部建好,把讀取的最后一個節(jié)點存入最小堆緩存單元底部開始第一個未被占用的單元中。
6.根據(jù)權利要求2所述的動態(tài)Huffman編碼硬件實現(xiàn)方法,其特征在于所述步驟(4)遍歷Huffman樹,得到Huffman樹中每一個葉子節(jié)點的碼字長度過程中Huffman樹已經(jīng)建好,并存放在最小堆緩存單元中,從最小堆緩存單元中最新存入的那個單元開始,并在碼字長度緩存單元中設置其對應的碼字長度為0,并從Huffman樹的根節(jié)點開始,依次遍歷最小堆緩存單元中存放的Huffman樹中剩余的每一個節(jié)點,依次設置好每一個葉子節(jié)點的碼字長度,依次存放在對應的碼字長度緩存單元中。
7.根據(jù)權利要求2所述的動態(tài)Huffman編碼硬件實現(xiàn)方法,其特征在于所述步驟(5)統(tǒng)計每一個非O碼字長度字符的數(shù)目過程中在遍歷Huffman樹,得到每一個節(jié)點的碼字長度時,主控狀態(tài)機會同時統(tǒng)計出每一個碼字長度的節(jié)點的個數(shù),為計算Huffman編碼的值作好準備。
8.根據(jù)權利要求2所述的動態(tài)Huffman編碼硬件實現(xiàn)方法,其特征在于所述步驟(6)根據(jù)每一個非O碼字長度字符的數(shù)目去計算出每一個字符的Huffman碼字值的過程是為了得出Huffman樹中每一個節(jié)點的碼字值,在統(tǒng)計出了每一個非O碼字長度的個數(shù),從Huffman樹的最頂層依次向下進行推出Huffman樹中每一個節(jié)點的碼字值,并將葉子節(jié)點的碼字值保存在碼字值緩存單元中。
9.根據(jù)權利要求2所述的動態(tài)Huffman編碼硬件實現(xiàn)方法,其特征在于所述步驟(7)統(tǒng)計數(shù)據(jù)塊經(jīng)過Huffman編碼之后的數(shù)據(jù)塊的大小過程是為了在得到每一個葉子節(jié)點碼字長度的過程中,同時讀取對應的頻率緩存單元中對應字符的頻率信息,通過乘法器單元計算出對頻率緩存單元中字符進行Huffman編碼之后的長度,同時計算出累計Huffman編碼的長度;在得出每一個Huffman葉子節(jié)點的碼字長度之后,也就得到了固定長度的數(shù)據(jù)塊經(jīng)過Huffman編碼之后總大小。
10.根據(jù)權利要求2所述的動態(tài)Huffman編碼硬件實現(xiàn)方法,其特征在于所述步驟(10)Huffman編碼統(tǒng)計之前對頻率緩存單元的提前清空過程為數(shù)據(jù)打包單元啟動,開始編碼輸出,同時主控狀態(tài)機開始把頻率緩存單元開始清空處理,為下一個數(shù)據(jù)塊的Huffman編碼開始做好準備。
全文摘要
本發(fā)明公布了一種動態(tài)Huffman編碼硬件實現(xiàn)系統(tǒng),該系統(tǒng)包括數(shù)據(jù)打包單元,頻率緩存單元,碼字長度緩存單元,三個數(shù)據(jù)選擇器單元,碼字值緩存單元,主控狀態(tài)機,父親節(jié)點緩存單元,深度緩存單元,最小堆緩存單元,數(shù)據(jù)統(tǒng)計單元,加法器單元和乘法器單元。動態(tài)Huffman編碼硬件實現(xiàn)方法,包括快速的字符統(tǒng)計;建立Huffman樹;建立Huffman表;編碼輸出;頻率緩存單元的提前清空等步驟。本發(fā)明通過硬件實現(xiàn)了Huffman編碼,并在Huffman編碼的硬件實現(xiàn)過程中,采用了快速的字符統(tǒng)計方法、頻率緩存單元提前清空等技術使得數(shù)據(jù)吞吐率有了明顯的提升。
文檔編號H03M7/40GK102983866SQ20121045801
公開日2013年3月20日 申請日期2012年11月14日 優(yōu)先權日2012年11月14日
發(fā)明者湯曉東, 郭彥鋒, 李冰 申請人:無錫芯響電子科技有限公司