轉載自:http://www.vcproj.net/aac-system-algorithm-analysis/
(英語:Advanced Audio Coding,AAC),出現于1997年,基于 MPEG-2的音訊編碼技術。由Fraunhofer IIS、杜比實驗室、AT&T、Sony(新力)等公司共同開發,目的是取代MP3格式。
背景
?1997年制訂不兼容MPEG-1的音頻標準MPEG-2 NBC,即MPEG-2 AAC
?1999年MPEG-2 AAC增加LTP和PNS工具,形成MPEG-4 AAC v1
? 2002年MPEG-4 AAC v1增加了SBR和錯誤魯棒性工具,形成MPEG-4 HE-AAC
? 2004年MPEG-4 HE-AAC引入PS模塊,提升低碼率性能,形成EAAC+
技術指標
?采樣率:8kHz – 96kHz
?碼率: 8kbps – 576kbps
?聲道:最多支持48個主聲道,16個低頻增強聲道
1.1 系統框圖
編碼框圖

解碼框圖

1.2 編碼概述
其整體AAC 編解碼系統,如圖所示,其編碼流程概述如下: 為當一音頻信號送至編碼端時,會分別送至聽覺心里模型(Psychoacoustic Model)以求得編碼所需之相關參數及增益控制(gain control)模塊中,將信號做某個程度的衰減,以降低其峰值大小,如此可減少Pre-echo 的發生。之后,再以MDCT 將時域信號轉換至頻率域,而送入至TNS(Temporal Noise Shaping Module)模塊中,來判斷是否需要啟動TNS,此模塊系利用開回路預測(open-loop prediction) 來修飾其量化噪聲,如此可將其量化噪聲的分布,修飾到原始信號能量所能含蓋的范圍之下,進一步的減少Pre-echo 的發生,若TNS 被啟動,則傳出其預測差值;反之,則傳出原始頻譜值。AAC 為了提升其壓縮效率,則使用了Joint Stereo Coding與預測(Prediction)模塊來進一步消除信號間的冗余成份。在Joint Stereo Coding中又可分為Intensity Stereo Coding 與M/S Stereo Coding。在Intensity Stereo Coding模塊中,是利用信號在高頻時,人耳只對能量較敏感,對于其相位不敏感之特性,將其左右聲道之頻譜系數合并,以節省使用之位;在M/S Stereo Coding 模塊中,利用左右聲道之和與差,做進一步地壓縮,若其差值能量很小,如此便可以用較少之位編碼此一聲道,將剩余之位應用于另一聲道上的編碼,如此來提升其壓縮率。而預測模塊的主要架構是使用Backward Adaptive Predictors,利用前兩個音頻幀來預測現在的音頻幀,若決定啟動此模塊,則傳出其預測差值,如此一來可以減少其數據量,達數據壓縮之目的。經過上述處理頻譜信號上的壓縮tools程序后,則將其數據予以量化與編碼,為了達到量化編碼的最佳化,AAC 使用了雙巢狀式循環(two nested loop)的量化編碼結構,以得最佳的壓縮質量,最后則將其位串送至解碼端,而完成整個編碼程序。
為了允許其系統可對音頻質量與內存/處理功率要求之間做一舍取,因此AAC 系統提供了三種profiles:Main profile、Low Complexity(LC) profile、Scaleable Sampling Rate(SSR) profile。且每一種profile所使用的tools皆不同,下表表示其三種不同profile所需使用的tools。
Took Name |
Main |
LC |
SSR |
Noiseless |
coding |
Used |
Used |
Quantizer |
Used |
Used |
Used |
M/S |
Used |
Used |
Used |
Prediction |
Used |
Not |
Use |
Intersity/Coupling |
Used |
Not |
Use |
TNS |
Used |
Limited |
Limited |
Filter |
Bank |
Used |
Used |
Gain |
Control |
Not |
Use |
2. MPEG2 AAC碼流格式與解析
MPEG2 AAC規定了2種碼流格式ADIF和ADTS,前者用于屬于文件格式用于存儲,后者屬于流格式,用于傳輸。如圖


其中Raw_data_block為基本碼流組件,其他部分為格式信息。Raw_data_block格式如下,id_syn_ele:3位標志位,指示后面所跟著的數據流的類型。
id_syn_ele |
數據流 |
ID_SCE(0×0) |
single_channel_element() |
ID_CPE(0×1) |
channel_pair_element() |
ID_CCE(0×2) |
coupling_channel_element() |
ID_LFE(0×3) |
lfe_channel_element() |
ID_DSE(0×4) |
data_stream_element() |
ID_PCE(0×5) |
program_config_element() |
ID_FIL(0×6) |
fill_element() |
ID_DSE,ID_PCE,ID_FIL所指示的流為擴展流或用戶數據流,非核心算法區,故暫不提及。而single_channel_element(),channel_pair_element(),coupling_channel_element()
lfe_channel_element()有如下類似的結構,

