Global Sources
電子工程專輯
 
電子工程專輯 > 處理器/DSP
 
 
處理器/DSP  

MPEG音訊即時解碼系統的DSP實現

上網時間: 2004年08月29日     打印版  Bookmark and Share  字型大小:  

關鍵字:MPEG  DSP  IMDCT  Huffman編碼  子帶合成 

為了使用單片DSP實現MPEG音訊即時解碼,本文對MPEG音訊解碼演算法的運算量和儲存量要求進行了分析,並根據編碼品質和處理器速度的要求結合電腦模擬結果,介紹了充分利用ADSP2181為音訊處理最佳化的硬體結構,對MPEG解碼演算法及DSP設計最佳化的方法。

MPEG音訊解碼過程是透過I/O埠獲得MPEG音訊碼流數據,依照MPEG標準進行解碼,並以PCM碼流格式存放在數據空間的緩衝單元中,供直接記憶體存取(DMA)方式使用。MPEG音訊解碼的主程式流程如下:開始-->輸入位元流查找標題-->側資訊解碼-->比例因子解碼-->霍夫曼數據解碼-->反量化採樣-->頻譜重排序-->減少混疊-->透過IMDCT綜合併重疊-->透過多相濾波器組綜合-->輸出PCM樣點-->結束。

可以看出對輸入碼流進行解碼先要經過訊框同步,讀入同步頭的資訊,得到該MPEG音訊碼流的採樣頻率、碼流速率等參數,並且記錄所解碼的MPEG碼流的訊框數,接著獲取側資訊。從側資訊中根據同步頭中所得的MPEG碼流的壓縮類型來讀取資訊,獲得對應於各自顆粒中各自通道的相關參數。然後,對一訊框中的兩個顆粒進行解碼,首先從碼流中獲取每個顆粒所對應的比例因子,並對每個顆粒下的數據進行霍夫曼解碼,這個霍夫曼解碼過程需要34個霍夫曼碼表之一進行解碼,可以從側資訊中含有的每個顆粒選擇碼表的資訊來進行選擇。

經過霍夫曼解碼的數據接下來要經過反量化採樣。在這一步中,各個子帶的數據根據所使用窗的類型,利用在側資訊中獲得參數反量化。然後是立體聲處理模組,這個模組根據MP3碼流所採用的壓縮類型進行相應的處理。如果MPEG音訊碼流是立體聲或雙聲道壓縮的,那麼就要對每一個通道的音訊數據進行如下處理:圖1:系統結構框圖。

重新排序處理:根據窗變換標記和所使用窗的類型所決定長窗、短窗和混和窗三種方式進行數據的重新排列;

抗鋸齒處理:這一步中使用抗鋸齒蝶型對每個子帶中的數據進行處理;

IMDCT:對每通道中的32個子帶的數據根據所使用窗的不同進行變換,在這一步中需要兩組144點的表用以儲存窗類型數據和正弦數據;

多相頻率倒置:對於經過IMDCT的子帶數據按照在偶數號子帶中偶數號數據符號取反的原則進行處理,然後將所得數據輸入到子帶合成濾波器的輸入緩衝中;

子帶合成:這一步需要4.5KB的緩衝用來儲存同步濾波器參數和同步窗數據。

這樣,當處理完一個顆粒中所有通道的數據後,就可以將這一顆粒已解碼好的數據輸出到輸出緩衝區中。當將下一顆粒的數據解碼並輸出後,這樣一訊框數據解碼完成,這訊框數據就可以輸入到D/A部份進行播放,並將輸出緩衝清空,等待下一訊框的解碼數據輸入。解碼程式直到碼流中再也找不到一訊框的同步頭時,就完成這一音訊流的解碼。

MPEG音訊解碼系統設計

MPEG音訊解碼器的解碼演算法完全由DSP晶片實現,其控制部份用CPLD實現。電路的整體設計與開發需要綜合考慮前面兩部份程式演算法介面內容,可以在進行詳細程式設計基礎上進行。這樣,可以把MPEG音訊解碼器的開發工作分為兩大模組:MPEG音訊解碼程式DSP實現,即軟體設計,以及CPLD控製程式開發和電路板設計部份,即硬體設計。各個模組的開發工作針對該開發模組的特點進行。MPEG音訊解碼系統開發從模組上可以劃分為硬體開發和軟體開發兩個部份。軟體主要實現MPEG音訊解碼演算法,硬體實現記憶體存取控制、MPEG音訊文件播放控制以及電源供給等功能。系統總體的功能結構如圖1所示。圖2:MPEG音訊解碼器軟體系統功能原理圖。

