楊 博, 張亞平, 丁 瑞
(首都師范大學(xué) 信息工程學(xué)院, 北京 100048)
通信作者:張亞平(1968—),女,湖南湘潭,碩士,工程師,主要研究方向?yàn)橛?jì)算機(jī)應(yīng)用、嵌入式系統(tǒng)開發(fā).
多任務(wù)音頻播放與實(shí)時(shí)頻譜變換的實(shí)現(xiàn)
楊 博, 張亞平, 丁 瑞
(首都師范大學(xué) 信息工程學(xué)院, 北京 100048)
使用ARM嵌入式開發(fā)實(shí)驗(yàn)箱UPTECH2410、μC/OS-II多任務(wù)調(diào)度操作系統(tǒng)和圖象顯示庫系統(tǒng),設(shè)計(jì)了一款能在彩色LCD屏上同步顯示歌詞、音頻頻譜信息、歌曲點(diǎn)播選單和對(duì)應(yīng)曲目主題畫面的可視化MP3播放器。給出了系統(tǒng)工作流程,討論了該系統(tǒng)是如何使用雙緩沖機(jī)制播放和處理音頻以保證音頻播放的實(shí)時(shí)性和無縫性,提出一種針對(duì)歌曲音頻的高效頻譜變換方法,并對(duì)常見的WAV音樂格式進(jìn)行了分析。
多任務(wù)音樂播放; 頻譜變換; μC/OS-II
MP3播放器種類繁多,按照操作系統(tǒng)屬性可以分為:
(1) 基于通用操作系統(tǒng),如Window、Linux、安卓等;
(2) 基于嵌入式實(shí)時(shí)操作系統(tǒng),如μC/OS、TinyOS、RTOS、剪裁修改的Linux等,很多高檔專用MP3播放器使用嵌入式實(shí)時(shí)操作系統(tǒng);
(3) 無操作系統(tǒng),使用簡(jiǎn)單的前后臺(tái)或者輪詢程序控制,屬于廉價(jià)低端MP3設(shè)備[1-3]。
為滿足教學(xué)、科研的需要,筆者設(shè)計(jì)了基于μC/OS-II操作系統(tǒng)的可視化MP3播放器。該播放器能夠完成歌曲播放、歌曲頻譜信息顯示、歌詞同步顯示和歌曲配圖顯示,不僅挖掘和擴(kuò)展了實(shí)驗(yàn)箱的功能,而且也豐富了μCOS-II實(shí)驗(yàn)教學(xué)實(shí)例,可供開發(fā)探究性實(shí)驗(yàn)和綜合創(chuàng)新性實(shí)驗(yàn)項(xiàng)目參考。
1.1 硬件環(huán)境
設(shè)計(jì)多任務(wù)音頻播放與實(shí)時(shí)頻譜變換MP3播放器使用的是北京博創(chuàng)公司ARM嵌入式開發(fā)實(shí)驗(yàn)箱UPTECH2410,其核心微處理器為ARM920T,板載UDA1341TS音頻解碼芯片、Flash存儲(chǔ)器、SRAM、LCD液晶屏、數(shù)字鍵盤、耳機(jī)接口等其他外設(shè)。
微處理器內(nèi)集成DMA、標(biāo)準(zhǔn)音頻通信IIS接口,可以在非CPU干預(yù)的情況下獨(dú)立定時(shí)地向音頻芯片傳輸數(shù)據(jù),其優(yōu)點(diǎn)是提高CPU工作效率,使數(shù)據(jù)傳送周期恒定。音頻播放相關(guān)硬件關(guān)系如圖1所示。
圖1 實(shí)驗(yàn)箱音頻播放相關(guān)硬件關(guān)系圖
1.2 軟件環(huán)境
基于ARM ADS1.2軟件集成開發(fā)環(huán)境,使用C語言作為開發(fā)語言,使用開源操作系統(tǒng)μC/OS-II構(gòu)建MP3播放器。μC/OS-II有如下特點(diǎn)[4-6]:
(1) 源代碼公開,可移植;
(2) 可裁剪,易于實(shí)現(xiàn)代碼最小化;
(3) 多任務(wù),可管理多達(dá)64個(gè)任務(wù),但不支持時(shí)間片輪轉(zhuǎn)調(diào)度;
(4) 搶占式的實(shí)時(shí)內(nèi)核;
(5) 精確延時(shí)。
此外,μC/OS-II可以提供多種系統(tǒng)服務(wù),具有中斷管理和可靠性、穩(wěn)定性高等特點(diǎn)。該實(shí)驗(yàn)箱為μC/OS-II配備了圖象顯示庫,可以直接調(diào)用這些函數(shù)在LCD上完成所需控件的顯示。
1.3 項(xiàng)目設(shè)計(jì)目標(biāo)
基于UPTECH2410實(shí)驗(yàn)平臺(tái)上的已有硬件設(shè)備,該項(xiàng)目能夠?qū)崿F(xiàn)如下功能:
(1) 支持Windows的標(biāo)準(zhǔn)WAV格式文件播放;
(2) 列表顯示Flash存儲(chǔ)器上所有WAV曲目;
(3) 隨歌曲播放同步顯示歌詞;
(4) 隨歌曲播放同步顯示聲調(diào)頻譜信息;
(5) 可為每首歌曲顯示設(shè)定的背景圖片;
(6) 可在任意時(shí)間播放、暫?;蚯袚Q歌曲。
2.1 音頻重建和播放
數(shù)字音頻文件是由麥克風(fēng)采集的模擬信號(hào)經(jīng)防混疊低通濾波器后采樣、量化得到的離散數(shù)字信號(hào)組成的。采樣時(shí)要滿足采樣定理,以高于原信號(hào)最高頻率2倍以上的速率進(jìn)行采樣(采樣頻率常用22.05 kHz、44.1 kHz或更高)。量化等級(jí)水平稱為量化深度或采樣深度,一般以bit為單位表示(常用16 bit)。
為了無失真或最小失真地將聲音信號(hào)還原,需要將離散數(shù)字信號(hào)按照不低于采樣深度的轉(zhuǎn)換水平,并且按照與采樣頻率相同的轉(zhuǎn)換速率經(jīng)DA轉(zhuǎn)換器輸出。輸出信號(hào)再經(jīng)低通濾波、放大后方可得到重建信號(hào)。
音頻文件播放必須滿足:
(1) 播放頻率(重建頻率)與采樣頻率一致,否則會(huì)發(fā)生頻率畸變;
(2) 播放轉(zhuǎn)換等級(jí)(DA的轉(zhuǎn)換精度水平)大于等于量化深度,否則會(huì)發(fā)生聲音失真、使音樂質(zhì)量降低。
本實(shí)驗(yàn)平臺(tái)上的UDA1341TS音頻播放芯片內(nèi)置有16位深度的雙聲道DA轉(zhuǎn)換器以及濾波器、放大器等相關(guān)電路[7],保證了一般應(yīng)用情況下所需的量化等級(jí)。該器件有獨(dú)立的時(shí)鐘和定時(shí)器,能夠支持包含經(jīng)典的44.1 kHz、22.05 kHz在內(nèi)的多種采樣頻率計(jì)數(shù),讓轉(zhuǎn)換器可以按照采樣頻率進(jìn)行轉(zhuǎn)換播放。通過分析可知,UDA1341TS滿足音頻文件不失真播放的要求。
UDA1341TS含有實(shí)用標(biāo)準(zhǔn)音頻播放IIS接口,方便與其他設(shè)備相連;也可以在定時(shí)器超時(shí)的時(shí)候產(chǎn)生中斷,自動(dòng)向DMA申請(qǐng)數(shù)據(jù),極大地減輕了CPU的負(fù)擔(dān),也保證音頻播放的頻率準(zhǔn)確性和實(shí)時(shí)性。
2.2 WAV音頻文件
WAV是微軟公司開發(fā)的一種無損聲音文件格式,它符合RIFF(resource interchange file format)文件規(guī)范,用于保存Windows平臺(tái)的音頻信息資源,支持多種音頻數(shù)字、采樣頻率和聲道數(shù)量[8]。標(biāo)準(zhǔn)格式化的WAV文件和CD格式一樣,也是44.1 kHz的采樣頻率,16位量化數(shù)字。
量化位數(shù)分為8位、16位、24位3種,聲道有單聲道和雙聲道(立體聲),采樣速率有11.025 kHz、22.05 kHz和44.1 kHz。本項(xiàng)目采用的是16 bit量化深度、22.05 kHz采樣頻率、雙聲道的WAV格式。
WAV文件由文件頭和數(shù)據(jù)塊組成,其中文件頭記錄WAV文件的屬性和控制等相關(guān)信息,數(shù)據(jù)塊順序記錄音頻的離散數(shù)字信號(hào)。整個(gè)文件采用小端模式(little-endian)字節(jié)順序,標(biāo)志符不是字符串而是單獨(dú)的符號(hào)。WAV頭文件格式如表1所示。
表1(續(xù))
數(shù)據(jù)塊結(jié)構(gòu)如表2所示。
表2 WAV文件數(shù)據(jù)塊結(jié)構(gòu)
在音頻數(shù)據(jù)中,每個(gè)采樣數(shù)據(jù)按照時(shí)間順序依次排列。每個(gè)采樣(4字節(jié))包含左聲道(低2字節(jié))和右聲道(高2字節(jié))數(shù)據(jù)。每個(gè)聲道數(shù)據(jù)由16 bit雙字節(jié)構(gòu)成,低8 bit在低字節(jié),高8 bit在高字節(jié)。
本項(xiàng)目會(huì)讀取頭文件信息并判斷該文件是否為符合要求的音頻文件,如果符合要求則按照數(shù)據(jù)格式提取數(shù)據(jù)并播放。
2.3 基于雙緩沖的音頻無縫分段播放
2.3.1 系統(tǒng)瓶頸導(dǎo)致的問題
待播放的音頻文件數(shù)據(jù)存儲(chǔ)在Flash中,播放時(shí)需要先將文件從Flash寫入內(nèi)存,再由DMA單元從內(nèi)存中讀取數(shù)據(jù)并通過IIS接口送入U(xiǎn)DA1341芯片。
對(duì)硬件平臺(tái)多次測(cè)試后得知:將時(shí)長(zhǎng)10 s的音頻數(shù)據(jù)(約861 KB)從Flash讀入內(nèi)存大概需要2 s;為保證播放速率,DMA將數(shù)據(jù)從內(nèi)存?zhèn)鞯経DA1341芯片需10 s。
可見,DMA的傳送速度慢于Flash的讀入速度,而Flash的讀入延遲也是相當(dāng)多的。若Flash讀入和DMA傳送都使用同一內(nèi)存,會(huì)導(dǎo)致Flash覆蓋DMA還沒有傳輸完的數(shù)據(jù),這樣音樂聽起來就完全不對(duì)了。所以將Flash讀出的數(shù)據(jù)寫入該內(nèi)存塊和DMA讀取同一內(nèi)存塊不能同時(shí)進(jìn)行,即避免訪寫沖突。若DMA讀取和Flash寫入交替進(jìn)行,那么音樂每播放10 s中間會(huì)產(chǎn)生2 s的停頓。不管如何縮短緩沖區(qū)的長(zhǎng)度以至于人耳無法察覺到停頓的存在,停頓引起的20%的延遲都是不可忽略的。延遲會(huì)引起播放時(shí)間的拉長(zhǎng),歌曲內(nèi)容與歌詞失去同步,這些是不容許的。
2.3.2 雙緩沖解決方案
本文提出采用雙緩沖區(qū)以避免Flash和DMA的訪寫沖突問題。其優(yōu)點(diǎn)有:
(1) 無訪寫沖突,保證了數(shù)據(jù)的安全性;
(2) 無縫播放,DMA可連續(xù)讀取各區(qū)的數(shù)據(jù);
(3) 降低IO優(yōu)先級(jí),以縮短其他Flash任務(wù)的響應(yīng)時(shí)間。
雙緩沖機(jī)制的實(shí)現(xiàn)需要兩個(gè)內(nèi)存區(qū)域——緩沖區(qū)1與緩沖區(qū)2,每個(gè)區(qū)域均可存放10 s的音頻數(shù)據(jù)。首先,CPU讀取10 s的音頻數(shù)據(jù)放入緩沖區(qū)1,然后啟動(dòng)DMA將緩存區(qū)1數(shù)據(jù)送到音頻設(shè)備播放(此過程DMA以22.05 kHz的頻率傳輸數(shù)據(jù),且無需CPU干預(yù)),同時(shí)CPU將Flash上第二個(gè)10 s的音頻數(shù)據(jù)讀入緩存區(qū)2。當(dāng)DMA傳輸完畢后,DMA播放緩沖區(qū)2的數(shù)據(jù),CPU將Flash上第三個(gè)10 s的數(shù)據(jù)讀入到緩沖區(qū)1中。如此交替循環(huán),可提高系統(tǒng)的并行能力,實(shí)現(xiàn)音頻的流暢無縫播放。
2.4 針對(duì)特定音調(diào)的DTFT頻譜特征變換
常用的頻譜變換方法是基于FFT的快速傅里葉變換[9],這種算法占用嵌入式設(shè)備大量的內(nèi)存空間和大量的浮點(diǎn)運(yùn)算,而且也增加了編程的復(fù)雜度;而用專用硬件進(jìn)行頻譜變換則會(huì)增加成本和設(shè)計(jì)的復(fù)雜度。
經(jīng)過對(duì)要處理的MP3文件的分析,發(fā)現(xiàn)大部分音頻會(huì)在某些特定頻率點(diǎn)上重復(fù)出現(xiàn),即所謂在音調(diào)上[10]。據(jù)此提出針對(duì)特定音調(diào)的DTFT(discrete-time Fourier transform)頻譜變換方法,其優(yōu)點(diǎn)是計(jì)算量更小、速度更快、計(jì)算空間需求小、編程簡(jiǎn)單,若技巧得當(dāng),可在無浮點(diǎn)運(yùn)算下完成。
DTFT頻譜變換的原理如下。
由采樣序列f(nT)的DTFT公式:
(1)
ejθ=cosθ+jsinθ
(2)
得:
推出:
(3)
因此,可將音頻序列x[k]與兩個(gè)正交的余弦序列{cos(kωT),k=1,2,3…}與{sin(kωT),k=1,2,3…}相乘求和,再平方得到其在頻率ω上的頻譜強(qiáng)度。其中ω=2πf,f為特定音調(diào)對(duì)應(yīng)的頻率。本文選取了如表3所示的10個(gè)在音樂中普遍出現(xiàn)的音調(diào),并給出了對(duì)應(yīng)的頻率。其中c1為中央C。
表3 常用的10個(gè)音調(diào)及其對(duì)應(yīng)頻率
將表3中的各音調(diào)頻率代入余弦序列{cos(kωT),k=1,2,3…}與{sin(kωT),k=1,2,3…}中,可得10對(duì)周期性的序列。將這10對(duì)序列按照常數(shù)存放和使用,可極大提高運(yùn)算速度。
將聲音信號(hào)以0.5 s為一段不斷地提取出來,并按照公式3與上述10對(duì)代表不同音調(diào)頻率特性的余弦序列相乘求和,得到了10個(gè)音調(diào)對(duì)應(yīng)的頻譜強(qiáng)度X(1),X(2),…,X(10)。
由于有時(shí)某一點(diǎn)的強(qiáng)度會(huì)極大地超過其他點(diǎn),并超過屏幕能夠顯示的強(qiáng)度上限,所以需要依照式(4)按其強(qiáng)度比進(jìn)行均衡化。
(4)
將均衡化后的結(jié)果顯示在屏幕上(見圖2)。整個(gè)算法的流程如圖3所示。
圖2 顯示在LCD屏幕上的頻譜圖
圖3 基于特定音調(diào)的頻譜提取流程
圖4是為驗(yàn)證算法的有效性和可行性而在Matlab上做的仿真。橫軸上1—10表示10個(gè)音調(diào)頻率,縱軸從0到300表示音樂的時(shí)間,高度表示頻譜強(qiáng)度。
圖4 音調(diào)特征提取的Matlab仿真結(jié)果
(1) 總流程。系統(tǒng)啟動(dòng)后,首先初始化各類參數(shù)以及圖形庫、IIS、DMA、UDA1341TS等模塊,隨后創(chuàng)建頻譜提取顯示、歌詞顯示、音樂播放控制、主任務(wù)等4個(gè)任務(wù),最后調(diào)用OS_Start啟動(dòng)各個(gè)任務(wù)的調(diào)度。
(2) 主任務(wù)。主任務(wù)是響應(yīng)鍵盤的輸入、處理外部事件、負(fù)責(zé)與上位機(jī)通信,負(fù)責(zé)其他各任務(wù)的相互協(xié)調(diào)。
(3) 頻譜提取顯示。任務(wù)是每隔0.5 s將下一段(長(zhǎng)度也為0.5 s)的音頻數(shù)據(jù)按照2.4節(jié)提到的DTFT頻譜特征變換方法進(jìn)行處理,并顯示在屏幕上。
(4) 歌詞顯示任務(wù)。該任務(wù)是對(duì)LRC歌詞文件的讀取和處理(見表4),一個(gè) LRC 文件包含2部分:歌詞和時(shí)間標(biāo)簽。該標(biāo)簽指示出每一句歌詞所出現(xiàn)的時(shí)間點(diǎn)。在任務(wù)中不斷調(diào)用sscanf(( const char *) File_Read_Buffer , “[%d:%d.%d]”, &SubTitle_Info.NextMinute, &SubTitle_Info.NextSecond, &SubTitle_Info.Next10Ms),讀取相鄰兩行歌詞的時(shí)間,得出兩句歌詞之間的時(shí)間差。當(dāng)?shù)谝痪涓柙~顯示后,調(diào)用延時(shí)函數(shù)OSTimeDly()進(jìn)行等待對(duì)應(yīng)的時(shí)間差,然后顯示第二句歌詞,如此往復(fù)實(shí)現(xiàn)了歌詞的同步。
表4 LRC文件格式實(shí)例
(5) 音樂播放。上文2.3節(jié)中說明了本文采用雙緩沖方式,并結(jié)合DMA、IIS、UDA1341等硬件模塊完成音樂的流暢無縫分塊播放。因此,音樂播放的程序主要包括兩部分,即底層硬件相關(guān)程序和上層播放控制程序。
4.1 與硬件相關(guān)的主要函數(shù)
(1) Audio_Init():用于初始化所需的IIS、DMA、UDA1341,設(shè)定播放速率和雙聲道傳輸模式;
(2) Audio_Stop():停止DMA傳輸和UDA1341的播放功能;
(3) Audio_Play():啟動(dòng)DMA傳輸與UDA1341的播放功能;
(4) Audio_SetBuffer(char* SoundBuffer,U32 DataCount):設(shè)定DMA將要傳輸數(shù)據(jù)緩沖區(qū)的起始地址及長(zhǎng)度。傳輸?shù)姆绞讲捎迷刂愤f增,而目的地址固定0X55000010 (目的地址為IIS外設(shè)接口地址)。
4.2 上層播放控制程序
圖5示意了本播放器的工作流程和雙緩沖工作機(jī)制(不含頻譜計(jì)算和字幕顯示)。頻譜計(jì)算在讀取完音頻數(shù)據(jù)后就開始了,每隔0.5 s為一個(gè)時(shí)間點(diǎn)進(jìn)行計(jì)算,并在正確的時(shí)間將頻譜信息、字幕信息顯示在屏幕上。播放暫停和停止操作也沒有繪入流程圖,暫停、停止操作會(huì)中斷播放任務(wù)線程,并記錄當(dāng)前的播放狀態(tài),以便恢復(fù)播放操作使用。
圖5 播放控制流程
基于μC/OS-II操作系統(tǒng)的可視化MP3播放器最終能流暢播放出MP3歌曲并同步顯示歌詞、頻譜信息,同時(shí)能夠自由暫停、繼續(xù)、開始、停止、切換歌曲,并
顯示所有符合WAV格式的歌曲列表,運(yùn)行結(jié)果如圖6所示。
圖6 MP3播放器運(yùn)行界面
通過音頻頻譜的提取和顯示,聲音文件流暢播出,可以充分了解嵌入式系統(tǒng)環(huán)境下軟硬件是如何協(xié)同工作的,有利于提高對(duì)系統(tǒng)的分析能力和綜合運(yùn)用所學(xué)知識(shí)解決問題的能力。目前該MP3播放器只能播放合法的WAV文件,且必須滿足22.05 kHz的采樣頻率、16 bit的采樣深度和雙聲道這3個(gè)條件。為此,需要進(jìn)一步研究,使該音樂播放器能夠支持更多的音頻格式和屬性。
References)
[1] 宋志章,馬麗,劉曉華.基于ARM的數(shù)字音頻解碼系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].科技通報(bào),2012,28(6):161-162,165.
[2] 何敬銀,王為.基于S3C2440的數(shù)字音頻播放器設(shè)計(jì)[J].科技通報(bào),2012,28(12):36-38,41.
[3] 蔣尚婷,金毅仁.數(shù)字音頻壓縮編碼及音頻播放器制作[J].電腦編程技巧與維護(hù),2011(6):82-85,92.
[4] Labrosse J J.嵌入式實(shí)時(shí)操作系統(tǒng)uC/OS-III[M].宮輝,曾鳴,譯.北京:北京航空航天大學(xué)出版社,2012.
[5] 楊鑄,唐攀.深入淺出嵌入式底層軟件開發(fā)[M].北京:北京航空航天大學(xué)出版社,2011.
[6] 王田苗.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā):基于ARM微處理器與uC/OS-II實(shí)時(shí)操作[M].北京:北京航空航天大學(xué)出版社,2007.
[7] 胡力剛,許偉明,焦陽.基于S3C2410A和UDA1341TS的嵌入式音頻系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)測(cè)量與控制,2009,17(2):2510-2512,2515.
[8] 王若鈞,何杉.WAV文件格式分析與詳解[J].數(shù)字技術(shù)與應(yīng)用,2004(3):93-94.
[9] 陳后金,薛健,胡健.數(shù)字信號(hào)處理[M].北京:高等教育出版社,2004.
[10] 曹西征,劉春紅,孫林.基于WAV文件的獨(dú)奏樂曲信號(hào)中的樂譜識(shí)別[J].計(jì)算機(jī)應(yīng)用,2009,29(3):768-770,788.
Realization of multi-task audio playback and real-time frequency spectrum conversion
Yang Bo, Zhang Yaping, Ding Rui
(College of Information Engineering, Capital Normal University, Beijing 100048, China)
By using the ARM embedded development box UPTECH2410 and the μC/OS-II multi-task scheduling and operating system, and the image display library system, a visual MP3 player is designed, which can synchronously display the lyrics, the audio frequency spectral information, the song request menu and the corresponding song theme pictures on the color LCD screen. The workflow of the whole system is presented, and how to use the double buffering mechanism to play and process the audio to ensure the real-time and seamless audio playback is discussed. A high efficient frequency spectral transform method for the song audio is proposed, and the common WAV musical formats are analyzed.
multi-task music playback; frequency spectral transform; μC/OS-II
TN912.3
: A
: 1002-4956(2017)09-0137-05
04—07H4long從下個(gè)地址開始到文件尾的總字節(jié)數(shù)08—0BH4char“WAVE”,WAV文件標(biāo)志0C—0FH4char“fmt”,波形格式標(biāo)志,最后一位空格10—13H4longfmt格式段長(zhǎng)度,一般為10H14—15H2short格式種類(1表示數(shù)據(jù)為線性PCM編碼)16—17H2short通道數(shù),單聲道為1,雙聲道為218—1BH4long采樣頻率(22050、44100等)
2017-04-26
楊博(1992—),男,北京,碩士研究生,主要研究方向?yàn)榍度胧胶碗娮有畔⒐こ?/p>
E-mail:yangkkb@aliyun.com
E-mail:997715213@qq.com
10.16791/j.cnki.sjg.2017.09.034