專利名稱:低比特率的編解碼器的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及信號(hào)的預(yù)測編碼和解碼,特別涉及代表諸如語音(speech)的聲音、音頻或視頻的信號(hào)的預(yù)測編碼和解碼。
背景技術(shù):
像在基于網(wǎng)際協(xié)議的網(wǎng)絡(luò)(主要是因特網(wǎng)或內(nèi)部網(wǎng))上的語音、音頻或視頻那樣的在分組交換網(wǎng)絡(luò)上的實(shí)時(shí)傳輸,由于眾多特征而變得愈發(fā)吸引人。這些特征包括諸如較低的操作開支、容易集成新的服務(wù)和同一網(wǎng)絡(luò)既用于非實(shí)時(shí)數(shù)據(jù)也用于實(shí)時(shí)數(shù)據(jù)等等。實(shí)時(shí)數(shù)據(jù)通常是語音、音頻或視頻信號(hào),在分組交換系統(tǒng)中被轉(zhuǎn)換成數(shù)字信號(hào),即轉(zhuǎn)換為比特流,其被劃分成合適大小的部分,以便在分組交換網(wǎng)絡(luò)上以數(shù)據(jù)分組從發(fā)送端傳輸?shù)浇邮斩恕?br>
由于分組交換網(wǎng)絡(luò)原本是為非實(shí)時(shí)數(shù)據(jù)的傳輸而設(shè)計(jì)的,所以在這種網(wǎng)絡(luò)上傳輸實(shí)時(shí)數(shù)據(jù)會(huì)造成某些問題。數(shù)據(jù)分組在傳輸中會(huì)丟失,因?yàn)樗鼈儠?huì)因阻塞問題或傳輸錯(cuò)誤而被網(wǎng)絡(luò)有意舍棄。在非實(shí)時(shí)應(yīng)用中,由于可以重發(fā)丟失的分組,所以這不成問題。然而,對(duì)于對(duì)延遲敏感的實(shí)時(shí)應(yīng)用來說,重發(fā)是不可能的解決方案。太晚到達(dá)的實(shí)時(shí)應(yīng)用的分組無法被用來復(fù)原(reconstruct)相應(yīng)信號(hào),因?yàn)檫@個(gè)信號(hào)早已或本該被傳遞至接收端了,例如,被揚(yáng)聲器回放或在顯示器屏幕上顯示。因此,太晚到達(dá)的分組就等同于丟失的分組。
當(dāng)傳送如分組的實(shí)時(shí)信號(hào)時(shí),丟失或延遲的數(shù)據(jù)分組的主要問題是在復(fù)原的信號(hào)中引入了失真。該失真是緣于以下事實(shí)丟失或延遲的分組所傳達(dá)的信號(hào)片斷無法被復(fù)原。
當(dāng)傳送信號(hào)時(shí),最經(jīng)常希望使用盡可能小的帶寬。眾所周知,許多信號(hào)具有包含冗余的模式(pattern)。適當(dāng)?shù)木幋a方法可避免冗余信息的傳輸,從而使信號(hào)傳輸?shù)膸捀咝?。利用這些冗余的通常的編碼方法是預(yù)測編碼方法。預(yù)測編碼方法基于模式呈現(xiàn)間的依存(dependency)而對(duì)信號(hào)模式進(jìn)行編碼。它以固定比特率對(duì)發(fā)送信號(hào)進(jìn)行編碼并在信號(hào)質(zhì)量和傳輸比特率之間有一個(gè)平衡。用于語音的預(yù)測編碼方法的例子是線性預(yù)測編碼(LinearPredictive Coding,LPC)和編碼激勵(lì)線性預(yù)測(Code Excited Linear Prediction,CELP),這兩種編碼方法皆是本領(lǐng)域的技術(shù)人員所熟知的。
在預(yù)測編碼方案中,編碼器狀態(tài)取決于信號(hào)前面編碼的部分。當(dāng)與編碼信號(hào)的分組化(packetization)相結(jié)合而使用預(yù)測編碼時(shí),丟失分組將導(dǎo)致錯(cuò)誤傳播,這是因?yàn)樵诮邮斩说念A(yù)測編碼器狀態(tài)所依賴的信息將與丟失的分組一道丟失。這意味著后續(xù)分組的解碼將以不正確的編碼器狀態(tài)開始。因此,由丟失分組而造成的錯(cuò)誤將在信號(hào)的解碼和復(fù)原期間傳播。
解決這一錯(cuò)誤傳播問題的一種方式是在分組所包含的編碼信號(hào)部分起始復(fù)位編碼器狀態(tài)。然而,這樣的編碼器狀態(tài)的重置將導(dǎo)致復(fù)原信號(hào)的質(zhì)量降級(jí)。減少丟失分組的影響的另一方式是當(dāng)對(duì)信號(hào)進(jìn)行編碼時(shí)使用不同方案(scheme)來包含冗余信息。按這種方式在丟失分組后的編碼器狀態(tài)可被近似。然而,這種方案不僅需要更多的帶寬用來傳送編碼信號(hào),而且也僅是減少了丟失分組的影響。由于丟失分組的影響不能徹底消除,所以錯(cuò)誤傳播仍將存在并導(dǎo)致復(fù)原信號(hào)在感覺(perceptual)上的低質(zhì)量。
現(xiàn)有技術(shù)預(yù)測編碼器的另一問題是在例如語音信號(hào)的播音開始(voicingonset),從相對(duì)很低到很高的信號(hào)電平的信號(hào)驟變時(shí)的編碼以及隨后的復(fù)原。當(dāng)對(duì)這種過渡進(jìn)行編碼時(shí),難以使編碼器狀態(tài)反映出該驟變(suddentransition),更重要的是反映出過渡后的有音時(shí)期的開始。這又接著將導(dǎo)致在解碼端的復(fù)原的信號(hào)質(zhì)量的降級(jí)。
發(fā)明內(nèi)容
本發(fā)明的一個(gè)目的在于至少克服一些上述與以分組來傳輸?shù)男盘?hào)的預(yù)測編碼/解碼相關(guān)的問題。
本發(fā)明的另一個(gè)目的是當(dāng)具有從編碼端發(fā)送來的編碼信號(hào)部分的分組在解碼端接收之前丟失時(shí),能夠改善與預(yù)測編碼/解碼相關(guān)的解碼端的性能。
本發(fā)明的另一個(gè)目的是改善受到信號(hào)功率驟增的信號(hào)的預(yù)測編碼和解碼。
根據(jù)本發(fā)明,這些目的是由具有如所附權(quán)利要求書所定義的特征并代表本發(fā)明的不同方面的方法、設(shè)備和計(jì)算機(jī)可讀媒體來實(shí)現(xiàn)的。
根據(jù)本發(fā)明,信號(hào)被劃分成塊并接著在逐塊的基礎(chǔ)上被編碼,并最終被解碼。該想法是要提供塊的預(yù)測編碼/解碼,從而使編碼/解碼不取決于任何先前的塊,同時(shí)仍能以信號(hào)的對(duì)應(yīng)部分與信號(hào)的其它部分同樣質(zhì)量級(jí)別而再生的方式,提供該塊的起始端的預(yù)測編碼/解碼。這是通過將塊的編碼和解碼基于位于塊的末端邊界間某處的編碼起始狀態(tài)上而實(shí)現(xiàn)的。該起始狀態(tài)是使用任何適宜的編碼方法來進(jìn)行編碼/解碼。如果確定第3部分存在,則使用任何預(yù)測編碼方法對(duì)在起始狀態(tài)并且在該塊邊界之間的各自側(cè)的第2塊部分和第3塊部分進(jìn)行編碼/解碼。為了方便在起始狀態(tài)周圍的這兩個(gè)塊部分的預(yù)測編碼/解碼,并且由于這兩個(gè)塊部分的編碼/解碼將基于同一起始狀態(tài),所以這兩塊部分在彼此相對(duì)的方向上進(jìn)行編碼/解碼。例如,位于塊的末端部分的塊部分是沿信號(hào)模式在時(shí)間上的出現(xiàn)順序來進(jìn)行編碼/解碼的,而位于塊的起始的另一部分是沿信號(hào)模式在時(shí)間上的反向出現(xiàn)順序來進(jìn)行編碼/解碼的,即從較晚出現(xiàn)的信號(hào)模式到較早出現(xiàn)的信號(hào)模式。
通過根據(jù)本發(fā)明在三個(gè)階段來對(duì)塊進(jìn)行編碼,可實(shí)現(xiàn)塊之間的編碼獨(dú)立性,并總能方便塊的起始端的正確預(yù)測編碼/解碼。這三個(gè)階段是 *對(duì)塊的第1部分進(jìn)行編碼,該編碼的部分代表編碼的起始狀態(tài)。
*使用預(yù)測編碼方法來對(duì)在編碼的起始狀態(tài)和塊末端邊界之一之間的第2塊部分進(jìn)行編碼,該預(yù)測編碼方法從起始狀態(tài)到末端邊界逐步地對(duì)這個(gè)第2塊部分進(jìn)行編碼。
*確定編碼的起始狀態(tài)和另一個(gè)塊末端邊界之間是否存在第3塊部分,如果存在,則使用預(yù)測編碼方法來對(duì)第3塊部分進(jìn)行編碼,該預(yù)測編碼方法從起始狀態(tài)到這個(gè)另一個(gè)末端邊界逐步地對(duì)這個(gè)第3塊部分進(jìn)行編碼。相對(duì)于與該塊相關(guān)聯(lián)的時(shí)間軸(time base),第3塊部分和第2塊部分的編碼相比較是以相反方向進(jìn)行編碼的。
相應(yīng)地,當(dāng)再生對(duì)應(yīng)的解碼的信號(hào)塊時(shí),編碼的塊的解碼是在三個(gè)階段來進(jìn)行的。
*對(duì)編碼的起始狀態(tài)進(jìn)行解碼。
*對(duì)塊的編碼的第2部分進(jìn)行解碼。使用基于起始狀態(tài)的預(yù)測解碼方法以用來再生位于起始狀態(tài)和塊的兩端邊界之一之間的塊的第2部分。
*確定是否存在編碼第3塊部分,如果存在,則對(duì)這個(gè)塊的編碼的第3塊部分進(jìn)行解碼。同樣地,使用基于起始狀態(tài)的預(yù)測解碼方法來再生位于起始狀態(tài)和塊的兩端邊界的另一端之間的塊的第3部分。相對(duì)于與該再生塊關(guān)聯(lián)的時(shí)間軸,塊的這個(gè)第3部分和塊的第2部分的再生相比較是以相反方向而再生的。
根據(jù)本發(fā)明而受到編碼的信號(hào)要么相應(yīng)于數(shù)字信號(hào),要么相應(yīng)于分析濾波的數(shù)字信號(hào)的剩余信號(hào)。該信號(hào)包括連續(xù)模式,其代表諸如語音或音頻的聲音,或其它可表現(xiàn)為連續(xù)模式的現(xiàn)象,例如視頻或心電圖(ECG)信號(hào)。于是,本發(fā)明適用于任何可被編碼從而以彼此相關(guān)的連續(xù)狀態(tài)來描述的連續(xù)模式。
更優(yōu)地,起始狀態(tài)的編碼/解碼使用不取決于信號(hào)先前部分的編碼方法,于是使得該塊對(duì)于定義起始狀態(tài)的信息而言是獨(dú)立的。然而,當(dāng)本發(fā)明應(yīng)用于LPC剩余域(residual domain)時(shí),最好是將預(yù)測編碼/解碼也用于起始狀態(tài)。通過假設(shè)在起始狀態(tài)開始之前的解碼信號(hào)中的量化噪聲可被忽略,則可以從零狀態(tài)開始預(yù)測編碼器的錯(cuò)誤加權(quán)或錯(cuò)誤反饋濾波。這樣可實(shí)現(xiàn)起始狀態(tài)的獨(dú)立編碼。
更優(yōu)地,信號(hào)塊被劃分成一組連續(xù)的間隔,并且選擇起始狀態(tài)以對(duì)應(yīng)于那些具有最高信號(hào)能量的間隔的一個(gè)或更多連續(xù)的間隔。這意味著起始狀態(tài)的編碼/解碼可向著具有相對(duì)較高信號(hào)能量的信號(hào)部分進(jìn)行最優(yōu)化。以這種方式,實(shí)現(xiàn)了其余塊的編碼/解碼,從感覺的觀點(diǎn)來看,它是很高效的,因?yàn)樗梢曰谝愿呔冗M(jìn)行編碼/解碼的起始狀態(tài)。
本發(fā)明的一個(gè)優(yōu)點(diǎn)是它使得預(yù)測編碼以這種方式來進(jìn)行即編碼塊獨(dú)立于激勵(lì)域(excitation domain)中的信息,即編碼信息不會(huì)與任何先前編碼塊中的信息相關(guān)聯(lián)。結(jié)果,在解碼時(shí),編碼塊的解碼是基于編碼塊中獨(dú)立的信息的。這意味著若攜帶編碼塊的分組在傳輸期間丟失了,則后續(xù)編碼塊的預(yù)測解碼將不受丟失的分組中的丟失狀態(tài)信息的影響。
于是,當(dāng)攜帶編碼塊的分組在被解碼端接收之前丟失時(shí),本發(fā)明避免了以往的預(yù)測編碼/解碼在解碼時(shí)遇到的錯(cuò)誤傳播問題。相應(yīng)地,應(yīng)用本發(fā)明的特征的編解碼器將對(duì)分組的丟失變得更有魯棒性(robust)。
更優(yōu)地,選擇起始狀態(tài)以使其位于與最高信號(hào)功率相關(guān)聯(lián)的塊部分中。例如,在由有聲和無聲部分構(gòu)成的語音信號(hào)中,這意味著在包括無聲和有聲部分的塊中,起始狀態(tài)將幾乎完全位于塊中的有聲部分內(nèi)。
在語音信號(hào)中,有聲部分內(nèi)的信號(hào)取樣之間存在高相關(guān)性,而無聲部分內(nèi)的信號(hào)取樣之間存在低相關(guān)性。無聲部分和有聲部分間的過渡區(qū)中的相關(guān)性很微弱而且難以利用。從感覺的觀點(diǎn)來看,更重要的是當(dāng)對(duì)信號(hào)的有聲部分進(jìn)行再生時(shí),達(dá)到良好的波形匹配,而無聲部分的波形匹配則不太重要。
傳統(tǒng)預(yù)測編碼器以同一順序?qū)π盘?hào)表示進(jìn)行操作,即利用信號(hào)源產(chǎn)生對(duì)應(yīng)的信號(hào)。于是,任何代表特定時(shí)刻信號(hào)的編碼器狀態(tài)將與代表信號(hào)較早部分的先前編碼器狀態(tài)相關(guān)聯(lián)。由于難以利用從無聲時(shí)期到有聲時(shí)期的過渡期間的相關(guān)性,所以傳統(tǒng)的預(yù)測編碼器的編碼器狀態(tài)將在這樣的過渡隨后的有聲時(shí)期開始期間、包含給出原始信號(hào)的非常低劣近似的信息。結(jié)果,在解碼端的語音信號(hào)的再生將為有聲區(qū)的開始提供感覺上的降級(jí)的信號(hào)。
通過將起始狀態(tài)幾乎完全放置于(well within)塊的有聲區(qū)內(nèi),然后從起始狀態(tài)向末端邊界對(duì)塊進(jìn)行編碼/解碼,從而本發(fā)明能夠更充分地利用有聲區(qū)中的高相關(guān)性,以使收聽受益。從無聲到高度周期性的有聲聲音的過渡需要數(shù)個(gè)音調(diào)周期。當(dāng)將起始狀態(tài)幾乎完全置于塊的有聲區(qū)內(nèi)時(shí),起始狀態(tài)編碼的高比特率將應(yīng)用于已建立起高度周期性的音調(diào)周期,而不是應(yīng)用于有聲區(qū)域的第一音調(diào)周期之一。
在下面的說明中,本發(fā)明的上述和其它特點(diǎn)和優(yōu)點(diǎn)將被更多地說明。
圖1表示在分組交換網(wǎng)絡(luò)上用于傳輸聲音的系統(tǒng)的發(fā)送部分的概要; 圖2表示在分組交換網(wǎng)絡(luò)上用于傳輸聲音的系統(tǒng)的接收部分的概要; 圖3表示剩余信號(hào)塊的例子; 圖4表示用于對(duì)圖3的剩余進(jìn)行編碼的起始狀態(tài)的整數(shù)(integer)子塊和更高的解析度目標(biāo); 圖5表示根據(jù)本發(fā)明的實(shí)施例的對(duì)起始狀態(tài)進(jìn)行編碼的編碼器的功能框圖; 圖6表示對(duì)應(yīng)于圖5的編碼器實(shí)行解碼操作的解碼器的功能框圖; 圖7表示從起始狀態(tài)向塊末端邊界的信號(hào)的編碼;和 圖8表示本發(fā)明的實(shí)施例有利地利用的自適應(yīng)密碼本搜索的功能框圖。
具體實(shí)施例方式 根據(jù)本發(fā)明的編碼和解碼功能通常包含于具有編碼器部分和解碼器部分的編解碼器中。參照?qǐng)D1和2,在用于在分組交換網(wǎng)絡(luò)上傳輸聲音系統(tǒng)中表示本發(fā)明的實(shí)施例。
在圖1中,根據(jù)本發(fā)明操作的編碼器130包含于發(fā)送系統(tǒng)中。在這個(gè)系統(tǒng)中,聲波由麥克風(fēng)110拾取并轉(zhuǎn)換成模擬電信號(hào)115。這個(gè)信號(hào)被A/D轉(zhuǎn)換器120取樣和數(shù)字化,以產(chǎn)生取樣的信號(hào)125。取樣的信號(hào)被輸入編碼器130。從編碼器的輸出是數(shù)據(jù)分組135。每個(gè)數(shù)據(jù)分組包含關(guān)于取樣的塊的壓縮信息。經(jīng)由控制器140,數(shù)據(jù)分組被遞交至分組交換網(wǎng)絡(luò)。
在圖2中,根據(jù)本發(fā)明操作的解碼器270包含于接收系統(tǒng)中。在這個(gè)系統(tǒng)中,數(shù)據(jù)分組由控制器250從分組交換網(wǎng)絡(luò)接收,并存儲(chǔ)于抖動(dòng)(jitter)緩沖器260。從抖動(dòng)緩沖器將數(shù)據(jù)分組265提供給解碼器270。解碼器的輸出是取樣的數(shù)字信號(hào)275。每個(gè)數(shù)據(jù)分組得到信號(hào)取樣的一個(gè)塊。取樣的數(shù)字信號(hào)被輸入D/A轉(zhuǎn)換器280,結(jié)果得到模擬電信號(hào)285。這個(gè)信號(hào)可被遞交至含有揚(yáng)聲器的聲音轉(zhuǎn)換器290,結(jié)果得到再生的聲波。
編解碼器的本質(zhì)上是線性預(yù)測編碼(LPC),其已知有別于(known from)自適應(yīng)預(yù)測編碼(APC)和代碼激勵(lì)線性預(yù)測(CELP)。然而,根據(jù)本發(fā)明的編解碼器卻使用了起始狀態(tài),即使用定位在信號(hào)塊內(nèi)的序列取樣,以初始化信號(hào)塊的剩余部分的編碼。本發(fā)明的原理遵循LPC的開環(huán)綜合分析(analysis-synthesis)方法、以及閉環(huán)綜合分析方法,其是已知有別于CELP的。在感覺加權(quán)的域(perceptually weighted domain)中的開環(huán)編碼提供了一種綜合分析的替代選擇,以得到編碼噪聲的感覺加權(quán)。當(dāng)與綜合分析做比較時(shí),這個(gè)方法提供了提出的方案的語音質(zhì)量和計(jì)算復(fù)雜度之間的有利的折衷(compromise)。在感覺加權(quán)域中的開環(huán)編碼將在本說明書的后面進(jìn)行說明。
編碼器 在圖1的實(shí)施例中,編碼器的輸入是數(shù)字信號(hào)125。這個(gè)信號(hào)可采取以8Hz取樣并去除了直流(DC)分量的16位統(tǒng)一脈沖碼調(diào)制(PCM)的格式。該輸入被分割成例如240個(gè)取樣的塊。每個(gè)塊又被再細(xì)分成例如6個(gè)連續(xù)子塊,每個(gè)子塊有40個(gè)取樣。
原則上可使用任何方法來從信號(hào)塊中提取頻譜包絡(luò)(spectral envelop),而不脫離本發(fā)明的精神。一種方法的概括如下對(duì)于每個(gè)輸入塊,編碼器進(jìn)行一定數(shù)量的(例如2次)線性預(yù)測編碼(LPC)分析,每次使用例如10的階數(shù)(order)。結(jié)果使得LPC系數(shù)被編碼,最好是以線性頻譜頻率(LSF)的形式來編碼。LSF的編碼是本領(lǐng)域的技術(shù)人員是熟知的。這個(gè)編碼可利用各組系數(shù)之間的相關(guān)性,例如,通過使用某些組的預(yù)測編碼。LPC分析可利用不同的、并且可能是不對(duì)稱的窗函數(shù),從而在窗的平滑和居中與在編碼中引入的超前延遲(lookahead delay)之間得到良好的折衷。量化的LPC顯示可有利地被內(nèi)插(interpolate)以得到大量平滑地隨時(shí)間變化的LSF系數(shù)組。隨后,使用被變換成用于分析濾波器的系數(shù)的、量化且平滑地內(nèi)插的LSF系數(shù),得到LPC剩余。
剩余信號(hào)塊315的例子及其分隔成的子塊316、317、318、319、320和321如圖3所示,子塊的數(shù)量僅是示例性的。在這個(gè)圖中的時(shí)間軸上的各間隔表示1個(gè)子塊。圖3中示例的剩余塊中起始狀態(tài)的目標(biāo)識(shí)別如圖4所示。在一種簡單的實(shí)施中,這個(gè)目標(biāo)可以被識(shí)別成剩余的2個(gè)連續(xù)子塊317和318,其展現(xiàn)了塊內(nèi)任何2個(gè)連續(xù)子塊的最大能量。此外,通過識(shí)別2個(gè)子塊間隔內(nèi)可能預(yù)定長度的連續(xù)取樣325的子集,目標(biāo)的長度可進(jìn)一步被縮短并以更高的時(shí)間解析度進(jìn)行定位(localize)。最好是將這樣的子集選擇為在2個(gè)子塊間隔中拖曳或拖尾(trailing or tailing)的預(yù)定數(shù)量的例如58個(gè)取樣。同樣地,拖曳或拖尾的子集間的選擇也可基于最大能量標(biāo)準(zhǔn)。
起始狀態(tài)的編碼 在不脫離本發(fā)明精神的情況下,起始狀態(tài)基本上可以用任何編碼方法來編碼。
根據(jù)本發(fā)明的實(shí)施例,使用了具有預(yù)測噪聲整形的標(biāo)量量化(scalarquantization),如圖5所示。按本發(fā)明,標(biāo)量量化用全通濾波器520來預(yù)先極化,該全通濾波器520被設(shè)計(jì)成將在所有取樣上的取樣能量擴(kuò)展到起始狀態(tài)中。已經(jīng)發(fā)現(xiàn),這導(dǎo)致了在低速率綁定標(biāo)量量化器的過載和顆粒噪聲之間的良好平衡。這樣的全通濾波器的簡單設(shè)計(jì)是這樣得到的沿時(shí)間正向應(yīng)用LPC綜合濾波器,并沿時(shí)間反向應(yīng)用對(duì)應(yīng)的LPC分析濾波器。具體地說,當(dāng)量化的LPC分析濾波器是Aq(z)時(shí),具有系數(shù)516。則全通濾波器520由Aq(z^-1)/Aq(z)給出。對(duì)于在解碼器中這個(gè)濾波器的逆操作來說,應(yīng)當(dāng)使用編碼的LPC系數(shù),并且濾波應(yīng)當(dāng)是起始狀態(tài)的長度的圓周卷積。起始狀態(tài)編碼器的其余部分是本領(lǐng)域的技術(shù)人員熟知的濾波的目標(biāo)525由歸一化530歸一化,以展示預(yù)定的最大振幅,以得到歸一化的目標(biāo)535和量化歸一化的因數(shù)536的指數(shù)。量化誤差的加權(quán)被劃分成歸一化目標(biāo)535的濾波540和量化目標(biāo)556的濾波560,由此對(duì)于每個(gè)取樣從加權(quán)目標(biāo)545中減去瞬變(ringing)或零輸入響應(yīng)566,以得出量化目標(biāo)547,其被輸入量化器550。結(jié)果得到量化的起始狀態(tài)的指數(shù)555序列。
可將噪聲整形加權(quán)濾波器540和560應(yīng)用于這個(gè)實(shí)施例中。最好是將同樣的噪聲整形應(yīng)用于起始狀態(tài)的編碼中,以及后述的剩余信號(hào)塊的后續(xù)編碼中。例如,噪聲整形可以這樣來實(shí)施在使用等于A(z/L1)/(Aq(z)*Aq(z/L2))的加權(quán)濾波器對(duì)量化誤差進(jìn)行加權(quán)之后,最小化量化誤差,其中A(z)是在可能的初始帶寬擴(kuò)展后的非量化的LPC分析濾波器,Aq(z)是量化的LPC分析濾波器,而L1和L2是帶寬擴(kuò)展系數(shù),其可分別有利地被設(shè)置成L1=0.8和L2=0.6。這個(gè)濾波中需要的全部LPC和加權(quán)系數(shù)在圖5中在輸入546和565采集。一種當(dāng)剩余編碼以后述的第3替代方法來完成時(shí)的有用的具有更短脈沖響應(yīng)的替代選擇是設(shè)置L1=1.0和L2=0.4。
以下是起始狀態(tài)編碼器的C代碼示例實(shí)施。
void StateSearchW(/*狀態(tài)的編碼*/float*residual,/*(i)目標(biāo)剩余向量,即圖5中的信號(hào)515*/ float*syntDenum,/*(i)圖5中的信號(hào)516、546和565的lpc系數(shù)*/ float*weightNum,/*(i)圖5中的信號(hào)546和565的加權(quán)濾波器的分子*/ float*weightDenum,/*(i)圖5中的信號(hào)546和565的加權(quán)濾波器的分母*/ int*idxForMax,/*(o)最大振幅的量化器指數(shù),即圖5中的信號(hào)536*/ int*idxVec,/*(o)量化指數(shù)的向量,即圖5中的信號(hào)555*/ int len/*(i)全部向量的長度,例如58*/); void AbsQuantW(float*in,float*syntDenum,float*weightNum,float*weightDenum,int*out,int len){ float*target,targetBuf[FILTERORDER+STATE_LEN], *SyntOut,syntOutBuf[FILTERORDER+STATE LEN], *WeightOut,weightOutBuf[FILTERORDER+STATE_LEN], toQ,xq; int n; int index; memset(targetBuf,0,F(xiàn)ILTERORDER*sizeof(float));<!-- SIPO <DP n="8"> --><dp n="d8"/> memset(syntOutBuf,0,F(xiàn)ILTERORDER*sizeof(float)); memset(weightOutBuf,0,F(xiàn)ILTERORDER*sizeof(float)); target=&targetBuf[FILTERORDER]; syntOut=&syntOutBuf[FILTERORDER]; weightOut=&weightOutBuf[FILTERORDER]; for(n=0;n<len;n++){ if(N==STATE_LEN/2{ syntDenum+=(FILTERORDER+1); weightNum+=(FILTERORDER+1); weightDenum+=(FILTERORDER+1); } AllPoleFilter(&in[n],weightDenum,1,F(xiàn)ILTERORDER); /*這個(gè)函數(shù)進(jìn)行向量in的全極性濾波,結(jié)果返回到同一向量中*/ /*這是圖5中的濾波540*/ syntOut[n]=0.0; AllPoleFilter(&syntOut[n],weightDenum,1,F(xiàn)LILTERORDER); /*這是圖5中的濾波560*/ /*量化器*/ toQ=in[n]-syntOut[n];/*這是從信號(hào)545中減去信號(hào)566以得到圖5中的信號(hào)547*/ sort_sq(&xq,&index,toQ,states3,8); /*這個(gè)函數(shù)進(jìn)行標(biāo)量量化*/ /*這是圖5中的函數(shù)550*/ out[n]=index; syntOut[n]=state_sq3[out[n]]; AllPoleFilter(&syntOut[N],weightDenum,1,F(xiàn)ILTERORDER);<!-- SIPO <DP n="9"> --><dp n="d9"/> /*這更新了圖5中的加權(quán)濾波器560,用于下一取樣*/ } } void StateSearchW(float*residual,float*syntDenum,float*weightNum,float*weightDenum,int*idxForMax,int*idxVec,int len){ float dtmp,maxVal,tmpbuf[FILTERORDER+2*STATE_LEN],*tmp,numerator[1+FILTERORDER],foutbuf[FILTERORDER+2*STATELEN],*fout; int k,utmp; in index; memset(tmpbuf,0,F(xiàn)ILTERORDER*sizeof(float)); memset(foutbuf,0,F(xiàn)ILTERORDER*sizeof(float)); for(K=0;K<T;FILTERORDER;k++){ numerator[k]=syntDenum[FILTERORDER-k]; } numerator[FILTERORDER]=synthDenum
; tmp=&tmpbuf[FILTERORDER]; fout=&foutbuf[FILTERORDER]; /*從這里*/ memcpy(tmp,residual,len*sizeof(float)); memset(tmp+len,0,len*sizeof(float)); ZeroPoleFilter(tmp,numerator,syntDenum,2*len,F(xiàn)ILTERORDER,fout); /*這個(gè)函數(shù)進(jìn)行tmp的零極性濾波并將濾波的向量返回到fout中*/ for(k=0;k<len;k++){ fout[k]+=fout[k+len]; }<!-- SIPO <DP n="10"> --><dp n="d10"/> /*到這里是圖5中的全通濾波520*/ maxVal=fout
; for(K=L;K<LT;LEN;k++){ if(fout[k]*fout[k]>maxVal*maxVal){ maxVal=fout[k]; } } maxVal=(float)fabs(maxVal); if(maxVal<T;10.0)( maxval=10.0; ) maxVal=(float)log10(maxVal); sort_sq(&dtmp,&index,maxVal,state_frgq,64); /*這個(gè)函數(shù)進(jìn)行平方值的排序*/ maxVal=state_frgq[index]; utmp=index; *idxForMax=utmp; maxVal=(float)pow(10,maxVal); maxval=(float)(4.5)/maxVal; for(k=0;K<len;k++){ fout[K]=maxVal;/*這是圖5中的歸一化530*0/ } AbsQuantW(fout,syntDenum,weightNum,weightDenum,idxVec,len); } 起始狀態(tài)的解碼 起始狀態(tài)的解碼自然遵循應(yīng)用在起始狀態(tài)的編碼的方法。對(duì)應(yīng)于圖5中編碼方法的解碼方法如圖6所示。首先在標(biāo)量密碼本620中查找指數(shù)615,結(jié)果得到量化的起始狀態(tài)625的復(fù)原(reconstruction)。量化的起始狀態(tài)接著使用量化的歸一化因數(shù)626的指數(shù)進(jìn)行去歸一化630。這產(chǎn)生了去歸一化的起始狀態(tài)635,其被輸入采用系數(shù)636的逆全通濾波器640,結(jié)果得到解碼的起始狀態(tài)645。以下是起始狀態(tài)解碼的C代碼示例。
void StateConstructW(/*對(duì)語音剩余的一種狀態(tài)進(jìn)行解碼*/ int idxForMax,/*(i)最大振幅的量化的7比特指數(shù),即圖6中的信號(hào)626*/ int*idxVec,/*(i)量化指數(shù)的向量,即圖6中的信號(hào)615*/ float*SyntDenum,/*(i)綜合濾波器分母,即圖6中的信號(hào)636*/ float*out,/*(o)解碼的狀態(tài)向量,即圖6中的信號(hào)645*/ int len/*(i)狀態(tài)向量的長度,例如58*/ ) { float max Val,tmpbuf[FILTERORDER+2*STATE_LEN],*tmp,numerator[FILTERORDER+1]; float foutbuf[FILTERORDER+2*STATE_LEN],*fout; intk,tmpi; maxVal=state_frgq[idxForMax]; maxVal=(float)pow(10,maxVal)/(float)4.5; memset(tmpbuf,0,F(xiàn)ILTERORDER*sizeof(float)); memset(foutbuf,0,F(xiàn)ILTERORDER*sizeof(float)); for(k=0;K<LT;FILTERORDER;k++){ numerator[k]=syntDenum[FILTERORDER-k]; } numerator[FILTERORDER]=syntDenum
; tmp=&tmpbuf[FILTERORDER]; fout=&foutbuf[FILTERORDER]; for(k=0;K<LT;len;k++){ tmpi=len-l-k;<!-- SIPO <DP n="12"> --><dp n="d12"/> tmp[K]=maxVal*state_sq3[idxVec[tmpi]]; /*這是圖6中的操作620和630*/ ) /*從這里*/ memset(tmp+len,0,len*sizeof(float)); ZeroPoleFilter(tmp,numerator,syntDenum,2*len,F(xiàn)ILTERORDER,fout); for(k=0;k<len;k++)( Out[k]=fout[len-L-K]+fout[2*len-l-K];} /*到這里是圖6中的操作640*/} 從起始狀態(tài)向塊邊界的編碼 在本發(fā)明的范圍內(nèi),塊的剩余取樣可有多種方式來編碼,這些方式都是利用了作為編碼算法的狀態(tài)的初始化的起始狀態(tài)。最好地,線性預(yù)測算法可被用于剩余取樣的編碼。特別地,自適應(yīng)密碼本的應(yīng)用使得在有聲語音段期間有效地利用起始狀態(tài)。在這種情況下,編碼的起始狀態(tài)被用來填充(populate)自適應(yīng)密碼本。而且,使用起始狀態(tài)有利地進(jìn)行錯(cuò)誤加權(quán)濾波器的狀態(tài)的初始化。這種初始化的具體細(xì)節(jié)可由本領(lǐng)域的技術(shù)人員熟知的多種方式來做。
從起始狀態(tài)向塊邊界的編碼由圖7中的信號(hào)來示例。
在基于子塊的實(shí)施例中,其中起始狀態(tài)被識(shí)別成預(yù)定長度的間隔、直到由許多子塊定義的間隔的一端,則最好是首先對(duì)剩余間隔應(yīng)用自適應(yīng)密碼本算法,以達(dá)到由許多子塊定義的整個(gè)間隔的編碼。例如,起始狀態(tài)715是信號(hào)645的例子,并且是起始狀態(tài)目標(biāo)325的解碼的顯示,該起始狀態(tài)715被擴(kuò)展至整數(shù)子塊長度起始狀態(tài)725。此后,這些子塊被用作塊A-B中的剩余子塊的編碼的起始狀態(tài)(子塊的數(shù)量僅是示例性的)。
這個(gè)編碼可從編碼時(shí)間上較晚的子塊來開始,或可從編碼時(shí)間上較早的子塊來開始。盡管兩種選擇在本發(fā)明的范圍內(nèi)都是頗有可能的,但我們只詳細(xì)地說明以時(shí)間上較晚的子塊的編碼來開始的實(shí)施例。
時(shí)間上較晚的子塊的編碼 如果塊含有時(shí)間上晚于為起始狀態(tài)編碼的子塊的子塊,則自適應(yīng)密碼本和加權(quán)濾波器從用于編碼時(shí)間上較晚的子塊的起始狀態(tài)進(jìn)行初始化。這些子塊的每個(gè)都被后續(xù)編碼。在例子中,這將導(dǎo)致圖7的信號(hào)735。
若多于一個(gè)子塊在時(shí)間上晚于在該塊中的整數(shù)子塊起始狀態(tài),則自適應(yīng)密碼本存儲(chǔ)器用編碼的LPC激勵(lì)來更新,以準(zhǔn)備下一子塊的編碼。這是由本領(lǐng)域的技術(shù)人員熟知的方法來完成的。
時(shí)間上較早的子塊的編碼 如果塊含有在時(shí)間上早于為起始狀態(tài)編碼的子塊的子塊,則將與應(yīng)用于時(shí)間上較晚的子塊的程序等同的程序應(yīng)用于逆時(shí)間塊(time-reversed block),以對(duì)這些子塊進(jìn)行編碼。區(qū)別在于當(dāng)與時(shí)間上較晚子塊的編碼進(jìn)行比較時(shí),現(xiàn)在不僅是起始狀態(tài),而且在時(shí)間上晚于起始狀態(tài)的LPC激勵(lì)都被應(yīng)用于自適應(yīng)密碼本和感覺加權(quán)濾波器的初始化。在例子中,這將使信號(hào)735擴(kuò)展成完全編碼的顯示745,即結(jié)果得到的LPC剩余315的解碼顯示。信號(hào)745構(gòu)成解碼器的LPC激勵(lì)。
本發(fā)明的編碼步驟已對(duì)圖3~5中的語音LPC剩余信號(hào)做了示例。然而,在不脫離本發(fā)明范圍的總體思想的情況下,這些步驟也適用于其它信號(hào),例如時(shí)域中未濾波的聲音信號(hào)或EKG等醫(yī)療信號(hào)。
從起始狀態(tài)向塊邊界編碼的C代碼示例 void iLBC_encode(/*主編碼器函數(shù)*/ float*speech,/*(i)語音數(shù)據(jù)向量*/ unsigned char*bytes,/*(o)編碼的數(shù)據(jù)位*/ float*block,/*(o)解碼的語音向量*/ int mode,/*(i)1用于標(biāo)準(zhǔn)編碼、2用于冗余編碼*/ float*decresidual,/*(o)增益適配前的解碼剩余(對(duì)冗余編碼單位有用)*/ float*syntdenum,/*(o)解碼的綜合濾波器(對(duì)冗余編碼單位有用)*/ float*weightnum,/*(o)加權(quán)分子(對(duì)冗余編碼單位有用)*/ float*weightdenum/*(o)加權(quán)分母(對(duì)冗余編碼單位有用)*/ ) { float data[BLOCKL]; float residual[BLOCKL],reverseResidual[BLOCKL];<!-- SIPO <DP n="14"> --><dp n="d14"/> float weightnum[NSUB*(FILTERORDER+1)],weightdenum[NSUB*(FILTERORDER+1)]; int start,idxForMax,idxVec[STATE_LEN]; float reverseDecresidual[BLOCKL],mem[MEML]; int n,k,kk,meml_gotten,Nfor,Nback,i; int dummy=0; int gain_index [NSTAGES*NASUB],extra_gain_index[NSTAGES]; int cb_index[NSTAGES*NASUB],extra_cb_index[NSTAGES]; int lsf_i[LSF_NSPLIT*LPC_N]; unsigned char*pbytes; int diff,start_pos,state-first; float en1,en2; int index,gc_index; int subcount,subframe; float weightState[FILTERORDER]; memcpy(data,block,BLOCKL*sizeof(float)); /*輸入數(shù)據(jù)的LPC*/ LPCencode(syntdenum,weightnum,weightdenum,lsf-i,data); /*這個(gè)函數(shù)進(jìn)行LPC分析和量化,并平滑LPC系數(shù)的內(nèi)插*/ /*得到剩余的逆濾波器*/ for(n=0;n<NSUB;n++){ anaFilter(&data[N*SUBL],&syntdenum[n*(FILTERORDER+L)],SUBL,&residual[n*SUBL]) } /*這個(gè)函數(shù)使用量化和內(nèi)插的LPC系數(shù)來進(jìn)行LPC分析濾波*/ /*此刻的剩余是例如圖3中的信號(hào)315的信號(hào)*/<!-- SIPO <DP n="15"> --><dp n="d15"/> /*找出狀態(tài)位置*/ start=FrameClassify(residual); /*這個(gè)函數(shù)以整數(shù)子幀的解析度來定位起始狀態(tài)*/ /*變量start表示整數(shù)個(gè)子塊中信號(hào)317,318(圖4)的開始*/ /*檢查狀態(tài)是否在2個(gè)子幀的第1或最末部分*/ diff=STATE_LEN-TATE_SHORT_LEN; en1=0; index=(START-1)*SUBL; for(i=0;i<STATE_SHORT_LEN;i++)en1+=residual[INDEX+i]*residual[INDEX+i]; en2=0; index=(start-1)*SUBL+diff; for(i=0;i<STATE_SHORT_LEN;i++)en2+=residual[index+i]*residual[INDEX+i]; if(en1>en2){ state-first=1; start_pos=(start-1)*SUBL; }else( state-first=0; start_pos=(start-1)*SUBL+diff; } /*變量start_pos現(xiàn)表示在整數(shù)數(shù)量的取樣中的信號(hào)325(圖4)的開始*/ /*狀態(tài)的標(biāo)量量化*/ StateSearchW(&residual[start_pos], &syntdenum[(start-1)*(FILTERORDER+1)], &weightnum[(start-1)*(FILTERORDER+1)], &weightdenum[(start-1)*(FILTERORDER+1)], &idxForMax,idxVec,STATE_SHORT_LEN); /*這個(gè)函數(shù)對(duì)起始狀態(tài)進(jìn)行編碼(詳見本說明書的上文)*/<!-- SIPO <DP n="16"> --><dp n="d16"/> StateConstructW(idxForMax,idxVec, &syntdenum[(start-1)*(FILTERORDER+1)), &decresidual[start_pos],STATE_SHORT_LEN); /*這個(gè)函數(shù)對(duì)起始狀態(tài)進(jìn)行解碼*/ /*此刻的解碼剩余含有例如圖7中的信號(hào)715那樣的信號(hào)*/ /*狀態(tài)中的預(yù)測量化*/ if(state-first){/*將自適應(yīng)部分放在最末*/ /*設(shè)置存儲(chǔ)器*/ memset(mem,0,(MEML-STATE_SHORT_LEN)*sizeof(float)); memcpy(mem+MEML-STATE_SHORT_LEN, decresidual+start_pos,STATE_SHORT_LEN*sizeof(float)); memset(weightState,0,F(xiàn)ILTERORDER*sizeof(float)); /*對(duì)子幀進(jìn)行編碼*/ iCB Search{extra_cb_index,extra_gain_index, &residual[start_pos+STATE_SHORT_LEN], mem+MEML-stMemL,stMemL,diff,NSTAGES, &syntdenum[(start-1)*(FILTERORDER+1)], &weightnum[(start-1)*(FILTERORDER+1)], &weightdenum[(start-1)*(FILTERODER+1)],weightState}; /*這個(gè)函數(shù)進(jìn)行整形和增益指數(shù)的加權(quán)的多級(jí)搜索*/ /*構(gòu)建解碼的向量*/ iCBConstruct{&decresidual[start_pos+STATE_SHORT_LEN],extra_cb_index,extra_gain_index,mem+MEML-stMemL,stMemL,diff,NSTAGES); /*這個(gè)函數(shù)對(duì)多級(jí)編碼進(jìn)行解碼*/ }<!-- SIPO <DP n="17"> --><dp n="d17"/> else(/*將自適應(yīng)部分放在開始*/ /*創(chuàng)建用于預(yù)測的逆向量*/ for(k=o;k<diff;k++){ reverseResidual[k]=residual[(start+1)*SUBL-1-(k+STATE_SHORT_LEN)]; reverseDecresidual[k]=decresidual[(start+1)*SUBL-1-(k+STATE_SHORT_LEN)]; } /*設(shè)置存儲(chǔ)器*/ meml_gotten=STATE_SHORT_LEN; for(k=0;k<meml_gotten;k++){mem[MEML-L-K]=decresidual[start_pos+k];} memset(mem,0,(MEML-k)*sizeof(float)); memset(weightState,0,F(xiàn)ILTERORDER*sizeof(float)); /*對(duì)子幀進(jìn)行編碼*/ iCBSearch(extra_cb_index,extra_gain_index,reverseResidual,mem+MEML-stMemL,stMemL,diff,NSTAGES, &syntdenum[(start-1)*(FILTERORDER+1)], &weightnum[(stat-1)*(FILTERORDER+1)], &weightdenum[(start-1)*(FILTERORDER+1)],weightState); /*構(gòu)建解碼的向量*/ iCBConstruct(reverseDecresidual,extra_cb_index,extra_gain_index,MEM+MEML-STMEML,stMemL,diff,NSTAGES); /*從逆向量中得到解碼剩余*/ for(k=0;k<diff;k++){ decresidual[start_pos-l-k]=reverseDecresidual[k];<!-- SIPO <DP n="18"> --><dp n="d18"/> } } /*此刻的解碼剩余含有例如圖7中的信號(hào)725那樣的信號(hào)*/ /*預(yù)測子幀的計(jì)數(shù)器*/subcount=0; /*正向子幀的預(yù)測*/ Nfor=NSUB-start-1; if(Nfor>0){ /*設(shè)置存儲(chǔ)器*/ memset(mem,0,(MEML-STATELEN)*sizeof(float)); memcpy(mem+MEML-STATE_LEN,decresidual+(start-1)*SUBL,STATE_LEN*sizeof(float)); memset(weightState,0,F(xiàn)ILTERORDER*sizeof(float)); /*在子幀上循環(huán)而編碼*/ for(subframe=0;subframe<Nfor;SUBFRAME++){ /*編碼子幀*/ iCBSearch(cb_index+subcount*NSTAGES, gain_index+subcount*NSTAGES, &residual[(start+1+subframe)*SUBL], mem+MEML-memLf[subcount],memLf[subcount],SUBL,NSTAGES, &syntdenum[(start+1+subframe)*(FILTERORDER+1)], &weightnum[(start+1+subframe)*(FILTERORDER+1)], &weightdenum[(start+1+subframe)*(FILTERORDER+1)],weightState); /*構(gòu)建解碼的向量*/ iCBConstruct(&decresidual[(start+1+subframe)*SUBL],cb_index+subcount*NSTAGES,gain_index+subcount*NSTAGES,mem+MEML-memLf[subcount],memLf[subcount],SUBL,NSTAGES);<!-- SIPO <DP n="19"> --><dp n="d19"/> /*更新存儲(chǔ)器*/ memcpy(mem,mem+SUBL,(MEML-SUBL)*sizeof(float)); memcpy(mem+MEML-SUBL,&decresidual[(start+1+subframe)*SUBL],SUBL*sizeof(float)); memset(weightState,0,F(xiàn)ILTERORDER*sizeof(float));subcount++; } } /*此刻的解碼剩余含有例如圖7中的信號(hào)735那樣的信號(hào)*/ /*子幀的反向預(yù)測*/ Nback=start-1; if(Nback>0){ /*創(chuàng)建逆次序向量*/ for(n=0;n<Nback;n++){ for(k=0;K<LT;SUBL;k++){ reverseResidual[N*SUBL+k]=residual[(start-1)*SUBL-1-n*SUBL-k]; reverseDecresidual[N*SUBL+k]=decresidual[(start-1)*SUBL-1-n*SUB-k];} /*設(shè)置存儲(chǔ)器*/ meml_gotten=SUBL*(NSUB+1-start); if(meml_gotten>MEML){meml_gotten=MEML;} for(k=0;k<meml_gotten;k++){mem[MEML-1-k]=decresidual[(start-1)*SUBL+k];} memset(mem,0,(MEML-k)*sizeof(float)); memset(weightState,0,F(xiàn)ILTERORDER*sizeof(float)); /*在子幀上循環(huán)而編碼*/ for(subframe=0;subframe<Nback;subframe++){<!-- SIPO <DP n="20"> --><dp n="d20"/> /*對(duì)子幀進(jìn)行編碼*/ iCBSearch(cb_index+subcount*NSTAGES, gain_index+subcount*NSTAGES, &reverseResidual[subframe*SUBL], mem+MEML-memLf[subcount],memLf[subcount],SUBL,NSTAGES, &syntdenum[(start-1-subframe)*(FILTERORDER+1)], &weightnum[(start-1-subframe)*(FILTERORDER+1)], &weightdenum[(start-1-subframe)*(FILTERORDER+1)],weightState); /*構(gòu)建解碼的向量*/ iCBConstruct(&reverseDecresidual[subframe*SUBL],cb_index+subcount*NSTAGES,gain_indexl+subcount*NSTAGES,mem+MEML-memLf[subcount],memLf[subcount],SUBL,NSTAGES); /*更新存儲(chǔ)器*/ memcpy(mem,mem+SUBL,(MEML-SUBL)*sizeof(float)); memcpy(mem+MEML-SUBL,&reverseDecresidual[subframe*SUBL], SUBL*sizeof(float)); memset(weightState,0,F(xiàn)ILTERORDER*sizeof(float));subcount++;} /*從逆向量中得到解碼剩余*/ for(i=0;i<SUBL*Nback;i++) decresidual[SUBL*Nback-i-1]=reverseDecresidual[i]; } /*此刻的解碼剩余含有例如圖7中的信號(hào)745那樣的信號(hào)*/ ..將信息打包成字節(jié) } 加權(quán)的自適應(yīng)密碼本搜索 在已說明的正向和反向編碼程序中,自適應(yīng)密碼本搜索可在非加權(quán)的剩余域中進(jìn)行,或可應(yīng)用現(xiàn)有的綜合分析加權(quán)。我們?cè)谶@里詳細(xì)說明適用于自適應(yīng)密碼本的第3方法。這種方法提供了綜合分析的替代選擇,并給出了性能和計(jì)算復(fù)雜度之間的良好折衷。該方法包括在構(gòu)建自適應(yīng)密碼本之前的自適應(yīng)密碼本存儲(chǔ)器和目標(biāo)信號(hào)的預(yù)加權(quán),以及之后的搜索密碼本指數(shù)。
這種方法與綜合分析比較其優(yōu)點(diǎn)在于對(duì)密碼本存儲(chǔ)器的加權(quán)濾波導(dǎo)致較少的計(jì)算,少于自適應(yīng)密碼本的綜合分析編碼的零狀態(tài)濾波器迭代(recursion)所需的計(jì)算。這個(gè)方法的缺陷在于加權(quán)密碼本向量會(huì)具有零輸入分量,其是來自密碼本存儲(chǔ)器中的過去取樣,而不像在綜合分析中那樣是來自解碼的信號(hào)的過去取樣。這個(gè)負(fù)面影響可通過這樣設(shè)計(jì)加權(quán)濾波器來壓低即讓加權(quán)濾波器在密碼本向量的長度上、與零狀態(tài)分量相比在零輸入分量上具有低能量。A(z/L1)/(Aq(z)*Aq(z/L2))形式的加權(quán)濾波器的有利的參數(shù)是設(shè)置L1=1.0和L2=0.4。
第3方法的實(shí)施以圖8來表示。首先自適應(yīng)密碼本存儲(chǔ)器815和量化目標(biāo)816在時(shí)間820上銜接(concatenate),結(jié)果得到緩沖825。這個(gè)緩沖器接著使用加權(quán)LPC系數(shù)836來加權(quán)濾波的830。加權(quán)緩沖器835接著分離840為對(duì)應(yīng)于存儲(chǔ)器和對(duì)應(yīng)于目標(biāo)的時(shí)間取樣。加權(quán)的存儲(chǔ)器845接著被用來搭建自適應(yīng)密碼本850。如本領(lǐng)域的技術(shù)人員所熟知的,自適應(yīng)密碼本855不需要與加權(quán)存儲(chǔ)器845在物理存儲(chǔ)器位置上不同,因?yàn)闀r(shí)移密碼本向量與存儲(chǔ)器緩沖中的時(shí)移取樣可由相同方式來尋址。
以下是用于加權(quán)密碼本搜索的這個(gè)第3方法的C代碼示例實(shí)施。
void iCBSearch(/*自適應(yīng)密碼本搜索*/ int*index,/*(o)向量l指數(shù)。這是圖8中的信號(hào)865*/ int*gain_index,/*(o)向量增益指數(shù)。這是圖8中的信號(hào)866*/ float*target,/*(i)量化目標(biāo)。這是圖8中的信號(hào)816*/ float*mem,/*(i)自適應(yīng)密碼本的存儲(chǔ)器。這是圖8中的信號(hào)815*/ int 1Mem,/*(i)存儲(chǔ)器的長度*/ int 1Target,/*(i)目標(biāo)向量的長度*/ int nStages,/*(i)量化級(jí)數(shù)*/ float*weightDenum,/*(i)加權(quán)濾波器分母系數(shù)。這是圖8中的信號(hào)836*/ float*weightState/*(i)用于目標(biāo)濾波的加權(quán)濾波器的狀態(tài)。這是圖8中的<!-- SIPO <DP n="22"> --><dp n="d22"/>濾波830的狀態(tài)*/ ) ( int i,j,icount,stage,best_index; float max_measure,gain,measure,crossDot,invDot; float gains[NSTAGES]; float cb[(MEML+SUBL+1)*CBEXPAND*SUBL]; int base_index,sInd,eInd,base_size; /*用于加權(quán)*/ float buf[MEML+SUBL+2*FILTERORDER]; base_size=1Mem-1Target+1; if(1Target==SUBL) base size=1Mem-1Target+1+1Target/2; memcpy(buf,weightState,sizeof(float)*FILTERORDER); memcpy(&buf[FILTERORDER],mem,1Mem*sizeof(float)); memcpy(&buf[FILTERORDER+1Mem],target,1Target*sizeof(float)); /*此刻的buf是圖8中的信號(hào)825*/ AllPoleFilter(&buf[FILTERORDER],weightDenum,1Mem+1Target,F(xiàn)ILTERORDER); /*這個(gè)函數(shù)對(duì)buf做全極性濾波。所得結(jié)果返回到buf中。這是圖8中的函數(shù)830*/ /*此刻的buf是圖8中的信號(hào)835*/ /*構(gòu)建所需的CB和目標(biāo)*/ createCB(&buf[FILTERORDER],cb,1Mem,1Target); memcpy(target,&buf[FILTERORDER+LMEM],1Target*sizeof(float)); /*此刻的目標(biāo)是圖8中的信號(hào)846而cb是圖8中的信號(hào)855*/ /*級(jí)上的主循環(huán)*/<!-- SIPO <DP n="23"> --><dp n="d23"/> /*此循環(huán)執(zhí)行圖8中的函數(shù)860*/ for(stage=0;stage<nStages;stage++){ max_measure=(float)-10000000.0; bes_index=0; for(icount=0;icount<base_size;icount++){ crossDot=0.0; invDot=0.0; for(j=0;j<1Target;j++){ crossDot+=target[j]*cb[icount*1Target+j]; invDot+=cb[icount*1Target+j]*cb[icount*1Target+j]; } invDot=(float)1.0/(invDot+EPS); if(stage==0){ measure=(float)-10000000.0; if(crossDot>0.0) measure=crossDot*crossDot*invDot; } else{ measure=crossDot*crossDot*invDot; } if(measure>max_measure){ best_index=icount; max_measure=measure; gain=crossDot*invDot; } } base_index=best_index; if(RESRANGE=-1){/*無限制搜索*/ sInd=0; eInd=base_size-1;<!-- SIPO <DP n="24"> --><dp n="d24"/> } else{ sInd=base_index-RESRANGE/2; if(sInd<0)sInd=0; eInd=sInd+RESRANGE; if(eInd>=base_size){ eInd=base_size-1; sInd=eInd-RESRANGE; } } for(i=1;I<CBEXPAND;I++){ sInd+=base_size; eInd+=base_size; for(icount=sInd;icount<=eInd;icount++){ crossDot=0.0; invDot=0.0; for(j=0;j<1Target;j++){ crossDot+=target[j]*CB[icount*1Target+j]; invDot+= cb[icount*1Target+j]*CB[icount*1Target+j]; } invDot=(float)1.0/(invDot+EPS); if(stage=0){ measure=(float)-10000000.0; if(crossDot>0.0) measure=crossDot*crossDot*invDot; ) else{ measure=crossDot*crossDot*invDot; }if(measure>max_measure){ best_index=icount;<!-- SIPO <DP n="25"> --><dp n="d25"/> max_measure=measure; gain=crossDot*invDot; } } } index[stage]=best_index; /*index是圖8中的信號(hào)865*/ /*增益量化*/ if(stage==0){ if(gain<0.0)gain=0.0; if(gain>1.0)gain=1.0; gain=gainquant(gain,1.0,1 6,&gain_index[stage]); /*這個(gè)函數(shù)搜索增益量化的最佳指數(shù)*/ /*gain_index是圖8中的信號(hào)866*/ } else{ if(fabs(gain)>fabs(gains[stage-1])){ gain=gain*(float)fabs(gains[stage-1])/(float)fabs(gain); } gain=gainquant(gain,(float)fabs(gains[stage-1]),8,&gain_index[stage]); /*這個(gè)函數(shù)搜索增益量化的最佳指數(shù)*/ /*gain_index是圖8中的信號(hào)866*/ } /*更新目標(biāo)*/ for(j=0;j<1Target;j++)target[j]-=gain*cb[index[stage]*1Target+j]; gains[stage]=gain; }/*結(jié)束主循環(huán)for(stage=0;…*/ } 解碼器 本發(fā)明所涵蓋的解碼器是任何與根據(jù)上述的編碼器合作的解碼器。這種解碼器將從編碼數(shù)據(jù)中提取起始狀態(tài)的位置。它將對(duì)起始狀態(tài)進(jìn)行解碼,并將它用作用來對(duì)剩余信號(hào)幀進(jìn)行解碼的存儲(chǔ)器的初始化。在沒有接收到數(shù)據(jù)分組的情況下,分組丟失彌補(bǔ)是很有利的。
以下是解碼器的C代碼示例實(shí)施。
void ILBC_decode(/*主解碼器函數(shù)*/float*decblock,/*(o)解碼的信號(hào)塊*/unsigned char*bytes,/*(i)編碼的信號(hào)位*/ int bytes_are_good/*(i)若字節(jié)是正確的數(shù)據(jù)則為1否則為0*/ ){ float reverseDecresidual[BLOCKL],mem[MEML]; int n,k,meml_gotten,Nfor,Nback,i; int diff,start_pos; int subcount,subframe; float factor; float std_decresidual,one_minus_factor_scaled; int gaussstart; diff=STATE LEN-TATE_SHORT_LEN; if(state_first==1)start_pos=(start-1)*SUBL; else start_pos=(start-1)*SUBL+diff; StateConstructW(idxForMax,idx Vec, &syntdenum[(start-1)*(FILTERORDER+1)], &decresidual[start_pos],STATE_SHORT_LEN); /*這個(gè)函數(shù)對(duì)起始狀態(tài)進(jìn)行解碼*/ if(state_first){/*將自適應(yīng)部分放在最末*/<!-- SIPO <DP n="27"> --><dp n="d27"/> /*設(shè)置存儲(chǔ)器*/ memset(mem,0,(MEML-STATE_SHORT_LEN)*sizeof(float)); memcpy(mem+MEML-STATE_SHORT_LEN,decresidual+start_pos,STATE_SHORT_LEN*sizeof(float)); /*構(gòu)建解碼向量*/ iCBConstruct(&decresidual[startpos+STATE_SHORT_LEN], extra_cb_index,extra_gain_index, mem+MEML-stMemL,stMemL,diff,NSTAGES); /*這個(gè)函數(shù)對(duì)剩余的幀進(jìn)行解碼*/ } else{/*將自適應(yīng)部分放在開始*/ /*創(chuàng)建用于預(yù)測的逆向量*/ for(k=0;k<diff;k++){ reverseDecresidual[K]=decresidual[(start+1)*SUBL-1-(K+STATE_SHORT_LEN)]; } /*設(shè)置存儲(chǔ)器*/ meml_gotten=STATE_SHORT_LEN; for(k=0;k<meml_gotten;k++){MEM[MEML-l-k]=decresidualstart_pos+k}; memset(mem,0,(MEML-k)*sizeof(float)); /*構(gòu)建解碼的向量*/ iCBConstruct(reverseDecresidual,extra_cb_index,extra_gain_index,mem+MEML-stMemL,stMemL,diff,NSTAGES); /*從逆向量中得到解碼的剩余*/ for(k=0;k<diff;k++){<!-- SIPO <DP n="28"> --><dp n="d28"/> decresidual[start_pos-l-k]=reverseDecresidual[K]; } } /*用于預(yù)測子幀的計(jì)數(shù)器*/ subcount=0; /*遞交子幀的預(yù)測*/ Nfor=NSUB-start-1; if(Nfor>0){ /*設(shè)置存儲(chǔ)器*/ memset(mem,0,(MEML-STATE_LEN)*sizeof(float)); memcpy(MEM+MEML-STATE_LEN,decresidual+(start-1)*SUBL,STATE_LEN*sizeof(float)); /*在要編碼的子幀上的循環(huán)*/ for(subframe=0;subframe<Nfor;subframe++){ /*構(gòu)建解碼的向量*/ iCBConstruct(&decresidual[(start+1+subframe)*SUBL],cb_index+subcount*NSTAGES,gain_index+subcount*NSTAGES,mem+MEML-memLf[subcount],memLf[subcount],SUBL,NSTAGES); /*更新存儲(chǔ)器*/ memcpy(mem,mem+SUBL,(MEML-SUBL)*sizeof(float)); memcpy(mem+MEML-SUBL,&decresdiaul[(start+1+subframe)*SUBL],SLBL*sizeof(float)); subcount++; } }<!-- SIPO <DP n="29"> --><dp n="d29"/> /*子幀的反向預(yù)測*/ Nback=start-1; if(Nback>0){ /*創(chuàng)建逆次序向量*/ for(n=0;n<Nback;n++){ for(k=0;K<SUBL;K++){ reverseDecresidual[n*SUBL+k]=decresidual[(start-l)*SUBL-1-n*SUBL-k]; } } /*設(shè)置存儲(chǔ)器*/ meml_gotten=SUBL*(NSUB+L-START); if(meml_gotten>MEML){meml_gotten=MEML;} for(k=0;K<meml_gotten;k++){mem[MEML-l-k]=decresidual[(start-l)*SUBL+k];} memset(mem,0,(MEML-k)*sizeof(float)); /*在要解碼的幀上的循環(huán)*/ for(subframe=0;subframe<Nback;subframe++){ /*構(gòu)建解碼的向量*/ iCBConstruct(&reverseDecresidual[subframe*SUBL],cb_index+subcount*NSTAGES,gain_index+subcount*NSTAGES,mem+MEML-memLf[subcount],memLf[subcount],SUBL,NSTAGES); /*更新存儲(chǔ)器*/ memcpy(mem,mem+SUBL,(MEML-SUBL)*sizeof(float)); memcpy(mem+MEML-SUBL,&reverseDecresidual[subframe*SUBL],SUBL*sizeof(float));<!-- SIPO <DP n="30"> --><dp n="d30"/> subcount++; } /*從逆向量中得到解碼的剩余*/ for(i=0;i<SUBL*Nback;i++) decresidual[SUBL*Nback-i-1]=reverseDecresidual[i]; } factor=(float)(gc_index+1)/(float)16.0; for(i=0;i<STATE_SHORT_LEN;i++)decresidual[startpos+i]*=factor; factor*=1.5; if(factor<1.0){ std_decresidual=0.0; for(i=0;i<BLOCKL;i++)std_decresidual+=decresidual[i]*decresidual[i]; std_decresidual/=BLOCKL; std_decresidual=(float)sqrt(std_decresidual); one_minus_factor_scaled=(float)sqrt(1-factor*factor)*std_decresidual; gaussstart=(int)ceil(decresidual
)%(GAUSS_NOISE_L-BLOCKL); for(i=0;i<BLOCKL;i++)decresidual[i]+= one_minus_factor_scaled*gaussnoise[gaussstart+i]; } } void iLBC_decode(float*decblock,unsigned char*bytes,intbytes_are_good) { static float old_syntdenum[(FILTERORDER+1)*NSUB]={<!-- SIPO <DP n="31"> --><dp n="d31"/> 1,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0); static int last_lag=20; float data[BLOCKL]; float lsfunq[FILTERORDER*LPC_N]; float PLCresidual[BLOCKL],PLClpc[FILTERORDER+1]; float zeros[BLOCKL],one[FILTERORDER+1]; int k,kk,i,start,idxForMax; int idxVec[STATE_LEN]; int dummy=0,check; int gain_index[NASUB*NSTAGES],extra_gain_index [NSTAGES]; int cb_index[NSTAGES*NASUB],extra_cb_index[NSTAGES]; int lsf_i[LSF_NSPLIT*LPC_N]; int state_first,gc_index; unsigned char*pbytes; float weightnum[(FILTERORDER+1)*NSUB],weightdenum[(FILTERORDER+1)*NSUB]; int order plus one; if(bytes_are_good){ ..從字節(jié)中提取參數(shù) SimplelsfUNQ(lsfunq,lsf-i); /*這個(gè)函數(shù)對(duì)LSF域中的LPC系數(shù)進(jìn)行解碼*/ check=LSF_check(lsfunq,F(xiàn)ILTERORDER,LPCN); /*這個(gè)函數(shù)檢查LPC濾波器的穩(wěn)定性*/ DecoderInterpolateLSF(syntdenum,lsfunq,F(xiàn)ILTERORDER); /*這個(gè)函數(shù)在塊上內(nèi)插LPC濾波器*/<!-- SIPO <DP n="32"> --><dp n="d32"/> Decode(decresidual,start,idxForMax,idxVec,syntdenum,cb_index,gain_index,extra_cb_index,extra_gain_index,state_first,gc_index); /*這個(gè)函數(shù)包含于上*/ /*準(zhǔn)備plc用于未來的損失*/ doThePLC(PLCresidual,PLClpc,0,decresidual,syntdenum+(FILTERORDER+1)*(NSUB-1),NSUB,SUBL,last_lag,start); /*這個(gè)函數(shù)處理分組損失彌補(bǔ)*/ memcpy(decresidual,PLCresidual,BLOCKL*sizeof(float));}else{ /*分組損失彌補(bǔ)*/ memset(zeros,0,BLOCKL*sizeof(float)); one
=1; memset(one+1,0,F(xiàn)ILTERORDER*sizeof(float)); start=0; doThePLC(PLCresidual,PLClpc,1,zeros,one,NSUB,SUBL,last_lag,start); memcpy(decresidual,PLCresidual,BLOCKL*sizeof(float)); order_plus_one=FILTERORDER+1; for(i=0;i<NSUB;i++) memcpy(syntdenum+(i*order_plus_one)+1,PLClpc+1,F(xiàn)ILTERORDER*sizeof(float)); ) ..解碼的剩余的后濾波 for(i=0;I<NSUB;i++) syntFilter(decresidual+I*SUBL,syntdenum+i*(FILTERORDER+1),SUBL); /*這個(gè)函數(shù)進(jìn)行解碼的剩余的綜合濾波*/memcpy(decblock,decresidual,BLOCKL*sizeof(float));memcpy(old_syntdenum,syntdenum,NSUB*(FILTERORDER+1)*sizeof(float));}
權(quán)利要求
1.一種對(duì)被劃分為連續(xù)的塊的信號(hào)進(jìn)行編碼的方法,其中該方法包括應(yīng)用于塊的以下步驟
對(duì)該塊的第一部分進(jìn)行編碼,該第一部分位于該塊的兩端邊界之間的某處,從而獲得該塊的編碼的起始狀態(tài);
使用基于所述編碼的起始狀態(tài)的預(yù)測編碼方法對(duì)該塊的第二部分進(jìn)行編碼,并朝所述兩端邊界之一的方向逐步地對(duì)所述第二部分進(jìn)行編碼;和
確定在所述起始狀態(tài)和所述兩端邊界的另一個(gè)之間是否存在任何信號(hào)取樣,如果存在,則使用基于所述編碼的起始狀態(tài)的預(yù)測編碼方法對(duì)包括這些取樣的該塊的第三部分進(jìn)行編碼,并朝所述兩端邊界的另一個(gè)的方向逐步地對(duì)所述第三部分進(jìn)行編碼,從而所述第三部分相對(duì)于與該塊關(guān)聯(lián)的時(shí)間軸,與所述第二部分的編碼相比是以相反方向編碼的。
2.根據(jù)權(quán)利要求1所述的方法,其中對(duì)所述第三部分的編碼除了基于所述編碼的起始狀態(tài),還基于該塊的編碼的第二部分的至少一部分。
3.根據(jù)權(quán)利要求1或2所述的方法,其中所述第二部分沿著所述時(shí)間軸朝位于該塊末端的所述兩端邊界之一的方向進(jìn)行編碼。
4.根據(jù)權(quán)利要求1或2所述的方法,其中所述第二部分逆著所述時(shí)間軸朝位于該塊開始的所述兩端邊界之一的方向進(jìn)行編碼。
5.根據(jù)權(quán)利要求1~4的任何一個(gè)所述的方法,其中該起始狀態(tài)的編碼基于任何其中編碼不取決于或使之不取決于該信號(hào)的任何先前的編碼的塊的編碼方法。
6.根據(jù)權(quán)利要求1~5的任何一個(gè)所述的方法,其中所述第二和第三部分的預(yù)測編碼包括從激勵(lì)域到編碼的信號(hào)域的綜合濾波的附加步驟。
7.根據(jù)權(quán)利要求1~5的任何一個(gè)所述的方法,其中所述信號(hào)是分析濾波的數(shù)字信號(hào)的剩余信號(hào)。
8.根據(jù)權(quán)利要求7所述的方法,其中該起始狀態(tài)的編碼基于具有噪聲整形的預(yù)測編碼,使得其預(yù)測編碼不取決于在相應(yīng)于該塊的所述第一部分的剩余信號(hào)的部分之前的剩余信號(hào)的任何編碼部分。
9.根據(jù)權(quán)利要求1~8的任何一個(gè)所述的方法,其中該起始狀態(tài)在編碼之前進(jìn)行全通濾波,以便在該起始狀態(tài)的取樣之中更平均地分配能量。
10.根據(jù)權(quán)利要求1~9的任何一個(gè)所述的方法,其中該方法以將應(yīng)用于塊的同樣步驟應(yīng)用于子塊的方式來對(duì)由塊的所述第一部分組成的子塊進(jìn)行編碼,從而使用迭代編碼。
11.根據(jù)權(quán)利要求1~10的任何一個(gè)所述的方法,包括將該塊分割成一組連續(xù)的間隔,其中該塊的所述第一部分的編碼包括對(duì)兩端邊界之間的一個(gè)或更多連續(xù)的間隔進(jìn)行編碼,以獲得所述編碼的起始狀態(tài)。
12.根據(jù)權(quán)利要求11所述的方法,其中所述一個(gè)或更多連續(xù)的間隔是在具有最高信號(hào)能量的那些間隔之中選擇的。
13.根據(jù)權(quán)利要求1~12的任何一個(gè)所述的方法,其中第二和第三部分的編碼基于以下任何編碼方法線性預(yù)測編碼(LPC);代碼激勵(lì)線性預(yù)測(CELP);具有一個(gè)或更多自適應(yīng)密碼本級(jí)的CELP;自激勵(lì)線性預(yù)測(SELP);或多脈沖線性預(yù)測編碼(MP-LPC)。
14.根據(jù)權(quán)利要求1~13的任何一個(gè)所述的方法,其中第二和第三部分的編碼基于在自適應(yīng)密碼本的構(gòu)建之前的自適應(yīng)密碼本存儲(chǔ)器和目標(biāo)信號(hào)的預(yù)加權(quán)。
15.根據(jù)權(quán)利要求1~14的任何一個(gè)所述的方法,其中所述信號(hào)是語音信號(hào)。
16.根據(jù)權(quán)利要求1~14的任何一個(gè)所述的方法,其中所述信號(hào)是音頻信號(hào)。
17.一種用來對(duì)被劃分為連續(xù)的塊的信號(hào)進(jìn)行預(yù)測編碼的設(shè)備,其中該設(shè)備包括裝置,該裝置用來對(duì)每個(gè)所述塊執(zhí)行根據(jù)權(quán)利要求1~16的任何一個(gè)所述的方法的步驟。
18.一種計(jì)算機(jī)可讀媒體,其存儲(chǔ)了用來對(duì)被劃分為連續(xù)的塊的信號(hào)進(jìn)行預(yù)測編碼的計(jì)算機(jī)可執(zhí)行組件,其中該計(jì)算機(jī)可執(zhí)行組件對(duì)每個(gè)所述塊執(zhí)行根據(jù)權(quán)利要求1~16的任何一個(gè)所述的方法的步驟。
19.一種對(duì)編碼信號(hào)進(jìn)行解碼的方法,其中在編碼端的信號(hào)在每個(gè)塊的編碼之前被劃分為連續(xù)的塊,其中該方法包括應(yīng)用于編碼塊的用于再生對(duì)應(yīng)的解碼塊的以下步驟
對(duì)編碼的起始狀態(tài)進(jìn)行解碼,用來再生位于要再生的塊的兩端邊界之間的某處的起始狀態(tài);
使用基于所述起始狀態(tài)的預(yù)測解碼方法,對(duì)該塊的編碼的第二部分進(jìn)行解碼,用于逐步地朝所述兩端邊界之一的方向再生所述第二部分;和
確定編碼塊是否包括編碼的第三部分,如果包括,則使用基于所述起始狀態(tài)的預(yù)測解碼方法對(duì)該編碼第三部分進(jìn)行解碼,用來逐步地朝所述兩端邊界的另一個(gè)方向再生第三部分,從而所述第三部分相對(duì)于與該塊相關(guān)聯(lián)的時(shí)間軸,與塊的第二部分的再生相比是以相反方向再生的。
20.根據(jù)權(quán)利要求19所述的方法,其中所述第三部分的解碼除了基于所述起始狀態(tài),還基于該塊的解碼的第二部分的至少一部分。
21.根據(jù)權(quán)利要求19或20所述的方法,其中所述第二部分沿著所述時(shí)間軸朝位于塊末端的所述兩端邊界之一的方向進(jìn)行再生。
22.根據(jù)權(quán)利要求19或20所述的方法,其中所述第二部分逆著所述時(shí)間軸朝位于塊開始的所述兩端邊界之一的方向進(jìn)行再生。
23.根據(jù)權(quán)利要求19~22的任何一個(gè)所述的方法,其中對(duì)該起始狀態(tài)的解碼基于任何其中再生起始狀態(tài)不取決于信號(hào)的任何先前的再生部分的解碼方法。
24.根據(jù)權(quán)利要求19~23的任何一個(gè)所述的方法,其中所述第二和第三部分的解碼包括從激勵(lì)域到解碼的信號(hào)域的綜合濾波的附加步驟,該第二和第三部分的綜合濾波是以與該塊的第二和第三部分的再生相同的順序執(zhí)行的。
25.根據(jù)權(quán)利要求19~23的任何一個(gè)所述的方法,其中所述信號(hào)是分析濾波的數(shù)字信號(hào)的剩余信號(hào)。
26.根據(jù)權(quán)利要求19~25的任何一個(gè)所述的方法,其中所述第一、第二和第三部分的解碼之后是從激勵(lì)域到解碼的信號(hào)域的綜合濾波的附加步驟,其中該塊的綜合濾波是以在時(shí)間上首先出現(xiàn)的所述兩端邊界之一到在時(shí)間上較晚出現(xiàn)的另一邊界的順序執(zhí)行的。
27.根據(jù)權(quán)利要求25或26所述的方法,其中第一部分的解碼基于具有噪聲整形的預(yù)測編碼,其解碼再生起始狀態(tài)不取決于在相應(yīng)于所述起始狀態(tài)的剩余信號(hào)的部分之前的剩余信號(hào)的任何先前的再生部分。
28.根據(jù)權(quán)利要求19~27的任何一個(gè)所述的方法,其中起始狀態(tài)是在所述第一部分的所述解碼之后的被全通濾波,以便進(jìn)一步地集中能量。
29.根據(jù)權(quán)利要求19~28的任何一個(gè)所述的方法,其中該方法以將應(yīng)用于塊的同樣步驟應(yīng)用于子塊的方式來對(duì)由所述編碼的起始狀態(tài)組成的子塊進(jìn)行解碼,從而使用迭代解碼。
30.根據(jù)權(quán)利要求19~29的任何一個(gè)所述的方法,其中第二和第三部分的解碼基于以下任何解碼方法線性預(yù)測編碼(LPC);代碼激勵(lì)線性預(yù)測(CELP);具有一個(gè)或更多自適應(yīng)密碼本的CELP;自激勵(lì)線性預(yù)測(SELP);或多脈沖線性預(yù)測編碼(MP-LPC)。
31.根據(jù)權(quán)利要求19~30的任何一個(gè)所述的方法,其中所述信號(hào)是語音信號(hào)。
32.根據(jù)權(quán)利要求19~30的任何一個(gè)所述的方法,其中所述信號(hào)是音頻信號(hào)。
33.一種用來對(duì)編碼的信號(hào)進(jìn)行預(yù)測解碼的設(shè)備,該信號(hào)在編碼端在每個(gè)塊的編碼之前被劃分為連續(xù)的塊,其中該設(shè)備包括裝置,該裝置用來對(duì)每個(gè)編碼塊執(zhí)行根據(jù)權(quán)利要求19~32的任何一個(gè)所述的方法的步驟,以再生對(duì)應(yīng)的解碼塊。
34.一種計(jì)算機(jī)可讀媒體,其存儲(chǔ)了用來對(duì)編碼的信號(hào)進(jìn)行預(yù)測解碼的計(jì)算機(jī)可執(zhí)行組件,該信號(hào)在編碼端在每個(gè)塊的編碼之前被劃分為連續(xù)的塊,其中該計(jì)算機(jī)可執(zhí)行組件對(duì)每個(gè)編碼塊執(zhí)行根據(jù)權(quán)利要求19~32的任何一個(gè)所述的方法的步驟,以再生對(duì)應(yīng)的解碼塊。
全文摘要
本發(fā)明涉及預(yù)測編碼/解碼操作的改善,該操作是對(duì)在分組交換網(wǎng)絡(luò)上傳輸?shù)男盘?hào)執(zhí)行的。該信號(hào)是以這樣的方式逐塊編碼的即塊A-B是不取決于任何先前塊而預(yù)測編碼的。位于該塊的末端邊界A和B之間某處的起始狀態(tài)(715)使用任何適宜的編碼方法來編碼。然后圍繞該起始狀態(tài)的兩塊部分基于該起始狀態(tài)、并在彼此相反的方向上進(jìn)行預(yù)測編碼,從而結(jié)果得到塊A-B的完全編碼的顯示(745)。在解碼端,執(zhí)行對(duì)應(yīng)的解碼操作。
文檔編號(hào)G10L19/02GK1615509SQ0282718
公開日2005年5月11日 申請(qǐng)日期2002年12月3日 優(yōu)先權(quán)日2001年12月4日
發(fā)明者索倫·V·安德森, 羅爾·哈根, 巴斯蒂安·克萊杰恩 申請(qǐng)人:環(huán)球Ip音響歐洲公司, 環(huán)球Ip音響公司