1. 程式人生 > >MP3編碼分析

MP3編碼分析

目錄

一、MP3檔案格式解析....2

1、MP3檔案及MPEG概述...2

二、MP3編碼原理....4

1、MP3編碼流程...4

2、子帶濾波器排——編碼流程圖中編號為1......5

3、改良後的DCT(MDCT)——編碼流程圖中編號為2......7

4、聲音心理學模型——編碼流程圖中編號為3......8

5、位元分配、量化和Huffman編碼——4......12

三、SHINE程式分析....13

1、檔案資料結構...13

2、編碼前化工作...14

3、MP3編碼...14

4、後處理...17

注:下面的資料參考網上論文整理而來

一、MP3檔案格式解析

1、MP3檔案及MPEG概述

MP3檔案是由幀(frame)構成的,幀是MP3 檔案最小的組成單位。MP3 的全稱應為MPEG1 Layer-3 音訊檔案。

MPEG(MovingPicture Experts Group),MPGE音訊層指MPGE檔案中的聲音部分,根據編碼質量和複雜程度分為3層,即Layer-1、Layer2、Layer3,對應MP1、MP2、MP3三種格式檔案。

2、MP3檔案結構

MP3檔案分為TAG_V2(ID3V2),Frame, TAG_V1(ID3V1)共3部分。

(1)Frame格式

幀頭為4個位元組,其結構如下

typedef FrameHeader{

unsigned intsync:11;           //同步資訊

unsigned intversion:2;          //版本

unsigned intlayer:2;            //層

unsigned intprotection:1;        // CRC校驗

unsigned intbitrate:4;           //位率

unsigned intfrequency:2;        //取樣頻率

unsigned intpadding:1;          //幀長調節

unsigned intprivate:1;           //保留字

unsigned intmode:2;            //聲道模式
unsigned int mode extension:2;    //

擴充模式

unsigned intcopyright:1;          // 版權

unsigned intoriginal:1;            //原版標誌

unsigned intemphasis:2;          //強調模式

}HEADER, *LPHEADER;

無論幀多長,每幀播放時間為26ms。MAIN_DATA長度為

Length(MAIN_DATA)=((version==MPEG1)?144:72)* bitrate / frequency +padding;資料長度

MP3幀長取決於位率和頻率,計算公式為
(144*64000)/44100+1=210

1 MP3幀頭位元組使用說明
名稱 位長
同步資訊 11 12位元組 所有位均為1,第1位元組恆為FF
版本 2 00-MPEG 2.5   01-未定義     10-MPEG 2     11-MPEG 1
2 00-未定義      01-Layer 3     10-Layer 2      11-Layer 1
CRC校驗 1 0-校驗        1-不校驗
位率 4 3位元組 取樣率,單位是kbps,例如採用MPEG-1 Layer 364kbps是,值為0101
bits V1,L1 V1,L2 V1,L3 V2,L1 V2,L2 V2,L3
0000 free free free free free free
0001 32 32 32 32(32) 32(8) 8 (8)
0010 64 48 40 64(48) 48(16) 16 (16)
0011 96 56 48 96(56) 56(24) 24 (24)
0100 128 64 56 128(64) 64(32) 32 (32)
0101 160 80 64 160(80) 80(40) 64 (40)
0110 192 96 80 192(96) 96(48) 80 (48)
0111 224 112 96 224(112) 112(56) 56 (56)
1000 256 128 112 256(128) 128(64) 64 (64)
1001 288 160 128 288(144) 160(80) 128 (80)
1010 320 192 160 320(160) 192(96) 160 (96)
1011 352 224 192 352(176) 224(112) 112 (112)
1100 384 256 224 384(192) 256(128) 128 (128)
1101 416 320 256 416(224) 320(144) 256 (144)
1110 448 384 320 448(256) 384(160) 320 (160)
1111 bad bad bad bad bad bad
V1 - MPEG 1    V2 - MPEG 2 and MPEG 2.5
L1 - Layer 1     L2 - Layer 2     L3 - Layer 3
"free" 
表示位率可變    "bad"  表示不允許值
取樣頻率 2 取樣頻率,對於MPEG-1  00-44.1kHz    01-48kHz    10-32kHz      11-未定義 對於MPEG-2  00-22.05kHz   01-24kHz    10-16kHz      11-未定義 對於MPEG-2.5 00-11.025kHz 01-12kHz    10-8kHz       11-未定義
幀長調節 1 用來調整檔案頭長度,0-無需調整,1-調整具體調整計算方法見下文。
保留字 1 沒有使用。
聲道模式 2 4位元組 表示聲道, 00-立體聲Stereo    01-Joint Stereo    10-雙聲道        11-單聲道
擴充模式 2 當聲道模式為01是才使用。
Value 強度立體聲 MS立體聲
00 off off
01 on off
10 off on
11 on on
版權 1 檔案是否合法,0-不合法   1-合法
原版標誌 1 是否原版,    0-非原版   1-原版
強調方式 2 用於聲音經降噪壓縮後再補償的分類,很少用到,今後也可能不會用。 00-未定義     01-50/15ms     10-保留       11-CCITT J.17

