AAC解碼算法原理詳解

寫在前面

如果大家對音視頻相關知識感興趣,可以訂閱我的專題 視頻播放器和音視頻基礎知識

正文

1:AAC解碼整體流程簡述

AAC解碼流程圖

在主控模塊開始運行后,主控模塊將AAC比特流的一部分放入輸入緩沖區,通過查找同步字得到一幀的起始,找到后,根據ISO/IEC 13818-7所述的語法開始進行Noisless Decoding(無噪解碼),無噪解碼實際上就是哈夫曼解碼,通過反量化(Dequantize)、聯合立體聲(Joint Stereo),知覺噪聲替換(PNS),瞬時噪聲整形(TNS),反離散余弦變換(IMDCT),頻段復制(SBR)這幾個模塊之后,得出左右聲道的PCM碼流,再由主控模塊將其放入輸出緩沖區輸出到聲音播放設備。

2:主控模塊

主控模塊的主要任務是操作輸入輸出緩沖區,調用其它各模塊協同工作。其中,輸入輸出緩沖區均由DSP控制模塊提供接口。輸出緩沖區中將存放的數據為解碼出來的PCM數據,代表了聲音的振幅。它由一塊固定長度的緩沖區構成,通過調用DSP控制模塊的接口函數,得到頭指針,在完成輸出緩沖區的填充后,調用中斷處理輸出至I2S接口所連接的音頻ADC芯片(立體聲音頻DAC和DirectDrive耳機放大器)輸出模擬聲音。

3. 同步及元素解碼

同步及元素解碼模塊主要用于找出格式信息,并進行頭信息解碼,以及對元素信息進行解碼。這些解碼的結果用于后續的無噪解碼和尺度因子解碼模塊。

AAC的音頻文件格式有以下兩種:

ADIF:Audio Data Interchange Format 音頻數據交換格式。這種格式的特征是可以確定的找到這個音頻數據的開始,不需進行在音頻數據流中間開始的解碼,即它的解碼必須在明確定義的開始處進行。故這種格式常用在磁盤文件中。

ADTS:Audio Data Transport Stream 音頻數據傳輸流。這種格式的特征是它是一個有同步字的比特流,解碼可以在這個流中任何位置開始。它的特征類似于mp3數據流格式。

AAC的ADIF格式見下圖:


ADIF格式

3.1 ADIF的組織結構

AAC的ADTS的一般格式見下圖:
ADTS一般格式

3.2 ADTS的組織結構

圖中表示出了ADTS一幀的簡明結構,其兩邊的空白矩形表示一幀前后的數據。ADIF和ADTS的header是不同的。它們分別如下所示:


ADTS一幀的結構

3.3 ADIF的頭信息

ADIF頭信息

3.4 ADTS的固定頭信息

ADTS固定頭信息

3.5 幀同步

幀同步目的在于找出幀頭在比特流中的位置,13818-7規定,aac ADTS格式的幀頭為12比特的“1111 1111 1111”.

3.6 頭信息解碼

ADTS的頭信息為兩部分組成,其一為固定頭信息,緊接著是可變頭信息。固定頭信息中的數據每一幀都相同,而可變頭信息則在幀與幀之間可變。

3.7 元素信息解碼

在AAC中,原始數據塊的組成可能有六種不同的元素。它們分別是

  • SCE: Single Channel Element單通道元素。單通道元素基本上只由一個ICS組成。一個原始數據塊最可能由16個SCE組成。

  • CPE: Channel Pair Element 雙通道元素,由兩個可能共享邊信息的ICS和一些聯合立體聲編碼信息組成。一個原始數據塊最多可能由16個SCE組成。

  • CCE: Coupling Channel Element 藕合通道元素。代表一個塊的多通道聯合立體聲信息或者多語種程序的對話信息。

  • LFE: Low Frequency Element 低頻元素。包含了一個加強低采樣頻率的通道。

  • DSE: Data Stream Element 數據流元素,包含了一些并不屬于音頻的附加信息。

  • PCE: Program Config Element 程序配置元素。包含了聲道的配置信息。它可能出現在ADIF 頭部信息中。

  • FIL: Fill Element 填充元素。包含了一些擴展信息。如SBR,動態范圍控制信息等。

