歡迎您光臨本站 登入註冊首頁

概述

1引言   近幾年,MP3音頻產品受到消費者的青睞,而高質量的音效是當前MP3音頻產品發展的重要趨勢。MP3文件解碼一般採用軟體解碼和硬體解碼兩種方法。硬體解碼實現簡單,……

1 引言
    近幾年,MP3音頻產品受到消費者的青睞,而高質量的音效是當前MP3音頻產品發展的重要趨勢。MP3文件解碼一般採用軟體解碼和硬體解碼兩種方法。硬體解碼實現簡單,但需增加硬體成本。軟體解碼需佔用大量CPU時間,實現難度大,但成本低、處理靈活,只要CPU具有足夠的處理速度則是一種很好選擇。本文介紹了MP3文件播放系統硬體和軟體設計,採用Cirrus Logic公司的EP9315處理器和UDA1341編解碼器,並介紹了基於uC/OS-II開源實時操作系統的MP3解碼原理,播放函數以及硬體介面初始化等。

2 MP3編解碼原理
    MP3是MPEG-1 Audio Layer-3的縮寫,它是一套完整的基於感知的音頻編碼演算法。這一演算法應用了心理聲學模型可達到1:12的壓縮比率。心理聲模型應用於人耳特性,最大限度保持原始聲音質量。MPEG-1 Audio編碼對象是20 Hz~20 000 Hz的寬頻聲音,採用感知子帶編碼,也叫做子帶編碼(sub-band coding,SBC),從而達到既壓縮聲音數據又儘可能保持聲音原有質量的目的。SBC編碼對象不局限於話音數據和某一種聲源。具體思想是:首先把時域中的聲音數據變換到頻域,對頻域內的子帶分量分別量化和編碼,根據心理聲學模型確定樣本精度,從而達到壓縮數據量的目的。子帶編碼的理論根據是聽覺系統的掩蔽特性,主要是利用頻域掩蔽特性,編碼過程中保留信號帶寬,但是卻扔掉被掩蔽的信號,因此編碼后還原(解碼、重構)的聲音信號與編碼前的聲音信號不相同.但人的聽覺系統很難分辨出它們的差別。因此.對於聽覺系統,這種壓縮是“無損壓縮”。
    當打開MP3文件后,播放器首先試圖對幀進行同步,然後分別讀取通道息及增益因子等數據,再進行霍夫曼解碼,至此已獲得解壓數據。但這些數據不能播放,它們仍處於頻域,若要播放,還需將其通過特定手段由頻域變換到時域。然後再分別進行立體化處理、抗鋸齒處理、IMDCT變換、IDCT變換及窗口化滑動處理。這樣得到的數據就可進行D/A轉換並播放。
    MP3歌曲的解碼是一個非常複雜的過程.可通過Start_mp3_decode()解碼函數完成。另外,還需給解碼函數進行供給數據、針對音頻介面的初始化、針對播放過程的初始化等操作。

3 系統硬體設計
3.1 系統結構分析
    本系統以EP9315為核心.包括Philips公司的UDA1341型立體聲音頻編解碼器、SDRAM、Flash存儲器。處理器通過IIS介面控制音頻數據在系統內存(SDRAM)與UDA1341之間傳輸。通過L3控制埠實現UDA1341的配置和控制,本設計系統MP3採用USB Host結構。使用時需插U盤。系統結構圖如圖1所示。
 
圖1 系統結構圖
3.2 音頻解碼器介面部分
   IIS(inter-IC Sound)匯流排是Philips公司提出的串列數字音頻匯流排協議。它是一種面向多媒體的音頻匯流排專用於音頻設備之間的數據傳輸,為數字立體聲提供序列的連接至標準編解碼器。IIS匯流排只處理聲音數據,其他信號(如控制信號)必須單獨傳輸。為了使電路的引出腳儘可能少,IIS只使用3條串列匯流排提供分時復用功能的數據線、欄位選擇線和時鐘信號線。
    整個音頻系統的硬體設計主要是CPU與編解碼器的連接。本系統採用Philips公司的基於IIS音頻匯流排UDA1341型音頻編解碼器。UDA1341支持IIS匯流排數據格式,採用位元流轉換技術進行信號處理,具有可編程增益放大器(PGA)和數字自動增益控制器(AGC)。UDA1341對外提供兩組音頻信號輸入介面.每組包括左右2個聲道。由於IIS匯流排只處理音頻數據,因此UDA1341還內置用於傳輸控制信號的L3匯流排介面。L3介面相當於混音器控制介面,可以控制輸入/輸出音頻信號的低音及音量大小等。L3介面接至EP9315的3個通用GPIO輸入輸出引腳。EP9315內置多達6通道的IIS匯流排介面,可直接外接16位的立體聲編解碼器,含有3個發送通道和3個接收通道。EP9315支持12個獨立的DMA通道,其中10個通道是用於外圍模塊與存儲器之間的數據傳輸,另外2個通道是專用於存儲器之間的數據傳輸。
    如圖2所示,器件EP9315的IIS匯流排信號與UDA1341的IIS信號直接相連接。L3介面的引腳L3MODE、L3CLOCK和L3DATA分別與EP9315的EGP1012、EGPIO11和EGPIO10通用數據輸出引腳相連,利用這3個I/O埠模擬L3匯流排的全部時序和協議實現控制。
 
圖2 音頻部分連接圖

4 軟體設計
4.1 嵌入式實時操作系統uC/OS-II
    對大多數移動設備而言,採用公開源代碼的操作系統uC/OS-II是最好的選擇。uC/OS-II是一個完整、可移植、可同化及可裁減佔先實時多任務內核。uC/OS-II大致分為內核、任務管理、時間管理、任務同步與通信、與CPU的介面等5部分,其中任務管理部分與任務操作密切相關,包括任務建立、刪除、掛起、恢復等。任務同步與通信部分包括信號郵箱、郵箱隊列和時間標誌等部分,主要用於任務間的相互聯繫和對臨界資源的訪問吲。

