[原創]桓澤學音頻編解碼(1):MPEG1 MP3 系統算法分析


07年總結的文檔今天分享一下

 

1 標准分析  

1.1 通用部分.. 

1.1.1 碼流結構.. 

1.1.2 碼流解析.. 

1.2 層1和層2. 

1.2.1層1和層2子碼流結構.. 

1.2.2層1和層2碼流解析.. 

1.2.2層1和層2算法分析.. 

1.2.2.1層1和層2反量化算法.. 

1.2.2.2層1和層2 其他算法.. 

1.3 層3. 

1.3.1 層3子碼流結構.. 

1.3.2 層3碼流解析.. 

1.3.2.1 旁信息解碼.. 

1.3.2.2 scalerfactor信息.. 

1.3.3 層3算法分析.. 

1.3.3.1 huffman解碼.. 

1.3.3.2量化編碼.. 

1.3.3.3 recoder處理.. 

1.3.3.4立體聲處理.. 

1.3.3.5 imdct 

1.3.3.6 alias處理.. 

1.3.3.7綜合濾波器組.. 

2 相關參考C代碼實現  

2.1解碼主循環..

2.2核心算法..

2.3解析maindata數據..

2.4 alias算法C代碼..

3 推薦的參考文獻  

 

 

  1. 標准分析

 

 

                                 11172-3編解碼框圖

1.1.        通用部分

1.1.1.       碼流結構

11172-3碼流以frame為單位,每個frame共分四個部分header, CRC, audio data和ancillary data如圖。除了audio data以外的部分都是公共部分,每層都是一樣的。

  

 

1.1.2碼流解析

1172-3解碼的第一步就是要同步文件頭,解碼文件頭信息和進行錯誤檢測。由文件頭12個同步位訂出數據的起始位置,在對文件頭做解碼動作,取得信息,當檔頭中有須要做CRC 時,可以取得文件頭信息后的16位長度的CRC檢查碼,對文件頭及旁信息進行CRC檢查。1172-3的header結構信息如下。

Header

(32bits)

CRC

(0/16bits)

Side information

(136/256bits)

Main Data

Ancillary Data

Header的結構

 

位寬

作用

syncword

12

同步字 固定值 1111 1111 1111

ID

1

1:mpeg-1 0:mpeg-2

layer

2

層指示標志位  

11:層1

10:層2

01:層3

00:層3

 

protection_bit

1

CRC標志位,1:添加CRC,0:無CRC

bitrate_index

4

指示編碼使用的比特率,單位為kbit/s

bitrate_index

層1

層2

層3

'0000'

自由格式

自由格式

自由格式

'0001'

32

32

32

'0010'

64

48

40

'0011'

96

56

48

'0100'

128

64

56

'0101'

160

80

64

'0110'

192

96

80

'0111'

224

112

96

'1000'

256

128

112

'1001'

288

160

128

'1010'

320

192

160

'1011'

352

224

192

'1100'

384

256

224

'1101'

416

320

256

'1110'

448

384

320

'1111'

禁止使用

禁止使用

禁止使用

 

sampling_frequency

2

采樣率

00:44.1khz

01:48kHz

10:32kHz

11:保留

 

padding_bit

1

Buffer flag

1:frame 中包含附加slot調整平均比特率與采樣頻率一致,0:反之

注意:padding在44.1khz和自由格式中是必須的。

private_bit

1

保留位,將來的ISO也不用

mode

2

立體聲標志位

00:立體聲

01:聯合立體聲

10:2通道無立體聲

11:單通道

注意:立體聲與2通道無立體聲的區別是前者聲音相關是左右通道數據只是沒有用算法壓縮,而后者2個通道的數據根本無關系。

mode_extension

2

立體聲擴充標志位

層1,2中指明那些子帶使用強度立體聲

00

子帶4-31使用強度立體聲

01

子帶8-31使用強度立體聲

10

子帶12-31使用強度立體聲

11

子帶16-31使用強度立體聲

層3中此flag用於指明使用了那種具體的立體聲算法

 

強度立體聲

MS立體聲

00

未使用

未使用

01

使用

未使用

10

未使用

使用

11

使用

使用

注意:有2種情況會導致使用stereo

1.  Mode=00

2.  Mode=01且mode_extension=00

copyright

1

0:無版權要求,1:有版權要求

original/copy

1

0:復制比特流,1:原版比特流

emphasis

2

指示使用哪種加重措施

emphasis: 在存儲和傳輸以前對聲音信號進行濾波以改善高頻的SNR