individual_channel_stream的核心數據格式如下:

2.3 MPEG2 AAC 碼流數據結構層次圖
注1:虛線表示可能存在。
注2:section層只在huffman解碼時存在。
注3:短窗時windows和scalefactor band 有交織
注4:長窗(含開始窗和結束窗)windows個數和windows_group的個數都是1。
MPEG2 AAC規定1024個sample數據為一個frame,一個frame的sample從時域通過MDCT映射到頻域時由于引入50%交疊,所以變成2048個譜線。如果是長塊變換則一個frame只有一個window group,每個window group有一個window,每個window 有2048個譜線。如果是短塊變換則可能有若個window group,每個window group可能有若干個window,但是所有window group的window個數加一起一定為8個,此時每個windows 有256個譜線。注意分window group的意義在于同一個window group的譜線數據使用一個scalefactor。而每個windows又可以分為n個section(1≤n≤max_sfb(一個frame內最多的scalefactor band的個數)),每個section有若干個譜線數據(spectral data),但注意,section的邊界必須和scalefactor band的邊界重合,所以也可以說每個section有若干個scalefactor band。提出section的意義在于統一個section的譜線數據(spectral data)使用同一個huffman table編碼。
MPEG2 AAC提出的window group和section的個數都是不定的,所以編碼端要在比特流中加入相關的side info用來指示window group和section分割方法。在isc_info()中的scale_factor_grouping和section_data()中的sect_len_incr就是起到這樣的作用.
2.2 碼流解析
碼流可以分為side info的解析和壓縮數據的解析,side info解析出的狀態信息和控制信息。都使用定長碼。解碼只要按照格式解析出來即可。由于解碼簡單和篇幅限制這里就不予提及,請查閱13818-7標準語法部分。其次是對壓縮數據的解析,壓縮數據屬于無損編碼,主要是變長碼。使用熵編碼算法,后面會直接在無損編碼部分提及。查閱本文檔主要技術中無損編碼部分。
3 主要技術
3.1 Filter Bank and Block Switching
濾波器組(Filter Bank)是MPEG-2 AAC 中一個基本的組件,扮演著將音頻信號從時間域轉換至頻譜域之表示,其在解碼端則反向處理。對Filter bank而言,它必需具備對音頻編碼有著完美的重建的特性,然而,有時其音頻還原似乎不是如此完美,其主要因素在于,處理時間域轉換至頻譜域時的音頻信號,是以frame by frame 的方式送至Filter bank,也就是將目前的音頻信號切割成多個音頻幀來處理,因而會造成音頻幀間的邊緣信號,給予不同精確度的編碼,并造成信號的不連續性,都將造成日后還原時,所發生的質量影響,其這種效應,稱之為塊效應(Blocking effect),為了解決此一問題,其塊間的信號在送入filter bank 之前,一個overlapping windowing 的方式將被采用來減少其信號不連續性。
3.1.1MDCT and IMDCT
在AAC 或是其它音頻信號的編解碼器上,最普遍解決上述問題的filter bank設計,即為在編碼端上的MDCT(Modified Discrete Cosine Transform)及解碼端上的IMDCT (Inverse Modified Discrete Cosine Transform)。MDCT/IMDCT 使用了一種技術,稱為TDAC(Time Domain Aliasing Cancellation),它是使用了一種winow-overlape-add 的處理方式來消除時間域上的交迭(aliasing ),如圖2.10所示為AAC Filter bank 的框圖表示,對一個輸入音頻信號的目前音頻幀,是取前一個音頻幀的后面50%與目前輸入的音頻幀音頻值前50%做為此次處理的音頻。

MDCT 與IMDCT 的數學式子可分別表示如(2.20)、(2.21)式:
MDCT公式

IMDCT公式