軟體系統設計方案是用DSP軟體實現MPEG音訊解碼演算法功能,並完成相應的介面存取功能,軟體功能見圖2所示。

透過分析,我們可以看出使用DSP作為MPEG音訊解碼系統的核心晶片,並輔助相應的擴展功能模組,就能夠方便地實現一個獨立的解碼系統。這樣的系統還能夠方便地透過修改DSP中的程式進行系統升級。

系統實現的框圖見圖3,該框圖為MPEG音訊解碼系統的基本組成部份,在圖中與電腦的介面晶片採用USB介面晶片,透過USB介面將MPEG等格式的音訊流下載到FLASH記憶體中。除了用於儲存音樂的FLASH之外,還應有儲存MPEG音訊解碼程式及其所用碼表的FLASH記憶體,這種FLASH的速度要求比較快,容量不必很大,一般256K就可以。如果使用ADSP2181,因為其內部RAM只有16k,那麼片外擴展RAM是必要的。

在一般情況下,該系統可以透過其USB介面借助電腦從網際網路上下載音訊文件,並將這些文件儲存到FLASH記憶卡中。當聽音樂的時候,啟動該系統的解碼部份,將存於FLASH中的DSP解碼程式加載到DSP中的內部RAM中,DSP開始執行解碼程式,從儲存音樂的FLASH中讀取要解碼音訊流,在這種情況下,ADSP2181具有的6通道DMA控制器為系統的設計帶來了很大的便利。ADSP2181在處理器全速執行的情況下可以自動完成DMA埠的接收和發送數據,而不需要處理器的干預。利用這個特點,可以透過DMA埠來實現ADDSP2181讀入和讀出數據。將解碼後的音訊流經過D/A後輸出到耳機,就可以聽到MPEG音訊解碼後的音樂了。這個系統的優點在於可以根據音訊技術的發展,加入新的DSP解碼程式就可以滿足升級的需要。

MPEG音訊解碼演算法的DSP設計和最佳化

1. 程式空間和數據空間的安排和最佳化

MP3解碼程式所需的程式區空間約為24KB,所需儲存變量的空間約為10KB,而其在解碼中所需要的各種碼表和參數所需要的儲存空間約為10KB,因為在MP3解碼中產生和變換的數據量比較大,所以需要比較大的堆疊段,經過多次測試和比較,其所需空間的大小至少為10KB。另外,在程式執行時還要考慮其所需要的動態空間的大小。所以根據以上的要求就可以編寫該程式的CMD文件。

在ADSP2181的軟體模擬器下執行該程式,在該模擬器下給出可以利用的資源如下:


a. 可以映射到程式區地址範圍和記憶體類型


(0x80到0x2000):/雙埠RAM/


(0x2000到0x8000):/單埠RAM,SARAMl/


(0x8000:到0x10000):/外部擴展RAM和ROM/


(0x18000到0x20000):/單埠RAM,SARAM2/

b. 可以映射到數據區地址範圍和記憶體類型


(0x0到0x60):/記憶體暫存器/


(0x60到0x2000):/雙埠RAM/


(0x2000到0x8000):/單埠RAM,SARAMl/


(0x8000到0x10000):/外部擴展RAM和ROM/


將DSP設置於微處理器模式,並使OVLY為1,編寫CMD文件。如下所示:


MEMORY


{


PAGE 0: DRAM (RWI) :0=0x0080, 1=0x0500


PROG (RWXI) :0=0x18000, l=0x8000


PAGE 1: DATAl (RW) :0=0x580, l=0x500


RAMl (RW) :0=0xa80, l=0x580


RAM2 (RW) :0=0xl000, l=0x 1000


DATA2 (RW) :0=0x2000, 1=0x6000


DA'I'A (RW) : 0=0x 8000, 1=0x8000


}


SECTIONS