(2)ID3V1格式

ID3V1存放在MP3檔案結尾,共128Bytes,各項資訊都順序存放,不足部分使用’\0’補足,可使用UltraEdit開啟檢視。

typedef struct tagID3V1
{

char Header[3];/*標籤頭必須是"TAG"否則認為沒有標籤*/
char Title[30];/*標題
*/
char Artist[30]; /*作者
*/
char Album[30]; /*專集
*/
char Year[4]; /*出品年代
*/
char Comment[28]; /*備註
*/
char reserve; /*保留
*/
char track;; /*音軌
*/
char Genre; /*型別*/

}ID3V1,*pID3V1;

(3)ID3V2格式

ID3V2存放在MP3檔案的首部,由1個標籤和若干標籤組成

標籤頭為10個位元組,

char Header[3];          /*必須為"ID3"否則認為標籤不存在*/
char Ver;                /*版本號ID3V2.3 就記錄
3*/
char Revision;            /*副版本號此版本記錄為
0*/
char Flag;               /*存放標誌的位元組,這個版本只定義了三位,稍後詳細解說
*/
char Size[4];             /*標籤大小,包括標籤頭的10 個位元組和所有的標籤幀的大小*/

每個標籤幀都有一個10個位元組的幀頭和至少一個位元組的不固定長度的內容組成為,幀頭的定義如下:

char FrameID[4];    /*用四個字元標識一個幀,說明其內容,稍後有常用的標識對照表*/
char Size[4];         /*幀內容的大小,不包括幀頭,不得小於
1*/
char Flags[2];        /*存放標誌,只定義了6 位,稍後詳細解說*/

二、MP3編碼原理

1、MP3編碼流程

MP3編碼流程圖

訊號描述

(1)MP3編碼輸入訊號:PCM(Pulse Code modulation脈衝編碼調製)聲音訊號,有些.wav格式的音訊檔案為PCM訊號。

(2)MP3編碼輸出訊號:MP3格式碼流

MP3屬於有損失的格式,犧牲音樂檔案的質量以換取較小的檔案體積;
WAV是無損的格式,標準格式化的WAV檔案和CD格式一樣,是44.1K的取樣頻率,16位量化數字,因此在聲音檔案質量和CD相當。
MP3是利用一種音訊壓縮技術,由於這種壓縮方式的全稱叫MPEG Audio Layer3,所以人們把它簡稱為MP3。因為人耳只能聽到一定頻段內的聲音,而其他更高或更低頻率的聲音對人耳是沒有用處的,所以MP3技術就把這部分聲音去掉了,從而使得檔案體積大為縮小,但在人耳聽起來, 卻並沒有什麼失真。MP3可以將聲音用1∶10甚至1∶12的壓縮率進行壓縮.

wav檔案頭格式

wav資料塊

WAV格式檔案所佔容量= (取樣頻率X量化位數X 聲道)X 時間/ 8 (位元組= 8bit)。

14H~15H的2個位元組值為1時表示資料是PCM編碼格式,可以作為MP3編碼器的輸入。

2、子帶濾波器排——編碼流程圖中編號為1

子帶濾波器及MDCT處理

子帶濾波過程

為多重相位濾波器,將PCM訊號輸入後,濾波器系統看做線性系統,則有

再將用32點進行下采樣,得子帶濾波器輸出結果為

ISO-M標準給出瞭如下圖所示的實現方法,我們的程式將按照該實現方法編寫。

ISO-M給出的濾波器組的實現

將上圖整個流程綜合用表示式表示為

其中

為分析矩陣的係數。是窗函式的係數,共512個點,其值在ISO11172-3標準的 ANNEX_C.DOC文件中給出了,為子帶序列號,範圍為0~31,為第i個子帶的樣點,且t是取樣間隔的整數倍。

3、改良後的DCT(MDCT)——編碼流程圖中編號為2

DCT變換的目的:進一步提高頻譜解析度,將每一個子頻帶細分為18個次頻帶

在正式DCT運算前,需要對子帶訊號進行加窗處理,有如下4中窗框,長窗框(Normal Window)、長短窗框(Start Window)、短窗框(Short Window)與短長窗框(Stop Window)。

長窗框具有高的頻譜解析度,短窗框的時間解析度比較高。

然後進行DCT變換,變換表示式 如下,

為DCT變換前加窗處理後的結果,如果加短窗框,則DCT運算中的,若加長框,則DCT運算中的