3.1.2Windowing and Block Switching
對一個MDCT filter bank 的頻率響應的分辨率改善,進來的音頻信號在經MDCT 轉換前,需經過一個window function相乘后才送至MDCT。AAC 支持兩種window shapes,即sin window 及KBD(Kaiser-Bessel Derived) window,KBD window 可以比sine window 更準確的重建出原始的時間域的信號。在MPEG-2 AAC 系統中,可以允許其KBD 及sin window 的切換,來達到最好的來接受輸入信號的狀態,而得到更好的音質重建結果。
另外,MPEG-AAC 編碼器中,為了在聲音特性、編碼效率與聲音壓縮質量上取得適合的塊長度,總共提供N=256(短塊)與N=2048(長塊)兩種塊長度作為選擇。其塊的選擇,是根據聽覺心理模型(Psychoacoustic Model)的PE值來決定。通常,長塊的使用可以被選擇來減少其信號的冗余部份,并得到較高的頻率分辨率,來改善編碼質量,但是也可能對某些瞬時信號而產生問題。 一般當音頻信號在時間域上有變化較大的瞬時信號(Transient signal)時,則以連續的8個短塊來處理,可以提升在音頻壓縮時的精確度并減少pre-echo的發生;相對的,當音樂數據屬于穩態的信號(Stationary signal),則使用長塊來處理。而在長短塊轉換中,還存在著兩種緩沖塊,長塊切換到短塊必須經過起始塊(start block)才切換到短塊,從短塊切換到長塊也必須經過停止塊(stop block)才切換到長塊。下圖則顯示其塊切換方式。

3.2 Temporal Noise Shaping
由于MPEG-2 AAC 的塊大小比MPEG-1 layer3的還要大,因此,一般在處理單一長塊信號時,假如在時間上有一急遽的信號變化時,經由在時間域與頻率域上的信號轉換,再經量化后,轉回其時間域時,有可能會增加造成 pre-echo的現象發生。而pre-echo的發生,從時間域上的遮蔽效應可發現,若一較高的能量是在轉換長塊的前半部時,其經由量化所產生的噪聲,可能被postmasking 所遮蔽,但是若較高的能量是在長塊的后半部時,則散布到前半部的噪聲將無法被 premasking 所遮蔽,這就是由于對長塊而言,其在時間域上的分辨率較低,因此噪聲分布范圍超過 premasking 的遮蔽范圍,而造成量化的噪聲將被人耳所聽到,此一現象,就是稱為 pre-echo。下圖所示為pre-echo現象發生所造成時間域上信號的失真。減少 Pre-echo 現象有許多種方式,如經由動態地切換塊大小可解決此一問題,另外,在MPEG-2 AAC 中加入了TNS,也是用來減少pre-echo的現象。而TNS 概念是使每個單一塊再經過TNS編解碼后,將量化噪聲的分布能被原信號所遮蔽。

在編碼端,首先將經過 MDCT 模塊的頻域信號送入,利用 Levinson- Durbin recursion 方法取得此音頻塊的反射系數(reflection coefficients)與預測增益(prediction gain),當求得的預測增益大于MPEG2-AAC 標準中所設定的常數值,則使用TNS模塊,首先為了減少反射系數傳送所需的bit rate,將反射系數作量化,然后再經過Truncate coefficients 來調整TNS 系數的階數,開始會根據不同profile所定義的系數階數,將后面系數小于0.1的系數值舍去,來調整系數階數,使得產生的 LPC 預測系數階數少于 profile 定義的階數,最后將反射系數經過計算求出TNS 的預測系數,送入TNS filter (MA)中。如果沒有啟動TNS,則將原始的頻域譜線送出。 在編碼端只需要傳送量化后所需要的反射系數階數以及整數的索引值,而不必傳出所有反射系數的信息。給Index 及TNS order的信息將使用在解碼端,用來還原量化后的反射系數。當解碼端所接收到的反射系數階數大于 0,代表有使用TNS 編碼,在解碼端就會啟動 TNS 解碼模塊,求得編碼時的預測系數送入 TNS filter(AR)中,解碼出頻率域上信號的數據 。 加入TNS 模塊后,其也有一些side information的項目需加入至位串(bitstream)里,以提供解碼端使用,如表所示。由于 TNS 預測級數對LONG window 而言,最多為20,對SHORT window,最多為7,因此,TNS 在編碼中對side information,最多增加的位數目為:
LONG window:1+1*(2+1+6+5+1+1+4) = 97 bits
SHORT window:1+8*(1+1+4+3+1+1+7*4) = 313 bits
Side information |
位寬 |
注釋 |
TNS Present or not |
1 |
|
Number of filters |
2/1 |
長/短 窗 |
TNS coefficients resolution |
1 |
|
TNS filter length in band |
6/4 |
長/短 窗 |
TNS filter order |
5/3 |
長/短 窗 |
TNS filter direction |
1 |
|
Coefficient compress or not |
1 |
|
Bit per coefficient |
4 |
|
3.3 Joint Stereo Coding
MPEG AAC 的系統為了提升其編碼效率及壓縮質量,Joint Stereo Coding 利用了左右聲道的特性,對立體音編碼引進了兩種技術,即M/S Stereo與Intensity Stereo。
3.3.1 M/S Stereo
在MPEG-2 AAC 系統中,M/S(Mid/Side) Stereo coding被提供在多聲道信號中,每個聲道對(channel pair)的組合,也就是每個通道對,是對稱地排列在人耳聽覺的左右兩邊,其方式簡單,且對位串不會引起較顯著的負擔。 一般其在左右聲道數據相似度大時常被用到,并需記載每一頻帶的四種能量臨界組合,分別為左、右、左右聲道音頻合并(L+R)及相減(L-R)的兩種新的能量,其表示式如(2.34)式所示。然后再利用上面章節所提到聽覺心理學模型與濾波器來處理。一般,若所轉換的Sid聲道的能量較小時,M/S Stereo coding 可以節省此通道的位數,而將多余的位應用于另一個所轉換的聲道,即Mid 聲道,進而可提高此編碼效率。對M/S Stereo coding,可以選擇性地切換其在時間域上塊與塊間是否使用
的時機,其切換的旗標(ms_used)將被設定與否而傳送至解碼端上。

