魯曉東,紀(jì)玉川
(1.浙江海洋大學(xué)東??茖W(xué)技術(shù)學(xué)院,浙江舟山 316000;2.舟山市海大科學(xué)技術(shù)研究院,浙江舟山 316000)
Matlab 由于其強大的計算和繪圖功能,在工程領(lǐng)域中常被用于各種設(shè)計方案、處理算法的仿真[1-2],以簡化計算過程,提高工作效率。同時Matlab 對硬件的支持[3]也是可圈可點的,例如Matlab 的數(shù)據(jù)采集工具箱(DAQ)就包含了市面上的各種數(shù)據(jù)采集卡驅(qū)動。由于它是通過自身的MEX 工具包調(diào)用操作系統(tǒng)的底層API 去驅(qū)動計算機的外設(shè),對用戶來說可以不必深究硬件如何工作,僅調(diào)用工具包的相關(guān)函數(shù)就能獲取外部傳感器的數(shù)據(jù)。所以Matlab 也非常適合于信號的實時處理[4-5],例如在嵌入式開發(fā)前期,硬件系統(tǒng)并未建立完善,當(dāng)需知某種處理方法在設(shè)計的系統(tǒng)中是否有效,可以直接借助PC 機上的Matlab 對該算法進行驗證,因為系統(tǒng)處理的是真實信號,只是算法在不同的平臺進行實現(xiàn)而已,所以仿真的結(jié)果幾近于實際效果。
DAQ(Data AcQuisition)是Matlab的數(shù)據(jù)采集工具箱,該工具箱由3個部分組成:功能函數(shù).m文件、DAQ引擎和硬件驅(qū)動程序。為了方便用戶的使用,Matlab對其內(nèi)部的DAQ 底層驅(qū)動作了函數(shù)的封裝,通過調(diào)用這些函數(shù)便可完成設(shè)備數(shù)據(jù)的采集。由于Matlab包含當(dāng)前市面上多數(shù)的硬件驅(qū)動,因此,其DAQ 有較好的兼容性,而用戶使用時感覺不到驅(qū)動的存在,只須調(diào)用函數(shù)就可直接控制設(shè)備[6]。例如要完成的是對音頻實時信號的處理,使用系統(tǒng)集成的聲卡作為DAQ 設(shè)備,Matlab 對聲卡的功能封裝如圖1 所示,Matlab 通過實例化一個audio Device Reader 對象,設(shè)置對象的屬性并使用對象提供的方法驅(qū)動聲卡工作以獲得數(shù)據(jù)。Matlab應(yīng)用的基本方法可以描述為:
圖1 音頻數(shù)據(jù)采集卡功能結(jié)構(gòu)
1)創(chuàng)建音頻采集卡DAQ 設(shè)備對象
MyDaq=audio Device Reader,
其中,audio Device Reader 是Matlab 實例化系統(tǒng)音頻卡的功能模塊,MyDaq 即為設(shè)備對象的句柄。
2)設(shè)置DAQ 對象的屬性參數(shù)
屬性參數(shù)主要包括采集卡工作時數(shù)據(jù)幀的幀緩沖大小、采樣率、通道數(shù)、采樣點數(shù)據(jù)類型等,屬性值可以根據(jù)系統(tǒng)工作的需要進行設(shè)置。例如:
MyDaq.Samples PerFrame=44100//采樣率MyDaq.Num Channels=2//通道數(shù)為2
MyDaq.BitDepth=′16-bit integer′//16 位整數(shù)
3)數(shù)據(jù)的采集控制
使用audio Device Reader對象的record 或step 方法,就可以讀取音頻采集卡中緩沖區(qū)里的數(shù)據(jù)。緩沖區(qū)一般存放一幀的數(shù)據(jù),軟件讀取的間隔一般都遠慢于硬件的采樣。所以會產(chǎn)生溢出,讀取的是緩沖區(qū)最后一幀數(shù)據(jù)。
[x,numOverrun]=record(MyDaq)//record 在MyDaq讀取數(shù)據(jù)并存放在x,返回幀溢出數(shù)numOverrun。
4)釋放內(nèi)存
release(MyDaq);//釋放該采集卡MyDaq 所占用的內(nèi)存資源。
以一個在實際環(huán)境中常見的反射信號的處理為例。通過Matlab 提供的信號處理工具計算其反射混響的時間參數(shù),對其濾波并消除該反射信號。
不妨設(shè)x1(n)為信號源信號,經(jīng)過某終端產(chǎn)生一系列衰減系數(shù)為αk延遲nk的反射信號,它與原信號疊加后的波形為:
x(n)可看成x1(n)與沖激串∑δ(n-nk)的卷積,令h(n)=δ(n)+α1δ(n-n1)+…+αkδ(n-nk),則式(1)可以改寫為:
h(n)實際上就是信道的沖激響應(yīng)。若想從x(n)中分離出x1(n),就必須知道h(n) 的相關(guān)信息,才可以對式(1)作反卷積或解差分方程。由于混響信號的特點是自身信號的延時疊加,所以可以借助信號的倒譜來觀測h的延時參數(shù)nk。先把式(2)變換到z域:
兩邊取對數(shù)得到:
所以對于延遲nk個序列的反射信號一定在倒譜上的第nk個序列值有一個峰值,因為此時的卷積值取得極值。通過尋找數(shù)值的峰值便可以確定延遲的參數(shù)nk,從而確定了式(1)所表達的差分方程。設(shè)僅存在一個反射波混合信號,利用Matlab 提供的濾波器函數(shù)filter(b,a,x)求解該差分方程,可以解算出原始信號x(n) ?;静襟E如下:
1)用倒譜函數(shù)rceps 計算出混合信號的倒譜序列。
cepsig=rceps(xecho);//xecho為混合時域信號,cepsig 為倒譜序列。
2)用findpeaks()檢索倒譜的峰值,確定反射信號的延遲參數(shù)delay。
[px,nk]=findpeaks(cepsig,′ Threshold′,0.01,′ Min PeakDistance′,10);
delay=nk(2)-1;
函數(shù)findpeaks()將在倒譜cepsig 中尋找峰值,并返回峰值的序列位置nk以及相應(yīng)峰值px。參數(shù)MinPeakDistance 是設(shè)置檢峰的最小時間尺度,用于過濾噪聲干擾。Threshold 則是設(shè)置各峰值必須與相鄰數(shù)據(jù)點的差值。這兩個參數(shù)會影響檢測的結(jié)果,操作中可以根據(jù)實際進行調(diào)整。倒譜序列的峰值在第二個即為反射序列出現(xiàn)的位置,因第一個位置nk(1)一定為1,延時為0,所以第二個位置nk(2)的延時要進行減1 調(diào)整。
3)用filter()函數(shù)解算差分方程并求得原信號。根據(jù)filter(b,a,x)函數(shù)的時域表達式[8]:
可確定存在一個反射信號的混響信號x(n)=x1(n)+αkx1(n-nk)的a,b參數(shù)。用Matlab描述為:
為提高編程效率,采用Matlab GUI 方式[9]建立信號處理的控制界面如圖3 所示。在面板上布置4 個AXES(圖形坐標(biāo)系)對象即程序中的signalraw、fsignalraw、cepstrum、firsignal,分別用于顯示信道信號、信號的頻譜、倒譜、以及濾波后的信號。右邊是濾波器控制面板、信號采集控制的按鈕等,用于實現(xiàn)對各控件函數(shù)的回調(diào)。
處理控制主要是完成信號的實時處理和數(shù)據(jù)的可視化處理。在建立采集卡對象后,便可以操作該對象提供的DAQ函數(shù),完成數(shù)據(jù)的采集、處理與顯示。
1)初始化DAQ 對象和圖形對象
以下是數(shù)據(jù)可視化圖形句柄初始化:
2)實時處理
由于Matlab 是一種單線程的應(yīng)用程序,因此控制腳本使用了循環(huán)結(jié)構(gòu),用循環(huán)結(jié)構(gòu)中的各條件變量決定信號處理的流程和方式,如圖2 所示。
圖2 信號處理流程結(jié)構(gòu)
這是人機對話的控制處理,主要完成數(shù)據(jù)采集的啟動、停止以及濾波器的設(shè)置??刂频膬?nèi)容都是實時處理腳本中的一些參數(shù),如啟動、停止的flag 變量,flag 為1 則while 中不斷采集數(shù)據(jù)并處理;選擇是否需要手動改變?yōu)V波系數(shù)[b,a],設(shè)置的變量是default,當(dāng)default為0則系統(tǒng)自動估算濾波參數(shù),否則在面板上手動調(diào)節(jié)截止頻率,并定義處理的函數(shù)filter_set()計算調(diào)節(jié)后相應(yīng)的參數(shù)。
用一個拾音器采集一個音頻信號,并給于一定的回聲效果,時延約為0.05 s,通過聲卡的A/D 轉(zhuǎn)換,在Matlab 上得到波形如圖3(a)所示,同時可以看到其頻譜如圖3(b)所示,在頻譜中看不到回聲延遲的特征,但可以把它轉(zhuǎn)為倒譜如圖3(c)所示,可以看出在原點和0.043 處各有一個峰值,原點是信號本身,而第二個就是延時的信號。經(jīng)過濾波得到信號的恢復(fù)與測試的原始信號作對比,如圖3(d)所示,效果是比較理想的。這個過程也可以通過界面上的濾波器手動設(shè)置來實現(xiàn),信號處理結(jié)果也可實時顯示[10-17]。
圖3 實時處理結(jié)果
從上述處理過程可見,利用Matlab 進行信號的實時處理非常方便,主要表現(xiàn)在其對硬件良好的兼容性,使用戶不必去關(guān)注硬件的驅(qū)動,只需關(guān)心軟件的算法效果。而且它封裝了大量的工具函數(shù),便于計算和調(diào)試,可以提高實現(xiàn)處理的效率。值得注意的是Matlab 是一種解釋性的語言,當(dāng)有多路信號同時要求處理時,Matlab 的這種循環(huán)結(jié)構(gòu)的編程方式會降低效率,實時性就不那么理想,但是其作為一種對實時處理算法的有效性檢驗手段是非常值得應(yīng)用的。