1. 程式人生 > >AAC編解碼(一)

AAC編解碼(一)

一、ADTS格式:

ADTS的全稱是Audio Data Transport Stream。是AAC音訊的傳輸流格式。

1. adts_sequence()

{

 while (nextbits() == syncword) {

 adts_frame();

 }

}

2. adts_frame()

{
 adts_fixed_header();

 adts_variable_header();

 if (number_of_raw_data_blocks_in_frame == 0) {

 adts_error_check();

 raw_data_block();

 }

 else {

 adts_header_error_check();

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

 raw_data_block();

 adts_raw_data_block_error_check();

 }

 }

}

3.

adts_fixed_header()

{
 syncword; 12 bslbf

 ID; 1 bslbf

 layer; 2 uimsbf

 protection_absent; 1 bslbf

 profile; 2 uimsbf

 sampling_frequency_index; 4 uimsbf

 private_bit; 1 bslbf

 channel_configuration; 3 uimsbf

 original/copy; 1 bslbf

 home; 1 bslbf

}

adts_variable_header()

{
 copyright_identification_bit; 1 bslbf

 copyright_identification_start; 1 bslbf

 frame_length; 13 bslbf

 adts_buffer_fullness; 11 bslbf

 number_of_raw_data_blocks_in_frame; 2 uimsfb

}

詳細說明下ADTS頭的重要資料部分:

syncword 同步字The bit string ‘1111 1111 1111’,說明一個ADTS幀的開始。

ID MPEG 標示符, 設定為1.

layer Indicates which layer is used. Set to ‘00’

protection_absent 表示是否誤碼校驗

profile 表示使用哪個級別的AAC,如01 Low Complexity(LC)--- AACLC

sampling_frequency_index 表示使用的取樣率下標

sampling_frequency_index sampling frequeny [Hz]

0x0 96000

0x1 88200

0x2 64000

0x3 48000

0x4 44100

0x5 32000

0x6 24000

0x7 22050

0x8 16000

0x9 2000

0xa 11025

0xb 8000

0xc reserved

0xd reserved

0xe reserved

0xf reserved

channel_configuration 表示聲道數

frame_length 一個ADTS幀的長度包括ADTS頭和raw data block.

adts_buffer_fullness 0x7FF 說明是位元速率可變的碼流

number_of_raw_data_blocks_in_frame

表示ADTS幀中有number_of_raw_data_blocks_in_frame + 1個AAC原始幀.

所以說number_of_raw_data_blocks_in_frame == 0 表示說ADTS幀中有一個AAC資料塊並不是說沒有。

二、編碼演算法處理流程

   首先對輸入的PCM訊號分段,每幀每聲道1024個樣本,採用1/2重疊,組合得到2048個樣本。加窗後,進行離散餘弦變化(MDCT),輸出1024個頻譜分量,依據不同取樣率和變換塊型別劃分成10個不同頻寬的比例因子頻帶。其中變化塊型別由 心理聲學模型 計算分析得到,該模型還將輸出 信掩比,用於後續模組的處理。

    AAC 還使用了一種新的稱為時域噪聲整形的技術,簡稱為 TNS。 TNS 的作用機理在於利用了時域和頻域訊號的對偶性。在立體聲編碼方面, AAC 既支援 M/S,又支援L/R,兩者的選擇準則是看位元數的消耗。基於人耳對高頻的定位主要取決於能量的特點,採用了增強立體聲(IS)技術,對耦合聲道只傳一路包絡。經過前述多個模組的預處理後,在量化和編碼階段才真正降低了資料量使用非均勻量化來改善小訊號的信噪比,把比例因子頻帶合併成分割槽後再對頻譜分量進行霍夫曼編碼。量化和編碼使用一種兩層巢狀迴圈演算法,以權衡位元速率和失真之間的矛盾。最後,進行位元流封裝,得到壓縮後的碼流


AAC各個模組計算量的比重

                   

   由此可見,量化編碼、心理聲學模型以及濾波器組模組是編碼演算法中復雜度、計算量較高的模組。