3.8 處理流程

(1). 判斷文件格式,確定為ADIF或ADTS

(2). 若為ADIF,解ADIF頭信息,跳至第6步。

(3). 若為ADTS,尋找同步頭。

(4). 解ADTS幀頭信息。

(5). 若有錯誤檢測,進行錯誤檢測。

(6). 解塊信息。

(7). 解元素信息。

4.無噪聲解碼

無噪編碼就是哈夫曼編碼,它的作用在于進一步減少尺度因子和量化后頻譜的冗余,即將尺度因子和量化后的頻譜信息進行哈夫曼編碼。

全局增益編碼成一個8位的無符號整數,第一個尺度因子與全局增益值進行差分編碼后再使用尺度因子編碼表進行哈夫曼編碼。后續的各尺度因子都與前一個尺度因子進行差分編碼。

量化頻譜的無噪編碼有兩個頻譜系數的劃分。其一為4元組和2元組的劃分,另一個為節劃分。對前一個劃分來說,確定了一次哈夫曼表查找出的數值是4個還是2個。對后一個劃分來說,確定了應該用哪一個哈夫曼表,一節中含有若干的尺度因子帶并且每節只用一個哈夫曼表。

4.1 分段

無噪聲編碼將輸入的1024個量化頻譜系數分為幾個段(section),段內的各點均使用同一個哈夫曼表,考慮到編碼效率,每一段的邊界最好同尺度因子帶的邊界重合。所以每一段必段傳送信息應該有:段長度,所在的尺度因子帶,使用的哈夫曼表。

4.2 分組和交替

分組是指忽略頻譜系數所在窗,將連續的,具有相同尺度因子帶的頻譜系數分為一組放在一起,共享一個尺度因子從而得到更好的編碼效率。這樣做必然會引起交替,即本來是以
c[組][窗][尺度因子帶][ 系數索引]

為順序的系數排列,變為將尺度因子帶同的系數放在一起:c[組][尺度因子帶][窗][ 系數索引]這樣就引起了相同窗的系數的交替。

4.3大量化值的處理

大量化值在AAC中有兩種處理方法:在哈夫曼編碼表中使用escape標志或使用脈沖escape方法。前者跟mp3編碼方法相似,在許多大量化值出現時采用專門的哈夫曼表,這個表暗示了它的使用將會在哈夫曼編碼后面跟跟一對escape值及對值的符號。在用脈沖escape方法時,大數值被減去一個差值變為小數值,然后使用哈夫曼表編碼,后面會跟一個脈沖結構來幫助差值的還原。

無噪解碼的流程圖如下:

無噪解碼的流程圖

5.尺度因子解碼及逆量化

在aac編碼中,逆量化頻譜系數是由一個非均勻量化器來實現的,在解碼中需進行其逆運算。即保持符號并進行4/3次冪運算。

在頻域調整量化噪聲的基本方法就是用尺度因子來進行噪聲整形。尺度因子就是一個用來改變在一個尺度因子帶的所有的頻譜系數的振幅增益值。使用尺度因子這種機制是為了使用非均勻量化器在頻域中改變量化噪聲的比特分配。

5.1 尺度因子帶(scalefactor-band)

頻率線根據人耳的聽覺特性被分成多個組,每個組對應若干個尺度因子,這些組就叫做尺度因子帶。為了減少信息含有短窗的邊信息,連續的短窗可能會被分為一組,即將若干個短窗當成一個窗口一起傳送,然后尺度因子將會作用到所有分組后的窗口去。

5.2 反量化公式

 x_invquant = sign(x_quant) * | x_quant| ^(4/3)

其中:

x_invquant 表示反量化的結果
sign (x) 表示反量化的結果
^ 標識冪運算

5.3 應用尺度因子公式:

x_rescal = x_invquant * gain
gain = 2 ^ (0.25 * (sf – SF_OFFSET))
x_rescal 為應用了尺度因子公式之后的值
gain 為一個增益
sf 為尺度因子值
SF_OFFSET 為一個常數,設為100

其中:

x_rescal 為應用了尺度因子公式之后的值
gain 為一個增益
sf 為尺度因子值
SF_OFFSET 為一個常數,設為100