在提高頻域解析度的同時,加長框後會有假象(混疊現象)產生,因為不同子帶之間存在混疊的訊號,加長框會對混疊的訊號當做該子帶內正常訊號處理,一種避免的辦法是減弱混疊訊號的強度。

噢,現在我們是知道了,所謂改良的DCT只不過是,(1)DCT變換前加窗處理(2)DCT變換(3)長框假象的處理 這3個過程。

到這裡,還有一個問題,那就是窗框的選擇問題,該如何選擇窗框?窄的窗框具有好的時間解析度,寬的窗框具有好的頻率解析度。我們回到編碼流程圖,

請注意圖中的標號3,3表示聲音心理學模型,窗框的寬窄選擇與聲音心裡學模型相關,下面來分析該模型。

4、聲音心理學模型——編碼流程圖中編號為3

研究聲音心理學模型用途有:

1)研究模型的PE值決定做MDCT變換時使用長窗框還是短窗框

(2)研究模型的SMR值決定量化編碼時的位元數分配

現在不明白以上2條用途沒關係,我們先來分析幾個重要的概念

(1)SPL(Sound Pressure Level),表示聲音強度的名詞,SPL是評價聽覺刺激強度的標準,也就是說,我們對外界聲音的感覺強度完全由它決定,其單位為dB。

(2)靜音門檻曲線

橫軸為f(HZ),縱軸為SPL(dB),若聲音強度(SPL)低於該曲線的值表示人聽不到聲音,如下圖所示。從圖中可以得出幾條結論:

第一,人的聽覺頻率範圍大約在10Hz~20KHz之間

第二,大約在3KHz到4KHz時SPL有最小值,也就是所人在該頻率範圍內的聽覺最敏銳

(3)臨界頻帶(Critical Bands)

因為人耳對不同頻率的敏感程度不同,MPEG1/Audio將22KHz範圍內可感知的頻率範圍劃分為23~26個臨界頻帶,如下圖。

從表中能得出幾條結論:

第一,噹噹中心頻率值在500Hz以內時,不同臨界頻帶的頻寬()幾乎相同,約100Hz

當中心頻率值大於500Hz後,隨著f值得上升,臨界頻帶的頻寬劇增

第二,從表中也可以看出,人耳對低頻的解析度要比高頻更好

(4)頻域上的遮蔽效應

SPL較大的訊號容易掩蓋頻率相近的SPL較小的訊號,叫聲音的遮蔽效應。就比如在機場很難聽到打電話的聲音。

如上圖所示,Masking Threshold(掩蔽閾值)將大約在0.7KHZ0.7kHz,1.6kHz和2.3kHz的訊號遮蔽了,當然0.7kHz訊號的SPL在靜音門檻曲線之下,不被遮蔽也是聽不到的。

在這裡,涉及3個重要的量——SMR、SNR和MNR

SMR(signal-to-maskratio):指在一個臨界頻帶內,從masker到遮噪門檻值的距離。

SNR(signal-to-noiseratio):指訊號經過m位元量化後的信噪比,等於量化前訊號方差和量化噪聲的方差之比,

MNR(mask-to-noise):用來測量人耳可以感知的失真引數,

如下圖所示,展示了3者之間的關係,其中的灰色區域Critial Band指臨界頻帶,Masking Threshold就是遮噪門檻曲線,圖中的SMR指在臨界頻帶內最大的SMR值。

遮噪門檻曲線和SMR、SNR、NMR

critial band是臨界帶,neighboring band是相鄰的條帶

值得注意的是,(1)我們上面討論的SMR、SNR和NMR三者都是基於臨界頻帶的,但遮蔽效應不僅對臨界頻帶有影響,對臨近的臨界頻帶也有影響,稱為遮噪延展性(2)上圖所顯示的是一個臨界頻帶內的一條遮噪曲線,實際情況存在多條遮噪曲線,結果是這些曲線的疊加。

(5)時域上的遮噪曲線

simultaneous masking是同時掩蔽

從上圖可以看出,在一段很短的時間內(200ms左右),若出現了兩個聲音,不管出現的先後順序,SPL大的聲音(masker)會遮蔽SPL小的聲音(maskee)。

若maskee出現在前,則遮噪曲線如上圖的Pre-Masking;若maskee出現在後,則遮噪曲線如上圖中的Post-Masking。由圖中很容易看出,Post-Masking要比Pre-Masking在時間軸上要長很多。Pre-Masking能遮蔽前回音,這是選擇MDCT視窗的一個依據。

(6)感知熵Perceptual Entropy(PE)

最重要的一點,PE能顯示特定訊號在理論上的壓縮極限。PE的單位是bits/sample,代表每個取樣在維持CD音質的情況下,能夠壓縮到的最低位元數。