de-emphasis: 在存儲和傳輸以后對聲音信號進行濾波去除由於emphasis 處理帶來的線性失真。

'00'

未使用

'01'

50/15 微秒加重

'10'

保留

'11'

CCITT J.17

 

 

1.2.1層1和層2子碼流結構

 

1.2.2層1和層2碼流解析

層1和層2的audio_data部分碼流傳輸信息如表.

 

 

傳送信息

層1

allocation

scalefactor

 

sample

層2

allocation

scalefactor

scfsi

sample

每個部分信息的意義是

 

位寬屬性

循環因子

層1中作用

層2中作用

allocation[ch][sb]

4位定長碼

通道號ch

子帶號sb

指明每個通道每個子帶的量化頻率譜線的編碼位數,在使用intensity立體聲編碼時,左右通道的scalefactor是一樣的,故只傳送1個通道的allocation。

指明每個通道每個子帶的量化頻率譜線的編碼位數,在使用intensity立體聲編碼時,左右通道的scalefactor是一樣的,故只傳送1個通道的allocation。

與層1不同的是層2中3個連續的量化頻率譜線被編碼成一個碼字,詳見標准附錄B的表3-B.2. Layer II bit allocation tables

scalefactor[ch][sb]

6位定長碼

通道號ch

子帶號sb

指明在每個通道每個子帶反量化頻率譜線時用於加權的因子,查表標准附錄B Table3.1獲得scalefactor值

同層1

sample[ch][sb][s]

2-15位變長碼

通道號ch

子帶號sb

譜線索引s

每個子帶每個通道第s個量化頻率譜線的碼字

每個子帶每個通道第s個量化頻率譜線的碼字

scfsi[ch][sb]

2位定長碼

通道號ch

子帶號sb

 

指明scalefactor在每個通道每個子帶中的使用方法(如下表)

 

scfsi[sb]

 

'00'

傳輸3個 scalefactors, 每個組一個scalerfactor

'01'

傳輸2個 scalefactors, 第一個對前兩組有效,第二個對第三組有效

'10'

傳輸1個scalefactor, 對全部3組數據有效

'11'

傳輸2個 scalefactors,  第一個對第一組有效,第二個對后兩組有效

 

注意:循環因子的優先級是sb優先級最高,其次是ch,即每個sb內有2個通道的數據。sample[ch][sb][s]循環的優先級是s在最外層,其次是sb,再次是ch。下面給出sample[ch][sb][s]排列方式。

 

 

 

1.2.2  層1和層2算法分析      

