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
名稱 | 位長 | 說明 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
同步資訊 | 11 | 第1、2位元組 | 所有位均為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 3,64kbps是,值為0101。
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是才使用。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版權 | 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每個資料幀包含2個grannul,每個grannul包含18*32個subband取樣)的子頻帶訊號。因為當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 */