6、聯合立體聲解碼

聯合立體聲有兩種,M/S stereo(中間旁道立體聲)和intensity stereo(強度立體聲)

6.1 M/S stereo

在M_S立體聲模式中,傳送的是規格化的中間/旁邊聲道的信息,計算公式如下:

l, r 表示轉換后的左右聲道值
m 表示中間聲道值
s 表示旁邊聲道值

6.2 Intensity stereo

在強度立體聲模式中,左聲道傳的是幅值,右聲道的scalefactor傳的是立體聲的位置is_pos。如果僅在一個指定了common_window為1的CPE中的右通道中指定哈夫曼表為INTENSITY_HCB或INTENSITY_HCB2,則解碼時使用強度立體聲模式。其計算公式如下:

is_pos += dpcm_is_pos
scale = invert_intensity * 0.5 ^(0.25 * ispos)
r_spec = scale * l_spec
is_po 是右聲道傳送的scalefactor
dpcm_is_pos 是上一個is_pos,初值為0
scale 為強度因子
invert_intensity 為是否反轉哈夫曼表(表14和表15)這個變量由ms_used指定,關系為:
invert_intensity = 1 – 2 * ms_used,
另外,當ms_mask_present為0時,invert_intensity恒為1。

從完全備份中還原,從完全備份中還原數據庫非常簡單

is_po 是右聲道傳送的scalefactor
dpcm_is_pos 是上一個is_pos,初值為0
scale 為強度因子
invert_intensity 為是否反轉哈夫曼表(表14和表15)這個變量由ms_used指定,關系為:
invert_intensity = 1 – 2 * ms_used,
另外,當ms_mask_present為0時,invert_intensity恒為1。

6.3 處理流程

聯合立體聲解碼流程圖

7、PNS

PNS(Perceptual Noise Substitution) 知覺噪聲替換模塊是一種以參數編碼的方式模擬噪聲的模塊。在判別出音頻值中的噪聲后,將些噪聲不進行量化編碼,而是采用一些參數告訴解碼器端這是某種噪聲,然后解碼器端將會對這些噪聲用一些隨機的編碼來制造出這一類型的噪聲。

在具體操作上,PNS模塊對每個尺度因子帶偵測頻率4kHz以下的信號成分。如果這個信號既不是音調,在時間上也無強烈的能量變動,就被認為是噪聲信號。其信號的音調及能量變化都在心理聲學模型中算出。

在解碼中,如果發現使用了哈夫曼表13(NOISE_HCB),則表明使用了PNS。

由于M/S立體聲解碼與PNS解碼互斥,故可以用參數ms_used來表明是否兩個聲道都用同樣的PNS。如果ms_used參數為1,則兩個聲道會用同樣的隨機向量來生成噪聲信號。

PNS的能量信號用noise_nrg來表示,如果使用了PNS,則能量信號將會代替各自的尺度因子來傳送。

噪聲能量編碼同尺度因子一樣,采用差分編碼的方式。第一個值同樣為全局增益值。它同強度立體聲位置值及尺度因子交替地放在一起,但對差分解碼來說又彼此忽略。即下一個噪聲能量值以上一個噪聲能量值而不是強度立體聲位置或尺度因子為標準差分解碼。

隨機能量將會在一個尺度因子帶內產生noise_nrg所計算出的平均能量分布。

7.1 處理流程

PNS解碼流程圖

8、TNS

TNS瞬態噪聲整形用于控制一個轉換窗口內的瞬時噪聲形態。它是用一個對單個通道的濾波過程來實現的。

傳統的變換編碼方案常常遇到信號在時域變化非常劇烈的問題,特別是語音信號,這個問題是因為量化后的噪聲分布雖然在頻率域上得到控制,但在時域上卻以一個常數分布在一個轉換塊內。如果這種塊中信號變化得很劇烈卻又不轉向一個短塊去,那這個常數分布的噪聲將會被聽到。

TNS的原理利用了時域和頻域的二元性和LPC(線性預測編碼)的時頻對稱性,即在其中的任意一個域上做編碼與在另一域上做預測編碼等效,也就是說,在一個域內做預測編碼可以在另一域內增加其解析度。量化噪聲產生是在頻域產生的,降低了時域的解析度,故在這里是在頻域上做預測編碼。