重新回到本小節一開始就提到的聲音心裡學模型的用途,重新列一下:

(1)研究模型的PE值決定做MDCT變換時使用長窗框還是短窗框

(2)研究模型的SMR值決定量化編碼時的位元數分配

對於第一條,MP3中定義,當PE>1800時,使用短窗框的MDCT來處理該grannul(MP3每個資料幀包含2grannul,每個grannul包含18*32subband取樣)的子頻帶訊號。因為當PE>1800表示這段音訊變化比較大,可能產生迴音,不適合使用長框。

對於第二條,下面的位元分配將給出解釋。

5、位元分配、量化和Huffman編碼——4

(1)位元分配

位元分配目的是使每個頻帶的MNR達到最大,使音質最佳。過程為:尋找最小的MNR頻帶,分配位元給該頻帶以提高MNR,接著重新計算各頻帶的MNR。重複上述過程,直到位元分配結束。

[a]可編碼位元數計算方法,1152指每個編碼框的取樣個數,

比如,以單聲道為例,位元率為128kbps,取樣頻率為44.1kHz,則每個編碼框可編碼的位元數為3344。但考慮到擋頭的32位,附屬資料的136位和可選擇的16位CRC,所以最終可用的位元數為3344-32-136-16=3160,實際編碼最小單位為grannul,所以每個grannul可用位元數為3160/2=1580。

[b]MNR計算方法,在前面心理學模型中已經提到,

其中SMR由聲音心理學模型提供,SNR信噪比則是由量化確定的。

(2)非均勻量化

上式為MP3量化的公式,其中為MDCT輸出並調整後的值,為量化後的整數值,0.75是為了使量化器提供一致的SNR值,表示四捨五入。

下圖為量化器的輸入輸出曲線,量化器的輸入為浮點值頻率,輸出為整形值的頻率。

由圖知,量化器將輸入的浮點值量化後變為整型值,且量化過程為非線性非均勻的。

頻譜量化器的輸入輸出

三、SHINE程式分析

SHINE是一個C語言編寫的MP編碼程式,總共由11個原始檔構成。將原始檔新增到VC新建的控制檯應用程式中即可執行,但執行時得使用命令列方式。

1、檔案資料結構

在types.h中定義了一個config_t的結構體型別,並用它初始化了一個全域性變數config,該變數作用相當於面嚮物件語言中的“物件”,用於在整個編碼流程中對編碼資料和引數進行儲存和管理。

定義了一個用於儲存PCM脈衝格式檔案資訊的結構體型別wave_t,並且用wave_t在config_t中定義了wave變數,該變數儲存了MP3編碼的源的資訊,作為MP3編碼器的輸入。

定義了一個用於儲存MP3編碼後資訊的結構體型別mpeg_t,同樣用mpeg_t在config_t中定義了mpeg變數,該變數儲存的資訊作為編碼後的MP3引數資訊輸出。

typedefstruct {

    time_t start_time;     /*記錄編碼起始時間*/

    char* infile;          /*編碼輸入檔案*/

    wave_t wave;         /*PCM檔案頭資訊*/

    char* outfile;         /*編碼輸出碼流檔案*/

    mpeg_t mpeg;        /*MP3檔案頭資訊*/

} config_t;

以上的結構體主要用於儲存“頭”資訊,編碼輸出後的位元組流實體資訊儲存在bs結構體(bitstream.h檔案中定義)中,bs結構體定義為

staticstruct

{

  FILE *f;           /* bitstream output file handle */

  unsigned int i;      /*file buffer index */

  unsigned char *b;   /* buffer pointer */

} bs;

結構體中的檔案指標指向同一個輸出檔案,b指向編碼後的碼流,編碼結束後寫入檔案中。

2、編碼前化工作

包括初始化config.mpeg結構體變數的預設值,開啟wave型別檔案(SHINE程式中此時只讀取了檔案頭資訊,沒讀取實體資訊),根據讀取的資訊對mpeg輸出資訊進行配置。

3、MP3編碼

MP3編碼主要由3步組成,分析子頻帶濾波器組MDCT變換到頻域位元分配與量化。每次的操作物件為輸入PCM的一幀。

                              MP3編碼核心呼叫

 /* polyphase filtering */

多相濾波

for(gr=0; gr<config.mpeg.granules; gr++)

for(ch=0; ch<config.mpeg.channels; ch++)

for(i=0;i<18;i++)

L3_window_filter_subband(&buffer[ch],&l3_sb_sample[ch][gr+1][i][0] ,ch);

    /* applymdct to the polyphase output */

    L3_mdct_sub(l3_sb_sample, mdct_freq);

    /* bit andnoise allocation */

    L3_iteration_loop(mdct_freq, &side_info, l3_enc,mean_bits);

    /* writethe frame to the bitstream */