轉(zhuǎn)載自:http://www.vcproj.net/aac-system-algorithm-analysis/
(英語:Advanced Audio Coding,AAC),出現(xiàn)于1997年,基于 MPEG-2的音訊編碼技術。由Fraunhofer IIS、杜比實驗室、AT&T、Sony(新力)等公司共同開發(fā),目的是取代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 系統(tǒng)框圖
編碼框圖

解碼框圖

1.2 編碼概述
其整體AAC 編解碼系統(tǒng),如圖所示,其編碼流程概述如下: 為當一音頻信號送至編碼端時,會分別送至聽覺心里模型(Psychoacoustic Model)以求得編碼所需之相關參數(shù)及增益控制(gain control)模塊中,將信號做某個程度的衰減,以降低其峰值大小,如此可減少Pre-echo 的發(fā)生。之后,再以MDCT 將時域信號轉(zhuǎn)換至頻率域,而送入至TNS(Temporal Noise Shaping Module)模塊中,來判斷是否需要啟動TNS,此模塊系利用開回路預測(open-loop prediction) 來修飾其量化噪聲,如此可將其量化噪聲的分布,修飾到原始信號能量所能含蓋的范圍之下,進一步的減少Pre-echo 的發(fā)生,若TNS 被啟動,則傳出其預測差值;反之,則傳出原始頻譜值。AAC 為了提升其壓縮效率,則使用了Joint Stereo Coding與預測(Prediction)模塊來進一步消除信號間的冗余成份。在Joint Stereo Coding中又可分為Intensity Stereo Coding 與M/S Stereo Coding。在Intensity Stereo Coding模塊中,是利用信號在高頻時,人耳只對能量較敏感,對于其相位不敏感之特性,將其左右聲道之頻譜系數(shù)合并,以節(jié)省使用之位;在M/S Stereo Coding 模塊中,利用左右聲道之和與差,做進一步地壓縮,若其差值能量很小,如此便可以用較少之位編碼此一聲道,將剩余之位應用于另一聲道上的編碼,如此來提升其壓縮率。而預測模塊的主要架構(gòu)是使用Backward Adaptive Predictors,利用前兩個音頻幀來預測現(xiàn)在的音頻幀,若決定啟動此模塊,則傳出其預測差值,如此一來可以減少其數(shù)據(jù)量,達數(shù)據(jù)壓縮之目的。經(jīng)過上述處理頻譜信號上的壓縮tools程序后,則將其數(shù)據(jù)予以量化與編碼,為了達到量化編碼的最佳化,AAC 使用了雙巢狀式循環(huán)(two nested loop)的量化編碼結(jié)構(gòu),以得最佳的壓縮質(zhì)量,最后則將其位串送至解碼端,而完成整個編碼程序。
為了允許其系統(tǒng)可對音頻質(zhì)量與內(nèi)存/處理功率要求之間做一舍取,因此AAC 系統(tǒng)提供了三種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規(guī)定了2種碼流格式ADIF和ADTS,前者用于屬于文件格式用于存儲,后者屬于流格式,用于傳輸。如圖


其中Raw_data_block為基本碼流組件,其他部分為格式信息。Raw_data_block格式如下,id_syn_ele:3位標志位,指示后面所跟著的數(shù)據(jù)流的類型。
id_syn_ele |
數(shù)據(jù)流 |
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所指示的流為擴展流或用戶數(shù)據(jù)流,非核心算法區(qū),故暫不提及。而single_channel_element(),channel_pair_element(),coupling_channel_element()
lfe_channel_element()有如下類似的結(jié)構(gòu),

individual_channel_stream的核心數(shù)據(jù)格式如下:

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

IMDCT公式

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

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

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

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

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

非均勻量化器被用在 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:結(jié)束窗 |
|
window_shape |
1 |
決定使用正弦窗還是KBD窗
0:正弦窗 1:KBD窗 |
max_sfb |
4/6 |
短窗下4位,其他時6位,表示每個窗組內(nèi)的scalefactor band的個數(shù) |
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 |
指示碼流中是否出現(xiàn)預測數(shù)據(jù) |
predictor_reset |
1 |
指示預測器是否全部復位 |
predictor_reset_group_number |
5 |
指示預測器組是否復位 |
prediction_used |
1 |
指示每個scalefactor band是否是由預測器 |
3.5.2huffman解碼算法
AAC使用huffman編碼算法對scalefactor和量化譜線數(shù)據(jù)進行編碼,AAC標準一共有12個有效碼本,一個碼本專用于scalefactor解碼.11個碼本用于譜線系數(shù)的解碼.有4個無效碼本,其中1個碼本表示傳輸?shù)南禂?shù)全位零,是0碼本,不需解碼.2個碼本是intensity碼本,也是0碼本.在為譜線系數(shù)解碼的11個碼本中,每個碼本有自己可以編碼的最大系數(shù)值LAV表示.如表2, 用于譜線系數(shù)的解碼的11個碼本中最后一個碼本可以解碼出譜線系數(shù)的最大值是16.但當解碼出譜線系數(shù)的值大于0小于16的時候.解碼出的值就是實際的譜線系數(shù)的絕對值,當解碼鋤地譜線系數(shù)是16時,表示退出huffman解碼,使用其他方式解碼.所以在該碼本中解碼出的值16被定義成ESC_FLAG.表2中的unsigned_cb[i]標志位表示該碼本是有符號碼本還是無符號碼本, unsigned_cb[i]=0時表示該碼本是有符號碼本, unsigned_cb[i]=1時表示該碼本是無符號碼本.解碼有符號數(shù)時,先按照無符號解碼再從輸入的解碼比特流中提取符號位,若解碼出的譜線系數(shù)非零,則其符號位緊跟在被該譜線系數(shù)的碼字的后面.
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部分的內(nèi)容是每個section的分割方式和每個section選擇的碼本。
3.5.4解碼scale_factor_data()
scale_factor_data的內(nèi)容是解碼每個scalefactor band中的差分scale factor值。
3.5.5解碼spectral_data()
這部分內(nèi)容主要解碼量化譜線信息spectral_data(). AAC的huffman編碼算法對量化譜線有兩步分組處理.如上所述,第一步分組是分出scalefactor band中的譜線個數(shù)是4的倍數(shù).目的是進行4個譜線一起編碼.第二步分割是標準中把1個或幾個scalefactor band合并成一個section.同一個section內(nèi)的所有scalefactor band的譜線使用同一個huffman碼表.所以,如果要進行huffman解碼,section的寬度信息和碼本號作為side information附加在section data中傳輸.解碼端要先解出這些信息才能進行huffman解碼.而section的長度小于scalefactor band的個數(shù)而大于scalefactor windows band的個數(shù). 為了最大限度的匹配量化譜線的統(tǒng)計特性,Huffman為了使量化譜線的統(tǒng)計特性最大化的匹配huffman碼本,section的數(shù)量允許和scalefactor band的數(shù)量一樣大. Section個數(shù)的最大值是max_sfb.但注意section的邊界要與scalefactor band的邊界重合. 用huffman編碼的量化解碼系數(shù)的Four-tuple 或2-tuples的傳送順序是從低頻系數(shù)到高頻系數(shù). 對于每個塊有多個windows的情況,要注意有分組和交織情況,系數(shù)的集合需要解交織,系數(shù)存儲在數(shù)組x_quant[g][win][sfb][bin]。