3.3.2 Intensity Stereo
人類聽覺系統一般對低頻信號而言,其對信號的能量與相位皆較敏感 ,相對于在高頻信號,人耳只對其能量較為敏感,而相位較不敏感。Intensity Stereo coding就是利用此一人耳的特性,被使用在高頻區域里,聲道對之間的不相關性條件下,這個方式,在過去對立體聲或多聲道編碼中已廣范地被使用,又可被稱為dynamic crosstalk 或是channel coupling 等等。其編碼是利用一因素來完成,也就是在高頻聲音組件的接收感覺,主要是依賴在他們的能量分析上,即時間封包(time envelopes),因此,它對某些型式的信號就有可能僅需傳送單一頻譜值來達到,其它音頻的聲道在不遺失質量下,可以虛擬地由此一頻譜值被表示出來。而原始編碼聲道的能量,即time envelopes,對每一個scalefactor band,經由一個調整(scaling)大小的運算因子,近似地被表示而儲存,使得在解碼端,對每一個聲道的信號,可藉由此一因子來重建。
如(2.35)式所示,經由相加通道對(channel pair)的頻譜信號,再乘上一個能量調整因子,來求得其每一個scalefactor band 的Intensity Stereo 信號的頻譜系數
在AAC 中,因為左右聲道只傳出一組合并后的頻譜系數,其位置放置于左聲道,右聲道中頻譜系數將會被設成零,以此來降低編碼所需之位數。

3.4 量化編碼
在完成之前的頻譜處理的工具后,實際位率減少是在量化處理中來達到,這個模塊主要的目的是量化頻譜上的數據,使得量化噪聲能夠滿足聲音心理模式的要求。迭代循環(Iteration loop)模塊被用來決定量化的step size,并保證其允許的失真不會超過,并在滿足迭代循環后,非線性的量化函數被執行。另外,對每一個音頻幀被量化的有效位數,也需在某個臨界之下,一般其值與取樣率及所要求的位率有關,依據(2.36)式,來定義每個音頻幀可以使用的位數。在每個音頻幀開始計算時,先將一些所需的變量初始化,如果此音頻幀里所有的頻域數據皆為0,則可以跳過此音頻幀不作處理,如果有頻域數據則將進入outer iteration loop,開始進行頻域數據的量化與位計算,最后將未使用的位數,保留到下一個音頻幀時繼續使用。

非均勻量化器被用在 AAC 里,其量化方式如下式所示。