4.2 uC/OS-II內核的多任務管理
    uC/OS-II除了具有良好的穩定性和安全性外.主要是對多任務的管理,可以管理多達64個任務。除了8個自用任務外,用戶的應用程序最多可達56個任務。
    在多任務系統中,內核負責管理各個任務,並且負責任務之間的通信。內核提高的基本服務是任務切換。由實時內核管理。一個任務有5種狀態,在任意給定時刻,任務狀態一定是這5種狀態之一:休眠、就緒、運行、掛起(等待某事件發生)和被中斷。
    uC/OS-II總是進入就緒狀態任務中優先順序最高的那一個。通過任務級的調度函數OSSched()或者中斷級的調度函數OSIntExt()在任務就緒列表OSRdyTb()中查找,在確定優先順序最高的就緒態任務后,如果有更高優先順序的任務要運行,調用OS_TASK_SW()完成實際的任務切換。

4.3 uC/OS-II任務間通信
    uC/OS-II有3種用於數據共享和任務通信方法:信號量、郵箱和消息隊列。信號量是一個二值量或可計數量,用於表示一個或者多個事件的發生.或者用於實現共享資源的互斥訪問。任務調用函數OSSemPend()等待一個信號量,用OSSemPost()發送一個信號量。郵箱和消息隊列都是uC/OS-II中利用指針變數的通信機制。郵箱中包含一個指針。指向包含了特定“消息”的數據結構,也可把郵箱當作二值信號量實現資源互斥訪問。而消息隊列可看作是多個郵箱組成的數組,只是它們共用一個等待任務列表。每個指針所指向的數據結構可按具體應用設定。
    此系統中含有播放(play)、暫停播放(pause)、停止播放(stop)、音量控制(control volume)、下載音樂(download)5個任務。各任務設置相應任務堆棧和優先順序,其中download任務優先順序最高,其他4個任務優先順序從高到低依次為停止播放(stop-task)、暫停播放(pause-task)、音量控制(control volume-task)、播放(play-task)。這樣在播放(play-task)運行態時,其他任務也能獲得CPU控制權,完成播放過程中的其他功能。
    ARM處理器有音頻文件解碼庫,能夠有效的解碼MP3格式的歌曲,輸出16-bit立體聲PCM數據。在播放任務play-task中。調用int play(struct audio_play *play)函數播放歌曲,struct audio_play *play是自定義的audio_play類型指針。播放時調用voidwrite_dev()初始化IIS介面和DMA2,以下為實現軟體播放的主要代碼:
int play(struct audio_play *Audio_play)
{struct buffer *buffer;
unsigned int len;
buffer=&output[bindex];
while(buffer->playing==1);
buffer->speed=c_speed;
len = audio_pcm_s16le();
buffer->pcm_length += len;
if ((buffer->pem_length+ MAX_NSAMPLES*2*2)
>=sizeof(buffer->pcm_data))
{write_dev();
bindex=(bindex+1)}
return 2;
}

5 運行播放任務時介面初始化
    在系統開始時,需初始化硬體函數,各介面的初始化根據任務的具體執行要求。設置相應的控制寄存器實現。ARM存儲系統中。所有I/O映射為地址空間,易於實現讀寫操作。其中對UDA1341的初始化需要注意L3控制埠的時序。因為L3控制埠由ARM 器件的通用PORT控制 需軟體編程實現傳送控制信息過程中符號L3的時序。實現IIS初始化的主要代碼為:
void IIS_Init(void)
{rIISCON&=0;
rIISMOD&=0;
rIISFCON&=0;
rIISCON1=(1<<5)|(1<<2)|(1<<1);
rIISMOD|=(0<<8)|(2<<6)|(0<<4)|(1<<3)|(1<<2)|(1<<0);
rIISFC0N|=(1<<15)|(1<<13)
}
    實現DMA初始化的主要代碼為:
void DMA_init(void)
{rDISRC2=(U32)(output[playing_index].pcm_data);
rDISRCC2=(0<<1)|(0<<0);
rDIDST2=(U32)0x55000010;
rDIDSTC2=(1<<1)|(1<<0);
rDCON2=(0<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|
(0<<24)|(1<<23)|(1<<22)|(1<<20)
|((output[playing_index].pcm_length)/2);
rDMASKTRIG2=(1<<1);
rIISC0N (1<<0);
}
    實現UDA1341初始化的主要代碼為:
unsigned Init_UDA1341(void)
{uda134l_volume=62-((DEF_VOLUME*61)/100);
uda1341_boost=0;
uda_sampling =DATA2_DEEMP_NONE | DATA2_PEAKAFTER;
uda_sampling&=~(DATA2_MUTE);
write_gpio_bit(GPIO_L3CLOCK,1);
write_gpio_bit(GPIO_L3MODE,1);
static void uda1341_l3_address(u8 data)
static void uda1341_l3_data(U8 data)
write_gpio_bit(GPIO_L3CLOCK,1);
write_gpio_bit(GPIO-L3MODE,0);
return 1;
}

6 結束語
    本系統充分利用了uC/OS-II的多任務管理和任務通信功能。提出了一種基於EP9315處理器的MP3文件播放系統,支持串口調試和USB介面下載歌曲。由於系統採用UDA1341編解碼器件。具有音
頻輸入介面,因此可以擴展系統的錄音功能。


[admin via 研發互助社區 ] 基於uC/OS II的MP3文件播放系統設計已經有2707次圍觀

http://cocdig.com/docs/show-post-42100.html