層1和層2的主要區別是在於frame的分割上,在層1中,384個數據為一幀(frame),每個frame有32個子帶(subband),每個子帶12個數據(sample)。而層2中 1152個數據為一幀(frame), 每個frame有32個子帶(subband,每個子帶3個組(group),每個group有12個數據(sample)。

層1層2解碼算法如圖,首先解析碼流數據,層1,層2的碼流解析可以分為2個部分。定長碼流信息解析和變長碼流信息解析。其中定長部分包括解碼信息side info和scalefactor。只要按照碼流語法信息中規定的碼流格式依次讀取數據即可。變長碼流信息結構由每個變長的量化頻率系數組成,32個子帶,每個子帶12個sample(層1)或36個(層2)的變長量化頻率系數的長度也通過side info中的allocation[ch][sb]信號指明。故在碼流解析之后獲得解碼信息,scalefactor,量化譜線數據以后就可以通過反量化重建頻率譜線。層1和層2的量化解碼與層3不同,層1,2使用均勻量化器,層3使用非均勻量化器。

 

層1、層2解碼框圖

 

層1和層2的反量化公式如下。

 

層1和層2的rescaler公式如下。

 

S´´ 輸入反量化數據

S´  輸出頻率譜線數據

重建頻率譜線后,若使用立體聲編碼要進行立體聲解碼處理,再通過綜合濾波器組后還原為時域信號輸出。層1和層2使用的算法中立體聲處理和層3的算法類似,具體內容詳見11172-3 stereo處理分析文檔。層1和層2綜合濾波器組的算法和層3中是完全一樣的。唯一要注意的是層1,層2,層3的frame大小不同。故層1,2的分析綜合濾波器組的算法不再給出。請詳見層3的相關部分。

1.3 11172-3層3

1.3.1層3的碼流格式

層3中 1152個數據為一幀(frame),每個frame有2個granules,每個granule有576個數據,32個子帶,每個子帶18個數據(sample)。

 

層3的audio data語法結構如圖

層3的side infomation語法結構如圖

層3的main data語法結構如圖

1.3.2層3的碼流解析

    層3的碼流解析也可以分為2個部分。定長碼流信息解析和變長碼流信息解析。定長碼包括side information。變長碼包括scalefactor和huffman code。

1.3.2.1旁信息解碼(Side Information Decoding)

旁信息包含許多必要的參數,有逆量化的信息(global gain、scale factor compress、sub block gain、scale factor、pre flag)以及霍夫曼解碼信息(part 2_3 length、big values、table select、region 0 count、region 1 count 、count 1 table select),window type(window switch flag、block type、mix block flag)和其他信息,這些信息都會被暫存起來以便稍后使用。而旁信息大小由聲道決定,單聲道 17字節,雙聲道 32位字節。                      

Main_data_begin:為9位的指針,指明main_data的起始位置。由於mp3中使用bit reservoir技術, 這個技術是指如果一個 frame可用的位在編碼完后還有剩下時,這些剩下的位可以被之后的frame所用,所以一個frame中的main_data不一定緊跟在side information后面,而在bit流中增加信號main_data_begin,它在數據流中有pointer的作用,指向真正的main data的開始。

如果main_data_begin值為 0 則表示main_data是緊接在side_information之后。否則,它表示一個負偏移值,它來自於同步位的第一個字組,但是不包含旁信息和文件頭的位數。因為位保留(bit reservoir)的原因使得主要數據不一定都緊附在旁信息后面,如圖。frame 0 的main_data_begin值為 0 則表示main_data是緊接在side_information之后。frame 1 它的主要數據起始位置不為 0 且其main_data一部份是在旁信息的前面,一部份在后面。其余frame依此類推。

Scfsi(ScalFactor Selector Information): Scfsi是一個 scale factor 標准,不論為組別 0 或是組別 1 都可以共享它。當編碼開始時全部576的頻譜會被分成 4份的 scale factor 頻帶(band),所以在單聲道模式時SCFSI 的大小為 4位,在雙聲道模式時為8位。當為1表示要讀取granule0 and granule1當為0時只須讀取granule0 . granule1的信息與granule0共享。

table_select: 此用於霍夫曼解碼的big value區共有32個表可供選擇。

Count1table_select:此用於霍夫曼解碼的 count1區有2個表可以選擇。

Big_values :指示主要數據(main data)中的big value區域包含多少筆壓縮后的音頻資料。

Scalefac_compress:表示重主要資料中取出的量化因子其數據長度是多少位元。

Block_type:表示window是何種型態,包含長窗(long window ),短窗(short window) 。
1.3.2.2  Scale Factor Decoder

    Main data碼流分為 2 部分, scale factor 和huffman code。它們都是變長碼。每個scalefactor 的長度由slen1 和 slen2 計算出來,而slen1 和 slen2 由scalefac_compress, block_type和mixed_block_flag一起確定。當解碼到第二組時,如果 SCFSI 被設定為 1,則第二組的 scale factor 不必計算,可以由第一組中直接獲得。在得到slen1 和 slen2 之后,每一個 scale factor 頻帶都可以解碼出scale factor。最后所有的scale factors 的大小(part2 length)都可以借由下列公式計算出來:

(1) Long block  (block type = 0、 1、 3):

576筆頻譜值被分為 21 個 scale factor 頻帶。slen1 表示頻帶0到10的 scale factor 大小。slen2 表示頻帶11到20的 scale factor 大小, slen2 其中: part2 length = 11 × slen1 + 10 ×

(2) Short block  (block type = 2 and mixed block flag = 0): 576筆頻譜值被分為 12 個 scale factor 頻帶。slen1 表示頻帶 0 到 5 的 scale factor 大小。slen2 表示頻帶 6 到 11 的 scale factor 大小, 其中: part2 length = 3 × 6 × slen1 + 3 × 6 × slen2

 

(3) Mix block (block type = 2 and mixed block flag = 1):

576筆頻譜值被分為 17 個 scale factor 頻帶。前面8個頻帶為 long block, 后面9個頻帶為short block,每一個頻帶包含3個窗口(window)。slen1 表示頻帶 0  到 10  的 scale factor  大小。slen2  表示頻帶 11  到 16  的 scale factor 大小,其中:part2 length=(8 + 3 × 3) × slen1 + (6 × 3) × slen2 

 

1.3.3 層3算法分析

1.3.3.4 霍夫曼解碼

解析碼流之后,提取了必要地的解碼信息以后就進入依次的解碼算法模塊。Huffman解碼是首先進行的解碼算法。霍夫曼解碼器使用標准固定的32個索引表把二進制碼流解碼成量化譜線數據。。它包含了這些代碼當初編碼的信息。不同的頻率頻譜使用不同的索引表,而所代表的查尋都是根據數據流的旁信息。在任何索引表當中最長的可變長度代碼,至多到19 bits,但是實際上在標准中只有16種不同的索引表。則解碼過程將會繼續,由讀取來自於索引表中的元素。來決定下一個標簽到底需要讀取多少的位,如同於下一個將要使用到的索引表的起始地址。具體內容詳見11172-3 huffman解碼算法分析文檔。

1.3.2.5量化與de-scalefacotr

    從Huffman解碼后的值經過反量化重構頻率譜線,反量化是依以下的公式:

(1)    long block:

(2)    short block:

其中global_gain、scalefac_multiplier、scalefac_l、preflag、pretab均在side information中有指定。具體內容詳見11172-3 逆量化算法分析文檔。

1.3.2.6 Reorder 

因為在短窗的 Huffman編碼時將每個子帶內的同一頻率的三個窗采樣數據均重新排列為同一窗,故在此必須恢復成原來的順序,而長窗沒有重新排列故不需要再重新排列。

下面的例子說明了重新排列的方法:假設6組頻率系數,每組頻率系數由3個窗相同的頻率系數組成,內總共有18個數據,Reorder過程如圖2:

1.3.2.7 Alias Reduction

Alias Reduction只在長窗口要使用,以減少因互相影響產生的噪聲原因:使用長窗框得到較細的頻譜分辨率時,同時會有混疊(Aliasing)的產生。原始信號被分成32 個子頻帶時,在頻譜上可見鄰近的子頻帶間有明顯的重疊現象,而處於重疊區間的信號將會同時影響兩個子頻帶。所以使用Aliasing算法消除頻率交疊。

混疊的過程如圖

偽代碼

for(sb=1;sb<32;sb++){

 for(i=0;i<8;i++){

  xr[18*sb-1 - i] = xr[18*sb -1-i]*cs[i] - xr[18*sb +i] *ca[i];

  xr[18*sb +i] = xr[18*sb +i] *cs[i] + xr[18*sb -1-i] *ca[i];

}

}

Cs[i]=(1+C[i])^-0.5    Ca[i]=(C[i] /(1+C[i])) ^-0.5

c[0~7]  = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }

xr[i]為經過reorder 模塊重新排列后的頻率值數據。C[i]值為8個可由查表取得之固定系數值。因此 Cs[i]與 Ca[i]為各 8 個可先計算出結果的值。

1.3.2.8 立體聲效處理(Stereo Processing)

    MP3 除了提供單聲道及雙聲道之外,同時還提供強化立體聲(intensity stereo)與 MS 立體聲這兩種立體聲的編碼方式。不過這時候的左右聲道就並不是單純是由反量化所處理過后的值,所以須要經過這個立體聲的處理過程來將編碼過的立體聲信號還原回左/右立體聲信號。具體內容詳見11172-3 stereo處理分析文檔。

1.3.2.9 改良式離散余弦反轉換及重迭相加(IMDCT & Overlapping-Add)

標准中,編碼器使用分析濾波器組把時域的576個數據分成32個子帶,每個子帶18個頻域數據。再通過MDCT把18個頻域數據進行細分,進一步提高頻率分辨率。在解碼端就要進行IMDCT把原有的頻率信號復原。由於MDCT 並不是一種正交,也就是會產生時域上的不一致,所以做轉換時,必須有50%做重迭,以消除這種不一致,因此在做完IMDCT 后還要做重迭相加。做IMDCT 長窗共有18條頻線組成,輸出得到36個值,短窗共有6條頻線組成,輸出得到12個值。 無論長窗或短窗做完IMDCT 后,在做windowing的動作,最終還是得到36個值,之后再將前一個區塊輸出值的前一半(0--17) 必須和先前的區塊輸出值的后一半(18--35) 做重迭相加。具體內容詳見11172-3 IMDCT算法分析文檔。

1.3.2.10合成濾波器(Synthesis Polyphase)

IMDCT后的結果再經多相濾波器就可以合成輸出的訊號,由IMDCT輸出的64個輸出向量V,先暫存至一個FIFO,每16個V向量(1024個sample)交叉型成 U向量(512個元素),U向量再經D window形成W向量(512個元素),最后512個元素每32個為一組,共分16組,此16組向量的和即為最后的重建結果。 具體內容詳見11172-3 分析綜合濾波器組算法分析文檔。

 

2 相關參考C代碼實現

   參考代碼來自ISO標准參考代碼

2.1解碼主循環流程圖

2.2層3解碼算法流程圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM