專利名稱:通過查表實(shí)現(xiàn)的算術(shù)編解碼方法
技術(shù)領(lǐng)域:
本發(fā)明屬于數(shù)據(jù)壓縮技術(shù)領(lǐng)域,具體涉及一種通過查表實(shí)現(xiàn)的算術(shù)編解碼方法。
背景技術(shù):
算術(shù)編碼是一種無失真的編碼方法,能有效地壓縮信源冗余度,屬于熵編碼的一種,適用于非等概率的數(shù)據(jù)的壓縮。算術(shù)編碼的基本原理是根據(jù)編碼數(shù)據(jù)中不同符號的概率,把線段劃分為互不重疊的子線段,子線段的寬度恰好是各符號的概率。編碼一個(gè)符號就是找到對應(yīng)的子線段,然后再對該線段劃分得到下一級的子線段,對下一個(gè)符號編碼。在最后的子線段中的任意實(shí)數(shù)都可以用來表示對應(yīng)的符號序列,這個(gè)數(shù)就是該符號序列所對應(yīng)的碼字。顯然,一串符號序列發(fā)生的概率越大,對應(yīng)的子線段就越寬,要表達(dá)它所用的比特?cái)?shù)就減少,因而相應(yīng)的碼字就越短。算術(shù)解碼的過程是算術(shù)編碼的逆過程,通過碼字得到線段中的某一個(gè)點(diǎn),稱為Value,判斷該點(diǎn)位于哪一個(gè)子線段中,從而得到與該子線段相應(yīng)的符號。
但是在具體實(shí)現(xiàn)中往往無法做到線段無限細(xì)劃的精度。在有限精度的條件下,就需要在編碼一些符號后,對線段進(jìn)行放大和平移,保證下一次線段劃分精度。而線段放大和平移的信息就是輸出碼字。其中需要對線段不同的情況做出不同的操作,所以如何減少運(yùn)算次數(shù)和判斷跳轉(zhuǎn)次數(shù)成了本領(lǐng)域研究的一個(gè)熱點(diǎn)。
發(fā)明內(nèi)容
本發(fā)明的目的是提出一種通過查表實(shí)現(xiàn)的算術(shù)編解碼方法。在編碼過程中可以快速的判斷當(dāng)前線段的情況,并且更新線段得到輸出碼字,大大減少運(yùn)算量,同時(shí)減少判斷和跳轉(zhuǎn)操作次數(shù);在解碼中,可以用該方法快速的更新子線段更新Value的值。
本發(fā)明提出的通過查表實(shí)現(xiàn)算術(shù)編解碼方法,是根據(jù)算術(shù)編解碼中線段的信息查表,得到線斷更新和其他操作的信息,從而高效的實(shí)現(xiàn)算術(shù)編解碼。具體來說,是根據(jù)更新前線段兩端的位置信息,在預(yù)存的“數(shù)據(jù)表”中得到相應(yīng)的數(shù)據(jù)。然后,在編碼端根據(jù)從“數(shù)據(jù)表”中查得的數(shù)據(jù),其中包括線段放大倍數(shù)和平移大小,輸出碼流的信息。在解碼端根據(jù)從“數(shù)據(jù)表”中查得的數(shù)據(jù),其中包括線段放大倍數(shù)和平移大小,更新Value的信息。本發(fā)明可以定義不同長度的“數(shù)據(jù)表”,“數(shù)據(jù)表”越長,算術(shù)編解碼越高效。具體表現(xiàn)在運(yùn)算數(shù)度加快,判斷跳轉(zhuǎn)次數(shù)減少。
本發(fā)明提出的通過查表實(shí)現(xiàn)的算術(shù)編解碼方法,編碼的具體步驟如下
(1)首先對一個(gè)符號編碼,得到新的線段;(2)然后根據(jù)新的線段兩端的位置,得到表格中Index;(3)讀取表中的相應(yīng)數(shù)據(jù),該數(shù)據(jù)中包含更新線段和輸出碼字的信息;(4)最后更新線段和輸出碼字;(5)判斷新的線段是否可以對下一個(gè)符號編碼,如為真,從步驟(1)開始,對下一個(gè)符號編碼,否則從步驟(2)開始,繼續(xù)查表,更新線段并且輸出碼字。
本發(fā)明提出的通過查表實(shí)現(xiàn)的算術(shù)編解碼方法,解碼的具體步驟如下(1)根據(jù)碼字得到線段中一點(diǎn)的位置,稱為Value,該點(diǎn)位于某個(gè)子線段,解碼的符號為該子線段對應(yīng)的符號;(2)然后根據(jù)子線段兩端的位置,得到表格中Index;(3)讀取表中的相應(yīng)數(shù)據(jù),該數(shù)據(jù)中包含更新線段的信息;(4)最后更新線段,并且同時(shí)更新Value;(5)判斷新的線段是否可以對下一個(gè)符號解碼,如為真,從步驟(1)開始,對下一個(gè)符號解碼,否則從步驟(2)開始,繼續(xù)查表,更新線段和Value。
與通常的算術(shù)編解碼的過程相比,主要的改進(jìn)在于引入了“數(shù)據(jù)表”,通過查表得到線段更新和輸出碼字的信息。該“數(shù)據(jù)表”可以設(shè)置成不同的大小,“數(shù)據(jù)表”越長,占用的空間越大,但是編解碼的效率也越高。
下面舉例為8*8的“數(shù)據(jù)表”。約定線段初始化為“1”,線段的兩端一次定義為Low和High,并且滿足Low≤High。當(dāng)對一個(gè)符號編碼后,新的線段是原線段的子線段,此時(shí)得到新的Low和High。將單位長度“l(fā)”的線段等分為8段,根據(jù)Low和High所處的位置會有64種項(xiàng),其中因?yàn)橐獫M足Low≤High的條件所以一共有36種可能,如表一。
用于編碼端的“數(shù)據(jù)表”中每一項(xiàng)都對應(yīng)于Low和High的位置,其中包括了所有輸出碼字的信息、Low和High放大倍數(shù)和偏移量以及線段更新結(jié)束的標(biāo)志。輸出碼字的信息包括直接放入輸出碼字的比特和所謂Bit_to_follow個(gè)數(shù),Bit_to_follow個(gè)數(shù)是指當(dāng)前不輸出,直到得到下一個(gè)輸出比特后才能確定的輸出比特個(gè)數(shù)。例如,當(dāng)前累加的Bit_to_follow個(gè)數(shù)為3,下一次查表,要求輸出的比特為“010”,那么,由于第一個(gè)確定比特為“0”,所以在這個(gè)“0”后面要加上3個(gè)“1”得到的輸出比特為“011110”;反之,如果當(dāng)前累加的Bit_to_follow個(gè)數(shù)為3,下一次查表,要求輸出的比特為“110”,那么,由于第一個(gè)確定比特為“1”,所以在這個(gè)“1”后面要加上3個(gè)“0”得到的輸出比特為“100010”。Low和High的放大倍數(shù)是指Low和High左移的比特?cái)?shù),左移后High的低位“0”要變?yōu)椤?”。由于左移后Low和High的范圍往往會超出原來的范圍,所以還要減去相應(yīng)的偏移量,使得Low和High回到原來的范圍內(nèi)。另外,如果Low和High的差值,也就是線段的長度足夠大的話,就不需要更新線段;如果Low和High經(jīng)過一次查表和更新過程,它們的差值仍然太小,就需要再進(jìn)行下一次查表操作,這需要一個(gè)標(biāo)志來標(biāo)示。
用于解碼端的“數(shù)據(jù)表”只需要記錄更新Low、High和Value的信息,即Low、High和Value放大倍數(shù)和偏移量。Low左移后低位填“0”,High左移后低位填“1”,Value左移后低位填入待解碼碼字的比特,然后減去偏移量,所以可以保證Low≤Value≤High,并且處于有效范圍內(nèi)。,如果Low和High的差值,也就是線段的長度足夠大的話,就不需要更新線段;如果Low和High經(jīng)過一次查表和更新過程,它們的差值仍然太小,就需要再進(jìn)行下一次查表操作,這需要一個(gè)標(biāo)志來標(biāo)示。
要求Low和High的差值足夠大是為了保證設(shè)下一個(gè)符號的概率為p,那么(High-Low)next=[(High-Low)·P]-1≥0,要使上式在P=Pmin時(shí)也成立,就要求High-Low足夠大,即High-Low≥1pmin.]]> 表一本發(fā)明提出的通過查表實(shí)現(xiàn)算術(shù)編解碼方法,大大節(jié)省了算術(shù)編解碼的運(yùn)算量,主要表現(xiàn)在
(1)通過查表,編碼端可以在一次更新線段的時(shí)候得到多個(gè)輸出比特和Bit_to_follow信息,而不是一次更新線段只得到一個(gè)輸出比特或Bit_to_follow增加1。解碼端可以在一次更新線段的時(shí)候?qū)⒍鄠€(gè)輸入比特放入Value中。
(2)通過查表,可以直接得到線段的信息,而避免了大量的判斷和跳轉(zhuǎn)操作。
具體實(shí)施例方式
本發(fā)明的重點(diǎn)在于數(shù)據(jù)表的設(shè)計(jì)和查表、更新線段的操作,現(xiàn)分別進(jìn)一步具體介紹如下一、“數(shù)據(jù)表”的設(shè)計(jì)編碼端“數(shù)據(jù)表”的內(nèi)容有(1)單位“1”線段劃分段數(shù);(2)數(shù)據(jù)表的表長;(3)線段是否需要更新標(biāo)志(比特);(4)線段更新時(shí)有無輸出比特標(biāo)志(比特);(5)線段更新時(shí)輸出的第一個(gè)比特(比特);(6)線段更新后是否需要再次更新標(biāo)志(比特);(7)線段放大后的偏移量(比特);(8)線段更新時(shí)輸出的比特(比特);(9)線段更新時(shí)輸出比特?cái)?shù)(比特);(10)Bit to follow的比特?cái)?shù)(比特);(11)數(shù)據(jù)表中每一項(xiàng)合計(jì)的比特?cái)?shù)(比特)。
隨著對單位“1”線段劃分的增多,“數(shù)據(jù)表”長度增長,同時(shí)“數(shù)據(jù)表”中每一項(xiàng)需要的比特?cái)?shù)也增多。通常線段劃分的段數(shù)取為2n,取n為2-16。
表2為n取2、3、4時(shí)“數(shù)據(jù)表”形式。
表二解碼端“數(shù)據(jù)表”的內(nèi)容有(1)單位“1”線段劃分段數(shù);(2)數(shù)據(jù)表的表長;(3)線段是否需要更新標(biāo)志(比特);(4)線段更新后是否需要再次更新標(biāo)志(比特);(5)線段放大的左移位數(shù)(比特);(6)線段放大后的偏移量(比特);(7)數(shù)據(jù)表中每一項(xiàng)合計(jì)的比特?cái)?shù)(比特)。
同樣的隨著對單位“1”線段劃分的增多,“數(shù)據(jù)表”長度增長,同時(shí)“數(shù)據(jù)表”中每一項(xiàng)需要的比特?cái)?shù)也增多。表3為n取2、3、4時(shí)“數(shù)據(jù)表”形式。
表三二、查表和更新線段的操作查表就是根據(jù)當(dāng)前線段Low和High的位置得到相應(yīng)的Index,然后得到“數(shù)據(jù)表”的信息。如果Low和High都用16個(gè)比特標(biāo)示,單位“1”線段為0到65535,將線段分為8段,那么將Low和High的最高3比特組成Index,即Index=Low15Low14Low13High15High14High13。
然后在“數(shù)據(jù)表”中得到數(shù)據(jù)。
編碼的操作如下(1)如果“線段是否需要更新標(biāo)志”為“非”,那么操作完成;反之,進(jìn)行下一步操作;(2)如果“線段更新時(shí)有無輸出比特標(biāo)志”為“是”,那么進(jìn)行步驟(3)操作;反之進(jìn)行步驟(4)操作;(3)判斷編碼器之前累加的Bit_to_follow是否大于0。如果為“是”,則將“線段更新時(shí)輸出的第一個(gè)比特”放入輸出碼字中,然后將Bit_to_follow個(gè)取反的“線段更新時(shí)輸出的第一個(gè)比特”也放入輸出碼字中,再將剩余的“線段更新時(shí)輸出的比特”放入輸出碼字中;如果為“非”,則將“線段更新時(shí)輸出的比特”直接放入輸出碼字中;(4)如果“數(shù)據(jù)表”中得到的“Bit_to_follow的比特?cái)?shù)”不為0,則將其累加到編碼器的Bit_to_follow中;(5)“線段更新時(shí)輸出的比特?cái)?shù)”和“Bit_to_follow的比特?cái)?shù)”之和為Low和High左移的位數(shù),左移后將High的低位置為“1”,然后減去偏移量。偏移量是通過“線段放大后的偏移量”得到的,由于不同情況下偏移量的若干低位都是“0”,“線段放大后的偏移量”只記錄了偏移量的高位,所以要通過左移得到實(shí)際需要的偏移量;(6)如果“線段更新后是否需要再次更新標(biāo)志”為“是”,則根據(jù)新得到的Low和High重新查表,然后從步驟(1)開始繼續(xù)操作;反之,則完成當(dāng)前操作,可以對下一個(gè)符號進(jìn)行編碼了。
解碼的操作如下(1)如果“線段是否需要更新標(biāo)志”為“非”,那么操作完成;反之,進(jìn)行下一步操作;(2)Low、High和Value左移“線段放大的左移位數(shù)”,Low左移后低位填“0”,High左移后低位填“1”,Value左移后低位填入待解碼碼字的比特,然后減去偏移量;和編碼端一樣,偏移量是通過“線段放大后的偏移量”得到的;(3)如果“線段更新后是否需要再次更新標(biāo)志”為“是”,則根據(jù)新得到的Low和High重新查表,然后從步驟(1)開始繼續(xù)操作;反之,則完成當(dāng)前操作,可以對下一個(gè)符號進(jìn)行編碼了。
三、與改進(jìn)前算術(shù)編解碼效果的比較在標(biāo)準(zhǔn)視頻流Salesman、Claire、Miss American中各選擇一幀,分別進(jìn)行一下操作。先對其進(jìn)行梯度自適應(yīng)預(yù)測(GAP),得到非等概率分布的符號集合,符號包括0到255,所以用8比特表示。任意選取64511個(gè)預(yù)測結(jié)果符號,統(tǒng)計(jì)預(yù)測結(jié)果各符號的概率,根據(jù)概率可以將線段劃分為256個(gè)子線段,每個(gè)線段對應(yīng)一個(gè)符號。Low和High都用16個(gè)比特表示,初始值Low=0,High=65535。
以下比較改進(jìn)前和改進(jìn)后算術(shù)編碼的效率。
表四顯然,使用查表的方法,可以使得計(jì)算的次數(shù)大大降低,其中減少判斷和跳轉(zhuǎn)的次數(shù)還意味著減少流水線排空的次數(shù)。這些都將大大提高算術(shù)編解碼的效率。
權(quán)利要求
1.一種通過查表實(shí)現(xiàn)的算術(shù)編解碼方法,其特征在于編碼的具體步驟如下(1)首先對一個(gè)符號編碼,得到新的線段;(2)然后根據(jù)新的線段兩端的位置,得到表格中Index;(3)讀取表中的相應(yīng)數(shù)據(jù),該數(shù)據(jù)中包含更新線段和輸出碼字的信息;(4)最后更新線段和輸出碼字;(5)判斷新的線段是否可以對下一個(gè)符號編碼,如為真,從步驟(1)開始,對下一個(gè)符號編碼,否則從步驟(2)開始,繼續(xù)查表,更新線段并且輸出碼字。
2.根據(jù)權(quán)利要求1所述的算術(shù)編解碼方法,其特征在于解碼(1)根據(jù)碼字得到線段中一點(diǎn)的位置,稱為Value,該點(diǎn)位于某個(gè)子線段,解碼的符號為該子線段對應(yīng)的符號;(2)然后根據(jù)子線段兩端的位置,得到表格中Index;(3)讀取表中的相應(yīng)數(shù)據(jù),該數(shù)據(jù)中包含更新線段的信息;(4)最后更新線段,并且同時(shí)更新Value;(5)判斷新的線段是否可以對下一個(gè)符號解碼,如為真,從步驟(1)開始,對下一個(gè)符號解碼,否則從步驟(2)開始,繼續(xù)查表,更新線段和Value。
3.根據(jù)權(quán)利要求1所述的算術(shù)編解碼方法,其特征在于用于編碼端的“數(shù)據(jù)表”中每一項(xiàng)都對應(yīng)于Low和High的位置,其中包括了所有輸出碼字的信息、Low和High放大倍數(shù)和偏移量以及線段更新結(jié)束的標(biāo)志,輸出碼字的信息包括直接放入輸出碼字的比特和所謂Bit_to_follow個(gè)數(shù),Bit_to_follow個(gè)數(shù)是指當(dāng)前不輸出,直到得到下一個(gè)輸出比特后才能確定的輸出比特個(gè)數(shù)。
4.根據(jù)權(quán)利要求2所述的算術(shù)編解碼方法,其特征在于用于解碼端的“數(shù)據(jù)表”只需要記錄更新Low、High和Value的信息,即Low、High和Value放大倍數(shù)和偏移量。
5.根據(jù)權(quán)利要求3所述的算術(shù)編解碼方法,其特征在于編碼中更新線段的操作步驟如下(1)如果“線段是否需要更新標(biāo)志”為“非”,那么操作完成;反之,進(jìn)行下一步操作;(2)如果“線段更新時(shí)有無輸出比特標(biāo)志”為“是”,那么進(jìn)行步驟(3)操作;反之進(jìn)行步驟(4)操作;(3)判斷編碼器之前累加的Bit_to_follow是否大于0,如果為“是”,則將“線段更新時(shí)輸出的第一個(gè)比特”放入輸出碼字中,然后將Bit_to_follow個(gè)取反的“線段更新時(shí)輸出的第一個(gè)比特”也放入輸出碼字中,再將剩余的“線段更新時(shí)輸出的比特”放入輸出碼字中;如果為“非”,則將“線段更新時(shí)輸出的比特”直接放入輸出碼字中;(4)如果“數(shù)據(jù)表”中得到的“Bit_fo_follow的比特?cái)?shù)”不為0,則將其累加到編碼器的Bit_to_follow中;(5)“線段更新時(shí)輸出的比特?cái)?shù)”和“Bit_to_follow的比特?cái)?shù)”之和為Low和High左移的位數(shù),左移后將High的低位置為“1”,然后減去偏移量;(6)如果“線段更新后是否需要再次更新標(biāo)志”為“是”,則根據(jù)新得到的Low和High重新查表,然后從步驟(1)開始繼續(xù)操作;反之,則完成當(dāng)前操作,可以對下一個(gè)符號進(jìn)行編碼了。
6.根據(jù)權(quán)利要求4所述的算術(shù)編解碼方法,其特征在于在解碼中更新線段的操作步驟如下(1)如果“線段是否需要更新標(biāo)志”為“非”,那么操作完成;反之,進(jìn)行下一步操作;(2)Low、High和Value左移“線段放大的左移位數(shù)”,Low左移后低位填“0”,High左移后低位填“1”,Value左移后低位填入待解碼碼字的比特,然后減去偏移量;(3)如果“線段更新后是否需要再次更新標(biāo)志”為“是”,則根據(jù)新得到的Low和High重新查表,然后從步驟(1)開始繼續(xù)操作;反之,則完成當(dāng)前操作,可以對下一個(gè)符號進(jìn)行編碼了。
全文摘要
本發(fā)明為一種通過查表實(shí)現(xiàn)的算術(shù)編解碼方法。算術(shù)編解碼是對非等概率的數(shù)據(jù)進(jìn)行壓縮和解壓縮的有效方法。算術(shù)編解碼過程中都需要將線段不斷地細(xì)化,由于在有限精度的情況下,無法將線段無限細(xì)化,所以實(shí)現(xiàn)過程中需要將縮小的線段放大和平移,這稱為更新,在編碼端還要同時(shí)將更新信息作為輸出的編碼碼字,在解碼端還要更新Value。本方法通過判斷更新前線段兩端的位置得到“數(shù)據(jù)表”中的索引信息,快速高效得更新線段和完成其它操作,從而大大節(jié)省編解碼時(shí)需要的運(yùn)算量,尤其是避免了大量判斷和跳轉(zhuǎn)的次數(shù)。試驗(yàn)結(jié)果證明,該方法為了存放“數(shù)據(jù)表”增加了有限內(nèi)存空間,但是可以大大加快算術(shù)編解碼的速度,提高硬件實(shí)現(xiàn)的效率。
文檔編號H03M7/30GK1658513SQ20051002430
公開日2005年8月24日 申請日期2005年3月10日 優(yōu)先權(quán)日2005年3月10日
發(fā)明者華赟, 胡波 申請人:復(fù)旦大學(xué)