專利名稱:基于信源高階熵的數據壓縮方法
技術領域:
本發明涉及信息技術領域中數據的無損壓縮和解壓縮技術,具體地涉及基于信源熵編碼的數據壓縮和解壓縮技術。
Huffman編碼是可變字長編碼的一種。Huffman于1952年提出一種編碼方法,該方法完全依據字符出現概率來構造非前綴碼的平均長度最短的碼字,有時稱之為最佳編碼。產生Huffman編碼需要對原始數據掃描兩遍。第一遍掃描要精確地統計出原始數據中,每個待編碼字符出現的頻率,第二遍是建立Huffman樹并進行編碼。Huffman編碼的前身,是由Claude·E·Shannon和R·M·Fano兩人提出的Shannon-Fano編碼。編碼前要求編碼字符的出現概率已經統計出來。Shannon-Fano編碼的核心仍然是構造二叉樹,構造的步驟如下1)將待編碼字符按其出現頻率從大到小排序。
2)將序列分成上下兩部分,使得上部頻率總和盡可能接近下部頻率總和。
3)把第二步中劃分出的上部作為二叉樹的左子樹,記0,下部作為二叉樹的右子樹,記1。
4)分別對左右子樹重復2、3兩步,直到所有的符號都成為二叉樹的樹葉為止。
Huffman算法和Shannon-Fano算法都是基于信源一階熵的壓縮算法。根據Shannon的信息熵理論,利用信源的高階熵可以進一步提高壓縮效率。舉個典型的例子來說明。在英語文本文件中,字符‘u’的出現頻率是很低的,在Huffman算法或Shannon-Fano算法中,要給‘u’分配一個較長的編碼。而根據英語語言的特點,在字符‘q’之后,字符‘u’出現的概率是很高的。因此,在前一字符為‘q’的情況下,給字符‘u’分配的編碼長度就可以很短,甚至只需一位(bit)即可。由此可見,基于信源的高階熵可以有效提高壓縮效率。
關于信源熵階的定義,按照Shannon的定義,信源的一階熵為H=-Σi=1mpilog2pi]]>bits/character (1)其中m為信源的個數,pi為第i個信源的出現概率。信源的二階熵為H=-Σi=1mpiΣj=1mPj|ilog2Pj|i]]>bits/character (2)其中m為信源的個數,Pj|i為當前信源為j,前一信源為i的條件概率。信源的三階熵為H=-Σi=1mpiΣj=1mPj|iΣk=1mPk|j,ilog2Pk|j,i]]>bits/character (3)其中m為信源的個數,Pk|j,i為當前信源為k,前一信源為j,再前一信源為i的條件概率。
本發明是基于信源高階熵的數據壓縮方法,在產生非前綴編碼和解碼時,不需要建立二叉樹,根據信源的Pj|i或Pk|j,i,即當前信源為j,再前一信源為i,或當前信源為k,前一信源為j,再前一信源為i的條件概率進行數據壓縮。
根據所有前一信源相同,再前一信源也相同(基于3階熵時)的所有信源的出現頻率,降序排列后按一定的規則分為左右子塊,根據當前信源在數組中的位置決定其編碼,若位于左子塊則編碼為‘0’,位于右子塊則編碼為‘1,,繼續劃分當前信源所在的子塊,直到該塊信源的個數只有一個時為止。其中右子塊中信源的個數總為2i個,i=0,1,2,3,4,5,6,7(當信源總數為256個時)。
劃分左右子塊的規則是在劃分左子塊時,將子塊開頭部分的2i個(i從0開始)信源出現頻率之和,與第2i+1個信源之后的所有信源出現頻率之和進行比較,若前者大于后者,則前者為右子塊,其余為左子塊,否則,將i值加1后再比較;若劃分的是右子塊,直接按信源的個數,平分為左右子塊,頻率大的部分為右子塊,頻率小的部分為左子塊。
同樣的,解壓縮時也不需要建立二叉樹。先根據劃分規則,劃分出左右子塊,然后取出1位(bit)壓縮編碼,若取出的是‘1’,則再劃分右子塊;若是‘0’,則再劃分左子塊,直到該塊的信源個數為1時,該信源即為解壓得出的信源。
具體實施例方式
下面結合附圖以三階熵為例對本發明作進一步描述首先,設定信源是由一個字節的字符構成,其代碼為從0到255,共有256個。定義兩個256*256*256的數組,一個用來存放前一信源為j,再前一信源為i的當前各信源的出現次數,用Count[i][j][256]來表示,初始值全部置為0;另一個用來存放前一信源為j,再前一信源為i的當前各信源依出現次數排序后相對應的信源字符,用Char[i][j][256]來表示。舉例說明在前一信源為j,再前一信源為i的前提條件下,當前信源‘1‘的出現次數為20,在256個信源字符中按降序排列后位于第五位,則Count[i][j][4]=20,Char[i][j][4]=1。Char[i][j][256]的初始值與該信源的值相等,即第0位為0,第1位為1,以此類推,最后一位為255。每次建立當前信源的編碼時,依據的就是這Count[i][j][256],參與編碼的信源個數為256個。對當前信源字符k來說,其出現概率為Pk|j,i,對應于該信源的三階熵。壓縮前,直接輸出第一個信源的字符和第二個信源的字符。然后,每壓縮一個字符后,就循環更新前一字符和再前一字符,即將前一字符作為再前一字符,當前字符變作前一字符,讀入的新字符為當前字符。
其次,建立當前信源k的編碼時,并不需要建立整棵二叉樹。先根據數組Char[i][j][256]來確定當前信源k在數組中的位置,用Position表示。該位置也是當前信源k在Count[i][j][256]中按降序排列后的位置。然后根據數組Count[i][j][256],用下面的方法來將數組分為左右兩塊。總的分塊原則,是使右子塊信源的個數為2i(i=0~7)個,有利于快速分出左右子塊。若第1位的出現頻率大于第3到第256位的出現頻率之和,則第1位為右子塊,其余為左子塊;否則,若第1和第2位出現頻率之和大于第5位至第256位出現頻率之和,則右子塊為第1位和第2位,其余為左子塊;否則,若第1至4位出現頻率之和大于第9至256位出現頻率之和,則右子塊為第1至4位,其余為左子塊;否則,若第1至8位出現頻率之和大于第17至256位出現頻率之和,則右子塊為第1至8位,其余為左子塊,如此比較下去,直到某個i值符合條件為止。右子塊個數為2i(右子塊最大個數為128個),其余為左子塊。分出左右子塊后,根據Position值的大小,確定當前信源k是屬于右子塊還是屬于左子塊。若屬于左子塊,則編碼為‘0’。再將左子塊按上述的方法分出左右子塊,然后用Position的值進行判斷,直到左子塊只剩下一個信源。若屬于右子塊,則編碼為‘1’。若右子塊元素的個數大于1,則將右子塊按信源個數平分為二,出現頻率大的為右子塊,出現頻率小的為左子塊,再根據Position的值,確定信源k是屬于左子塊還是右子塊,左子塊則編碼為‘0’,右子塊則編碼為‘1’。這樣,不用建立整棵二叉樹,也不用通過搜索二叉樹來確定信源的編碼,只需根據信源的出現頻率就能直接得到信源的編碼。
接下來,將信源k的出現頻數增一,再將Count[i][j][256]排成降序,更新前一信源代碼和再前一信源代碼,讀入新的信源代碼為當前代碼。回到上一步,直到所有輸入的信源編碼完成。
下面再說明編碼的解碼方法。首先,按壓縮編碼時的方法初始化數組Count[256][256][256]和Char[256][256][256],讀入第一個字符FirstChar和第二個字符SecondChar。從第三個字符起,是信源壓縮后的編碼。然后,按照壓縮過程的方法那樣,將前一信源為SecondChar,再前一信源為FirstChar的256個信源,即Char[FirstChar][SecondChar][256],按出現的頻數分成左右子塊。取出壓縮編碼的第1位(bit),若該位為1,則說明待解壓信源位于右子塊;若該位為0,則說明待解壓信源位于左子塊;只要所在子塊的信源個數大于1,則按分塊規則,再分為左右子塊,壓縮編碼左移一位,取出其第一位,按上述相同的方法判斷待解碼信源位于左子塊還是右子塊。就這樣分解下去,直到左子塊或右子塊的信源個數為1時,則該信源即為解壓縮得出的原始信源。
本方法可以基于信源的二階熵或三階熵進行數據壓縮。基于信源高階熵的壓縮方法,不適宜采用靜態的方法。一方面是因為采用靜態編碼的方法,要對待壓縮數據掃描兩遍,且不能用于實時數據的壓縮;另一方面是因為要保留大量的頭文件信息(各信源及其編碼),降低了壓縮編碼效率。因此,只能采用自適應的壓縮方法。
為了與已有的壓縮方法進行比較,根據本方法分別基于信源的二階熵和三階熵編寫出程序(LCL),與Huffman算法程序、LZW算法程序一起,對Windows98第二版操作系統內的幾種不同格式的文件進行壓縮,試驗結果如下表所示。用到的Huffman算法程序和LZW算法程序,均是從Internet上下載來的,作者分別是Fredrik Qvarfort和Mark R.Nelson
表1壓縮效果比較
1 壓縮編碼示例假設當前信源為字符A,在FirstChar和SecondChar為某一確定值的情況下,出現的次數為12次,在按出現次數排列的數組中位于第17位。其它信源出現的次數分別為55,51,47,45,41,38,37,35,34,31,29,27,24,22,18,16,12,11,9,7,6,6,4,3,3,2,2,1,1,1。第1步分左右子塊。因為(55)不大于Σi=330Ci=512,]]>其中Ci為各信源的出現次數,(55+51)也不大于Σi=530Ci=420,]]>(55+51+47+45)=198也不大于 而(55+51+47+45+41+38+37+35)=319,大于Σi=1730Ci=68,]]>故右子塊由前8個信源組成,左子塊由后面的22個信源組成。右子塊編碼字1,左子塊編碼字0。如
圖1所示。第二步由于當前信源位于第17位,屬于左子塊,下一步只需再分左子塊即可。由于(34)不大于Σi=1130Ci=204,]]>(34+31)也不大于Σi=1330Ci=148,]]>而(34+31+29+27)=121,大于Σi=1730Ci=68,]]>故再將左子塊分為新的左子塊和右子塊。右子塊由第9,10,11,12信源組成,由第13至30信源組成左子塊。如圖2所示。第三步當前信源屬于新的左子塊,再分左子塊。由于(24)不大于Σi=1530Ci=102,]]>(24+22)=46也不大于Σi=1730Ci=68,]]>而(24+22+18+16)=80,大于Σi=2130Ci=29,]]>故新的右子塊由第13至16信源組成,新的左子塊由第17至30信源組成。如圖3所示。第四步當前信源屬于新的左子塊,再分左子塊。由于(12)不大于Σi=1930Ci=45,]]>(12+11)也不大于Σi=2130Ci=29,]]>而(12+11+9+7)=39,大于Σi=2530Ci=10,]]>故新的右子塊由第17至20信源組成,新的左子塊由第21至30信源組成。如圖4所示。第五步當前信源屬于新的右子塊,再分右子塊。對于右子塊,只需要將右子塊按信源的個數平分即可。故新的右子塊由第17,18信源組成,左子塊由第19,20信源組成。如圖5所示。第六步當前信源屬于新的右子塊,再分右子塊。新的右子塊由第17信源組成,左子塊由第18信源組成。由于右子塊的信源個數只有1個,故編碼過程至此結束。如圖6所示。
從樹的根往下編碼,右子樹編1,左子樹編0,故可得當前信源的編碼為000111。2 編碼解壓縮示例以上例來說明編碼的解碼過程。同上例的第一步,先求出左右子塊,右子塊由第1至8信源組成,其余信源為左子塊。現取出編碼的第1位,是‘0’,說明待解壓縮信源位于左子塊;再按上例第二步,將左子塊再分為新的左子塊和右子塊。取出編碼的第1位,又是‘0’,說明待解壓縮信源仍位于左子塊。再按上例第三步,將左子塊再分為新的左子塊和右子塊。取出編碼的第1位,又是‘0’,說明待解壓縮信源仍位于左子塊。再按上例第四步,將左子塊再分為新的左子塊和右子塊。取出編碼的第1位,是‘1’,說明待解壓縮信源位于右子塊,此時右子塊只有第17至20信源。再按上例第五步,將右子塊再分為新的左子塊和右子塊。取出編碼的第1位,是‘1’,說明待解壓縮信源仍位于右子塊,此時右子塊只有第17和18信源。再按上例第六步,將右子塊再分為新的左子塊和右子塊。取出編碼的第1位,是‘1’,說明待解壓縮信源位于右子塊,此時右子塊只有第17信源,故解壓縮得到的編碼為第17信源,輸出該信源,這樣,就完成了一個信源的解碼。
權利要求
1.一種基于信源高階熵的數據壓縮方法,其特征是指根據信源的Pj|i或Pk|j,i,即當前信源為j,再前一信源為i,或當前信源為k,前一信源為j,再前一信源為i的條件概率進行數據壓縮。
2.如權利要求1所述的數據壓縮方法,其特征是指根據所有前一信源相同,再前一信源也相同(基于3階熵時)的所有信源的出現頻率,降序排列后按一定的規則分為左右子塊,根據當前信源在數組中的位置決定其編碼,若位于左子塊則編碼為‘0’,位于右子塊則編碼為‘1’,繼續劃分當前信源所在的子塊,直到該塊信源的個數只有一個時為止。
3.如權利要求2所述的數據壓縮方法,其特征是將信源數組分為左右子塊,其中右子塊中信源的個數總為2i個,i=0,1,2,3,4,5,6,7(當信源總數為256個時)。
4.如權利要求2所述的數據壓縮方法,其特征為劃分左右子塊的規則是若劃分左子塊時,將子塊開頭部分的2i個信源出現頻率之和(i從0開始),與第2i+1個信源之后的所有信源出現頻率之和進行比較,若前者大于后者,則前者為右子塊,其余為左子塊,否則,將i值加1后再比較;若劃分的是右子塊時,直接按信源的個數,平分為左右子塊,頻率大的部分為右子塊,頻率小的部分為左子塊。
5.如權利要求1中所述的數據壓縮方法,其特征為解壓縮編碼時不需要建立二叉樹,先根據劃分規則,劃分出左右子塊,然后取出1位(bit)壓縮編碼,若取出的是‘1’,則再劃分右子塊;若是‘0’,則再劃分左子塊,直到該塊的信源個數為1時,該信源即為解壓得出的信源。
6.一種由執行如權利要求1的方法的控制器組成的數據壓縮器。
7.一種用于數據壓縮器的計算機程序產品,這個計算機程序產品包含一套執行如權利要求1的方法的指令。
全文摘要
本發明涉及信息技術領域中的數據無損壓縮和解壓縮技術。現有的基于信源熵編碼的無損壓縮和解壓縮方法,都是基于信源的一階熵來壓縮數據;基于非前綴碼的熵編碼方法,都要先根據信源的出現頻率建立一棵二叉樹,然后通過從根到葉子的搜索來建立信源的編碼。本發明是基于信源的高階(2階或3階)熵,能較大地提高數據的壓縮比;是自適應算法,不需要事先知道各信源的出現頻率;是直接根據信源的出現頻率建立非前綴編碼,不需要建立二叉樹,適用于所有數字化文件的壓縮和解壓縮,也可作為圖像、聲音等信息有損壓縮方法中的熵編碼算法,還可用于各種實時流媒體信息的壓縮和解壓縮。
文檔編號H04N7/50GK1447603SQ0311442
公開日2003年10月8日 申請日期2003年1月10日 優先權日2003年1月10日
發明者李春林 申請人:李春林