韓 萍,周 航,金昌旺
(中國民航大學電子信息工程學院,天津 300300)
本文以“數字信號處理”課程為基礎,利用“Matlab程序設計”課程的知識,設計了一種音樂播放器,實現與一般的計算機媒體播放器相同的音樂播放功能。相比其它設計方法,本設計編程簡單,實現方便,且與專業課程知識結合緊密[1-3]。我們將其作為電子信息類本科學生的“數字信號處理”課程設計項目,用于提高學生設計能力和對知識的綜合應用能力。
播放器由音頻控制和顯示兩大功能模塊組成。控制模塊主要實現對音頻信號的處理和播放,包括音樂播放、均衡、暫停、停止、音樂快進快退、音量控制和播放模式選擇等。顯示模塊用來實時顯示當前播放的歌曲名稱、時間進度、多首曲目列表、歌詞、歌手圖片及資料、日期和時間和動態波形等。播放器的總體結構如圖1所示。

圖1 播放器總體結構圖
播放器各模塊功能的實現依賴于對界面控件控制和各控件之間的邏輯關聯。界面設計采用的主要控件為按鈕、滾動條、文本、圖形顯示和下拉菜單等。各控件均有相應的回調函數,在函數下寫入程序實現該控件功能。控件之間的關聯主要通過控件回調函數間的變量傳遞和函數內部對各變量的處理實現。圖2所示為播放器運行界面。

圖2 播放器運行界面
若希望播放器脫離Matlab環境而獨立運行,可將源代碼通過VC++編譯生成exe文件,再將需要調用的文件一起打包即可[4,5]。
播放器的播放控制部分包括開始、繼續、暫停和停止四個功能,用兩個變量和一個定時器控制。其中一個變量st表示播放狀態,通過設置不同的取值分別對應“開始/繼續”,“暫停”和“停止”等功能。另一個變量s表示曲目播放進度,用定時器timer控制播放顯示模塊,實現與歌曲播放進度同步,定時器周期設為1秒。利用play和stop命令實現音樂播放和停止,將“開始/繼續”設為播放器的默認狀態。
播放器設計了五種音樂播放模式:即單曲播放、單曲循環、順序播放、循環播放和隨機播放。其中,循環播放和隨機播放的播放次數不限,播放模式的默認狀態設為單曲播放。
播放器模塊采用popupmenu控件設計,播放模式設計成一個循環體,周期為1秒。設變量sk表示用戶點擊命令,取值為1至5,分別對應上述五種播放模式,sk的值從popupmenu中的value屬性中獲取。用變量k表示曲目列表中的曲目總數,變量num表示當前播放的曲目序號。播放模式設計流程圖如圖3所示。對于隨機播放模式,則用rand函數在1~k之間產生一個隨機數賦給num來實現。

圖3 播放模式控制流程圖
該模塊設計成手動拖放滾動條的形式。當需要對播放進行快進/快退操作時,直接拖動滾動條至目標位置,曲目便自動跳至該位置進行播放。此時,滾動條光標所在位置對應的s值被自動返回,并利用函數timeslide停止聲音信號模擬輸出,刪除timer值,重新啟動聲卡從s處播放曲目并啟動time。
播放器中的音響處理效果主要體現在均衡器中,該模塊設計成手動調諧方式。典型的二階均衡器描述如下[6]:

式中,A(z)=[α - β(1+ α)z-1+z-2]/[1 - β(1+α)z-1+α z-2],|α|<1。這里 K,α 和 β 為可調參數,分別影響濾波器的帶寬和中心頻率,K影響濾波器的總增益,其不同取值下的幅頻特性曲線如圖5所示。

