(這個文檔也是07年做項目時總結的,今天共享出來)
1 AC3標准概述
AC-3技術起源於為高清晰度電視HDTV提供高質量聲音。由於電影業對聲音技術的要求越來越高,AC-3系統被要求具有5.1聲道來替代已經使用了很久的4-2-4矩陣模擬聲音系統;同時為了可靠地記錄數字聲音數據,並且不干擾原有的圖像和模擬聲音,確定壓縮碼率為320
kbps. AC-3在1993年被美國HDTV大聯盟及ACATS采用,國際電信聯盟ITU-R也采納了5.1聲道的方案。AC-3系統在設計時考慮了不同聽覺、不同地點、不同條件下的不同要求,以求能得到廣泛應用。AC-3技術包含着靈活性,它可以重現從一到五個通道的各種播放配置,再加上一個任選的低頻增強通道。AC-3方案可使用32和640kbit/s之間的可調數據率,提供優良的聲音質量,AC-3數據格式用來在已經采用了高度誤碼校正的環境中操作。歐洲MUSICAM環繞聲雖然是ISO MPEG-2的聲音標准.但從實際測試情況看,杜比AC-3的效果要強於MUSICAM,所以多數HDTV系統采用AC-3作為聲音標准。
1.1 編碼概述
編碼框圖
AC-3編碼器接受PCM音頻並產生符合本標准的數碼流。AC-3算法通過對音頻信號的頻域表達式進行粗量化,達到高的編碼增益。在編碼過程中的第一步是把音頻表達式從一個PCM時間樣本的序列變換為一個頻率系數樣本塊的序列。這在分析濾波器組中完成.512個時間樣本的互相重受樣本塊被乘以時間窗而變換到頻域。由於是相互重疊的樣本塊,每個PCM輸入樣本將表達在相繼的變換樣本塊中。頻域表達式則可以二取一,使每個樣本塊包含256個頻率系數。這些單獨的頻率系數用二進制指數記數法表達為一個二進制指數和一個尾數。這個指數的集合被編碼成信號頻譜的粗略表達式,稱為頻譜包絡。核心的比特指派例行程序用這個頻譜包絡,確定每個單獨尾數需要用多少比特進行編碼。將頻譜包絡和6個音頻樣本塊粗略量化的尾數,格式化成一個AC-3數據幀.人C-3數碼流是一個AC-3數據幀的序列。實際的AC-3編碼器比上圖中所表示的更為復雜。
1.2 解碼概述
解碼框圖
解碼過程基本上是編碼過程的逆過程。解碼器如上圖,必須同解碼數碼流同步,檢查誤碼,以及將不同類型的數據(例如編碼的頻譜包絡和量化的尾數)進行解格式化。運行比特指派例行程序,將其結果用於解數據打包和尾數的逆量化.將頻譜包絡進行解碼而產生各個指數。各個指數和尾數被變換回到時域成為解碼的PCM時間樣本。
2.AC3 碼流結構
每個AC-3幀分為三部分,即幀頭、音頻塊和幀尾。在每個同步幀開始是同步信息和比特流信息。每個同步幀包含6個編碼的音頻樣本塊,其中每個代表256個新的音頻信息。這樣,在每幀中每個聲道就包含有1536個PCM樣本信息。編碼的音頻樣本塊之后接着是一個輔助數據(AUX)字段。在每幀中有兩個CRC校驗字,分別位於幀的開頭和結尾,提供校驗信息。
2.1 幀頭
同步幀以一個16比特的同步字開始,同步字總是OxOB77,同步字的傳輸,同其他比特字段元素一樣,是左位比特在先。在幀頭中有16比特的CRC循環冗余校驗,用於校驗數據幀的前5/8。為了滿足各種業務的需要,在每幀的比特流信息中都有3比特用於指示數碼流運送的業務類型,稱為數碼流模式位(bsmod) o另有3比特表明哪些主要業務聲道正在使用中,范圍自3/2至1/0,稱為音頻編碼模式(acmod)位。聲道總數nchans在Ife聲道斷開時,等於nfchans;而在)lfe聲道接通時,等於1+nfchans。
在幀頭中另有兩比特碼用於指示Dolby環繞聲模式,即指示某節目是否按照“Dolby環繞聲”進行了編碼.該信息AC-3解碼器本身並不采用,但可用於音頻重放設備的其他部分。表中“保留”的意思是“未做指示”,解碼器將仍然重放音頻。
2.2 audblk音頻塊
每個AC-3幀中有六個音頻塊,每一個音頻塊每聲道包含256個音頻樣點,在音頻塊中包含有塊切換標志、耦合坐標、指數、比特分配參數、尾數等信息。數據在一幀內部具有共享性,例如在塊0中出現的信息可能會被該幀中后續音頻塊所利用。這樣,在后續音頻塊中若要用到之前音頻塊中已經出現的數據,可設置重復使用以前的參數標志,就可不必重傳這些數據,以達到減少數據量的目的。但對解碼器而言,帶來的后果是必須保存一幀中出現的數據,以備為后續音頻塊解碼所需,從而增加了緩沖區的開銷,
動態范圍控制字用於使碼流符合不同回放場合的需要。在AC-3編碼中、引入了聲道耦合的概念。所謂聲道耦合,指的是一些聲道在高頻可以耦合在一起,以便工作在較低比特率時,可以得到更高的編碼增益。如能做到,在編碼中通過將變換系數在包含於耦合聲道中各聲道之間取平均,來實現藕合。各被耦合聲道有一套唯一的耦合坐標,用於保存原始聲道的高頻包絡。
音頻塊中的主要部分是指數和尾數值。這里的指數包括耦合指數、聲道指數以及低頻效果聲道指數,同樣,尾數值包括耦合尾數、聲道尾數以及低頻效果聲道尾數。
2.3 幀尾
幀尾包括輔助數據字段和幀誤碼校驗字段。
不論何時編碼器從不將全部可獲得的數據用於音頻信號的編碼,在幀的最后總存在一些未用的數據。這種情況出現在假使最后的比特指派沒有用全部可獲得的比特,或假使輸入音頻信號僅僅是不需要把全部可獲得的比特都進行編碼。或者,指令編碼器有意留出一些比特不用於音頻,讓它們能用於輔助數據。因輔助數據需要的比特數少於在任一特指幀中可獲得的比特數(它們隨時間變化),提供了一種方法通過信號告知在各幀中實際輔助數據的比特數。
各AC-3數據幀包含兩個16比特CRC字,CRC1處在幀頭,緊隨在同步字之后。CRC2處在幀尾,是數據幀的最后一個16比特字,恰在下一個幀同步字之前。CRCI用於前5/8幀,不包括同步字。CRC2覆蓋后3/8幀以及全幀(不包括同步字)。
3.AC3解碼算法描述
3.1 BSI解包和輔助信息
該過程主要對比特流中不同類型的信息進行解復用,在AC3解碼函數中對應於取比特流信息和取音頻塊信息函數。該操作根據AC3標准規定的結構取出各種碼流信息,並將其復制到寄存器或專用工作存儲單元中。
3.2 指數解碼
AC3碼流傳送的實際音頻信息由量化的頻譜系數組成。而每個系數由一個指數和尾數組成。指數指示頻率系數二進制表達式中前導零的個數如圖3-5所示,AC3碼流的指數信息包含各種類型聲道的指數策略及編碼指數組,指數信息在一個數據幀內的各個音頻塊之間可以共享,即根據不同指數共享策略數據塊1到數據塊5可以重復使用以前數據塊的指數信息。AC3指數的傳輸采用差分編碼,其中聲道的第一個指數以4比特的絕對值發送,剩余相繼的指數用差分值發送,差分值必須加到上一個指數的絕對值上形成該指數的絕對值。在AC3碼流中,差分指數根據不同的指數策略(D15, D25, D45)被映射成相應的映射值,再將相鄰的三個映射值根據下面的公式組合成數據組,對於三種指數策略每個數據組的大小都固定為7比特。
編碼的7比特數據組值=(25x Ml)+(5x M2)+M3;
3.3 比特指派
比特指派對音頻信號從掩蔽效應分析它的頻譜包絡,以確定分配給各頻譜系數的尾數所需要的比特數。比特指派包含一個由頻率函數表示的人耳聽覺的參數模型,用來估算噪聲域值。在編碼器中,根據輸入信號的特性確定聽覺模型的各種參數,將模型參數同其它附帶信息傳送到解碼器。解碼器先計算出細顆粒均勻頻率標度上的輸入信號功率譜密度(PSD),再根據傳送的模型參數計算出粗顆粒頻率標度上的噪聲域值,將兩者差值用來查比特指派指針(BAP)表格的索引,查表得到比特指派指針信息。
3.4 尾數的量化和解碼
尾數的量化和解碼根據比特指派計算出的BAP值將所有尾數量化到同一等級精度上。該步驟先從碼流中取出尾數信息,再將尾數信息和指數解碼解出的頻譜指數信息組合成頻譜系數,它在AC3解碼程序中對應於取尾數信息和尾數解碼兩個子函數。在編碼器中,為壓縮音頻信息多個量化的尾數值被組合編碼成一個碼字:在解碼時,先將BAP值作為索引在量化表格中查出尾數占用的比特數,再根據該比特數將尾數從碼流中取出,由於小於等於15的尾數量化級使用對稱量化,15級以上使用非對稱量化,則兩者的量化和解碼公式分別如下公式所示:
3.5 雙聲道處理(stereo process)
在這里利用一些 stereo 的特性和聽覺的特性來消除雙聲道之間的冗余(redundancy)及不需要(irrelevance)的訊號。AC-3 里的stereo process指的就是coupling algorithm 和rematrix algorithm。Coupling algorithm 是根據聽覺特性來消除兩訊號間不需要的訊號,而rematrix algorithm 則是以stereo的特性來消除兩訊號間的冗余訊號。以下將介紹這兩種方法。
3.5.1耦合(coupling)
人類對高頻的 stereo 訊號較不敏感,所以對高頻的 stereo 訊號使用coupling策略會有相當顯著的效果。Coupling聲到的產生方式是結合兩個聲道變成一個聲道。適用的頻率范圍從3.14KHz 到21.75KHz。 coupling algorithm 主要的組件有 coupling band structure,coupling channel,coordinate,以及phase modifier。如圖所示。coupling band structure是將高頻的頻率成分切割成一些具有不同性質且不能再分割的部分。coupling channel 是由 joint 算法產生出來的 spectral envelope。Coordinate是把 coupling channel 重建回 stereo訊號的scale factor。Phase modifier是把第二個欲重建的聲道的相位轉180度,如果需要的話。
3.5.2rematrix
rematrix algorithm利用了統計上的特性,消除stereo redundancy。從統計的觀點來看,rematrix algorithm 把原本的左聲道訊號及右聲道的訊號轉換成這兩個訊號的和及這兩個訊號的差。根據訊息理論,若這新的訊號對的能量或變異數比原先的訊號對較小的話,就能以較少的位數來編碼。 Rematrix 的主要組成組件是 rematrix trigger,用來決定是否要啟動rematrix。
3.6 逆變換及加窗交疊:
逆變換即完成頻域系數到時域系數的轉換。在編碼中,從以上比特指派的分析可知,聲音的掩蔽作用與頻率子帶有關,所以有必要將輸入聲音信號分成多個子帶,分別對多個子帶進行壓縮,然后加以合成。AC3采用分析/綜合濾波器組對信號進行分割和重建。此外,編碼時輸入信號在頻域變換前先要進行加窗操作,以降低塊邊界效應對譜分析的影響;而且正弦變換在塊邊界處有固有的不連續性,會產生很大的噪聲,通過將相鄰塊的采樣值重疊50%,然后通過時域混迭消除技術(TDAC)在合成階段消除邊界效應。因此解碼過程是上述過程的逆過程,先將多個子帶的系數綜合成時域系數,將進行加窗交疊操作恢復出音頻信號。在逆變換時可選擇進行一個512點的變換或兩個256點的變換,512點的變換提供較高的頻率分辨率而256點的變換提供較高的時間分辨率,因此前者適合於對緩慢地隨時間變化的信號進行變換,后者適於對隨時間快速變換信號的轉換。編碼時,根據輸入信號的頻譜特性和時間特性自適應地選擇變換塊的長度並將其編碼在碼流中。解碼時,根據碼流的塊切換標志選擇512或256點逆變換,以X[k]表示輸入的頻譜系數,x[n]表示輸出的時間系數,則逆變換的公式如下所示。
其中0<n<K;對於512點變換K=512,對於256點變換K=256。且對於第一個短塊變換a=-1;對於長塊變換a=0;對於第二個短塊變換a=1。
3.7 向下混合:
若在重放系統中,解碼器輸出所需要的聲道數小於比特流中編碼的聲道數,則需進行向下混合。向下混合采用線性變換,即將多個聲道用標准化的系數進行線性變換后得到所需聲道數目的PCM樣本。
4 C參考代碼分析
參考Aaron Holtzman寫的libac3dec解碼代碼。系統解析簡單清晰。
流程圖如下
在int AC3_SampleConvert(sint_16 *pPcmData, uint_32 *pnPcmDataLen, uint_8* pAc3Buf, uint_32 nAc3DataLen)內部完成AC3解碼各種算法。