專利名稱:產(chǎn)生數(shù)據(jù)流的設(shè)備和方法和讀取數(shù)據(jù)流的設(shè)備和方法
技術(shù)領(lǐng)域:
本發(fā)明與用可變長度碼字進(jìn)行編碼的技術(shù)有關(guān),具體地說,本發(fā)明涉及產(chǎn)生和讀取對在傳輸中出現(xiàn)的差錯不敏感即魯棒(robust)的用可變長度碼字編碼的數(shù)據(jù)流。
背景技術(shù):
現(xiàn)代的例如遵從MPEG層3標(biāo)準(zhǔn)的音頻編碼或解碼方法可以將音頻信號的數(shù)據(jù)率壓縮到例如1/12(即壓縮因子為12),而不會使音頻信號的質(zhì)量有明顯的下降。為了實現(xiàn)這樣高的數(shù)據(jù)率的壓縮,通過對音頻信號采樣得到一個離散時間樣點序列。如在該技術(shù)領(lǐng)域所知的那樣,這個離散時間樣點序列經(jīng)窗處理后,得到一系列經(jīng)窗處理的時間樣點塊。一個在時間上加窗的樣點塊用濾波器組、變型離散余弦變換(MDCT)或其他適當(dāng)?shù)拇胧┳儞Q到頻域,得到一些頻譜值,這些頻譜值作為一個整體就是這個離散時間樣點塊確定的這段時間的音頻信號的頻域表示。通常,以50%的交疊產(chǎn)生時間塊,通過MDCT變換到頻域,由于MDCT的特性,例如1024個離散時間樣點總是產(chǎn)生1024個頻譜值。
眾所周知,人耳的感覺取決于音頻信號本身的瞬時頻譜。這個關(guān)系遵從所謂的心理聲學(xué)模型,用這個模型可以為一段時間計算出一些取決于瞬時頻譜的遮蔽門限。遮蔽意味著一個特定的音或頻譜分量在例如一個相鄰的頻譜范圍具有比較高的能量的情況下會受到掩蓋。為了盡可能盡可能精確地量化變換后得得出的頻譜值,可以利用遮蔽這個現(xiàn)實。目的是一方面避免再解碼得到的音頻信號內(nèi)有聽得到的干擾,另一方面也可以在這種情況下用盡可能少的比特來編碼或量化音頻信號。所希望的是,量化引入的干擾,即量化噪聲,低于遮蔽門限,從而成為聽不見的。按照已知的方法,將這些頻譜值分成一些所謂的比例因子頻帶(scale factor band),這些頻帶應(yīng)該相應(yīng)于人耳的臨界頻帶,即頻率組。在一個比例因子組內(nèi)的各個頻譜值乘以一個比例因子,執(zhí)行對一個比例因子頻帶的各個頻譜值整體定標(biāo)。然后對用比例因子定標(biāo)的這些比例因子頻帶進(jìn)行量化,產(chǎn)生量化的頻譜值。當(dāng)然,分成比例因子頻帶并不是關(guān)鍵性的。然而,它用于MPEG層3標(biāo)準(zhǔn)或MPEG 2 AAC(高級音頻編碼)標(biāo)準(zhǔn)。
數(shù)據(jù)壓縮的一個非常重要的方面是對量化后的頻譜值進(jìn)行熵編碼。熵編碼通常用霍夫曼(Huffman)編碼。霍夫曼編碼是一種可變長度編碼,也就是說,一個需編碼的值的碼字長度取決于這個值的出現(xiàn)概率。在邏輯上,霍夫曼編碼對最可幾的字符賦予最短的碼,即最短的碼字,從而可以實現(xiàn)很好的冗余度壓縮。一個普遍所知的用普通長度編碼的例子是莫爾斯(Morse)碼。
在音頻編碼領(lǐng)域,用霍夫曼碼對量化的頻譜值編碼。一種現(xiàn)代的例如按照MPEG 2 AAC標(biāo)準(zhǔn)工作的音頻編碼器用不同的霍夫曼碼表對這些量化的頻譜值編碼,這些霍夫曼碼表由一定的準(zhǔn)則分配給頻譜各段。在這個過程中,2個或4個頻譜值總是一起編碼成一個碼字。
遵從MPEG 2 AAC的方法與遵從MPEG層3的方法之間的一個差別是將不同的比例因子頻帶,即不同的頻譜值,組合成任何個數(shù)的頻譜段。采用AAC,一個頻譜段包括至少四個頻譜值,最好是四個以上的頻譜值。因此,這些頻譜值的整個頻率范圍分割成一些相鄰的段,一段表示一個頻帶,而所有的段一起覆蓋了整個頻率范圍,它是變換后的這些頻譜值的疊加。
在MPEG層3方法中,從多個所謂的“霍夫曼表”中將一個可以實現(xiàn)最大的冗余度壓縮的表分配給一個段。在AAC方法的比特流中,通常包括1024個頻譜值,現(xiàn)在就是這些頻譜值按頻率遞升次序排列的霍夫曼碼字。有關(guān)在各頻率段中所用的表的信息在輔助信息中傳送。這種情況如圖6所示。
圖6示出了包括10個霍夫曼碼字的比特流的示范性情況。在一個碼字總是由一個頻譜值形成的情況下,這可以是對10個頻譜值編碼得到的結(jié)果。然而,通??偸菍?個或4個頻譜值一起編碼成一個碼字,這樣圖6就示出了包括20個或40個頻譜值的編碼比特流的一部分。在各霍夫曼碼字包括2個頻譜值的情況下,標(biāo)號為1的碼字表示開頭兩個頻譜值,碼字1的長度比較短,意味著開頭兩個頻譜值(即兩個頻率最小的系數(shù))較為經(jīng)常地出現(xiàn)這。然而,標(biāo)號為2的碼字具有比較長的長度,這意味著在編碼音頻信號中的第三和第四個頻譜系數(shù)這樣的值較少出現(xiàn),因此用比較多的比特編碼。此外,從圖6可見,表示頻譜系數(shù)5和6、7和8、9和10的編號為3、4、5的碼字也較為經(jīng)常地出現(xiàn),因為這些碼字的長度也比較短。對于編號為6至10的這些碼字同樣也可以作這樣的分析。
如已經(jīng)提到的那樣,從圖6可以清楚地看到,在考慮比特流由已知的編碼設(shè)備產(chǎn)生的情況下,這些編碼頻譜值的霍夫曼碼字在這個比特流中按頻率線性遞增方式排列。
霍夫曼碼的一個主要缺點是在信道不理想的情況下會出現(xiàn)差錯傳播。例如,假設(shè)圖6中的碼字2受到了干擾。這很可能也改變了這個錯誤的碼字2的長度,因此使它與正確的長度不同。在圖6這個例子中,在碼字2由于受到干擾而長度改變的情況下,一個解碼器就不再能確定碼字3至10(幾乎表示整個音頻信號)的開始點。這意味著在受到干擾的碼字之后的所有其他碼字不再能正確地編碼,因為不知道這些碼字的開始點,而由于這個差錯選擇了不正確的開始點。
作為差錯傳播問題的一種解決方案,歐洲專利No.0 612 156建議將一部分可變長度的碼字排列在一個格柵(raster)內(nèi),而將其余的碼字分布在剩下的空隙內(nèi),因此不需要完全譯碼或者在傳輸有錯的情況下可以更為容易地發(fā)現(xiàn)排列在柵格點上的碼字的開始點。
確實,這種已知方法通過重排碼字對差錯傳播提供了某些改善措施。對于某些碼字,可以占用比特流中的一些固定位置,而剩余的空隙可用于剩下的碼字。這并不需要任何額外的比特,但是防止了在有差錯的情況下差錯在這些重排的碼字之間傳播。
在本申請?zhí)峤蝗掌诤蠊嫉牡聡鴮@暾?9 747 119.6-31建議不是就將任何碼字置在柵格點上,而是將從心理聲學(xué)看來是重要的碼字,即對音頻信號有明顯影響的那些頻譜值的碼字,置于柵格點上。諸如由這樣的編碼器產(chǎn)生的可變長度碼字?jǐn)?shù)據(jù)流示于圖5。如在圖6中那樣,該數(shù)據(jù)流也包括10個碼字,其中打上了陰影線的是優(yōu)先碼字。第一優(yōu)先碼字安排成在第一格柵點100處開始,第二優(yōu)先碼字安排成在第二格柵點101處開始,第三優(yōu)先碼字安排成在第三格柵點102處開始,第四優(yōu)先碼字安排成在第四格柵點103處開始,而第五優(yōu)先碼字安排成在第五格柵點104處開始。第一段105由柵格點100和101限定。類似,第二段106、第三段107、第四段108和最后段109也相應(yīng)這樣限定。由圖5可見,前兩段105和106的長度與下兩段107和108的不同,還與最后段109的不同。然后,將非優(yōu)先碼字6、7、8、9和10接在這些優(yōu)先碼字之后填滿數(shù)據(jù)流。如圖5所示,在這種后發(fā)表的方法中,非優(yōu)先碼字相繼插入已經(jīng)寫有優(yōu)先碼字的柵格。具體地說,非優(yōu)先碼字6插在優(yōu)先碼字1后。在這段105還剩下的空間內(nèi)充以接著的非優(yōu)先碼字7,而非優(yōu)先碼字7的剩余部分,即7b,寫入下一空閑空間,即寫入段107內(nèi),緊接優(yōu)先碼字3。對于非優(yōu)先碼字8至10,也是這樣處理。
圖5所示的這種后發(fā)表的方法的優(yōu)點是,優(yōu)先碼字1至5得到保護,不受差錯傳播影響,因為它們的開始點與柵格點一致,因此是已知的。
例如,在優(yōu)先碼字2在傳輸中受到損害的情況下,用圖6所示的現(xiàn)有技術(shù)很可能解碼器就不能對任何其余的碼字3至10正確解碼。然而,用圖5所示的方法,下一個碼字,即優(yōu)先碼字3,在柵格點102處開始,因此解碼器無論如何都能發(fā)現(xiàn)碼字3的開始點。因此,用圖5所示的方法,無論怎樣也不會出現(xiàn)序列性差錯(sequence error),而只有優(yōu)先碼字2會受到損害。因此,這種方法為處在柵格點的優(yōu)先碼字提供了有效保護。
然而,對于非優(yōu)先碼字來說,卻沒有得到有效保護。參照圖5,如果非優(yōu)先碼字6受到損害,使得解碼器得出一個短一個比特的錯誤碼字6,這將導(dǎo)致不再能對碼字7正確解碼,因為正確的碼字6的最后一個比特將被解釋為下一個碼字7的開始點。因此,碼字6的差錯將很可能由于序列性差錯導(dǎo)致不再能對后面的任何碼字正確解碼,即使這些碼字并沒有受到傳輸差錯的有害影響。
發(fā)明概述本發(fā)明的目的是使可變長度碼字具有更好的差錯魯棒(error-robust)。
這個目的由按照權(quán)利要求1提出的產(chǎn)生數(shù)據(jù)流的設(shè)備、按照權(quán)利要求12提出的讀取數(shù)據(jù)流的設(shè)備、按照權(quán)利要求18提出的產(chǎn)生數(shù)據(jù)流的方法和按照權(quán)利要求19提出的讀取數(shù)據(jù)流的方法來實現(xiàn)。
本發(fā)明基于認(rèn)識到在不只在一個寫方向而且還在另一個寫方向?qū)憯?shù)據(jù)流時數(shù)據(jù)流對傳輸差錯,具體地說是對可變長度碼字的序列性差錯的魯棒性(robustness)可以有決定性的增強。在大多數(shù)情況下,一個數(shù)據(jù)流總是有一個開始點和一個結(jié)束點。在現(xiàn)有技術(shù)中,在最簡單的情況下,數(shù)據(jù)流是從開始點開始一直寫到結(jié)束。這樣就有可能在第一個碼字內(nèi)的一個傳輸差錯會導(dǎo)致整個數(shù)據(jù)流不再能正確解碼,即使是所有其他碼字都是正確傳輸?shù)?。按照本發(fā)明,一個數(shù)據(jù)流可以寫成第一半從數(shù)據(jù)流的開始點開始寫,而第二半從數(shù)據(jù)流的結(jié)束點開始寫。即使從這個簡單的例子也可以看到,在數(shù)據(jù)流的第一半內(nèi)的傳輸差錯不再會影響到數(shù)據(jù)流的第二半使其也由于序列性差錯而不能正確解碼。這是因為解碼器知道數(shù)據(jù)流的后一半必須從數(shù)據(jù)流的結(jié)束點開始,確切地說沿相反的讀方向,繼續(xù)讀取。因此,只是由于使寫方向/讀方向反向而實際上不用額外的代價就可以獲得一定的差錯魯棒性。
如已經(jīng)提到的那樣,利用柵格點將可變長度碼字寫入數(shù)據(jù)流可以使解碼器解碼的序列性差錯受到限制,因為按規(guī)定,確定的碼字在柵格點開始。為了使差錯魯棒性最高,原則上希望使柵格盡可能窄,從而使解碼器可以發(fā)現(xiàn)盡可能多的碼字的正確開始點。但是,增多柵格點,即減小段長,如所知的那樣,將導(dǎo)致越來越少的具有可變長度的碼字可以完全裝入柵格內(nèi),從而需要采取一些措施將不能完全裝入柵格的那些碼字的末端部分寫入其他的柵格,以便在解碼時能正確檢測。這導(dǎo)致在增多柵格點、縮短段長時要增加額外的代價。
在現(xiàn)有技術(shù)中,碼字只沿單個寫方向從柵格點開始寫,如結(jié)合圖5和6所說明的那樣。按照本發(fā)明,碼字現(xiàn)在也沿相反的寫方向從柵格點開始寫,這使可以在柵格點開始寫的碼字?jǐn)?shù)加倍,在最佳情況下基本上不需任何額外的代價。通過用一個裝置沿一個第一寫方向從一個基準(zhǔn)點開始寫而用另一個裝置沿一個與第一寫方向相反的第二寫方向從另一個基準(zhǔn)點開始寫來寫數(shù)據(jù)流,就不僅能利用一個基準(zhǔn)點的“一側(cè)”而且能利用一個基準(zhǔn)點的兩側(cè)來增強差錯魯棒性,即防止傳播差錯或序列性差錯的能力。根據(jù)實現(xiàn)的方式,例如可以每隔一個碼字沿相同的方向?qū)?,而其余各碼字可以沿另一個方向?qū)憽A硪环矫?,可以將可變長度碼字例如按照它們的優(yōu)先權(quán)劃分成一些不同的碼字組,使得例如第一組的所有碼字都沿第一寫方向從柵格點開始寫,而第二組的所有碼字都可以沿第二寫方向從柵格點開始寫。
此外,碼字的剩余部分可以沿與碼字的開始部分相同的寫方向或者相反的寫方向?qū)?。顯然,必須采取一些措施使解碼器,即讀數(shù)據(jù)流的設(shè)備,可以始終完全知道在寫數(shù)據(jù)流時的寫方向。這可以明確設(shè)定,或者作為可變長度碼字?jǐn)?shù)據(jù)流的輔助信息傳輸。對于段長也可以這樣,段長可以是相等的,或者在整個數(shù)據(jù)流上是可改變的,當(dāng)前段長當(dāng)然也可以在解碼器內(nèi)明確設(shè)定,或者也可以作為輔助信息與可變長度碼字一起傳輸。
下面將結(jié)合附圖詳細(xì)說明本發(fā)明的優(yōu)選實施例。在這些附圖中圖1示出了本發(fā)明的一種寫一個差錯魯棒的數(shù)據(jù)流的設(shè)備;圖2示出了本發(fā)明的一種讀一個差錯魯棒的數(shù)據(jù)流的設(shè)備;圖3示出了本發(fā)明的方法在三個可變長度碼字組情況下的程序圖;圖4示出了例示本發(fā)明的方法讀按照圖3產(chǎn)生的數(shù)據(jù)流的程序圖;圖5示出了一種已知設(shè)備產(chǎn)生的優(yōu)先碼字遭受差錯傳播的數(shù)據(jù)流;圖6示出了一個執(zhí)行了按優(yōu)先碼字和非優(yōu)先碼字排列的數(shù)據(jù)流。
實施例詳述在詳細(xì)說明圖1前,應(yīng)指出的是,用可變長度碼字編碼在這個技術(shù)領(lǐng)域中也稱為熵編碼。熵編碼的一個典型例子是所謂的霍夫曼編碼。原則上,在霍夫曼編碼中,對需編碼的這些信息碼元進(jìn)行統(tǒng)計檢驗后,確定對于經(jīng)常出現(xiàn)的信息碼元用比不經(jīng)常出現(xiàn)的信息碼元短的碼字。在完全的霍夫曼碼中,所有的碼字都終止于一個碼樹的端或分支。例如,一個霍夫曼解碼器串行讀入一個霍夫曼碼字的數(shù)據(jù)流,每讀入一個比特就跳轉(zhuǎn)至這個規(guī)定的碼樹的一個分支,直到若干次(與碼字的比特數(shù)即碼字長度相應(yīng))跳轉(zhuǎn)后,到達(dá)一個沒有任何分支的分支端,就得出一個碼字。于是,解碼器知道下一個比特就是一個新碼字的開始。這個過程按需要一直重復(fù)到數(shù)據(jù)流完全讀入。每當(dāng)霍夫曼編碼器跳回開始點,即碼樹的根,在它的起始點就給出一個碼字。由于碼字的長度隱含地由碼字本身或者在編碼器和在解碼器內(nèi)已知的碼樹規(guī)定,因此可以看到,會導(dǎo)致數(shù)據(jù)流內(nèi)一個比特翻轉(zhuǎn)的干擾將誤導(dǎo)解碼器在碼樹中的跳轉(zhuǎn),從而最后得到一個不同的即錯誤的碼字,這個錯誤碼字很可能具有與正確碼字不同的長度。在這種情況下,解碼器得出錯誤碼字后,將跳轉(zhuǎn)回來,按后面的比特重新在碼樹內(nèi)從一個分支點移動到另一個分支點。然而,這個解碼器不可能避免序列性差錯,除非它偶然得出一個正確的“碼端”。
因此,為了保證差錯魯棒的傳輸,必須執(zhí)行防錯,如本發(fā)明所作的那樣。實際上,按照本發(fā)明設(shè)計的產(chǎn)生可變長度碼字?jǐn)?shù)據(jù)流的設(shè)備可以起著霍夫曼編碼器的發(fā)送或輸出級的作用,而讀取可變長度碼字?jǐn)?shù)據(jù)流的設(shè)備可以起著霍夫曼解碼器的接收或輸入級的作用。由此可見,本發(fā)明不僅適用于霍夫曼編碼器,而且也適用于任何容易出現(xiàn)序列性差錯的有可變長度碼字的碼。
圖1示出了按照本發(fā)明設(shè)計的設(shè)備10,在可變長度碼字加到輸入端14上輸入設(shè)備10時,它在輸出端12上產(chǎn)生一個差錯魯棒的數(shù)據(jù)流。這種設(shè)備包括一個沿一個第一寫方向從一個第一基準(zhǔn)點開始寫的第一裝置16和一個沿一個第二寫方向從一個第二基準(zhǔn)點開始寫的第二裝置16。根據(jù)設(shè)備10的復(fù)雜性,可變長度碼字可以如圖1所示加到裝置16和18上,由一個簡單的分支點20和一個相應(yīng)的合并點22寫。裝置16和18確定選擇哪些碼字沿哪個方向?qū)懞?或碼字的哪些部分沿哪個方向?qū)?。代替?jié)點20,也可以用一個多路分用器將一些特定的碼字(例如一個碼字組中的碼字)提供給第一裝置16而將另一些特定的碼字提供給第二裝置18。同樣,合并點22可以用一個多路復(fù)用器實現(xiàn),多路復(fù)用差錯魯棒的數(shù)據(jù)流12。也可以用其他受相應(yīng)控制為裝置16和18提供可變長度碼字的器件,這對于熟悉該技術(shù)的人員來說在看本說明時是很清楚的。
圖2示出了讀差錯魯棒的數(shù)據(jù)流的設(shè)備30,設(shè)備30是一個與圖1所示的產(chǎn)生數(shù)據(jù)流的設(shè)備10互補的設(shè)備。設(shè)備30包括一個輸入端32,差錯魯棒的數(shù)據(jù)流在通過例如一個無線電鏈路傳輸后加到這個輸入端32上,以便在開始點34上重新得出已加到圖1中的設(shè)備10的輸入端14上的可變長度碼字。讀數(shù)據(jù)流的設(shè)備30包括一個沿第一方向從第一基準(zhǔn)點開始讀的第一裝置36和一個沿第二方向從第二基準(zhǔn)點開始讀的第二裝置38。
顯然,設(shè)備30也有一個分支點40和一個合并點42,根據(jù)例如一個明確設(shè)定的算法或者可以與差錯魯棒的數(shù)據(jù)流一起從發(fā)送方(即圖1的設(shè)備10)發(fā)送給接收方(即圖2的設(shè)備30)的輔助信息將差錯魯棒的數(shù)據(jù)流饋入裝置36和38。
圖3以一個例子為例示出了本發(fā)明的寫可變長度碼字的方法。在這個例子中,有15個可變長度碼字30,這些碼字分成有6個碼字1至6的第一組、也有6個碼字7至12的第二組和有剩下的3個碼字13至15的第三組。如圖3所示,碼字30具有可變長度。
按照本發(fā)明的一個優(yōu)選實施例,段長(即段的長度)比第一組內(nèi)最長的碼字的長度還長一些。第一組的碼字排列在柵格點41至46上,其中,對于最后段No.6,一個柵格點用虛線表示,這個柵格點并不使用,然而,由于數(shù)據(jù)流的終端47實際上也可以認(rèn)為是一個柵格點,用虛線表示的這個柵格點因此是冗余的柵格點。第一段No.6因此比其他段都長,然而,這對于本發(fā)明來說是無關(guān)緊要的。一般說來,這些段可以具有任何長度,可以在數(shù)據(jù)流內(nèi)改變,當(dāng)然解碼器必須知道當(dāng)前段的長度,從而可以利用本發(fā)明的優(yōu)點。
首先,在步驟a)將第一組的碼字寫入數(shù)據(jù)流,產(chǎn)生一個由碎片組成的數(shù)據(jù)流31,第一組的碼字如圖3中符號化表示寫入方向的箭頭48所示從左至右寫入相應(yīng)各段。由于段長度選擇成比第一組內(nèi)最長的碼字還長,因此步驟a )只需要一次試寫。在這些段較短的情況下,可能因此需要多次試寫。
然后在步驟b)將第二組的碼字寫入數(shù)據(jù)流31。為了獲得高的差錯魯棒性(error robustness),第二組的碼字不是像第一組的碼字那樣從左至右而是從右到左分別從第二柵格點開始(例如對于第一段從柵格點42開始)寫,如相應(yīng)的寫方向箭頭所示。寫第二組的碼字按照預(yù)定指配規(guī)則進(jìn)行,在所選的這個例子中,第二組的第一個碼字寫入與第一組的第一個碼字相同的段,然而始終要在這段還有空間的情況下才行。由第一次試寫產(chǎn)生的數(shù)據(jù)流32表明在第一段內(nèi)只有可以寫入碼字7的開始部分那么多的空間。
與將碼字7的第二部分寫入第二段的現(xiàn)有技術(shù)相反,將碼字7的第二半(即7b)存儲起來,在第二次試寫中按照解碼器也必須知道的預(yù)定條例寫入數(shù)據(jù)流。圖3清楚地示出了在第二段內(nèi)碼字2與8之間還有足夠的空間可以讓碼字No.7的最后部分插入。在沒有足夠的空間的情況下,這個碼字的第三部分可以插入段3。因此,在圖3中,將碼字7插入數(shù)據(jù)流的預(yù)定條例是在每個情況下用一個段繼續(xù)進(jìn)行。當(dāng)然,也可以用兩個段或三個段或者更多段繼續(xù)進(jìn)行,使得在下一次試寫中第二部分7b可以寫入不是第二段而是第三段、第五段等。用來容納碼字7的第二部分的各段的次序可以任意。然而,這必須對解碼器是透明的,使得這個重排的數(shù)據(jù)流可以重讀取。
然后,將第三組的碼字13至15插入所得到的仍由碎片組成的數(shù)據(jù)流33。與步驟b)類似,最好用相同的指配規(guī)則進(jìn)行,使得第三組的第一個碼字分配給第一段、第三組的第二個碼字分配給第二段、第三組的第三個碼字分配給第三段等等。這個指配規(guī)則對于第三組完全是任意的,也可以與第二組的指配規(guī)則不同,按照本發(fā)明將一個組的各個碼字分配給不同的段。類似,各個組的寫的方向也可以任意選擇。最好采用交替的寫方向次序。然而,也可以將兩個相鄰的組用相同的寫方向?qū)懭?。原則上,在一個組內(nèi)寫方向也可以改變。
在步驟c)中,第一次試寫只是將碼字15的第一部分插入,產(chǎn)生一個由碎片組成的數(shù)據(jù)流34。碼字13、14和碼字15的第二部分15b存儲起來,在第二、第三、第四、第五和第六次試寫中插入,其中在第二次試寫中碼字15的第二部分15b可以插入第四段(產(chǎn)生數(shù)據(jù)流35),在第三次試寫中第四段不再能容納什么,于是在第四次試寫中將碼字14的開始部分插入(產(chǎn)生數(shù)據(jù)流36),碼字14的最后部分14b可以在第五次試寫中插入(產(chǎn)生數(shù)據(jù)流37),而最后在第六次也就是最后一次試寫中可以將第三組的第一個碼字插入第六段,從而產(chǎn)生在這里所示的例子的差錯魯棒數(shù)據(jù)流38。圖3所示的方法保證了這種差錯魯棒數(shù)據(jù)流的長度完全與這些可變長度碼字的長度相應(yīng),對于數(shù)據(jù)壓縮的熵解碼是自明的。然而,本發(fā)明并不局限于具有最小長度的差錯魯棒數(shù)據(jù)流,因為差錯魯棒性不受可能出現(xiàn)的填充比特的影響。
從圖3所示的魯棒數(shù)據(jù)流可見,碼字8的開始點即柵格點43完全與碼字7的結(jié)束點無關(guān)。而且,碼字9的開始點即柵格點44完全與碼字8的結(jié)束點無關(guān)。此外,應(yīng)指出的是,由于反向?qū)懭氲囊?guī)則,例如第一段內(nèi)碼字1的導(dǎo)致錯誤的碼字比正確的碼字1短一個比特的數(shù)據(jù)差錯不會破壞碼字7a的開始部分,因為后者是從右到左而不是從左至右寫入的。在從左至右寫入的情況下,解碼器會取最初正確的碼字1剩下的這個比特作為碼字7的開始比特,這將產(chǎn)生一個從1至7的序列性差錯。然而,這個序列性差錯不會傳播至8,因為碼字8完全地完全與碼字7無關(guān),選擇成從右到左寫入。在碼字8的寫入次序等于第一組的碼字的寫入次序的情況下,這個差錯也不會從7傳播到8,因為碼字8按指配規(guī)則在第二部分7b前寫入,與碼字2鄰接,因此不受錯誤部分7b的影響。
圖4通過一個適當(dāng)?shù)睦邮境鲎x取差錯魯棒數(shù)據(jù)流38的設(shè)備的操作。首先,在步驟a)從差錯魯棒數(shù)據(jù)流提取第一組的碼字。為此,本發(fā)明的可以與一個霍夫曼解碼器連接的設(shè)備從第一柵格點41開始讀取第一組的碼字1、從第二柵格點42開始讀取第一組的碼字2等等,直到讀取了第一組內(nèi)的所有碼字1至6。顯然,讀取數(shù)據(jù)流的設(shè)備選擇與產(chǎn)生數(shù)據(jù)流的設(shè)備所用的相同的方向。
接著,在步驟b)從剩下的數(shù)據(jù)流50提取第二組的碼字。于是,解碼器跳至第一段的第二柵格點42,得出第二組的碼字7的開始部分7a(第一段現(xiàn)在已讀空),但是它不是就讀第二部分7b,而是將第一部分7a先存儲起來,再從第二段的第二柵格點開始讀取第二組的第二個碼字,等等。結(jié)果得到一個剩余的數(shù)據(jù)流51,其中第一段已經(jīng)完全出空。由于解碼器并不馬上就連續(xù)讀取碼字7,而是始終根據(jù)產(chǎn)生數(shù)據(jù)流的設(shè)備所用的指配規(guī)則逐段讀取,因此保證了已經(jīng)說明的差錯魯棒性,大大減少了序列性差錯的傳播。
在第二次試提取第二組的碼字中,按照現(xiàn)有的寫入方向在第二段內(nèi)讀取碼字7的第二部分7b,得到只剩下第三組的碼字的數(shù)據(jù)流52,而第二段已出空。在步驟c)提取第三組的碼字,首先在第一次試讀中確定碼字15的開始部分,然而不將它存儲起來,因為發(fā)現(xiàn)在第三段內(nèi)碼字15沒有結(jié)束。于是,第三段出空。在第二次試讀中,可以發(fā)現(xiàn)碼字15讀完。然而,從數(shù)據(jù)流54可見,在段3內(nèi)搜索碼字14和在段4內(nèi)搜索碼字15都沒有成功。于是,在第四次試讀中,在第五段內(nèi)搜索到碼字14。然而,碼字14沒有結(jié)束,因此將開始部分14a存儲起來,在第五次試讀中檢驗剩余的數(shù)據(jù)流55,完全讀取,在最后的第六次試讀中,數(shù)據(jù)流56現(xiàn)在只有第六段和只有碼字13。
雖然在前面的例子中只是用將碼字分成一個開始部分和一個最后部分作為例子來說明,但是原則上可以用任何類型的劃分。只要解碼器知道第二組或第三組和其它組的碼字分別指配給不同的段的情況,就可以保證差錯魯棒解碼。而且,將碼字的最后部分安排入數(shù)據(jù)流顯然可以是任意的,只要解碼器或解碼器上游寫入電路確切知道編碼器執(zhí)行的預(yù)定條例。
為了再次強調(diào)本發(fā)明的優(yōu)點和/或工作情況,再對圖3中的差錯魯棒數(shù)據(jù)流38進(jìn)行一些說明。在考慮柵格點41和42之間的第一段時,可以看到碼字1從左至右從第一柵格點41開始寫入,如由圖下箭頭清楚示出的那樣。然而,碼字7的第一部分7a從右到左從第二柵格點42開始寫入。如果兩個碼字1和7或7a都只是從左至右寫入數(shù)據(jù)流,碼字7的開始點或碼字7的開始部分7a的開始點就取決于碼字1的結(jié)束點。因此,在碼字1內(nèi)的傳輸差錯幾乎不可避免地在碼字7內(nèi)引起序列性差錯。然而,如果按照本發(fā)明,將碼字7沿相反的寫方向從第二柵格點42開始寫入,碼字7的開始點或碼字7的開始部分7a的開始點就不再取決于碼字1,而由格柵或柵格點42確定。解碼器將始終知道這個開始點,這就是碼字1內(nèi)的差錯不會在碼字7內(nèi)引起差錯的原因。從圖3中的差錯魯棒數(shù)據(jù)流38可以看到,碼字7的第一部分7a和第二部分7b都在相同的寫方向?qū)懭?。然而,這并非強制性的。當(dāng)然,碼字7的第二部分7b也可以從左至右在第二碼字2的結(jié)束點開始寫入。
如果柵格點選擇成使這些段長度比第一組內(nèi)的最長碼字還長,例如從圖3的數(shù)據(jù)流31可以看到,就沒有一個段會被第一組的碼字完全填滿。在這種情況下,可以使在柵格點開始寫的碼字的數(shù)目實際上加倍,而不需要提供任何一個額外的柵格點。
權(quán)利要求
1.一種產(chǎn)生一個包括兩個基準(zhǔn)點(41-47)的可變長度碼字?jǐn)?shù)據(jù)流(38)的設(shè)備(10),所述設(shè)備包括一個將一個碼字的至少一部分沿一個第一寫方向從一個第一基準(zhǔn)點開始寫入所述數(shù)據(jù)流的第一裝置(16);一個將一個碼字的至少一部分在一個與所述第一寫方向相反的第二方向從另一個基準(zhǔn)點開始寫入所述數(shù)據(jù)流的第二裝置(18)。
2.如權(quán)利要求1所述的設(shè)備,其中所述數(shù)據(jù)流的兩個基準(zhǔn)點分別為所述數(shù)據(jù)流的開始點(41)和結(jié)束點(47)。
3.如權(quán)利要求1所述的設(shè)備,其中所述第一寫裝置(16)配置成寫一個碼字的一個開始部分,而所述第二寫裝置(18)配置成寫同一個碼字的剩余部分的至少一部分。
4.如權(quán)利要求1所述的設(shè)備,其中所述數(shù)據(jù)流包括許多作為基準(zhǔn)點的柵格點(41-46),這些柵格點規(guī)定了一個格柵,而兩個相鄰的柵格點限定了一個段,所述第一寫裝置(16)配置成在一個段的第一柵格點開始寫入一個第一碼字,而所述第二寫裝置(18)配置成在這個段的第二基準(zhǔn)點開始寫入一個第二碼字。
5.如權(quán)利要求1所述的設(shè)備,其中所述數(shù)據(jù)流包括許多作為基準(zhǔn)點的柵格點,這些柵格點規(guī)定了一個格柵,而兩個相鄰的柵格點限定了一個段,所述第一寫裝置(16)配置成在第一段的第一柵格點寫一個第一碼字的一個開始部分和在下一段的第一柵格點寫一個第二碼字的一個開始部分,而所述第二寫裝置(18)配置成分別從第二段的第二基準(zhǔn)點開始寫第一碼字的其余部分和從再下一段的第二基準(zhǔn)點開始寫第二碼字的其余部分。
6.如任何以上權(quán)利要求中所述的設(shè)備,其中所述這些碼字分成多個碼字組,所述第一寫裝置(16)配置成將第一組的每個碼字從一個段的第一基準(zhǔn)點開始寫入數(shù)據(jù)流,而第二寫裝置(18)配置成將第二組的每個碼字從一個相應(yīng)的段的第二基準(zhǔn)點開始寫入數(shù)據(jù)流。
7.如權(quán)利要求6所述的設(shè)備,其中所述第二寫裝置(18)配置成從所述第一寫裝置(16)已經(jīng)寫入的段的第二基準(zhǔn)點開始寫,如果第二組的相應(yīng)碼字比這段內(nèi)的未占用的空間還長,就將第二組的這個碼字的適合未占用的空間的這部分寫入這段,而將其余部分存儲起來。
8.如權(quán)利要求6或7所述的設(shè)備,其中所述第二寫裝置(18)配置成只在第一組的所有碼字都已經(jīng)寫入數(shù)據(jù)流后激活。
9.如權(quán)利要求8所述的設(shè)備,其中所述第二寫裝置(18)配置成將碼字的剩余部分在作為一個基準(zhǔn)點的第二組的一個碼字的結(jié)束點后寫入數(shù)據(jù)流。
10.如權(quán)利要求6至9中任何一項所述的設(shè)備,其中所述第二組的碼字按照一個預(yù)定的指配規(guī)則分配給各段,使得第二組的每個碼字分配給一個不同的段,而所述第二寫裝置(18)配置成如果第二組的一個碼字不能完全寫入所分配的段就在它用第二組的其他碼字處理了所有剩余的段后再將剩余部分寫入另一個沒有被完全占用的段。
11.如權(quán)利要求4至10中任何一項所述的設(shè)備,其中所述碼字分成至少三個組,所述第一寫裝置(16)配置成從各段的第一柵格點開始寫第一組的碼字,所述第二寫裝置(18)配置成從各段的另一個柵格點開始寫第二組的碼字,所述第一或第二寫裝置(16,18)還配置成分別從第一和第二組的碼字的結(jié)束點開始寫第三組。
12.一種讀取一個包括兩個基準(zhǔn)點的數(shù)據(jù)流(32)的設(shè)備(30),一個碼字的至少一部分沿一個第一或第二寫方向從這兩個基準(zhǔn)點開始寫入數(shù)據(jù)流,所述設(shè)備包括一個在一個與第一寫方向相應(yīng)的第一讀方向從第一基準(zhǔn)點開始進(jìn)行讀取的第一裝置(36);以及一個在一個與第一讀方向相反的第二讀方向從第二基準(zhǔn)點開始進(jìn)行讀取的第二裝置(38)。
13.如權(quán)利要求12所述的設(shè)備,其中所述數(shù)據(jù)流包括許多作為基準(zhǔn)點的柵格點,這些柵格點規(guī)定了一個格柵,兩個相鄰的柵格點限定了一個段,所述數(shù)據(jù)流包括多個碼字組,第一碼字組沿第一方向?qū)懭攵诙a字組沿第二方向?qū)懭?,第二組的碼字按照一個預(yù)定的指配規(guī)則分配給數(shù)據(jù)流的各段,使得一個組的每個碼字分配給一個不同的段,所述設(shè)備還包括一個控制裝置(40),用來將在柵格點開始的第一組的碼字提供給第一讀裝置(36)和將第二組的碼字提供給第二讀裝置(38),其中,按照預(yù)定的指配規(guī)則跳至相應(yīng)的柵格點,如果在一個基準(zhǔn)點發(fā)現(xiàn)沒有碼字,就按照指配規(guī)則驗證第二組的碼字是否出現(xiàn)在相應(yīng)的柵格點,在讀取了第二組的所有碼字后,按照預(yù)定規(guī)則跳至一個不同的柵格點,以便完全得出第二組的所有碼字。
14.如權(quán)利要求13所述的設(shè)備,其中一個讀裝置如果在一個段內(nèi)讀取的只是一個碼字的開始部分,就將這個開始部分存儲起來。
15.如任何以上權(quán)利要求所述的設(shè)備,其中所述碼字為霍夫曼碼字。
16.如任何以上權(quán)利要求所述的設(shè)備,其中所述碼字表示信息碼元,而所述第一組的碼字表示比第二組或其它組的碼字重要的信息碼元。
17.如權(quán)利要求16所述的設(shè)備,其中所述信息碼元為一個音頻信號的頻譜值,而所述第一組的碼字為從心理聲學(xué)觀點看來是重要的那些頻譜值,需要予以保護,以免受到數(shù)據(jù)流傳輸差錯引起的差錯傳播的影響。
18.一種產(chǎn)生一個包括兩個基準(zhǔn)點(41)至(47)的可變長度碼字?jǐn)?shù)據(jù)流(38)的方法(10),所述方法包括下列步驟將一個碼字的至少一部分沿一個第一寫方向從一個第一基準(zhǔn)點開始寫入數(shù)據(jù)流;將一個碼字的至少一部分沿一個與所述第一寫方向相反的第二寫方向從另一個基準(zhǔn)點開始寫入數(shù)據(jù)流。
19.一種讀取一個包括兩個基準(zhǔn)點的數(shù)據(jù)流(32)的方法(30),一個碼字的至少一部分分別沿一個第一和第二寫方向從這兩個基準(zhǔn)點開始寫入數(shù)據(jù)流,所述方法包括下列步驟沿一個與第一寫方向相應(yīng)的第一讀方向從所述第一基準(zhǔn)點開始進(jìn)行讀??;以及沿一個與第一讀方向相反的第二讀方向從第二基準(zhǔn)點開始進(jìn)行讀取。
全文摘要
熵編碼器包括一個產(chǎn)生包括兩個基準(zhǔn)點的可變長度碼字?jǐn)?shù)據(jù)流的設(shè)備(10),這個設(shè)備包括一個將一個碼字的至少一部分沿一個第一寫方向從一個第一基準(zhǔn)點開始寫入數(shù)據(jù)流的第一裝置(16)和一個將一個碼字的至少一部分沿一個與第一寫方向相反的第二寫方向從另一個基準(zhǔn)點開始寫入數(shù)據(jù)流的第二裝置(18)。具體地說,在用一個具有多個段的格柵將可變長度碼字寫入數(shù)據(jù)流時,在最佳情況下,可以在柵格點開始寫入的碼字的數(shù)目可以加倍,從而使可變長度碼字?jǐn)?shù)據(jù)流對于序列性差錯的傳播是魯棒的。
文檔編號H03M7/40GK1343390SQ00804929
公開日2002年4月3日 申請日期2000年1月17日 優(yōu)先權(quán)日1999年2月23日
發(fā)明者拉爾夫·斯皮爾施內(nèi)德, 馬丁·迪茨, 丹尼爾·霍姆, 雷恩霍爾德·貝姆 申請人:弗蘭霍菲爾運輸應(yīng)用研究公司