MP3 ( MPEG I Audio Layer 3 )是大家而熟能詳的一種音樂格式,此聲音壓縮技術近年橫掃全球,但由於大部分壓縮及解壓縮工作,都是利用軟體來處理,可攜性不佳。之前以帶領學弟將 MP3 Decoder 成功的 Real Time 的實現在 TI-C6x ( TMS320C6201 ) 的單晶片上。
本專題將利用C6X實現 MP3 Decoder 達到Real Time的經驗與基礎,再進一步的想要利用更低功率( Low Power )更有經濟化( Low Cost )的數位訊號處理C54x ( TMS320C54 ),來達到MP3解壓縮、播放的角色,並要求達到Real-time的境界,等於是把個人電腦中的CPU以及音效卡結合起來,以更小的體積、更低的價格來做同樣的功能。
下圖便是我們想要做的整個系統的略圖。
第一節 MP3的壓縮原理
在MPEG-1的標準中,將聲音訊號的壓縮標準分為三個層級,分別是MPEG LAYER 1、MPEG LAYER 2與MPEG LAYER 3。影音光碟就有採用LAYER 2的標準,至於MP3 就是MPEG LAYER3的產物了。進一步說,MP3就是把現在的CD音樂檔,以壓縮的方式儲存,透過CPU強大的運算能力,以軟體解壓縮的方式,就可以在電腦上聽到好聽的音樂了。至於這其中的壓縮效果有多好?我們可以如此計算,普通的CD音樂大約是以44.1khz的頻率、十六位元取樣,平均每分鐘音樂就要花掉 44100×16×2stereo×60的容量,大約是十MB的儲存空間。以目前每片光碟650MB的容量來說,一片CD的儲存量約在六十五到七十五分鐘之間。
MP3就是將這些樂曲透過壓縮的方式,增加更多的儲存量。由於MP3的壓縮比大約在十到十二倍之間,一分鐘的樂曲透過MP3壓縮,只要一 MB左右的儲存空間,換言之每片光碟可以儲存六百五十到七百五十分鐘的音樂,更重要的是,即使壓縮比如此驚人,音樂的品質依然直追CD,因為利用人類聽覺遮蔽的緣故,以現在一般個人電腦CPU的速度解壓MP3時,人類聽覺沒辦法分辨壓縮後有所不同,讓使用者不須為了追求高容量,而犧牲了聽的品質。
MPEG/audio 的壓縮,其Sampling rate可分為32、44.1、48kHz,支援的聲道有monophonic,dual-monophonic,stereo mode,joint-stero mode,Error detection為CRC error detection code還有Ancillary data。其主要是利用人類聽覺系統在某些情況下,會產生聽覺的mask而無法分辨出量化的雜訊,根據實驗亦發現人類聽覺有一個極限,也就是人類所能聽到的聲音頻率約為20Hz到20kHz之間,critical band並不能完整呈現出人類聽覺系統的聽覺特性,因為人類聽覺系統依據頻率來分辨聲音能量,所以任何頻率的雜訊遮罩只和其限定頻寬內附近的信號能量有關。MPEG/audio將聲音信號分配成接近critical band的subband,然後依據每一個subband的聽覺量化雜訊程度來量化。最有效的壓縮,即是將不需要的聽覺量化雜訊移除。也就是我們可以將一大部份人類聽覺系統所無法察覺的資料移除,以減少資料檔案達到壓縮的效果。
它利用到了人耳遮蔽效應,將人耳聽不到或不易辨認部份省去,只針對我們可辨認的音頻作壓縮,因此可以減少壓縮的量,使壓縮後的檔案變得很小。
首先經過時間跟頻率的mapping,再經過psychoacoustic model的處理,最後再經過量化及編碼等步驟而達成壓縮的目的。詳細的流程圖如圖一。
當然,解壓縮的過程便是壓縮過程的相反程序。接著我們先討論關於 MP3 檔案標頭的表示。
第二節 MP3 Bitstream
MP3 主要的位元資料格式主要如圖二。
每一個欄位的意義與其數字分別解釋如下
Header:
參考附錄A。
CRC:
在Header 中如果宣告包含 CRC 碼,則在有16 bit 的check code。反之在Header 中指出沒有包含 CRC 碼,則在 Header 後便緊接著 Side information。
Side Information:
如果為 Signal channel 則有 17 byte ( 136 bit )的information,若為雙聲道則將會有 34 byte ( 256 bit ) 的information 。而這些資料流的訊息( Side information ) 存放了該選擇哪一個 table 作為解碼的 table以及跳出的位元代表法。 (ESC-bit “linbits”)。
Main data
主要資料存放的地方。但是其資料流也包含了 Main data 何處結束或是資料何處開始的指標以及長度的資料。
這些為MP3 資料的格式。在程式的編寫方面可以參考附錄B的解碼流程圖。
第一節 硬體介紹
如圖三,為TMSC5402 DSP 的圖示。我們可以知道裡面主要擁有
圖 三
第二節 特殊指令的介紹
可以將兩的數相加後乘另一個數,只需一個 Cycle。
例如:
y= a0 * ( x(0) + x(7) ) ………..得到y 只需要一個 Cycle
這樣的指令將有助於我們在做 MDCT , DCT 時可減低Clock 數。
可以用於多項式的算法。這樣將可以減低我們計算 sine or cos 值時所需要的 clock 數。
方法一.
將 Float Point運算改為 Fixed Point 運算
這樣的方法就可以在程式中都使用 Fixed Point 的運算了。
結果:
利用上述的方法所運算處理的速度將會是浮點運算時間的數十倍快。但是使用這樣的方法卻會犧牲了音質。但這樣的音質大概能為一般人所接受,在圖五可以看出兩個分別使用
Floating Point 與 Fixed Point 所得結果的聲音的波形。我們可以看得出兩者的波形確實相差不遠。
方法二.
在模擬的過程中發現一項很好玩得事情。如果在 .mp3 的檔案中有資料錯誤時。則後面的 Frame 都會解錯!
經過研讀後才發現, MPEG/Layer III 的 main data 可能會有彼此相依的情形發生。如圖六。
結果:
main data 可以放在前一個 Frame 或是之前Frame 裡面。因此如果有一個 Frame 發生了錯誤,不能夠一下子就把這個 Frame 丟掉,因為這將會造成資料的遺失。應該在確定此 Frame 並沒有在被其他 main data 後
才可以丟棄。
這次的 C54x 儀器拿到的比較晚,所以並還不能完全的可以將整個的 MP3 Decoder 實現在晶片上執行。不過我想從拿到儀器到現在也花了不少工夫。
因為C54x 的許多C語言的定義與一般我們寫的VC
定義有很大的出入,如表二。
再加上程式中常常利用C的語法來取一個一個的bit。這使用了大量的左移或是右移。如果宣告的形態不同,將造成許多的錯誤。致力於這個地方已經得到結果了,現在已經可以利用 VC 相對的位元數模擬 C5x 相同位元數可以執行的程式了。
但因為在使用 C54x 並還為非常的熟習,因此仍有許多奇奇怪怪的 Bug 至今還為解決。但我想在暑假的時間可以再好好的將這些 Bug 解決後,便可以利用其 C54x 單晶片的特性將以加速,以其可以達到 Real Time 的速度。
MPEG/Audio Header:
MPEG 對於 Audio 的資料有著很細微的規定。它一共分三個層級(Layer 1,Layer 2 和 Layer 3),每個層級所用的解碼運算法以及解碼器的設置都不一樣。所以,它的檔頭資料就變得很重要。以下就大略的解釋一下 MPEG-1 定義的 Audio Frame的Header Information。
MPEG-1 的 Audio Frame Header 以 bit 為單位,順序定義如表一。
表 一檔頭位元配置表
位置 |
|
|
|
|||||
0-11 | 12 bit | 同步字元 | 1111 1111 1111 | |||||
12 | 1 bit | 演算法flag | 1:MPEG-1 0: 保留 | |||||
13-14 | 2 bit | Layer flag | 11:layer
I 10:layer II
01:layer III 00:保留 |
|||||
15 | 1 bit | 糾錯flag | 1:未添加多餘度
0:添加了錯誤碼保護多餘度 |
|||||
16-19 | 4 bits | 碼率
flag
( 與立體聲,聯合立體聲,雙通道,單通道等具體編碼模式無關 ) |
索引 | Layer
I |
Layer II | Layer III | ||
0000 | Free for-mat | Free for-mat | Free for-mat | |||||
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 | |||||
20-21 | 2 bit | 取樣頻率 | 00:44.1 kHz 01:48 kHz 10:32 kHz 11:保留 | |||||
22 | 1 bit | 緩衝flag | 1: frame內包含將平均碼率調至取樣率的附加
Slot ( layer I 4 bytes, layerII 和
layer III 1 bytes,僅用於 44.1 kHz 取樣率
)
0: 不包含: |
|||||
23 | 1 bit | 專用位元 | 留待私用( 此位元將來 ISO 也不用 ) | |||||
24-25 | 2 bit | 模式 flag | 00:立體聲 01: 聯合立體聲 ( layer I,layer II 為強度立體聲, layer III 可以為和差立體聲 ) 10: 2 channel 11: 1 channel | |||||
26-27 | 2 bit | 模式擴充 | 僅用於聯合立體聲模式。
在 layer I,layer II,指示哪些子帶用強度立體聲編碼 ( 其餘為立體聲編碼 ): 00:4-31 01:8-31 10:12-31 11:16-31 在 layer III,若上面的 flag 採用聯合立體聲編碼方法,那這兩個 bits 就用來指出是採用哪一種立體聲編碼。而強度立體聲及和差立體聲的頻帶範圍則隱含在演算法中。 |
|||||
索引 | 強度立體聲編碼 | 和差立體聲編碼 | ||||||
00 | No | No | ||||||
01 | Yes | no | ||||||
10 | No | Yes | ||||||
11 | Yes | Yes | ||||||
28 | 1 bit | 版權 flag | 0:無版權要求
1:有版權保護 |
|||||
29 | 1 bit | 原版 flag | 0:bit
stream 是複製的
1:bit stream 是原始的 |
|||||
30-31 | 2 bit | 加重標識 | 指示應用哪一種去加重措施。
00:編碼時未加重 01:50/15 微秒加重 10:保留 11: CCITTJ.17 |
以下我們來看一個例子,假設我們開啟某個MP3檔案,其檔頭為:
FF FB 90 44 00 00 .............
我們先將它轉成二進位格式
1111 1111 1111 1011 1001 0000 0100 0100 0000 0000 ..............
再對照表一,我們就可以很明白的看出這個mp3 file的基本資訊。
1111 1111 1111 是同步字元,1011 表示是 MPEG-1,layer III encoding,未添加任何糾錯資料,1001 表示這個檔案是以 128 kbps 來 sample 的,1001 則說明了檔案 sample rate 是 32 kHz,0000 表示是立體聲模式,0100 表示無版權的原始檔案,編碼時未加重。
MP3資料格式與解碼流程:
根據 MP3 Encoder 所利用的數個壓縮原理,我們的解碼過程可以縮是利用壓縮的相反方向來進行的。