1.概述
隨著數(shù)字化技術(shù)的快速、深入發(fā)展,人們對(duì)數(shù)字化電子產(chǎn)品所產(chǎn)生的圖像、圖形以及聲音等質(zhì)量的要求越來(lái)越高。在實(shí)時(shí)數(shù)字處理過(guò)程中,與D/A和A/D轉(zhuǎn)換相關(guān)的模擬信號(hào)重構(gòu)過(guò)程是決定數(shù)字系統(tǒng)輸出質(zhì)量的關(guān)鍵[1]。在聲音的拾取過(guò)程及通過(guò)音響設(shè)備的傳送過(guò)程中,由于設(shè)備或器件的原因,其幅度對(duì)頻率的響應(yīng)往往不一致,這樣就達(dá)不到原來(lái)的聽(tīng)覺(jué)效果,而均衡器就是一個(gè)改變放大器頻率響應(yīng)的設(shè)備。一個(gè)好的均衡器能起到以下幾個(gè)方面的作用: (1) 能校正音頻設(shè)備所產(chǎn)生的頻率失真;
(2) 校正由于建筑學(xué)共振性的不均勻所帶來(lái)的傳輸增益的頻率失真;
(3) 調(diào)整某些易反饋的頻率成分,抑制聲反饋,提高會(huì)場(chǎng)增益;
(4) 在藝術(shù)創(chuàng)作中,利用它來(lái)刻畫(huà)演員和樂(lè)器的音色修改,提高藝術(shù)效果。
現(xiàn)有的許多播放器都具有均衡器的功能,如Winamp(如圖 1所示)等。
圖 1 Winamp的均衡器
MATLAB是一個(gè)數(shù)據(jù)分析和處理功能十分強(qiáng)大的工程實(shí)用軟件,他的濾波器設(shè)計(jì)工具箱為實(shí)現(xiàn)聲音信號(hào)的數(shù)字濾波提供了十分方便的函數(shù)和命令,但MATLAB的計(jì)算速度慢。Visual C++是Windows平臺(tái)下主要的應(yīng)用程序開(kāi)發(fā)環(huán)境之一,它能方便實(shí)現(xiàn)軟件開(kāi)發(fā),開(kāi)發(fā)的系統(tǒng)具有執(zhí)行速度快等優(yōu)點(diǎn),故MATLAB與VC的混合編程正好結(jié)合了MATLAB強(qiáng)大的工具箱與VC很快的執(zhí)行速度。本文將給出基于MATLAB與VC混合編程的數(shù)字均衡器的設(shè)計(jì)方法,功能包括:
(1).WAV聲音信號(hào)獲取,即從文件(*.wav,*.au等)讀取音頻信息;
(2).八段數(shù)字均衡器設(shè)定,具體按照表 1中的頻段,其中前兩個(gè)頻段合并在一起;
(3).濾波,包括生成低通、高通、帶通、帶阻的巴特沃斯、切比雪夫?yàn)V波器,并顯示濾波器的頻率特征曲線(xiàn);
(4).保存,保存濾波后的音頻信息到文件;
(5).播放,播放濾后音頻信號(hào)并實(shí)時(shí)顯示波形及頻譜特性。
表 1頻率的音感特征
30~60Hz
沉悶 如沒(méi)有相當(dāng)大的響度,人耳很難感覺(jué)。 60~100Hz 沉重 80Hz附近能產(chǎn)生極強(qiáng)的“重感”效果,響度很高也不會(huì)給人舒服的感覺(jué),可給人以強(qiáng)烈的刺激作用。 100~200Hz 豐滿(mǎn) 200~500Hz 力度 易引起嗡嗡聲的煩悶心理。 500~1KHz 明朗 800Hz附近如提升10dB,會(huì)明顯產(chǎn)生一種嘈雜感,狹窄感。 1K~2KHz 透亮 2800Kz附近明亮感關(guān)系最大。 2K~4Kz 尖銳 6800Hz形成尖嘯,銳利的感覺(jué)。 4K~8Kz 清脆 3400Hz易引起聽(tīng)覺(jué)疲勞。 8K~16Kz 纖細(xì) >7.5KHz音感清徹纖細(xì)。 30~60Hz 沉悶 如沒(méi)有相當(dāng)大的響度,人耳很難感覺(jué)。 2.設(shè)計(jì)原理 2.1數(shù)字濾波器 2.1.1 數(shù)字濾波器的原理簡(jiǎn)介 數(shù)字濾波器的功能是把輸入序列通過(guò)一定的運(yùn)算,變換成輸出序列。數(shù)字濾波器一般可用兩種方法實(shí)現(xiàn):一種是根據(jù)描述數(shù)字濾波器的數(shù)學(xué)模型或信號(hào)流程圖,用數(shù)字硬件構(gòu)成專(zhuān)用的數(shù)字信號(hào)處理機(jī),即硬件方式;另一種是編寫(xiě)濾波器運(yùn)算程序,在計(jì)算機(jī)上運(yùn)行,即軟件方式。考慮到軟件的靈活性及易于實(shí)現(xiàn),本文采用軟件方式實(shí)現(xiàn)數(shù)字濾波器。 數(shù)字濾波器有無(wú)限沖激響應(yīng)(IIR)和有限沖激響應(yīng)(FIR)兩種。下面分別介紹:
(1) IIR濾波器
IIR濾波器的特點(diǎn)是:?jiǎn)挝粵_激響應(yīng)h(n)是無(wú)限長(zhǎng)的;系統(tǒng)函數(shù)H(z)在有限長(zhǎng)Z平面(0<|Z|<∞)有極點(diǎn)存在;結(jié)構(gòu)上存在輸出到輸入的反饋,也即結(jié)構(gòu)上是遞歸型的;因果穩(wěn)定的IIR濾波器其全部極點(diǎn)一定在單位圓內(nèi)。其系統(tǒng)函數(shù)為
(1)
計(jì)算機(jī)上實(shí)現(xiàn)時(shí)則需要用到差分方程的形式,如下
(2)
IIR濾波器有四種基本的網(wǎng)絡(luò)結(jié)構(gòu)(具體參看文獻(xiàn)[3]),直接I型、直接II型、級(jí)聯(lián)型與并聯(lián)型。其中直接I型需要2N個(gè)延遲單元,而直接II型只需要N個(gè)延遲單元。因此,用軟件實(shí)現(xiàn)時(shí),直接II型少占用存儲(chǔ)單元。級(jí)聯(lián)型則是將N階IIR系統(tǒng)函數(shù)分解成二階因式連乘積,并聯(lián)型則是將系統(tǒng)函數(shù)化成部分分式之和,則可得到IIR數(shù)字濾波器的并聯(lián)結(jié)構(gòu)。
(2) FIR濾波器
IIR濾波器的特點(diǎn)是:系統(tǒng)的單位沖激響應(yīng)h(n)是個(gè)有限長(zhǎng)序列;系統(tǒng)函數(shù)|H(z)|在|z|>0處收斂,極點(diǎn)全部在z=0處(即FIR一定為穩(wěn)定系統(tǒng));結(jié)構(gòu)上主要是非遞歸結(jié)構(gòu),沒(méi)有輸出到輸入反饋。但有些結(jié)構(gòu)中(例如頻率抽樣結(jié)構(gòu))也包含有反饋的遞歸部分。其系統(tǒng)函數(shù)的一般形式為
(3)
對(duì)應(yīng)的差分方程為
(4)
FIR系統(tǒng)的基本結(jié)構(gòu)有直接型、級(jí)聯(lián)型、快速卷積型、頻率取樣型等。
2.1.2 FIR與IIR濾波器的比較與選擇
IIR濾波器可以用比FIR濾波器少的階數(shù)來(lái)滿(mǎn)足相同的技術(shù)指標(biāo),這樣,IIR濾波器所用的存儲(chǔ)單元和所用的運(yùn)算次數(shù)都比FIR濾波器少。FIR濾波器可得到嚴(yán)格的相位,而IIR濾波器不能得到。事實(shí)上,IIR濾波器的選頻特性越好,它的相位的非線(xiàn)性就越嚴(yán)重。因此在需要嚴(yán)格線(xiàn)性相位的情況下應(yīng)該選擇FIR濾波器。IIR濾波器可利用模擬濾波器現(xiàn)成的設(shè)計(jì)公式、數(shù)據(jù)和表格,因而計(jì)算工作量較小,對(duì)計(jì)算工具要求不高。FIR濾波器沒(méi)有現(xiàn)在的設(shè)計(jì)公式,對(duì)計(jì)算工具要求較高,需要借助計(jì)算機(jī)來(lái)設(shè)計(jì)。另外,IIR濾波器主要是設(shè)計(jì)規(guī)格化的、頻率特性為分段常數(shù)的標(biāo)準(zhǔn)低通、高通、帶通、帶阻和全通濾波器,而FIR濾波器可設(shè)計(jì)出理想正交變換器、理想微分器、線(xiàn)性調(diào)頻器等各種網(wǎng)絡(luò),適應(yīng)性較廣。 總之,IIR和FIR這兩種濾波器各有特點(diǎn),在實(shí)際應(yīng)用中空間選擇中哪種濾波器,就從多方面的因素來(lái)考慮。例如用于語(yǔ)音通信的濾波器,對(duì)相位要求不是主要的,因此選用IIR濾波器較為合適,可以充分發(fā)揮其經(jīng)濟(jì)和高效的特點(diǎn)。而圖像信號(hào)處理和數(shù)據(jù)傳輸?shù)纫圆ㄐ螖y帶信息的系統(tǒng),對(duì)相位的線(xiàn)性要求較高,因此采用FIR濾波器較好。
對(duì)于數(shù)字均衡器,一方面是用于處理語(yǔ)言信號(hào),另一方面需要用到頻率特性分段的帶通濾波器,因此應(yīng)該IIR濾波器。下面介紹IIR濾波器的設(shè)計(jì)方法。
2.1.3 IIR數(shù)字濾波器的設(shè)計(jì)方法
實(shí)際中的數(shù)字濾波器都是用有限精度算法實(shí)現(xiàn)的線(xiàn)性非移變離散系統(tǒng),設(shè)計(jì)IIR數(shù)字濾波器的方法主要有兩種:一種是利用模擬濾波器的理論來(lái)設(shè)計(jì),另一種是計(jì)算機(jī)輔助設(shè)計(jì),即使用最優(yōu)化技術(shù)設(shè)計(jì)。利用模擬濾波器的設(shè)計(jì)理論來(lái)設(shè)計(jì)IIR濾波器,就是首先根據(jù)實(shí)際要求設(shè)計(jì)一個(gè)模擬濾波器,然后再將這個(gè)模擬濾波器轉(zhuǎn)換成數(shù)字濾波器。由于模擬網(wǎng)絡(luò)綜合理論已經(jīng)發(fā)展得很成熟,故許多常用的模擬濾波器不僅有了簡(jiǎn)單而嚴(yán)格的設(shè)計(jì)分式,而且設(shè)計(jì)參數(shù)已經(jīng)表格化,所以設(shè)計(jì)起來(lái)很方便。因此本文采用第一種方法。 設(shè)計(jì)步驟大致分以下三步:
(1) 設(shè)計(jì)模擬濾波器。根據(jù)實(shí)際需要確定濾波器的參數(shù),利用的濾波器的設(shè)計(jì)公式設(shè)計(jì)出模擬濾波器并得到其傳遞函數(shù)H(s),常用的濾波器有巴特沃斯濾波器、橢圓濾波器和切比雪夫?yàn)V波器;
(2) 將模擬濾波器轉(zhuǎn)換成數(shù)字濾波器。利用沖激響應(yīng)不變法或雙線(xiàn)性變法將H(s)轉(zhuǎn)換成H(z),不同的設(shè)計(jì)方法對(duì)應(yīng)于不同的s平面到z平面的映射公式;
(3) 頻率變換。上述方法得到的是低通濾波器,為了得到高通、帶通、帶阻濾波器,還需要用利用變換公式作頻率變換。
以上各步驟都有成熟的理論與公式,具體可參看文獻(xiàn)[3]。
2.2均衡器的原理
2.2.1 均衡器總體設(shè)計(jì) 均衡器的基本功能是調(diào)節(jié)各頻段的信號(hào)強(qiáng)弱,為了滿(mǎn)足該功能,本文采用如下的方法: Step1:設(shè)計(jì)出對(duì)應(yīng)八個(gè)頻段的八個(gè)帶通濾波器;
Step2:對(duì)原始信號(hào)分八路用八個(gè)帶通濾波器進(jìn)行濾波;
Step3:將八個(gè)濾波器的濾波結(jié)果加權(quán)求和,權(quán)值的設(shè)計(jì)與均衡器的調(diào)節(jié)要求一致。
這樣最終得到的結(jié)果便是所需要的均衡結(jié)果。其中第2步中各帶通濾波器的輸入信號(hào)均為原始信號(hào),而不是“串聯(lián)”地濾波。設(shè)原始輸入信號(hào)為x(n),第i路的輸出信號(hào)為,第i路的權(quán)值為,均衡器的輸出信號(hào)為y(n),則有
(5)
(6)
式中,、為濾波器的參數(shù),可由2.1.3節(jié)的方法得到,N為濾波器的階數(shù)。
具體應(yīng)用中,式(6)有兩個(gè)問(wèn)題,下節(jié)將介紹這兩個(gè)問(wèn)題并給出解決方法。
2.2.2 濾波計(jì)算的兩個(gè)問(wèn)題
(1) 數(shù)組越界問(wèn)題 即當(dāng)n<N時(shí),如5階濾波器處理第一個(gè)x時(shí)(n=1,N=5),則式(6)中的與會(huì)出現(xiàn)數(shù)組下標(biāo)小于0。
對(duì)于聲音信號(hào),人的聽(tīng)覺(jué)不會(huì)感覺(jué)出很短時(shí)間的異常。因此,可以簡(jiǎn)單地將數(shù)組越界的情況用0代替,即n<N時(shí),規(guī)定。這樣只有前N個(gè)數(shù)字信號(hào)不準(zhǔn)確,從而前N/Fs秒聲音信號(hào)不準(zhǔn)確,N一般不超過(guò)10,而Fs一般為44100,從而N/Fs很小,人的聽(tīng)覺(jué)根本不會(huì)感覺(jué)到。
(2) 溢出問(wèn)題
定點(diǎn)加法運(yùn)算有可能發(fā)生溢出。但是,在采用補(bǔ)碼進(jìn)行運(yùn)算時(shí),即使中間計(jì)算結(jié)果發(fā)生了溢出,但只要最終累加值的絕對(duì)值小于1,就能保證最后得到的總和是正確數(shù)值。因此,為防止數(shù)字濾波器定點(diǎn)運(yùn)算產(chǎn)生溢出, y(n)絕對(duì)值小于1就夠了。
一種解決方式是針對(duì)輸入x。對(duì)于IIR濾波器,有
(7)
由不溢出的條件得
(8)
即,當(dāng)(8)式不滿(mǎn)足時(shí),需要對(duì)輸入信號(hào)x(n)乘以一個(gè)小于1的比例因子,使得(8)式恰好滿(mǎn)足。比例因子的計(jì)算式易由(8)式推出。
為簡(jiǎn)單起見(jiàn),本文采用針對(duì)輸出的解決方式,即如果y(n)絕對(duì)值超過(guò)1,則對(duì)其賦值為1或,符號(hào)選擇取決于原值的符號(hào)。
2.3 軟件設(shè)計(jì)
2.3.1 數(shù)據(jù)流圖 數(shù)據(jù)流圖(DFD)是一種圖形化技術(shù),它描繪信息流和數(shù)據(jù)從輸入移動(dòng)到輸出的過(guò)程中所經(jīng)受的變換。在數(shù)據(jù)流圖中沒(méi)有任何具體的物理元素,它只是描繪信息在軟件中流動(dòng)和被處理的情況。設(shè)計(jì)數(shù)據(jù)流圖時(shí)只需考慮系統(tǒng)必須完成的基本邏輯功能,而不用考慮具體實(shí)現(xiàn),因而它是進(jìn)行軟件設(shè)計(jì)很好的出發(fā)點(diǎn)。 面向數(shù)據(jù)流的設(shè)計(jì)方法的目標(biāo)是給出設(shè)計(jì)軟件結(jié)構(gòu)的一個(gè)系統(tǒng)化的途徑。結(jié)合上一節(jié)的內(nèi)容,可以得出軟件的數(shù)據(jù)流圖如圖 2所示。
圖 2 均衡器的數(shù)據(jù)流圖
2.3.2 模塊劃分
模塊化就是把程序劃分成獨(dú)立命名且可獨(dú)立訪(fǎng)問(wèn)的模塊,每個(gè)模塊完成一個(gè)子功能,把這些模塊集成起來(lái)構(gòu)成一個(gè)整體,可以完成指定的功能滿(mǎn)足用戶(hù)需求。根據(jù)人類(lèi)解決一般問(wèn)題的經(jīng)驗(yàn),如果一個(gè)問(wèn)題由兩個(gè)問(wèn)題組合而成,那么它的復(fù)雜程度大于分別考慮每個(gè)問(wèn)題時(shí)的復(fù)雜程度之和,也就是說(shuō)把復(fù)雜的問(wèn)題分解成許多容易解決的小問(wèn)題,原來(lái)的問(wèn)題也就容易解決了。這就是模塊化的根據(jù)。 在模塊劃分時(shí)應(yīng)遵循如下規(guī)則[4]:改進(jìn)軟件結(jié)構(gòu)提高模塊獨(dú)立性;模塊規(guī)模應(yīng)該適中;深度、寬度、扇出和扇入都應(yīng)適當(dāng);模塊的作用域應(yīng)該在控制域之內(nèi);力爭(zhēng)降低模塊接口的復(fù)雜程度;設(shè)計(jì)單入口單出口的模塊;模塊功能應(yīng)該可以預(yù)測(cè)。
本著上述的啟發(fā)式規(guī)則,對(duì)軟件進(jìn)行如圖 3所示的模塊劃分。
圖 3數(shù)字均衡器的模塊劃分
3.軟件實(shí)現(xiàn) 3.1界面設(shè)計(jì) MATLAB是Mathworks公司推出的數(shù)學(xué)軟件,它將數(shù)值分析、矩陣計(jì)算、信號(hào)處理和圖形顯示結(jié)合在一起,為眾多學(xué)科領(lǐng)域提供了一種簡(jiǎn)潔、高效的編程工具。它提供的GUIDE工具為可視化編程工具,使得軟件的界面設(shè)計(jì)像VB一樣方便。故本文采用MATLAB作為主要編程語(yǔ)言實(shí)現(xiàn)數(shù)字均衡器。 為了實(shí)現(xiàn)預(yù)期的功能,設(shè)計(jì)如圖 4所示的界面。
圖 4 頻譜分析儀的界面設(shè)計(jì)
左邊最上面的部分為標(biāo)題區(qū),用于顯示軟件標(biāo)題等信息,不具人機(jī)交互功能。
再往下是信號(hào)輸入/輸出區(qū),包含3種輸入方式。界面應(yīng)該具有:只有當(dāng)每個(gè)單選框被選中時(shí)才允許使用對(duì)應(yīng)的輸入框、按鈕等。支持WAV和AU兩種格式的音頻文件。“原聲播放”用于播放輸入的原信頻信號(hào),區(qū)別于濾波后的信號(hào),用于對(duì)比濾波前后的信號(hào)。
再往下是均衡器區(qū)。八個(gè)滾動(dòng)條對(duì)應(yīng)八個(gè)帶通濾波器的權(quán)值,在中間時(shí)為1,最下為0,最上為10。“類(lèi)型”單選框用于選擇巴特沃斯、切比雪夫等各種類(lèi)型IIR濾波器。“重置”用于將各輸入恢復(fù)默認(rèn)。
“濾波”后才能“播放”,這是考慮到MATLAB對(duì)多線(xiàn)程機(jī)制支持得不好,不宜使用一邊濾波一邊播放的方法。由于濾波時(shí)間較長(zhǎng),故添加了進(jìn)度顯示的功能。條形圖是許多音頻軟件使用的頻譜輸出方式。
右邊的上面是濾波器,可以指定各種類(lèi)型與參數(shù)。“生成濾波器”可以產(chǎn)生一個(gè)符合條件的濾波器,并在下面的圖中顯示濾波器的頻率特征曲線(xiàn)。“濾波”用于對(duì)輸入的音頻信號(hào)用生成的濾波器濾波。
再往下則分別是時(shí)域波形與頻譜分析的圖形顯示,均為實(shí)時(shí)顯示。
在界面設(shè)計(jì)時(shí)為避免錯(cuò)誤的操作,在某些按鈕不能使用時(shí)必須將其設(shè)置為不可用,而它們能夠使用時(shí)立即設(shè)置為可用。例如,沒(méi)有打開(kāi)音頻文件時(shí)“濾波”按鈕不可用,打開(kāi)后“濾波”按鈕可用;點(diǎn)擊“濾波”前,“播放”不可用,點(diǎn)擊“濾波”并完成濾波后,“播放”則變?yōu)榭捎谩?/div>
3.2均衡器模塊的實(shí)現(xiàn)
均衡器模塊功能是生成帶通濾波器并對(duì)原信號(hào)濾波。為了便于程序的擴(kuò)充與修改,將表 1中的頻段數(shù)據(jù)獨(dú)立出來(lái),如下 handles.fband=[20 100 200 500 1000 2000 4000 8000 16000];
均衡器的功能主要在“濾波”按鈕的回調(diào)函數(shù)中實(shí)現(xiàn),下面具體介紹
開(kāi)始需要得到濾波器的參數(shù):頻帶與階數(shù),如下
order=str2double(get(handles.order,'String'));
num=8;%8 filters totally
fband=handles.fband;
接著就是產(chǎn)生濾波器并濾波了,每次濾波后產(chǎn)生的yi(n)如果都存到一個(gè)變量中,則需要8個(gè)這樣的變量,對(duì)于輸入信號(hào)量很大時(shí)將需要大量的內(nèi)存空間,為此,本文采用累加的方式,這樣只用一個(gè)變量去存儲(chǔ)濾波結(jié)果。
nn=length(handles.y);
handles.yy=zeros(size(handles.y));
for i=1:num
if get(handles.butterworth,'Value')==1
[b a]=butter(order,2*fband(i:i+1)/handles.Fs);
elseif get(handles.cheby1,'Value')==1
[b a]=cheby1(order,0.5,2*fband(i:i+1)/handles.Fs);
elseif get(handles.cheby2,'Value')==1
[b a]=cheby2(order,20,2*fband(i:i+1)/handles.Fs);
elseif get(handles.ellip,'Value')==1
[b a]=ellip(order,0.5,20,2*fband(i:i+1)/handles.Fs);
else
errordlg('No filter type chosen or filter type error!');
end
eval(sprintf('k=get(handles.band%d,''Value'');',i));
y=(9^k-1)/8*qfilter(b,a,handles.y);
handles.yy=handles.yy+y;
end
guidata(hObject,handles);
在程序中有一句y=(9^k-1)/8*qfilter(b,a,handles.y),作用是加權(quán)以便下一句的求和,其中k是從滾動(dòng)條中得到的參數(shù),從0到2,但需要的權(quán)值是從0到10,令w為需要的權(quán),即,由于實(shí)際需要w為指數(shù)變化,故設(shè)
(9)
代入w=0, k=0; w=1, k=1; w=10, k=2解得a=1/8,b=9,,從而有上述代碼。
3.3 混合編程實(shí)現(xiàn)filter函數(shù)
MATLAB中提供的filter函數(shù),但有兩個(gè)問(wèn)題,一個(gè)是運(yùn)行速度較慢,另一個(gè)是不能解決2.2.2節(jié)的溢出問(wèn)題。由于filter函數(shù)的執(zhí)行速度是整個(gè)軟件速度的瓶頸,故需要提高其速度。故這里采用VC實(shí)現(xiàn)filter函數(shù),具體通過(guò)MATLAB與VC的混合編程來(lái)實(shí)現(xiàn)。這樣能夠較好解決那兩個(gè)問(wèn)題。 具體步驟為:
(1) MATLAB中運(yùn)行mex –setup將VC選作編譯器
(2) 在VC中新建一個(gè)DLL工程,添加如下代碼
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{ double *a,*b,*x,*y;
int M,n,i,j;
b=mxGetPr(prhs[0]); //獲得指向矩陣的指針
a=mxGetPr(prhs[1]);
x=mxGetPr(prhs[2]);
M=mxGetM(prhs[2]); //獲得矩陣的行數(shù)
plhs[0]=mxCreateDoubleMatrix(M,1,mxREAL);
y=mxGetPr(plhs[0]);
n=mxGetN(prhs[0]);
for(i=0;i<n;i++)
{ y[i]=b[0]*x[i];
for(j=1;j<i+1;j++)
y[i]+=b[j]*x[i-j]-a[j]*y[i-j];
if(y[i]>1)y[i]=1;else if(y[i]<-1)y[i]=-1;
}
for(;i<M;i++)
{ y[i]=b[0]*x[i];
for(j=1;j<n;j++)
y[i]+=b[j]*x[i-j]-a[j]*y[i-j];
if(y[i]>1)y[i]=1;else if(y[i]<-1)y[i]=-1;
}
}
(3) 保存為qfilter.cpp,放在MATLAB工作目錄,在MATLAB中運(yùn)行mex qfilter.cpp生成qfilter.dll。
這樣,只需調(diào)用qfilter函數(shù)即能實(shí)現(xiàn)濾波。
3.4 實(shí)時(shí)顯示的實(shí)現(xiàn)
軟件的功能要求實(shí)時(shí)顯示波形與頻譜分析結(jié)果,這里采用分批處理的方法。即先取一批信號(hào),將其播放出來(lái),同時(shí)進(jìn)行FFT,并繪出時(shí)域波形與頻譜分析結(jié)果,然后取下一批信號(hào)……由于各批信號(hào)間的時(shí)間間隔很小,從而感覺(jué)像連續(xù)播放,而時(shí)域波形與頻譜則是實(shí)時(shí)地變化。 該功能主要在“播放”按鈕的回調(diào)函數(shù)中實(shí)現(xiàn)
N=length(handles.yy);
n=4096;
step=n/handles.Fs;
from=1;
to=n;
ymax=max(handles.y);
ymin=min(handles.y);
f=linspace(0,handles.Fs/2,n/2);
fband=handles.fband;
num=length(fband)-1;
tic
while to<=N;
y=handles.yy(from:to,:);
pause(step-toc*0.99);
wavplay(y,handles.Fs,'async');
tic
P=fft(y,n);
Pyy =2*abs(P)/n;
loglog(handles.axes1,f,Pyy(1:n/2));
axis(handles.axes1,[fband(1) fband(num+1) 1e-3 ymax]);
plot(handles.axes2,y);
ylim(handles.axes2,[ymin ymax]);
from=from+n;
to=to+n;
end
采用異步播放方式可以使得播放不占用主線(xiàn)程,從而使得播放效果不會(huì)很卡。為了使得播放流暢,需要與pause的使用結(jié)合,具體方法為用tic和toc計(jì)算出其它代碼運(yùn)行時(shí)間,然后用播放時(shí)間減去其它代碼運(yùn)行時(shí)間,從而得到需要暫停運(yùn)行的時(shí)間。
4.運(yùn)行實(shí)例與誤差分析
4.1運(yùn)行實(shí)例 圖 5是程序的運(yùn)行的一個(gè)實(shí)例,可以看到,基本上可以實(shí)現(xiàn)各個(gè)頻段的均衡與調(diào)結(jié)。但是并不能完全濾掉某個(gè)頻段的信號(hào)。 另外,為了比較MATLAB的filter函數(shù)與VC寫(xiě)的qfilter的執(zhí)行速度,軟件中提供了選擇濾波程序的界面,圖 5中的運(yùn)行結(jié)果為qfilter的運(yùn)行時(shí)間,為0.031秒,而相同情況下,MATLAB的filter的運(yùn)行時(shí)間為0.157秒,如圖 6所示。從而混合編程的方式大大提高了軟件的運(yùn)行效率。所以在均衡器功能上直接采用qfilter。
4.2 誤差分析
理想的濾波器是不存在的,實(shí)際中只能盡量地接近理想濾波器,所以只能盡量地去接近理想的濾波器。對(duì)于IIR數(shù)字濾波器,階數(shù)越高,則濾波器的精度越高,即越接近于理想的情況,但計(jì)算機(jī)運(yùn)行速度就越慢了,所以實(shí)際中應(yīng)該權(quán)衡運(yùn)行速度與濾波器的精度。另外,計(jì)算機(jī)本身也有誤差(如截?cái)嗾`差),但相對(duì)于濾波器的設(shè)計(jì)誤差,計(jì)算機(jī)的計(jì)算誤差可以怱略不計(jì)。故提高精度關(guān)鍵在于提高濾波器的設(shè)計(jì)精度。 圖 5 運(yùn)行結(jié)果實(shí)例
圖 6 MATLAB的filter的運(yùn)行時(shí)間
另外,每個(gè)帶通濾波器之間的過(guò)渡也有設(shè)計(jì)誤差,理論上帶通濾波器間的過(guò)濾應(yīng)該滿(mǎn)足各濾波器的頻率響應(yīng)曲線(xiàn)疊加起來(lái)為一條值為1的水平線(xiàn),但實(shí)際中只能盡量去接近理論的情況。
5.總結(jié)與展望
5.1總結(jié) 本文首先對(duì)數(shù)字濾波器的原理進(jìn)行了分析,并選擇了一種實(shí)現(xiàn)數(shù)字均衡器的方案,在軟件的設(shè)計(jì)上采用軟件工程的理論,使用面向數(shù)據(jù)流的設(shè)計(jì)方法進(jìn)行軟件設(shè)計(jì),并且采用了模塊劃分的方法。在實(shí)現(xiàn)的時(shí)候采用MATLAB與VC混合編程的方式,這樣不僅利用了MATLAB的強(qiáng)大工具箱,而且使得開(kāi)發(fā)的軟件有著運(yùn)行速度快的特點(diǎn)。界面上采用MATLAB提供的GUIDE工具進(jìn)行設(shè)計(jì),使得軟件開(kāi)發(fā)效率較高。對(duì)于均衡器所要求的功能,已經(jīng)全部實(shí)現(xiàn),但限于篇幅,本文只給出了部分功能的實(shí)現(xiàn)方法。最后給出了軟件的運(yùn)行結(jié)果,并對(duì)軟件進(jìn)行了誤差分析。 5.2展望
該軟件在播放前需要點(diǎn)濾波按鈕,這使得操作變得麻煩,所以可以將濾波功能加到播放中,這就意味著需要加快程序的運(yùn)行速度可者采用多線(xiàn)程機(jī)制。帶通濾波器頻率交界處的誤差可以通過(guò)優(yōu)化設(shè)計(jì)的方法來(lái)將其減小,即各帶通濾波器不完全以給定的頻帶為自己的生成參數(shù),而是以附近的某個(gè)頻率值作為其生成參數(shù),這樣就需要用到優(yōu)化的理論。其實(shí)可以將軟件的主體用VC進(jìn)行開(kāi)發(fā),部分難以實(shí)現(xiàn)但運(yùn)行次數(shù)不多的函數(shù)則借用MATLAB,實(shí)現(xiàn)以VC的主體的混合編程,這樣可以實(shí)現(xiàn)多線(xiàn)程,并且運(yùn)行速度會(huì)進(jìn)一步加快,但這種開(kāi)發(fā)方式的開(kāi)發(fā)時(shí)間相對(duì)較長(zhǎng)。 本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/sbtdkj1017/archive/2008/03/21/2202003.aspx
|
|
來(lái)自: yanjunfeng > 《我的圖書(shū)館》