專利名稱:一種快速提取比特流哈夫曼解碼方法
技術(shù)領(lǐng)域:
本發(fā)明屬于采用哈夫曼編解碼的多媒體技術(shù)領(lǐng)域,尤其涉及一種通過從比特流中快速提取比特位來實現(xiàn)哈夫曼解碼的方法。
背景技術(shù):
所述的哈夫曼編碼是利用信號源符號的概率分布來確定符號編碼的信息量,對于出現(xiàn)概率高的符號,采用短的碼字來描述;對于出現(xiàn)概率低的符號,采樣長的碼字來描述。通過變長編碼來消除信息之間的冗余,來實現(xiàn)對信號無損壓縮的目的。
在現(xiàn)代的多媒體領(lǐng)域,哈夫曼編解碼技術(shù)得到了廣泛的應(yīng)用,包括應(yīng)用在MPEG音頻編碼解碼技術(shù)中,應(yīng)用在AVS音頻編解碼技術(shù)中,以及應(yīng)用在AC系列音頻編解碼技術(shù)中。
在哈夫曼解碼過程中,需要從比特流中提取比特位用于在哈夫曼碼表中來查找所提取比特位總共對應(yīng)的值是否等于哈夫曼碼表中的某個碼值,同時所提取比特位的總數(shù)是否等于該碼值對應(yīng)的碼長,如果兩者都相同,即可以得到解碼信息。但是在從比特流中剝離比特位的時候,就需要大量的移位和邏輯運算。
目前常見的哈夫曼解碼方法有線性搜索法、直接查表法、二進制搜索法和分步查表法。其中線性搜索法和二進制搜索法的效率較低,不適合實時性要求高的場合;而直接查表法的效率稍高,但是內(nèi)存開銷較大;另外,分步查表法是二進制搜索法和直接查表法的折衷,但是其效率仍不是很高。
本發(fā)明提出了一種從比特流中快速剝離比特位數(shù)來實現(xiàn)哈夫曼解碼的方法,大大的減少由于從比特流中剝離比特位數(shù)而導(dǎo)致的大量運算,最終實現(xiàn)可以獲得同原來相同的解碼結(jié)果。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是,提供一種快速提取比特流哈夫曼解碼方法,其通過重新構(gòu)造哈夫曼碼表的結(jié)構(gòu),將碼表構(gòu)造成基于碼長呈規(guī)律性分布,再利用構(gòu)造的碼表來實現(xiàn)快速從比特流中剝離出需要解碼的位數(shù),從而實現(xiàn)對比特流解碼;本發(fā)明方法可大大減少由于從比特流中剝離比特位數(shù)而導(dǎo)致的大量運算,并可最終獲得同原來相同的解碼結(jié)果,大大提高運行效率。
為了達到上述目的,本發(fā)明提供一種快速提取比特流哈夫曼解碼方法,其包含以下步驟步驟1、重新構(gòu)造新的哈夫曼碼表的碼值表,索引表和碼長表;步驟2、基于步驟1中所構(gòu)造的哈夫曼碼表,快速地從比特流中剝離出需要的位數(shù)來實現(xiàn)哈夫曼解碼。
所述的步驟1具體包含以下步驟步驟1.1、根據(jù)哈夫曼碼表中原來的碼長表Table_len1中的各個碼長值的大小,按照順序重新進行排序,將排序后獲得的新碼長表存儲在表Table_len2中;步驟1.2、將從原來碼長表映射到新碼長表的映射關(guān)系存儲到映射表Table_Index中;步驟1.3、按照表Table_Index中的映射關(guān)系,將哈夫曼碼表中原來的碼值表Table_val1對應(yīng)映射到新的碼值表Table_val中;步驟1.4、在碼長表Table_len2的基礎(chǔ)上,生成新的碼長表Table_len。
所述的步驟1.1中,根據(jù)哈夫曼碼表中原來的碼長表Table_len1中的各個碼長值的大小,按照從小到大的順序重新進行排序,得到Table_len2。
所述的步驟1.1中,根據(jù)哈夫曼碼表中原來的碼長表Table_len1中的各個碼長值的大小,按照從大到小的順序重新進行排序,得到Table_len2。
所述的步驟1.4具體包含以下步驟步驟1.4.1、用碼長表Table_len2中的最后一個碼長值減去排列在其前一個(即最后第二個)的碼長值,并將相減所得的結(jié)果覆蓋存儲在最后一個碼長值所在的存儲空間;步驟1.4.2、用碼長表Table_len2中的最后第二個碼長值減去排列在其前一個(即最后第三個)的碼長值,并將相減所得的結(jié)果覆蓋存儲在最后第二個碼長值所在的存儲空間;如此類推;
步驟1.4.3、用碼長表Table_len2中的第二個碼長值減去排列在其前一個(即第一個)的碼長值,并將相減所得的結(jié)果覆蓋存儲在第二個碼長值所在的存儲空間;步驟1.4.4、由于碼長表Table_len2中的第一個碼長值前面沒有數(shù)據(jù),故碼長表中的第1個碼長值保持不變,由此生成新的碼長表Table_len。
上述步驟1中重新生成的碼值表Table_val,碼長表Table_len和映射表Table_Index組成步驟1中所述的新的哈夫曼碼表。
所述的步驟2具體包含以下步驟步驟2.1、設(shè)置記憶變量m,val和bitCnt的初始值均為0;其中,bitCnt用來存儲從比特流中提取的比特位數(shù);m用來記錄在碼表中上一次搜索到的位置,val用來記錄從比特流中提取的bitCnt個比特位對應(yīng)的值;步驟2.2、獲取前一次在碼長表中搜索到的位置將記憶變量m賦值給j,即j=m;步驟2.3、從比特流中依次讀取相應(yīng)位比特數(shù)據(jù)步驟2.3.1、根據(jù)碼長表中當(dāng)前Table_len[j]的值,將變量val的值向左移Table_len[j]位后賦值給val,即val=val<<Table_len[j];其中,j=0,1,……,Size-1,Size表示哈夫曼碼表中碼的個數(shù)值;步驟2.3.2、利用函數(shù)unpack()依次從左至右從比特流中讀取出Table_len[j]位的比特位,將讀取獲得的比特數(shù)據(jù)unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j]);其中,unpack(Table_len[j])函數(shù)表示從比特流中讀取出Table_len[j]個比特位的數(shù)據(jù);步驟2.3.3、利用變量bitCnt來記錄從比特流中共提取出的比特位數(shù),即bitCnt=bitCnt+Table_len[j];步驟2.4、判斷val的值是否等于Table_val[j]的值,若相等,執(zhí)行步驟2.5;若不相等,執(zhí)行步驟2.6;步驟2.5、將當(dāng)前j值對應(yīng)的映射索引Table_Index[j]作為解碼信息返回,同時返回解碼信息編碼的位數(shù)bitCnt的值,結(jié)束解碼過程;步驟2.6、依次循環(huán)判斷當(dāng)前Table_Index[j+1]和bitCnt是否為解碼獲得的信息,該步驟2.6具體包含以下步驟步驟2.6.1、判斷碼長表Table_len[j+1]的值是否等于0,若Table_len[j+1]=0,執(zhí)行步驟2.6.3;若碼長表Table_len[j+1]≠0,執(zhí)行步驟2.6.2;其中,j+1=1,……,Size-1,Size表示哈夫曼碼表中碼的個數(shù)值;步驟2.6.2、記錄在碼長表中當(dāng)前搜索到的位置將當(dāng)前j+1的值賦值給記憶變量m,即m=j(luò)+1,然后循環(huán)返回執(zhí)行步驟2.2;步驟2.6.3、判斷val的值是否等于碼值表Table_val[j+1]的值;如果相等,執(zhí)行步驟2.6.4;如果不相等,則循環(huán)返回執(zhí)行步驟2.6.1,判斷哈夫曼映射表中下一個Table_Index[j+1](即此時令j+1=(j+1)+1),和bitCnt是否為解碼獲得的信息;步驟2.6.4、將當(dāng)前j+1值對應(yīng)的映射索引Table_Index[j+1]作為解碼信息返回,同時返回解碼信息編碼的位數(shù)bitCnt的值,結(jié)束解碼過程。
本發(fā)明提供的快速提取比特流哈夫曼解碼方法,其通過重新構(gòu)造哈夫曼碼表的結(jié)構(gòu),將碼表構(gòu)造成具有規(guī)律性分布,再利用構(gòu)造的碼表來實現(xiàn)快速從比特流中剝離出需要解碼的位數(shù),從而實現(xiàn)對比特流解碼。本發(fā)明方法可大大減少由于從比特流中剝離比特位數(shù)而導(dǎo)致的大量運算,并可最終獲得同原來相同的解碼結(jié)果,大大提高運行效率。
圖1是本發(fā)明步驟2中快速從比特流中剝離出需要的位數(shù)進行哈夫曼解碼的流程圖。
具體實施例方式
以下根據(jù)圖1,具體說明本發(fā)明的一種較佳實施方式本發(fā)明提供一種快速提取比特流哈夫曼解碼方法,其包含以下步驟步驟1、重新構(gòu)造新的哈夫曼碼表的碼值表,索引表和碼長表;步驟2、基于步驟1中所構(gòu)造的哈夫曼碼表,快速地從比特流中剝離出需要的位數(shù)來實現(xiàn)哈夫曼解碼。
所述的步驟1具體包含以下步驟步驟1.1、根據(jù)哈夫曼碼表中原來的碼長表Table_len1中的各個碼長值的大小,按照順序重新進行排序,將排序后獲得的新碼長表存儲在表Table_len2中;步驟1.2、將從原來碼長表映射到新碼長表的映射關(guān)系存儲到映射表Table_Index中;步驟1.3、按照表Table_Index中的映射關(guān)系,將哈夫曼碼表中原來的碼值表Table_val1對應(yīng)映射到新的碼值表Table_val中;步驟1.4、在碼長表Table_len2的基礎(chǔ)上,生成新的碼長表Table_len。
所述的步驟1.1中,根據(jù)哈夫曼碼表中原來的碼長表Table_len1中的各個碼長值的大小,按照從小到大的順序重新進行排序,得到Table_len2。
所述的步驟1.1中,根據(jù)哈夫曼碼表中原來的碼長表Table_len1中的各個碼長值的大小,按照從大到小的順序重新進行排序,得到Table_len2。
所述的步驟1.4具體包含以下步驟步驟1.4.1、用碼長表Table_len2中的最后一個碼長值減去排列在其前一個(即最后第二個)的碼長值,并將相減所得的結(jié)果覆蓋存儲在最后一個碼長值所在的存儲空間;步驟1.4.2、用碼長表Table_len2中的最后第二個碼長值減去排列在其前一個(即最后第三個)的碼長值,并將相減所得的結(jié)果覆蓋存儲在最后第二個碼長值所在的存儲空間;如此類推;步驟1.4.3、用碼長表Table_len2中的第二個碼長值減去排列在其前一個(即第一個)的碼長值,并將相減所得的結(jié)果覆蓋存儲在第二個碼長值所在的存儲空間;步驟1.4.4、由于碼長表Table_len2中的第一個碼長值前面沒有數(shù)據(jù),故碼長表中的第1個碼長值保持不變,由此生成新的碼長表Table_len。
上述步驟1中重新生成的碼值表Table_val,碼長表Table_len和映射表Table_Index組成步驟1中所述的新的哈夫曼碼表。
如圖1所示,所述的步驟2具體包含以下步驟步驟2.1、設(shè)置記憶變量m,val和bitCnt的初始值均為0;其中,bitCnt用來存儲從比特流中提取的比特位數(shù);m用來記錄在碼長表中上一次搜索到的位置,val用來記錄從比特流中提取bitCnt個比特位對應(yīng)的值;步驟2.2、將記憶變量m賦值給循環(huán)變量j,即j=m;
步驟2.3、從比特流中依次讀取相應(yīng)位比特數(shù)據(jù)步驟2.3.1、根據(jù)碼長表中Table_len[j]的值,將變量val的值向左移Table_len[j]位后賦值給val,即val=val<<Table_len[j];步驟2.3.2、利用函數(shù)unpack()依次從左至右從比特流中讀取出Table_len[j]位比特位,將讀取獲得的比特數(shù)據(jù)unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j]);其中,unpack(Table_len[j])函數(shù)表示從比特流中讀取出Table_len[j]個比特位的數(shù)據(jù);步驟2.3.3、利用變量bitCnt來記錄從比特流中共提取出的比特位數(shù),即bitCnt=bitCnt+Table_len[j];步驟2.4、判斷val的值是否等于Table_val[j]的值,若相等,執(zhí)行步驟2.5;若不相等,執(zhí)行步驟2.6;步驟2.5、將循環(huán)變量j對應(yīng)的映射索引Table_Index[j]作為解碼信息返回,同時返回解碼信息編碼的位數(shù)bitCnt的值,結(jié)束解碼過程;步驟2.6、將當(dāng)前(j+1)的值賦值給循環(huán)變量i,即i=j(luò)+1;并判斷i值是否小于哈夫曼碼表中碼的個數(shù)值Size,若i<Size,則執(zhí)行步驟2.6.1,判斷當(dāng)前Table_Index[i]和bitCnt是否為解碼獲得的信息;若i>=Size,說明Size設(shè)置錯誤,退出解碼過程,校對Size值;所述的判斷當(dāng)前Table_Index[i]和bitCnt是否為解碼獲得的信息的步驟具體包含以下步驟2.6.1、判斷碼長表Table_len[i]的值是否等于0,若Table_len[i]=0,執(zhí)行步驟2.6.3;如果碼長表Table_len[i]≠0,執(zhí)行步驟2.6.2;步驟2.6.2、將循環(huán)變量i賦值給記憶變量m,即m=i,并判斷當(dāng)前i值是否小于哈夫曼碼表中碼的個數(shù)值Size,若j<Size,則返回循環(huán)執(zhí)行步驟2.2,若j>=Size,則表示傳輸比特流出錯,退出解碼過程;步驟2.6.3、判斷val的值是否等于碼值表Table_val[i]的值;如果相等,執(zhí)行步驟2.6.4;如果不相等,則對循環(huán)變量i的值加1,即i=i+1,并返回執(zhí)行步驟2.6.1,繼續(xù)判斷哈夫曼映射表中下一個Table_Index[i]和bitCnt是否為解碼獲得的信息;步驟2.6.4、將循環(huán)變量i對應(yīng)的映射索引Table_Index[i]作為解碼信息返回,同時返回解碼信息編碼的位數(shù)bitCnt的值,結(jié)束解碼過程。
以下通過一具體實施例,詳細說明本發(fā)明方法的實施過程設(shè)原來的哈夫曼碼表如下所示Table_val1[16]={1,0,7,26,1,110,24,222,2,446,108,894,25,1790,109,1791},其為原來的哈夫曼碼值表;Table_len1[16]={1,3,4,6,3,8,6,9,3,10,8,11,6,12,8,12};其為原來的哈夫曼碼長表;其中,哈夫曼碼表中碼的個數(shù)值Size=16。
采用步驟1介紹的方法來重新構(gòu)成新的哈夫曼碼表,即為根據(jù)步驟1.1,按照從小到大的順序,得到Table_len2[16]=[1,3,3,3,4,6,6,6,8,8,8,9,10,11,12,12];根據(jù)步驟1.2,得到Table_Index[16]=[1,2,5,9,3,4,7,13,6,11,15,8,10,12,14,16];該表中的各個位置的映射碼值分別表示Table_len1表中各個對應(yīng)位置的碼長值在Table_len2表中所處的位置排序號,例如,Table_Index表中的第3個映射碼值為5,該碼值5表示,在Table_len1表中的第3個碼長值4,現(xiàn)在在Table_len2表中處于第5個位置;根據(jù)步驟1.3,得到Table_val[16]=[1,0,1,2,7,26,24,25,110,108,109,222,446,894,1790,1791];根據(jù)步驟1.4,得到Table_len[16]=[1,2,0,0,1,2,0,0,2,0,0,1,1,1,1,0];上述重新生成的碼值表Table_val,碼長表Table_len和映射表Table_Index組成新構(gòu)成的哈夫曼碼表。
接著需要得到二進制數(shù)“001”解碼出的信息,采用本發(fā)明的方法,要解碼出“001”對應(yīng)的信息,根據(jù)步驟2所述的方法,具體過程為步驟2.1、設(shè)置m=0,val=0,bitCnt=0;步驟2.2、令j=m=0;步驟2.3、從比特流中依次讀取出相應(yīng)位比特位信息步驟2.3.1、由于j=0,則Table_len[j]=Table_len
=1,則val=val<<Table_len[j]=0<<1=0;
步驟2.3.2、利用函數(shù)unpack()依次從左至右從比特流中依次解碼出Table_len[j]位比特位,將解碼出的值unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j])=0+unpack(1)=0+0=0;其中,unpack(1)函數(shù)表示從“001”比特流中解碼出第1個比特位的值,即unpack(1)=0;(第一次比特流提取)步驟2.3.3、利用變量bitCnt來記錄從比特流中共提取出的比特位數(shù),即bitCnt=bitCnt+Table_len[j]=0+1=1;步驟2.4、由于val=0,Table_val[j]=Table_val
=1,判斷得到val的值不等于Table_val[j]的值(第一次進行邏輯判斷),繼續(xù)執(zhí)行步驟2.6;步驟2.6、i=j(luò)+1=1;并判斷得到i<Size(第二次進行邏輯判斷),執(zhí)行步驟2.6.1;步驟2.6.1、由于Table_len[i]=Table_len[1]=2,判斷得到Table_len[i]的值不等于0(第三次進行邏輯判斷),執(zhí)行步驟2.6.2;步驟2.6.2、m=i=1;由于Size=16,j=0,判斷得到j(luò)<Size(第四次進行邏輯判斷),返回循環(huán)執(zhí)行步驟2.2;步驟2.2、令j=m=1;步驟2.3、從比特流中依次讀取出相應(yīng)位比特位信息步驟2.3.1、由于j=1,則Table_len[j]=Table_len[1]=2,則val=val<<Table_len[j]=0<<2=0;步驟2.3.2、利用函數(shù)unpack()依次從左至右從比特流中依次解碼出Table_len[j]位比特位,將解碼出的值unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j])=0+unpack(2)=0+1=1;其中,unpack(2)函數(shù)表示從“001”比特流中解碼出第2和第3這2個比特位的值,即unpack(2)=01=1;(第二次比特流提取)步驟2.3.3、利用變量bitCnt來記錄從比特流中共提取出的比特位數(shù),即bitCnt=bitCnt+Table_len[j]=1+2=3;步驟2.4、由于val=1,Table_val[j]=Table_val[1]=0,判斷得到val的值不等于Table_val[j]的值(第五次進行邏輯判斷),繼續(xù)執(zhí)行步驟2.6;步驟2.6、i=j(luò)+1=2;并判斷得到i<Size(第六次進行邏輯判斷),執(zhí)行步驟2.6.1;
步驟2.6.1、由于Table_len[i]=Table_len[2]=0,判斷得到Table_len[i]的值等于0(第七次進行邏輯判斷),執(zhí)行步驟2.6.3;步驟2.6.3、由于val=1,Table_val[i]=Table_val[2]=1,判斷得到val的值等于Table_val[i]的值(第八次進行邏輯判斷),執(zhí)行步驟2.6.4;步驟2.6.4、返回解碼信息Table_Index[i]=Table_Index[2]=5,并返回解碼信息編碼的位數(shù)bitCnt的值為3,結(jié)束解碼過程。
由上述實施例可以得到,采用本發(fā)明的方法解碼出“001”對應(yīng)的信息,一共只需要進行8次邏輯判斷和兩次比特流提取。
而如果采用背景技術(shù)中所述二進制查表法,查找“001”解碼出的信息,利用表Table和Len來得到“001”解碼出的信息,共需要進行邏輯判斷的次數(shù)為80,并需要三次比特流提取。
通過比較可以看出,采用本發(fā)明中所提出的算法來進行解碼,相對于采用二進制查表法,只需要少于原來運算量的10%就可以獲得同原來算法同樣的解碼效果,大大的減少了運算量。
權(quán)利要求
1.一種快速提取比特流哈夫曼解碼方法,其特征在于,包含以下步驟步驟1、重新構(gòu)造新的哈夫曼碼表的碼值表,索引表和碼長表;步驟2、基于步驟1中所構(gòu)造的新哈夫曼碼表,快速從比特流中剝離出需要的位數(shù)來實現(xiàn)快速哈夫曼解碼。
2.如權(quán)利要求1所述的快速提取比特流哈夫曼解碼方法,其特征在于,所述的步驟1具體包含以下步驟步驟1.1、根據(jù)哈夫曼碼表中原來的碼長表Table_len1中的各個碼長值的大小,按照順序重新進行排序,將排序后獲得的新碼長表存儲在表Table_len2中;步驟1.2、將從原來碼長表映射到新碼長表的映射關(guān)系存儲到映射表Table_Index中;步驟1.3、按照表Table_Index中的映射關(guān)系,將哈夫曼碼表中原來的碼值表Table_val1對應(yīng)映射到新的碼值表Table_val中;步驟1.4、在碼長表Table_len2的基礎(chǔ)上,生成新的碼長表Table_len;所述的碼值表Table_val,碼長表Table_len和映射表Table_Index組成重新構(gòu)造后的新的哈夫曼碼表。
3.如權(quán)利要求2所述的快速提取比特流哈夫曼解碼方法,其特征在于,所述的步驟1.1中,根據(jù)哈夫曼碼表中原來的碼長表Table_len1中的各個碼長值的大小,按照從小到大的順序重新進行排序,得到Table_len2。
4.如權(quán)利要求2所述的快速提取比特流哈夫曼解碼方法,其特征在于,所述的步驟1.1中,根據(jù)哈夫曼碼表中原來的碼長表Table_len1中的各個碼長值的大小,按照從大到小的順序重新進行排序,得到Table_len2。
5.如權(quán)利要求2所述的快速提取比特流哈夫曼解碼方法,其特征在于,所述的步驟1.4具體包含以下步驟步驟1.4.1、用碼長表Table_len2中的最后一個碼長值減去排列在其前一個,即最后第二個的碼長值,并將相減所得的結(jié)果覆蓋存儲在最后一個碼長值所在的存儲空間;步驟1.4.2、用碼長表Table_len2中的最后第二個碼長值減去排列在其前一個,即最后第三個的碼長值,并將相減所得的結(jié)果覆蓋存儲在最后第二個碼長值所在的存儲空間;如此類推;步驟1.4.3、用碼長表Table_len2中的第二個碼長值減去排列在其前一個,即第一個的碼長值,并將相減所得的結(jié)果覆蓋存儲在第二個碼長值所在的存儲空間;步驟1.4.4、由于碼長表Table_len2中的第一個碼長值前面沒有數(shù)據(jù),故碼長表中的第1個碼長值保持不變,由此生成新的碼長表Table_len。
6.如權(quán)利要求1所述的快速提取比特流哈夫曼解碼方法,其特征在于,所述的步驟2具體包含以下步驟步驟2.1、設(shè)置記憶變量m,val和bitCnt的初始值均為0;其中,bitCnt用來存儲從比特流中提取的比特位數(shù);m用來記錄在碼表中上一次搜索到的位置,val用來記錄從比特流中提取bitCnt個比特位對應(yīng)的值;步驟2.2、獲取前一次在碼長表中搜索到的位置將記憶變量m賦值給j,即j=m;步驟2.3、從比特流中依次讀取相應(yīng)位比特數(shù)據(jù)步驟2.4、判斷val的值是否等于Table_val[j]的值,若相等,執(zhí)行步驟2.5;若不相等,執(zhí)行步驟2.6;步驟2.5、將循環(huán)變量j對應(yīng)的映射索引Table_Index[j]作為解碼信息返回,同時返回解碼信息編碼的位數(shù)bitCnt的值,結(jié)束解碼過程;步驟2.6、依次循環(huán)判斷當(dāng)前Table_Index[j+1]和bitCnt是否為解碼獲得的信息。
7.如權(quán)利要求6所述的快速提取比特流哈夫曼解碼方法,其特征在于,所述的步驟2.3具體包含以下步驟步驟2.3.1、根據(jù)碼長表中Table_len[j]的值,將變量val的值向左移Table_len[j]位后賦值給val,即val=val<<Table_len[j];其中,j=0,1,……,Size-1,Size表示哈夫曼碼表中碼的個數(shù)值;步驟2.3.2、利用函數(shù)unpack()依次從左至右從比特流中解碼出Table_len[j]位比特位,將解碼出的值unpack(Table_len[j])累加到val上,即val=val+unpack(Table_len[j]);其中,unpack(Table_len[j])函數(shù)表示從比特流中解碼出Table_len[j]個比特位的值;步驟2.3.3、利用變量bitCnt來記錄從比特流中共提取出的比特位數(shù),即bitCnt=bitCnt+Table_len[j]。
8.如權(quán)利要求6所述的快速提取比特流哈夫曼解碼方法,其特征在于,所述的步驟2.6具體包含以下步驟步驟2.6.1、判斷碼長表Table_len[j+1]的值是否等于0,若Table_len[j+1]=0,執(zhí)行步驟2.6.3;若碼長表Table_len[j+1]≠0,執(zhí)行步驟2.6.2;其中,j+1=1,……,Size-1,Size表示哈夫曼碼表中碼的個數(shù)值;步驟2.6.2、記錄在碼長表中當(dāng)前搜索到的位置將當(dāng)前j+1的值賦值給記憶變量m,即m=j(luò)+1,然后循環(huán)返回執(zhí)行步驟2.2;步驟2.6.3、判斷val的值是否等于碼值表Table_val[j+1]的值;如果相等,執(zhí)行步驟2.6.4;如果不相等,則循環(huán)返回執(zhí)行步驟2.6.1,判斷哈夫曼映射表中下一個Table_Index[j+1]和bitCnt是否為解碼獲得的信息;步驟2.6.4、將當(dāng)前j+1值對應(yīng)的映射索引Table_Index[j+1]作為解碼信息返回,同時返回解碼信息編碼的位數(shù)bitCnt的值,結(jié)束解碼過程。
全文摘要
本發(fā)明涉及一種快速提取比特流哈夫曼解碼方法,其包含步驟1.重新構(gòu)造新的哈夫曼碼表,將碼表構(gòu)造成基于碼長呈規(guī)律性分布;步驟2.基于該重新構(gòu)造的哈夫曼碼表,快速地從比特流中剝離出需要的位數(shù),從而實現(xiàn)對比特流解碼。本發(fā)明提供的快速提取比特流哈夫曼解碼方法,可大大減少由于從比特流中剝離比特位數(shù)而導(dǎo)致的大量運算,并可最終獲得同原來相同的解碼結(jié)果,大大提高運行效率。
文檔編號H03M7/40GK101051845SQ20071004044
公開日2007年10月10日 申請日期2007年5月9日 優(yōu)先權(quán)日2007年5月9日
發(fā)明者譚建國 申請人:上海廣電(集團)有限公司中央研究院