在公式中,MAGIC_NUM被定義為0.4054,且common_scalfac 是對所有的scalefactor bands 的通用量化步階大小(global quantizer step size)。因此量化器可能被改變1.5dB 的步長大小,且量化范圍被限制在±8191 。
3.5 無損解碼
3.5.1解碼ics_info()
|
位寬 |
作用 |
ics_reserved_bit |
1 |
一定為‘0’ |
window_sequence |
2 |
窗類型
00:長窗 |
01:起始窗 |
10:短窗 |
11:結束窗 |
|
window_shape |
1 |
決定使用正弦窗還是KBD窗
0:正弦窗 1:KBD窗 |
max_sfb |
4/6 |
短窗下4位,其他時6位,表示每個窗組內的scalefactor band的個數 |
scale_factor_grouping |
7 |
在短窗時有效。指明window group的分割方式。7個bit表示8個窗中的1-7窗的分組情況。
即bit(8-n)表示window(n)的分組屬性,當bit(8-n)=‘1’表示window(n)和window(n-1)是同一個組,若bit(8-n)=‘0’表示window(n)和window(n-1)是不是同一個組。
如下圖 |
predictor_data_present |
1 |
指示碼流中是否出現預測數據 |
predictor_reset |
1 |
指示預測器是否全部復位 |
predictor_reset_group_number |
5 |
指示預測器組是否復位 |
prediction_used |
1 |
指示每個scalefactor band是否是由預測器 |
3.5.2huffman解碼算法
AAC使用huffman編碼算法對scalefactor和量化譜線數據進行編碼,AAC標準一共有12個有效碼本,一個碼本專用于scalefactor解碼.11個碼本用于譜線系數的解碼.有4個無效碼本,其中1個碼本表示傳輸的系數全位零,是0碼本,不需解碼.2個碼本是intensity碼本,也是0碼本.在為譜線系數解碼的11個碼本中,每個碼本有自己可以編碼的最大系數值LAV表示.如表2, 用于譜線系數的解碼的11個碼本中最后一個碼本可以解碼出譜線系數的最大值是16.但當解碼出譜線系數的值大于0小于16的時候.解碼出的值就是實際的譜線系數的絕對值,當解碼鋤地譜線系數是16時,表示退出huffman解碼,使用其他方式解碼.所以在該碼本中解碼出的值16被定義成ESC_FLAG.表2中的unsigned_cb[i]標志位表示該碼本是有符號碼本還是無符號碼本, unsigned_cb[i]=0時表示該碼本是有符號碼本, unsigned_cb[i]=1時表示該碼本是無符號碼本.解碼有符號數時,先按照無符號解碼再從輸入的解碼比特流中提取符號位,若解碼出的譜線系數非零,則其符號位緊跟在被該譜線系數的碼字的后面.
Codebook Number, i |
unsigned_cb[i] |
Dimension of Codebook |
LAV for codebook |
Codebook listed in |
0 |
- |
- |
0 |
- |
1 |
0 |
4 |
1 |
Table A.2 |
2 |
0 |
4 |
1 |
Table A.3 |
3 |
1 |
4 |
2 |
Table A.4 |
4 |
1 |
4 |
2 |
Table A.5 |
5 |
0 |
2 |
4 |
Table A.6 |
6 |
0 |
2 |
4 |
Table A.7 |
7 |
1 |
2 |
7 |
Table A.8 |
8 |
1 |
2 |
7 |
Table A.9 |
9 |
1 |
2 |
12 |
Table A.10 |
10 |
1 |
2 |
12 |
Table A.11 |
11 |
1 |
2 |
(16) ESC |
Table A.12 |
12 |
- |
- |
(reserved) |
- |
13 |
- |
- |
(reserved) |
- |
14 |
- |
- |
intensity out-of-phase |
- |
15 |
- |
- |
intensity in-phase |
- |
3.5.3解碼section_data()
Section data部分的內容是每個section的分割方式和每個section選擇的碼本。
3.5.4解碼scale_factor_data()
scale_factor_data的內容是解碼每個scalefactor band中的差分scale factor值。
3.5.5解碼spectral_data()
這部分內容主要解碼量化譜線信息spectral_data(). AAC的huffman編碼算法對量化譜線有兩步分組處理.如上所述,第一步分組是分出scalefactor band中的譜線個數是4的倍數.目的是進行4個譜線一起編碼.第二步分割是標準中把1個或幾個scalefactor band合并成一個section.同一個section內的所有scalefactor band的譜線使用同一個huffman碼表.所以,如果要進行huffman解碼,section的寬度信息和碼本號作為side information附加在section data中傳輸.解碼端要先解出這些信息才能進行huffman解碼.而section的長度小于scalefactor band的個數而大于scalefactor windows band的個數. 為了最大限度的匹配量化譜線的統計特性,Huffman為了使量化譜線的統計特性最大化的匹配huffman碼本,section的數量允許和scalefactor band的數量一樣大. Section個數的最大值是max_sfb.但注意section的邊界要與scalefactor band的邊界重合. 用huffman編碼的量化解碼系數的Four-tuple 或2-tuples的傳送順序是從低頻系數到高頻系數. 對于每個塊有多個windows的情況,要注意有分組和交織情況,系數的集合需要解交織,系數存儲在數組x_quant[g][win][sfb][bin]。