{


.text :>PROG PAGE 0


.cinit :>DRAM PAGE 0


.cio :>DRAM PAGE 0


.switch :>DRAM PAGE 0


.bss :>DATA PAGE 1


.const : >DATA1 PAGE 1


.sysmem :>DATA PAGE 1


.stack :>DATA2 PAGE 1


.input : fill=0x00,>RAMl PACE 1,align(256)


}

2.解碼程式各個模組運算量的最佳化

在進行MPEG音訊解碼之前,有必要做一些準備工作:


a. 在數據空間劃分大約4.5KB的空間,將在霍夫曼解碼中所用的34個碼表寫入,這部份數據地址可以映射到片外擴展的FLASH ROM中去;


b. 可以將在IMDCT模組中的正弦表和窗函數表寫入到片外擴展的FLASH ROM中,因為這些數據都是浮點的,用DSP即時產生比較費時;


c. 片外擴展FLASH ROM中還應該有一個4KB的碼表用以儲存用於子帶合成濾波器組的參數,這些數據都是正弦浮點表示,用查表的方式來得到其值是比較快的一種方法。圖3:MP3音訊解碼系統的實現框圖。

做完這些工作後就可以進行解碼。在解碼的各個模組中運算量主要集中在反量化採樣、IMDCT和子帶合成濾波模組,並且以後兩者的運算量為最大。以下將說明在這三個模組中如何簡化運算量:

反量化採樣模組 在這個模組中涉及較多的是冪指數運算,並且冪指數一般不是整數。如果直接使用C語言所帶的POWER函數,那麼匯編的程式碼太長。對其最佳化的辦法是觀察其運算公式,因為公式中所取的各個變量的取值個數是有限的,所以其運算結果也就是可數的,因此可以預先運算出這些結果,編成一個表格,根據實際的變量的選取來作為查表的索引。

IMDCT模組

在這個模組中主要涉及到兩個問題,一是找到一種快速方法來實現求餘演算法,二是如何快速實現大量的乘累加運算。對於前者,可以使用如下語句來代替求餘函數:


n1=2*p+19;


n2=2*m+l;


n=_smpy(nl,n2);


j=n/144;


n=n-144*j


這樣做可以較大幅度地提高運算速度。對於後者,因為在DSP中有專用的匯編指令來實現乘法累加功能,理論上對定點的乘法累加運算速度比較快。但是在本程式中參加乘法累加運算的都至少是單精密度的浮點數,其運算速度比較慢。因此,有必要將浮點轉定點運算,因為在MPEG音訊流中的數據都是16位元定點數據,可以確定其值的取值範圍,可以將用於乘法累加運算的數據乘以一個比較大的係數,透過捨入運算使其值變為整數,可以用32,768到32,767之間的整數來表示這些數據。這樣一來就可以利用在CCS中所提供的INTRISIC函數庫中的快速運算指令。

但是,在以上所說的過程中需要注意防止乘以較大係數後溢出問題,因為加法器是40位元,乘法器是17位元乘17位元,所以乘法累加的中間結果是不會出現溢出和誤差,因此經過放大後的乘累加結果最後再除以放大係數仍然可以用一個字來表示。這樣的處理使程式結構變複雜,並且帶來一定的捨入噪音。由於是採用的16位元量化,導入的捨入噪音影響不大。而使用INTRISIC函數庫中的快速運算指令,需要注意DSP的管線指令作業,以免引起管線衝突。

子帶合成模組 該模組主要涉及到乘法累加運算的簡化。

作者:何寧,王明俊,張樹才,姚靜波,段明升


Email:hening1980@sohu.com


裝備指揮技術學院電子工程系





投票數:   加入我的最愛
我來評論 - MPEG音訊即時解碼系統的DSP實現
評論:  
*  您還能輸入[0]個字
*驗證碼:
 
論壇熱門主題 熱門下載
 •   將邁入40歲的你...存款多少了  •  深入電容觸控技術就從這個問題開始
 •  我有一個數位電源的專利...  •  磷酸鋰鐵電池一問
 •   關於設備商公司的工程師(廠商)薪資前景  •  計算諧振轉換器的同步整流MOSFET功耗損失
 •   Touch sensor & MEMS controller  •  針對智慧電表PLC通訊應用的線路驅動器
 •   下週 深圳 llC 2012 關於PCB免費工具的研討會  •  邏輯閘的應用


EE人生人氣排行
 
返回頁首