在AACplus中,由于基于AAC profile LC,故TNS的濾波器階數被限制在12階以內。

8.1 處理流程

TNS解碼流程圖

9. IMDCT

將音頻數據從頻域轉換到時域的過程主要是由將頻域數據填入一組IMDCT濾波器來實現的。在進行IMDCT變換后,輸出數值經過加窗,疊加,最后得到時域數值。

9.1 IMDCT公式

IMDCT公式
    for 0<= n <N
n 采樣點索引值
i 窗索引值
k 頻譜系數索引值
N 窗函數長度,全為短窗N = 256,其余情況為2048
 n0=(N/2 +1)/2

9.2 塊型

由于長塊的頻域分辨率較高而短塊的時域分辨率較高,故長塊較適合相對平穩的時域信號,而短塊較適合變化相對較快的時域信號。

長塊長度為2048個點,短塊長度為256個點。

9.3 加窗

AAC用到兩種窗函數,分別為Kaiser-Bessel 類(KBD)窗和正弦窗。

KBD窗如下所示:

KBD窗

定義為:
   for 0 <= n <= N/2

使用KBD窗時,window_shape 為1

正弦窗如下所示:



定義如下圖:



使用正弦窗時,window_shape 為0

另定義:


對應于四種不同的窗序列分別進行不同的加窗變換:
1.) 僅有長塊:
window_shape 為 1:



window_shape 為0:



加窗后,時域信號可用w(n)表示為:

2.) 長開始塊:

window_shape 為 1:


window_shape 為0:



加窗后,時域信號可用w(n)表示為:



3.) 只有短塊:
window_shape 為 1:

window_shape 為0:



加窗后,時域信號可用w(n)表示為:

2.) 長結束塊:
window_shape 為 1:



window_shape 為0



加窗后,時域信號可用w(n)表示為:

9.4 覆蓋疊加

在加窗完成后得到的時域信號值z經過前后窗相互疊加計算,得出最后的PCM值:

術語說明

AAC Advanced Audio Coding 高級音頻編碼
AAC LC AAC with Low Complexity AAC的低復雜度配置
AAC plus HE-AAC, AAC+,MPEG4 AAC LC加入SBR模塊后形成的一個aac版本
MPEG Motion Picture Expert Group
IMDCT 反離散余弦變換
ADIF Audio Data Interchange Format 音頻數據交換格式
ADTS Audio Data Transport Stream 音頻數據傳輸流
SCE Single Channel Element單通道元素
CPE Channel Pair Element 雙通道元素
CCE Coupling Channel Element 藕合通道元素
DSE Data Stream Element 數據流元素
PCE Program Config Element 程序配置元素
FIL Fill Element 填充元素
ICS Individual Channel Stream 獨立通道流
PNS Perceptual Noise Substitution 知覺噪聲替換
SBR Spectral Band Replication 頻段復制
TNS Temporal Noise Shaping 瞬時噪聲整形
ch channel 通道
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,076評論 2 375

推薦閱讀更多精彩內容

  • 聲音 如何將現實生活中的聲音轉換成數字信號? 脈沖編碼調制(PCM) 脈沖編碼調制示意圖 圖3-2(a),是一個以...
    LvyCode閱讀 874評論 0 1
  • 摘要 該配置文件定義了支持高質量音頻分發所需的Bluetooth?設備的要求。這些要求以終端用戶服務的方式表達,并...
    公子小水閱讀 9,927評論 0 4
  • OpusEncoder 1:獲得 OpusEncoder結構的大小 2:分配和初始化 encoder狀態.一個編碼...
    今憶Zoe閱讀 6,737評論 0 3
  • 介紹 AAC(Advanced Audio Coding),中文稱為“高級音頻編碼”,出現于1997年,基于 MP...
    sxyxsp123閱讀 7,492評論 0 7
  • 在保證視頻圖像質量的前提下,HEVC通過增加一定的計算復雜度,可以實現碼流在H.264/AVC的基礎上降低50%。...
    加劉景長閱讀 7,942評論 0 6