馬 銳,張自嘉,潘玲嬌
(南京信息工程大學(xué)信息與控制學(xué)院,江蘇南京 210044)
機(jī)械產(chǎn)品在工作時(shí)會(huì)產(chǎn)生一定的噪聲,一方面增加了自身的磨損,降低了使用壽命,同時(shí)也會(huì)對(duì)環(huán)境造成一定的噪聲污染,因此對(duì)噪聲進(jìn)行準(zhǔn)確定位,對(duì)機(jī)械產(chǎn)品的改進(jìn)和故障檢測(cè)具有重要意義。然而國(guó)內(nèi)基于麥克風(fēng)陣列的聲源定位研究工作起步較晚,目前的算法和系統(tǒng)還不夠完善,在國(guó)際上小型、低功耗的聲源定位系統(tǒng)也不多。文獻(xiàn)[1]是用EasyARM2100采集3通道的數(shù)據(jù),采用時(shí)延估計(jì)算法進(jìn)行聲源定位,借助PC顯示定位結(jié)果,文中利用嵌入式微處理器S3C6410和AD7606進(jìn)行8通道數(shù)據(jù)的同步采集,運(yùn)用波束形成算法進(jìn)行聲源定位并實(shí)時(shí)顯示定位結(jié)果,體積小、功耗低,精度高更具有實(shí)際應(yīng)用價(jià)值。
文中設(shè)計(jì)的聲源定位系統(tǒng)是基于S3C6410的實(shí)時(shí)聲源定位系統(tǒng),系統(tǒng)采用Linux-2.6.28版本內(nèi)核。S3C6410處理器采用ARM1176JZF-S的核,ARM Core電壓為1.1 V時(shí),可以運(yùn)行到553 MHz,在1.2 V時(shí),可以運(yùn)行到667 MHz[2],足夠高的主頻保證AD采集達(dá)到25 K的采樣率,和較快的數(shù)據(jù)處理速度。系統(tǒng)有8個(gè)全指向麥克風(fēng)組成的均勻線陣,每個(gè)麥克風(fēng)包含前置放大電路,將信號(hào)放大到A/D能夠采集的電壓信號(hào)范圍;A/D轉(zhuǎn)換模塊采用AD7606,它是一款16位、8通道同步采樣模數(shù)數(shù)據(jù)采集系統(tǒng)(DAS),可以處理±10 V和±5 V真雙極性輸入信號(hào),同時(shí)所有通道均能以高達(dá)200 KSPS的吞吐速率采樣[3];LCD是Ok6410開(kāi)發(fā)板自帶的4.3寸液晶顯示屏,顯示定位結(jié)果。系統(tǒng)結(jié)構(gòu)圖如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)圖
微處理器S3C6410通過(guò)GPIO口與AD7606連接,AD7606的轉(zhuǎn)換是由CONVST引腳控制。CONVST A和CONVST B相連,實(shí)現(xiàn)八通道同步采樣。當(dāng)CONVST A、B上升沿時(shí),內(nèi)部采樣保持放大器對(duì)輸入信號(hào)進(jìn)行同步采樣,轉(zhuǎn)換開(kāi)始,BUSY引腳跳變?yōu)楦唠娖?。所有通道的轉(zhuǎn)換時(shí)間典型值均為4 μs.轉(zhuǎn)換結(jié)束后,BUSY變?yōu)榈碗娖?,通過(guò)并行口從數(shù)據(jù)寄存器讀取數(shù)據(jù),AD7606與S3C6410的連接示意圖如圖2所示。
圖2 AD7606與S3C6410的連接示意圖
多通道同步數(shù)據(jù)采集是獲得較高定位精度的前提條件,文中聲源定位系統(tǒng)是在Ubuntu10.04下開(kāi)發(fā),嵌入式Linux-2.6.28環(huán)境下運(yùn)行,交叉編譯器版本為4.3.2。要先進(jìn)行驅(qū)動(dòng)程序設(shè)計(jì)才能對(duì)AD7606進(jìn)行控制,嵌入式系統(tǒng)下,通常采用內(nèi)核設(shè)備驅(qū)動(dòng)設(shè)計(jì)方法。該方法屏蔽了硬件設(shè)計(jì)的具體細(xì)節(jié),在內(nèi)核空間為各種不同的設(shè)備提供了統(tǒng)一接口。硬件設(shè)備不同,接口中的注冊(cè)函數(shù),初始化函數(shù)等均不相同。應(yīng)用程序調(diào)用這些接口函數(shù),執(zhí)行“swi”指令,引起處理器異常,進(jìn)入內(nèi)核,找到相應(yīng)的設(shè)備驅(qū)動(dòng),通過(guò)驅(qū)動(dòng)中的接口函數(shù)控制硬件設(shè)備。
傳統(tǒng)嵌入式系統(tǒng)中的硬件操作都是基于內(nèi)核設(shè)備驅(qū)動(dòng)實(shí)現(xiàn)的,即使不斷優(yōu)化軟件設(shè)計(jì),但不可避免的存在如下缺點(diǎn)[4-5]:
(1)只能對(duì)功能簡(jiǎn)單、操作難度低的設(shè)備實(shí)現(xiàn)控制。即使類(lèi)型相同的設(shè)備也需要設(shè)計(jì)不同的設(shè)備驅(qū)動(dòng),比如打印機(jī)、鍵盤(pán)、串口等都屬于字符設(shè)備,但都需要截然不同的設(shè)備驅(qū)動(dòng)。
(2)傳統(tǒng)內(nèi)核設(shè)備驅(qū)動(dòng)需要利用讀、寫(xiě)函數(shù)將采集數(shù)據(jù)以字節(jié)方式從內(nèi)核空間傳輸?shù)接脩?hù)空間,然后由用戶(hù)空間將采集數(shù)據(jù)存儲(chǔ)到外部移動(dòng)設(shè)備。而且當(dāng)讀寫(xiě)函數(shù)傳遞數(shù)據(jù)時(shí),進(jìn)程內(nèi)存空間和內(nèi)核內(nèi)存空間之間會(huì)頻繁傳遞內(nèi)存,這樣降低了系統(tǒng)的執(zhí)行效率。
(3)傳統(tǒng)設(shè)備驅(qū)動(dòng)中,對(duì)A/D芯片的初始化控制,數(shù)據(jù)讀取等均在內(nèi)核空間中完成,導(dǎo)致整個(gè)內(nèi)核驅(qū)動(dòng)執(zhí)行效率低,程序冗長(zhǎng),降低采集系統(tǒng)的采樣率。
系統(tǒng)若利用傳統(tǒng)內(nèi)核設(shè)備驅(qū)動(dòng)控制外擴(kuò)式A/D芯片,只有通過(guò)內(nèi)核接口函數(shù)才能間接訪問(wèn)A/D芯片。通常采集系統(tǒng)在一定時(shí)間內(nèi)需要連續(xù)不停地采樣,因此數(shù)據(jù)量相當(dāng)龐大,一般采集8通道2 048個(gè)采樣點(diǎn)的數(shù)據(jù)文件大小約為186 K字節(jié)。如果讀、寫(xiě)函數(shù)以字節(jié)為單位傳遞數(shù)據(jù),將耗費(fèi)很長(zhǎng)的時(shí)間,而且極易產(chǎn)生數(shù)據(jù)丟失或錯(cuò)誤。同時(shí)如果內(nèi)存訪問(wèn)不當(dāng),會(huì)造成采集系統(tǒng)癱瘓。
3.1內(nèi)存映射原理
內(nèi)核設(shè)備驅(qū)動(dòng)程序?yàn)榱耸褂迷O(shè)備文件控制硬件,經(jīng)常調(diào)用read( )、write( )函數(shù)。這些函數(shù)在應(yīng)用程序中能夠屏蔽硬件的設(shè)計(jì)細(xì)節(jié),但這些函數(shù)在運(yùn)行時(shí)會(huì)伴隨有進(jìn)程內(nèi)存與內(nèi)核內(nèi)存間的內(nèi)存復(fù)制問(wèn)題,因此降低了系統(tǒng)性能,不適用于聲音信號(hào)數(shù)據(jù)的傳輸。
為了解決上述問(wèn)題,唯有在不帶內(nèi)存復(fù)制的前提下,確保驅(qū)動(dòng)程序可以直接使用相關(guān)地址空間。在驅(qū)動(dòng)程序中不能直接對(duì)物理地址操作,需要將物理地址映射為虛擬地址。系統(tǒng)利用內(nèi)存映射把設(shè)備物理內(nèi)存經(jīng)頁(yè)式管理對(duì)應(yīng)到用戶(hù)空間某一段虛擬內(nèi)存地址,這樣用戶(hù)空間在這段虛擬地址上就能直接操作設(shè)備。實(shí)際物理地址根據(jù)硬件設(shè)計(jì)可以直接得出,用戶(hù)空間獲得的虛擬內(nèi)存地址是映射過(guò)程中內(nèi)核自動(dòng)分配的,用戶(hù)只需建立相應(yīng)的頁(yè)表[6]。mmap映射原理框架如圖3所示。
圖3 mmap統(tǒng)調(diào)用框架圖
mmap是Linux系統(tǒng)函數(shù)指針集file_operations中的一個(gè)成員函數(shù),系統(tǒng)通過(guò)mmap系統(tǒng)調(diào)用來(lái)映射設(shè)備文件,此時(shí)內(nèi)核將自動(dòng)分配虛擬地址空間和調(diào)用驅(qū)動(dòng)程序中的mmap接口。內(nèi)核在完成映射工作后,調(diào)用真正的mmap函數(shù),降低了系統(tǒng)編寫(xiě)代碼難度[7]。
3.2基于內(nèi)存映射的驅(qū)動(dòng)設(shè)計(jì)
針對(duì)傳統(tǒng)內(nèi)核設(shè)備驅(qū)動(dòng)存在的缺陷,結(jié)合實(shí)際噪聲采集條件的需要,文中基于內(nèi)存映射機(jī)制,利用內(nèi)核空間與用戶(hù)空間互訪通信機(jī)制設(shè)計(jì)了同步數(shù)據(jù)采集系統(tǒng)的軟件驅(qū)動(dòng),直接在用戶(hù)空間存儲(chǔ)采集數(shù)據(jù),避免了內(nèi)核與用戶(hù)空間通信時(shí)造成的數(shù)據(jù)丟失問(wèn)題。另外,通過(guò)多次物理地址映射,很好地解決了物理地址跨度大,無(wú)法一次完成映射等問(wèn)題。
基于內(nèi)存映射的驅(qū)動(dòng)程序主要在用戶(hù)空間進(jìn)行mmap內(nèi)存映射,經(jīng)內(nèi)核空間驅(qū)動(dòng)程序完成大量映射工作后,返回映射地址,用戶(hù)空間通過(guò)該地址操作A/D芯片。這種方法不僅避免了內(nèi)核空間與用戶(hù)空間的數(shù)據(jù)傳遞,而且運(yùn)行速度顯著提高。內(nèi)存映射驅(qū)動(dòng)主要包含2個(gè)部分:內(nèi)核空間程序設(shè)計(jì)和用戶(hù)空間程序設(shè)計(jì),其相互關(guān)系如圖4所示。
圖4 內(nèi)核空間與用戶(hù)空間關(guān)系圖
用戶(hù)空間mmap函數(shù)如下定義:
void*mmap(caddr_t addr,size_t len,int prot,int flags,int fd,off_t offset);
其中,系統(tǒng)通過(guò)參數(shù)addr和len可以確定映射空間的大小,addr是目的映射內(nèi)存區(qū)的開(kāi)始地址,len表示將設(shè)備文件中多大的部分映射進(jìn)虛擬內(nèi)存;系統(tǒng)將addr設(shè)為NULL,讓內(nèi)核自主選擇映射地址,成功映射后該地址會(huì)返回;系統(tǒng)中的len必須是頁(yè)的倍數(shù),如果不是頁(yè)的整數(shù)倍,多出的剩余空間將被系統(tǒng)清空;參數(shù)prot表示映射空間的保護(hù)方式;參數(shù)flags表示映射區(qū)的各種特性;為了保證映射后的虛擬地址空間能夠由用戶(hù)訪問(wèn),系統(tǒng)將映射的虛擬內(nèi)存區(qū)域設(shè)為可讀可寫(xiě)性質(zhì),且可向其拷貝數(shù)據(jù);offset也必須能被頁(yè)整除,否則映射失敗。如果mmap操作成功,返回值則為映射區(qū)的開(kāi)始地址。
大多數(shù)情況下,內(nèi)核設(shè)備驅(qū)動(dòng)會(huì)提供需要映射的物理地址,這樣可以將用戶(hù)空間mmap函數(shù)傳遞的offset參數(shù)作為物理地址偏移量。但是系統(tǒng)硬件使用的物理地址跨度范圍較大,如果在內(nèi)核指定映射的物理地址,無(wú)法一次性映射結(jié)束。文中在內(nèi)核mmap接口函數(shù)中不指定實(shí)際物理地址,將該任務(wù)留給用戶(hù)空間完成,有效地解決了無(wú)法映射的問(wèn)題。系統(tǒng)自定義的mmap函數(shù)主要代碼如下所示: static int ad7606_mmap(struct file*filp,struct vm_area_struct *vma)
{/*生成vm_area_struct結(jié)構(gòu)體*/
vma->vm_flags |= VM_RESERVED;//禁止將內(nèi)存區(qū)域交換出去
vma->vm_flags |= VM_IO;//設(shè)置映射區(qū)域?yàn)镮/O內(nèi)存空間
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);//無(wú)緩存式申請(qǐng)映射
/*一次性建立頁(yè)表*/if(remap_pfn_range(vma,vma->vm_start,vma->vm_pgoff,
vma->vm_end-vma->vm_start,vma->vm_page_prot))
… …
vma->vm_ops=&ad7606_vm_ops;//更新vm_ops
… …
}
由此得出,內(nèi)存映射驅(qū)動(dòng)主要涉及3個(gè)函數(shù),用戶(hù)空間mmap系統(tǒng)調(diào)用函數(shù),負(fù)責(zé)指定映射的物理地址,映射大小,映射區(qū)域性質(zhì)設(shè)置;內(nèi)核mmap接口函數(shù)中的vma結(jié)構(gòu)體與用戶(hù)空間mmap系統(tǒng)調(diào)用函數(shù)相結(jié)合,將地址信息傳遞給自定義的內(nèi)部函數(shù)remap_page_range,為物理地址創(chuàng)建頁(yè)表。3個(gè)函數(shù)的關(guān)系圖如圖5所示。
圖5 函數(shù)關(guān)系圖
聲源定位系統(tǒng)中定位算法決定系統(tǒng)性能優(yōu)劣,文中采用的是自適應(yīng)波束形成算法,自適應(yīng)波束形成的波束形成權(quán)向量與接收到的數(shù)據(jù)有關(guān),它是根據(jù)空間陣列的輸入信號(hào)及輸出信號(hào)自動(dòng)地調(diào)整權(quán)向量,對(duì)不同的權(quán)向量可以將形成的波束指向不同的方向,同樣功率輸出最大方向即為信號(hào)方向。麥克風(fēng)陣列的形式有均勻線陣、平面陣、均勻圓陣等多種形式,其中均勻線陣為最基本、應(yīng)用最多的陣列形式,圖6為8麥克分均勻線陣的結(jié)構(gòu)圖,麥克風(fēng)間距為d,θ為噪聲源的方位角。
圖6 均勻線陣結(jié)構(gòu)示意圖
由圖可以得到信號(hào)延遲時(shí)間為:
τm=(m-1)dcosθ/c
(1)
式中:c為聲音在空氣中傳播的速度;m=1,2…8。
各麥克風(fēng)接收到的離散信號(hào)序列為:
x(n)=A(θ)s(n)+N(n)
(2)
式中:x(n)為麥克風(fēng)陣列的輸出向量;x(n)=[x1(n),x2(n),…,xM(n)]T;N(n)為其中的噪聲向量;N(n)=[N1(n),N2(n),…,NM(n)]T;A(θ,f)=[e-j2πfτ1,e-j2πfτ2,…,e-j2πfτm]T;n為時(shí)間采樣序列。
對(duì)目標(biāo)方位的估計(jì)需要借助波束形成來(lái)實(shí)現(xiàn),波束形成器的輸出為
y(k,φ,f)=WH(φ,f)X(k,f)
(3)
式中:WH(φ,f)為表示波束形成器中的頻率為f的諧波分量的權(quán)向量;φ為波束指向角;WH(φ,f)=[w1(φ,f),w2(φ,f),…,wM(φ,f)]T;X(k,f)為表示第k個(gè)抽樣時(shí)間快拍且頻率為f的輸出向量;X(k,f)=[x1(k,f),x2(k,f),…,xM(k,f)]。
波束形成器的輸出功率為
P(φ,f)=E(|y(k,φ,f)|2)
=WH(φ,f)E(X*(k,f)XT(k,f))W(φ,f)
=WH(φ,f)R(k,f)W(φ,f)
(4)
式中:*表示復(fù)共軛;E()表示數(shù)學(xué)期望;對(duì)常規(guī)波束,W(φ,f)和導(dǎo)向矢量A(φ,f)相同;R(k,f)為輸出信號(hào)中,第k個(gè)快拍、頻率為f的窄帶信號(hào)的協(xié)方差矩陣。
(5)
利用式(4)可以計(jì)算出波束形成的輸出功率,改變?chǔ)?,找到功率的最大值就可以確定目標(biāo)的方位。式(4)為常規(guī)波束形成器(CBF)的輸出功率。最小方差無(wú)失真響應(yīng)(MVDR)或最優(yōu)權(quán)波束形成器是一種自適應(yīng)波束形成算法,有較強(qiáng)的抗干擾能力,可以對(duì)不同的環(huán)境做自適應(yīng)處理。MVDR波束形成的波束輸出功率為:
(6)
式中fi為方向角φ上的頻率分量[8]。
4.1算法C程序?qū)崿F(xiàn)
為實(shí)現(xiàn)定位系統(tǒng)的小型化,不借助PC進(jìn)行數(shù)據(jù)處理,將算法用C語(yǔ)言編寫(xiě),在VC6.0下開(kāi)發(fā),用arm-linux-gcc交叉編譯器進(jìn)行交叉編譯,就可以將執(zhí)行文件移植到開(kāi)發(fā)板中運(yùn)行,且執(zhí)行效率比用Matlab高。采集聲音信號(hào)時(shí)無(wú)可避免的會(huì)帶有干擾信號(hào),利用軟件濾波去除干擾信號(hào),且信號(hào)是寬帶的語(yǔ)音信號(hào),需利用傅里葉變換將信號(hào)從時(shí)域變換到頻域進(jìn)行處理,之后按照波束形成算法進(jìn)行大量的矩陣預(yù)算,程序流程圖如圖7所示。
圖7 處理程序流程圖
將數(shù)據(jù)采集程序和處理程序結(jié)合才能構(gòu)成完整的聲源定位系統(tǒng),上位機(jī)是用QT開(kāi)發(fā),通過(guò)上位機(jī)分別調(diào)用采集程序和數(shù)據(jù)處理程序,最終在上位機(jī)上顯示定位結(jié)果,設(shè)置采樣點(diǎn)數(shù)為2 048,采樣頻率為25 kHz,采集的噪聲源方位角為50°,數(shù)據(jù)波形顯示如圖8所示。
圖8 數(shù)據(jù)波形顯示圖
Start,Stop按鍵分別為啟動(dòng)停止采集數(shù)據(jù)。終止噪聲信號(hào)采集工作,系統(tǒng)調(diào)用數(shù)據(jù)處理程序進(jìn)行處理,并顯示定位結(jié)果,結(jié)果如圖9所示。
圖9 定位結(jié)果圖
系統(tǒng)利用外接AD7606芯片采集8路聲音信號(hào),S3C6410作為核心處理器件,采用波束形成算法,OK6410開(kāi)發(fā)板在Linux 2.6.28內(nèi)核下,主要設(shè)計(jì)內(nèi)存映射驅(qū)動(dòng)提升聲音采集速率,編寫(xiě)精簡(jiǎn)的波束形成算法提升數(shù)據(jù)處理速度,和簡(jiǎn)潔的上位機(jī)界面動(dòng)態(tài)顯示定位結(jié)果,將采集、處理數(shù)據(jù)和顯示界面完整結(jié)合,實(shí)現(xiàn)了低功耗,小型化的聲源定位系統(tǒng),相比其他的嵌入式聲源定位系統(tǒng),算法定位精度高,運(yùn)算速度快,系統(tǒng)集成度高,可用于實(shí)時(shí)定位系統(tǒng)。
參考文獻(xiàn):
[1]蘇立娟,吳長(zhǎng)奇,郭欣欣.麥克風(fēng)陣列聲源定位研究與ARM實(shí)現(xiàn).無(wú)線電通信技術(shù),2011,37(5):48-50.
[2]SAMSUNG.S3C6410X RISC microprocessor user’s manual.Korea:SAMSUNG electronic co,2009.
[3]AnalogDevicesInc.AD7606/AD7606-6/AD7606-4 8-/6-/4-Channel DAS with 16-Bit,Bipolar Input,Simultaneous Sampling ADC data sheet.
[4]何富貴,侯義斌,李輝.用戶(hù)空間程序研究.計(jì)算機(jī)應(yīng)用研究,2008,25(12):3642.
[5]RUBINI A,CORBET J.Linux設(shè)備驅(qū)動(dòng)程序.魏永明,耿岳,鐘書(shū)毅,譯.中國(guó)電力出版社,2000.
[6]項(xiàng)西.基于ARM的指紋采集系統(tǒng)研究:[學(xué)位論文].武漢:武漢理工大學(xué),2007.
[7]朱建光.基于嵌入式Linux的數(shù)據(jù)采集系統(tǒng)研究:[學(xué)位論文].太原:中北大學(xué),2011.
[8]張自嘉,王昌明,劉偉.基于虛擬儀器的水聲信號(hào)采集與處理.儀器儀表學(xué)報(bào),2007,28(4):205-207.