專利名稱:哈夫曼解碼方法
技術(shù)領(lǐng)域:
本發(fā)明屬于解碼技術(shù)領(lǐng)域,尤其涉及一種并行分布查表的哈夫曼解碼方法。
背景技術(shù):
變長(zhǎng)編碼(Variable Length Coding,VLC)是一種無損數(shù)據(jù)壓縮方法,在圖像、視頻、文本、數(shù)據(jù)、語音以及其它各種媒體壓縮中都有著廣泛的應(yīng)用。變長(zhǎng)編碼通過給信源符號(hào)集中出現(xiàn)概率越大的符號(hào)分配越短的來減少每個(gè)符號(hào)編碼所需的平均碼長(zhǎng),充分消除數(shù)據(jù)中的冗余性,達(dá)到數(shù)據(jù)壓縮的目的。
在變長(zhǎng)編解碼技術(shù)中,哈夫曼(Huffman)編解碼是一種經(jīng)典的方法,該方法能夠在平均碼字長(zhǎng)度熵達(dá)到最優(yōu)。哈夫曼碼廣泛應(yīng)用于各類數(shù)據(jù)壓縮中,并被MPEG、H。26x等音視頻壓縮編碼標(biāo)準(zhǔn)所采納。目前常見的Huffman變長(zhǎng)解碼(Variable Length Decoding,VLD)的軟件實(shí)現(xiàn)方法有線性搜索法、直接查表法、二進(jìn)制搜索法、分步查表法等。其中,線性搜索法和二進(jìn)制搜索法的效率較低,不適于實(shí)時(shí)性要求較高的場(chǎng)合;直接查表法效率較高,但由于內(nèi)存開銷很大,應(yīng)用場(chǎng)合受到較大限制;分步查表法是對(duì)二進(jìn)制搜索與直接查表的折衷優(yōu)化,內(nèi)存開銷和譯碼效率介于二者之間,是在實(shí)際中常用的方法。
在Huffman碼的集合中,短碼字出現(xiàn)的概率遠(yuǎn)大于長(zhǎng)碼字,因此碼流中多個(gè)短碼字連續(xù)出現(xiàn)的概率也較高。利用Huffman碼的這一特性,通過修改碼表結(jié)構(gòu),可以實(shí)現(xiàn)對(duì)連續(xù)多個(gè)短碼字的并行處理,減少譯碼操作,節(jié)省譯碼開銷。
發(fā)明內(nèi)容
本發(fā)明提出了一種并行分步查表的解碼方法。該方法采用并行查表減少比特操作,并引入兩種數(shù)據(jù)結(jié)構(gòu)來構(gòu)造碼表。該方法對(duì)存儲(chǔ)資源的要求比較靈活,通過修改碼表可以適應(yīng)不同平臺(tái)上譯碼對(duì)性能和資源的要求。
在該方法中使用了碼字組合的概念,一個(gè)碼字組合的長(zhǎng)度為n個(gè)單個(gè)碼字與n-1位符號(hào)位的總長(zhǎng)度。碼字組合被看作一個(gè)碼字,可以一次解出。
該哈夫曼解碼方法,具體包括以下兩個(gè)方面(A)Huffman樹的構(gòu)造和基于Huffman樹的碼表的構(gòu)造。
(B)基于(A)中所構(gòu)造碼表進(jìn)行并行分布查表的Huffman解碼過程。
在(A)中所構(gòu)造的Huffman樹,可根據(jù)碼字組合最大長(zhǎng)度L劃分為上下兩部分。長(zhǎng)度小于或等于L的葉子節(jié)點(diǎn)包含碼字組合和長(zhǎng)度小于或等于L的單個(gè)碼字。長(zhǎng)度大于L的葉子節(jié)點(diǎn)為長(zhǎng)度大于L的單個(gè)碼字;在(A)中所構(gòu)造的碼表,為一張包含轉(zhuǎn)跳地址信息(也可包含長(zhǎng)度小于L的單個(gè)碼字的信息)的地址表,以及多張包含碼字組合信息或單個(gè)碼字信息的碼字表;在(B)中所述基于(A)中所構(gòu)造碼表進(jìn)行并行分布查表的Huffman解碼過程,其具體過程如下(b1)在解Huffman碼時(shí),一次取L(碼字組合最大長(zhǎng)度)個(gè)比特碼流在地址表中查表,若查得需要轉(zhuǎn)跳到包含長(zhǎng)度小于或等于L碼字(碼字組合)信息的表,到步驟(b2);反之,則到步驟(b3);(b2)根據(jù)查表得到信息判斷該碼是為碼字組合還是單個(gè)碼字。若為單個(gè)碼字,則在地址表中直接查表或根據(jù)地址表中的地址信息在相應(yīng)的碼表中查表得到該碼字信息;若為碼字組合,則根據(jù)該對(duì)應(yīng)項(xiàng)中地址信息在包含碼字組合信息的碼表中查得該碼字組合信息;(b3)則取接下去Huffman樹最大長(zhǎng)度與碼字組合最大長(zhǎng)度之差個(gè)比特碼流在轉(zhuǎn)跳地址信息對(duì)應(yīng)的碼表中查表得到相應(yīng)的碼字長(zhǎng)度大于L單個(gè)碼字信息;該方法中,在Huffman樹的構(gòu)造上可綜合考慮碼字組合出現(xiàn)概率和內(nèi)存開銷等因素確定碼字組合的最大長(zhǎng)度L,然后可根據(jù)對(duì)內(nèi)存開銷和解碼速度的要求靈活構(gòu)造碼表。若在解碼時(shí)首先必須訪問的地址表中不存放長(zhǎng)度小于L的單個(gè)碼字信息,而只存放該碼字在對(duì)應(yīng)的碼字表里的相對(duì)地址信息,則該地址信息欄只需占很少幾個(gè)比特,比存放完整碼字信息時(shí)所占位寬大幅降低。因地址表中的單個(gè)碼字項(xiàng)為多對(duì)一的關(guān)系,若將其簡(jiǎn)化為一張包含碼字長(zhǎng)度小于或等于碼字組合最大長(zhǎng)度L的單個(gè)碼字信息的碼表,一項(xiàng)對(duì)應(yīng)一個(gè)碼字,則新增的項(xiàng)數(shù)并不多,而碼表所占用的總的內(nèi)存空間可大大降低。
該方法中所構(gòu)造的碼字表包括一張包含碼字組合信息的碼表,一張包含碼字長(zhǎng)度小于或等于碼字組合最大長(zhǎng)度L的單個(gè)碼字信息的碼表(此表如上段中所述可合并到地址表中),以及一張或多張包含碼字長(zhǎng)度大于碼字組合最大長(zhǎng)度L的單個(gè)碼字信息的碼表。包含碼字組合信息的碼表存放碼字組合中多個(gè)碼字的信息。在由地址表在向該表轉(zhuǎn)跳時(shí),由于該表只有一張,表的首地址為確定值,所以在地址表中只需存放碼字組合在該碼字表中的相對(duì)地址。包含碼字長(zhǎng)度小于或等于L的單個(gè)碼字信息的碼字表只有一張,表的首地址為確定值,在由地址表向該表轉(zhuǎn)跳時(shí),同樣只需在地址表中存放單個(gè)碼字在該碼字表中的相對(duì)地址。包含碼字長(zhǎng)度大于L的單個(gè)碼字信息的碼表的數(shù)目取決于Huffman樹在長(zhǎng)度L上中間節(jié)點(diǎn)的個(gè)數(shù),一個(gè)中間節(jié)點(diǎn)對(duì)應(yīng)一張碼表。每個(gè)中間節(jié)點(diǎn)下面部分的葉子節(jié)點(diǎn)按其與該中間節(jié)點(diǎn)的相對(duì)位置構(gòu)成碼表。
在地址表中還包含一位轉(zhuǎn)跳位,用以表明下一步所要轉(zhuǎn)跳到的地址是相對(duì)地址還是絕對(duì)地址。當(dāng)要轉(zhuǎn)跳到包含碼字長(zhǎng)度大于L的單個(gè)碼字信息的碼表是,為絕對(duì)地址;反之則為相對(duì)地址。
圖1為具體實(shí)施方式
中所示實(shí)施例的解碼流程圖;圖2為具體實(shí)施方式
中所示實(shí)施例的Huffman樹結(jié)構(gòu)圖,圖中符號(hào)意義
○表示根節(jié)點(diǎn)或中間節(jié)點(diǎn);□表示葉子節(jié)點(diǎn);◇表示碼字組合節(jié)點(diǎn);圖3是一張表,為具體實(shí)施例中根據(jù)Huffman樹所構(gòu)造的包含地址信息和單個(gè)碼字信息的地址表(以下稱作表(a));圖4是一張表,為具體實(shí)施例中根據(jù)Huffman樹所構(gòu)造的包含碼字組合信息的碼字表(以下稱作表(b));圖5是一張表,為具體實(shí)施例中根據(jù)Huffman樹所構(gòu)造的包含碼字長(zhǎng)度大于碼字組合最大長(zhǎng)度L的單個(gè)碼字信息的碼字表(以下稱作表(c))。
具體實(shí)施例方式
下面結(jié)合附圖以一個(gè)具體的實(shí)施例來說明本方法。圖1所示為包含12個(gè)碼字(00,01,100,101,110,1110,11110,1111101,1111110,1111111,11111000,11111001),碼字組合最大長(zhǎng)度L=5,單個(gè)碼字最大長(zhǎng)度為8的一個(gè)Huffman樹。以碼字長(zhǎng)度小于或等于L為界,將Huffman樹分成上下兩部分。根據(jù)Huffman樹的劃分進(jìn)行碼表的構(gòu)造。表(a)(如圖3所示)對(duì)應(yīng)Huffman樹的上半部,在每次查表時(shí)首先被訪問。在本實(shí)施例中,將包含碼字長(zhǎng)度小于或等于碼字組合最大長(zhǎng)度L的單個(gè)碼字信息的碼字表合并到了表(a)中。表(a)第二列表明是否跳轉(zhuǎn)到表(c)(如圖5所示)繼續(xù)查找。在本例所示的Huffman樹在長(zhǎng)度L上只有一個(gè)中間節(jié)點(diǎn),因此只需構(gòu)造一張包含碼字長(zhǎng)度在大于L的單個(gè)碼字信息的碼字表。表(a)只有最后一項(xiàng)“11111”對(duì)應(yīng)的節(jié)點(diǎn)是中間節(jié)點(diǎn),所以除了這一項(xiàng)是1外,其余表項(xiàng)的第二列為0。第三列是一個(gè)二選一的表項(xiàng),當(dāng)?shù)诙袨?時(shí),對(duì)應(yīng)的是碼字信息,即“run”、“l(fā)evel”、“l(fā)ength”、“l(fā)ast”的組合;當(dāng)?shù)诙袨?時(shí),對(duì)應(yīng)的是跳轉(zhuǎn)到的碼表起始地址。當(dāng)待查碼字包含在表(a)中時(shí),還要判斷是否為碼字組合。此例中用“run”值作為判據(jù)依據(jù)。正常碼字的run值在0到63之間,可用一個(gè)不屬于
范圍的run值來標(biāo)示碼字組合。若待查碼字為碼字組合,則第三列為碼字組合對(duì)應(yīng)的碼字組合信息在表(b)(如圖4所示)中的對(duì)應(yīng)位置以及碼字組合總長(zhǎng)度;若待查碼字不是碼字組合,則第三列為對(duì)應(yīng)的碼字信息。表(b)包含最大長(zhǎng)度為L(zhǎng)(在本例中為5)的由n(在本例中為2)個(gè)單個(gè)碼字與n-1位符號(hào)字節(jié)成的碼字組合的信息。根據(jù)地址信息訪問表(b)的對(duì)應(yīng)表項(xiàng),查出碼字組合的信息。表(c)對(duì)應(yīng)本例中Huffman樹的下半部分,存放長(zhǎng)度大于L的碼字的信息。
假設(shè)接收到一段碼流“001111110000011000”,第一步取5比特,即“00111”查表(a),“00111”對(duì)應(yīng)的碼字在第八項(xiàng),碼字長(zhǎng)度為2,即前兩個(gè)比特位“00”對(duì)應(yīng)Huffman樹中的碼字1,第三個(gè)比特位“1”為該碼字的符號(hào)位。第二步取接下去的5比特,即“11111”,先查表(a),對(duì)應(yīng)于最后一項(xiàng),由于該項(xiàng)第二列為1,表明需要跳轉(zhuǎn)到表(c)。再取接下去的3比特,即“000”,可以確定該碼字在表2中的位置。查得該8比特對(duì)應(yīng)Huffman樹中碼字19。接下去的一個(gè)比特“1”為該碼字的符號(hào)位。第三步取接下去的5比特,即“01100”,其對(duì)應(yīng)于表(a)的第13項(xiàng),查得“run”值超出了0到63的范圍,因此這是一個(gè)碼字組合,碼字總長(zhǎng)度為5。通過第三列中的地址信息可以得到該碼字組合在表(b)中位置并查出相應(yīng)的碼字組合信息。這段碼流的解碼最終結(jié)果為碼字1、19、2、1,符號(hào)由每個(gè)碼字后最鄰近比特確定。
以上所述僅為本發(fā)明的一個(gè)特定實(shí)例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的修改、替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍內(nèi)。
權(quán)利要求
1.本發(fā)明所提出的哈夫曼解碼方法,其特征在于該方法包括以下方面(A)Huffman樹的構(gòu)造和基于Huffman樹的碼表的構(gòu)造;(B)基于(A)中所構(gòu)造碼表進(jìn)行并行分布查表的Huffman解碼過程。
2.按權(quán)利要求1所述的哈夫曼解碼方法,其特征在于按該方法所構(gòu)造的Huffman樹,可根據(jù)碼字組合的最大長(zhǎng)度L劃分為上下兩部分,長(zhǎng)度小于或等于L的葉子節(jié)點(diǎn)包含碼字組合以及長(zhǎng)度小于或等于L的單個(gè)碼字,長(zhǎng)度大于L的葉子節(jié)點(diǎn)為長(zhǎng)度大于L的單個(gè)碼字。
3.按權(quán)利要求1所述的哈夫曼解碼方法,其特征在于基于權(quán)利要求2中所述Huffman樹所構(gòu)造的碼表,為一張包含轉(zhuǎn)跳地址信息的地址表和多張包含碼字組合信息或單個(gè)碼字信息的碼字表,在包含轉(zhuǎn)跳地址信息的地址表中也可包含長(zhǎng)度小于L的單個(gè)碼字的碼字信息,
4.按權(quán)利要求1所述的哈夫曼解碼方法,其特征在于該方法所述基于所構(gòu)造碼表進(jìn)行并行分布查表的Huffman解碼過程,其具體過程如下(a)在解Huffman碼時(shí),一次取L即碼字組合最大長(zhǎng)度個(gè)比特碼流在地址表中查表;(b)根據(jù)步驟(a)查表結(jié)果,若需要轉(zhuǎn)跳到包含長(zhǎng)度小于或等于L的碼字或碼字組合信息的表,再根據(jù)查表得到信息判斷該碼是為碼字組合還是單個(gè)碼字,若為單個(gè)碼字,則在地址表中直接查表或根據(jù)地址表中的地址信息在相應(yīng)的碼表中查表得到該碼字信息;若為碼字組合,則根據(jù)該對(duì)應(yīng)項(xiàng)中地址信息在包含碼字組合信息的碼表中查得該碼字組合信息;(c)根據(jù)步驟(a)查表結(jié)果,若需要轉(zhuǎn)跳到包含長(zhǎng)度大于L的單個(gè)碼字的信息的表,則取接下去Huffman樹最大長(zhǎng)度與碼字組合最大長(zhǎng)度之差個(gè)比特碼流在轉(zhuǎn)跳地址信息所示的碼表中查表得到相應(yīng)的碼字長(zhǎng)度大于L的單個(gè)碼字的碼字信息。
全文摘要
本發(fā)明為一種并行查表的哈夫曼解碼方法。該方法可根據(jù)譯碼時(shí)對(duì)性能和資源的要求靈活構(gòu)造哈夫曼樹和碼表,在解碼時(shí)可將多個(gè)短碼字作為一個(gè)碼字組合通過分步查表一次解出。
文檔編號(hào)H03M7/42GK1889366SQ20061005243
公開日2007年1月3日 申請(qǐng)日期2006年7月13日 優(yōu)先權(quán)日2006年7月13日
發(fā)明者王維東, 倪昕, 沈渝力, 張貽雄, 劉鵬, 史冊(cè), 姚慶棟 申請(qǐng)人:浙江大學(xué)