圖4 二階均衡器幅頻特性曲線
本文的播放器采用10個增益可調的巴特沃茲帶通濾波器并聯逼近均衡器。由于一般音頻信號的采樣率是44.1kHz,而人耳能夠接受的頻率范圍一般在20Hz至20kHz。因此,濾波器的中心頻率設為32Hz 至 16kHz,依次為 32Hz,64Hz,125Hz,250Hz,500Hz,1kHz,2kHz,4kHz,8kHz 和 16kHz。由于聲音信號頻譜能量主要集中在低頻段,因此濾波器在低頻段分布比較密集,以更好地實現對信號的音響處理效果。
用set函數設定十個濾波器的增益調節范圍為-12dB至12dB。當這十個濾波器的增益均為0dB時,彼此并聯疊加后可形成一個全通濾波器。均衡器設計采用butter函數,用wavread函數讀取wav格式音頻信號的時域序列及采樣率,聲音信號的濾波由filter函數實現。
播放曲目列表設計兼具顯示功能和控制功能,可以實現曲目的添加、刪除、清空及列表保存和讀取。并且在關閉播放器時程序會自動保存用戶當前的列表,下一次啟動播放器時,用戶已存的曲目被自動讀取并顯示出來,解決了每次啟動都須重新添加曲目的麻煩。
播放列表采用listbox控件,通過改變該控件的string屬性值來改變列表的顯示,列表的保存和讀取采用.mat格式文件(如:設為 playlist.mat)。在用戶退出播放器的同時,程序自動將曲目名、曲目總數k和曲目路徑三個變量保存到playlist.mat文件中,以便下次播放時自動顯示所保存的內容。
該模塊設計成靜態和動態顯示兩部分。
(1)靜態顯示包括歌曲名和歌手資料兩部分,由text控件實現,利用fopen和textscan函數打開和讀取已存在的.txt文本數據,并將數據轉化為字符型導入text控件的string屬性,即可顯示文字。
(2)動態顯示用來顯示播放曲目的歌詞,可以采用listbox控件實現。利用定時器每隔約3.5秒將listbox的value值自加1,相應的鼠標光標即向下一行移動,調整好滾動速度及歌詞文字間距,即可比較準確地顯示歌詞。
該模塊設計成時間顯示和進度條動態顯示兩種形式。
(1)時間顯示是將變量s(含義同前)轉換為分和秒顯示,用set函數將text控件的string屬性值設置為[‘0’,num2str(m),‘:’,num2str(s)]。若 s<10,則設為[‘0’,num2str(m),‘:’,‘0’,num2str(s)]。num2str函數作用是將數值型轉換為字符型。每次運行顯示程序時,用set函數改變text控件的string屬性,即產生定時刷新的效果,實現動態顯示。
(2)進度條動態顯示是利用get函數定時獲取s值,并將s值設置為slider滾動條控件的value屬性值,滾動條會根據value值的變化移動到相應的位置。滾動條的max屬性值需提前設定為其顯示的總長度。這樣,滾動條光標相對于總長的位置即對應目前歌曲的播放進度。
(3)當執行暫停功能時,保存當前進度數據s,顯示狀態停留在原處不變。當執行“繼續”功能時,根據當前保留的顯示數據,將進度時間和滾動條均從當前處開始刷新,實現對曲目播放的實時跟蹤。
(4)該模塊通過定時器timer可自由設定精度、周期和執行次數等參數,十分方便,可以代替for和while等語句構成的循環體,大大提高了運算速度和精度。
該模塊用來展現動態且富有張力的視覺效果,設計為時域和頻域顯示兩部分。時域顯示音量的強度,用一條不斷跳躍的曲線表現,方法是將信號長度分段,每段約5000點,時長約0.1134秒。啟動定時器timer,用plot指令將各段信號繪制成波形,顯示在控件axes上。
頻域描述音調,用20根上下不斷跳轉的柱形圖表現。其方法是將各段時間信號進行傅里葉變換獲得其幅頻特性,利用bar函數繪制成柱狀圖,顯示在axes控件上。
為增強動態效果和界面美感,將顯示波形設計成紅、橙、黃、綠、藍、靛、紫七種顏色,由紅、綠、藍三基色合成。繪制時域波形時,直接在plot命令中設置三基色值,繪制頻域波形時,用colormap命令設置色調。
另外,該模塊還設計了“切換顯示”按鈕,通過點擊按鈕可以不斷在時域波形、頻域波形以及無顯示三者之間切換。
音樂播放過程中可同時顯示當前日期、時間和星期。
該模塊主要使用clock和weekday兩個指令。clock指令自動讀取并返回電腦當前時間,返回結果為一個一行六列的double型數組。數組各項依次表示年、月、日、時、分和秒。將數組各項轉化為字符型后導入text控件的string屬性,即可顯示當前的時間。weekday指令返回當前的星期,用同樣方法進行顯示。由于顯示了分秒這樣小的時間單位,必須對數據進行刷新以達到準確顯示的目的。在開啟播放器后立即啟動定時器timer定時調用控制時間顯示函數,在該函數下不斷更新顯示數據。
播放器除具有上述主要功能外,我們還利用popupmenu控件對播放器界面設計了主題切換功能,可使用戶自行選擇搭配各控件顏色和界面背景圖案,形成獨特的風格。
另外,在本播放器主界面上還設計了“幫助”窗口等其它功能模塊,用戶點擊后可查閱播放器的使用說明。其它如:修改窗口的名稱、窗口圖標修改和菜單欄的創建等。
[1]馮建元,音頻播放器的架構分析與關鍵技術的實現,[J].天津:計算機與網絡,2009年35卷20期,pp53-56
[2]段鳳云,基于ARM的數字音頻播放器的設計,[J].天津:實驗室科學,2010年6月,第l3卷,第3期,pp169-170
[3]劉林濤,田慧珍,基于Authorware的 wave音頻播放器的設計,[J].合肥:電腦知識與技術,2006年10期,pp116-117
[4]仲麟,MATLAB仿真技術與應用教程,[M].北京:國防工業出版社,2004
[5]張亮,王繼陽,MATLAB與C/C++混合編程,[M].北京:人民郵電出版社,2008
[6][美]Sanjit K.Mitra著,孫洪,余翔宇譯,[M].數字信號處理——基于計算機的方法(第二版),[M]北京:電子工業出版社,2005.