信號(hào)處理好,開(kāi)環(huán)也能跑
楊韜 余文輝 曹申
2020-09-30 Wednesday
針對(duì)2020年第十五屆全國(guó)大學(xué)生智能車競(jìng)賽信標(biāo)組關(guān)于聲音信標(biāo)的識(shí)別,需要采集聲音信號(hào)和FM信號(hào),通過(guò)聲音信號(hào)和FM信號(hào)互相關(guān)進(jìn)行距離檢測(cè)和通過(guò)兩組聲音信號(hào)互相關(guān)進(jìn)行信標(biāo)方位判斷。
實(shí)際中,是在頻域中對(duì)兩組信號(hào)做乘法求最大值,而將時(shí)域信號(hào)變換為頻域信號(hào)需要經(jīng)過(guò)FFT變換,本系統(tǒng)引入一種新的級(jí)聯(lián)FFT變換,大大提高了計(jì)算速度和效率。為了增加系統(tǒng)的抗干擾性,我們使用了廣義互相關(guān)算法,有效抑制了噪聲和混響的干擾。
關(guān)鍵詞:級(jí)聯(lián)FFT;廣義互相關(guān);計(jì)算速度;
快速傅里葉變換(FFT)本身便是利用了離散傅里葉變換(DFT)中的對(duì)稱性和周期性,大大縮短了傅里葉變換的時(shí)長(zhǎng),這使得FFT成為基本的信號(hào)處理算法。
在2020年第十五屆全國(guó)智能車競(jìng)賽中,信標(biāo)組的比賽模式發(fā)生了很大的變化,從原始的識(shí)別一定頻率的光信號(hào)變?yōu)橹芷谛缘?50~2000Hz的Chirp聲音信號(hào)和對(duì)應(yīng)的FM調(diào)頻信號(hào)。信標(biāo)發(fā)出的信號(hào)的變化導(dǎo)致了信號(hào)識(shí)別和處理模式的變化,由原來(lái)識(shí)別光信號(hào)使用攝像頭,變?yōu)榻邮章曇粜盘?hào)的麥克風(fēng)模塊及接收FM信號(hào)的FM解調(diào)模塊,經(jīng)過(guò)不斷嘗試和選擇,麥克風(fēng)我們使用了9814帶自動(dòng)增益的麥克風(fēng)模塊,F(xiàn)M解調(diào)模塊使用了RDA5807解調(diào)芯片,兩者在實(shí)際使用中都取得了非常好的效果。
在信號(hào)處理中,一定距離的麥克風(fēng)接受到的信號(hào)進(jìn)行互相關(guān)可以獲得聲源方位,緊挨著的FM模塊和麥克風(fēng)接受到的信號(hào)進(jìn)行互相關(guān)可以得到車身與信標(biāo)的距離。時(shí)域互相關(guān)運(yùn)算計(jì)算量是十分龐大,實(shí)際上可以看做是兩組離散信號(hào)的時(shí)域卷積運(yùn)算,因此一般我們會(huì)把這種卷積運(yùn)算轉(zhuǎn)換到頻域中,將時(shí)域卷積等效為頻域相乘,這樣會(huì)大大簡(jiǎn)化我們的計(jì)算。將時(shí)域信號(hào)變換到頻域一般使用快速傅里葉變換(FFT),但在實(shí)際使用中這種速度仍然無(wú)法滿足高速定位的需求。
我們選用了TC264DA芯片的核心板,與普通TC264D芯片不同,TC264DA擁有512K的EMEM內(nèi)存空間和內(nèi)置了硬件FFT計(jì)算資源,硬件FFT比軟件FFT在速度上有質(zhì)的提升。但其存在的缺點(diǎn)為硬件FFT只能計(jì)算整形數(shù)據(jù),會(huì)造成一定程度的精度丟失,并且硬件FFT最多只能計(jì)算1024個(gè)點(diǎn)的,這種精度不能滿足本次比賽中信標(biāo)的識(shí)別。在本次比賽中至少要使用2048點(diǎn)的FFT,才能在高速下準(zhǔn)確定位。為了解決此問(wèn)題,我們引入了一種新的級(jí)聯(lián)FFT變換,既使用1024點(diǎn)的硬件FFT又能彌補(bǔ)序列長(zhǎng)度不夠的缺陷,并在此基礎(chǔ)上融合入廣義互相關(guān),提升互相關(guān)的抗干擾性。
級(jí)聯(lián)FFT算法的基本思想是把長(zhǎng)序列進(jìn)行分段,類似于把一維數(shù)組變?yōu)槎S數(shù)組,然后對(duì)行和列分別進(jìn)行FFT變換,用一定的計(jì)算方法將多個(gè)短序列的FFT合成原長(zhǎng)序列的FFT結(jié)果。
直接把一段C=M×N點(diǎn)序列信號(hào)x(n+mN),n=0,1,2,…,N-1;m=0,1,2,…,M-1;當(dāng)做一維序列進(jìn)行FFT變換,運(yùn)算結(jié)果可以表示為:
把一段C=M×N點(diǎn)序列信號(hào)x(n+mN),n=0,1,2,…,N-1;m=0,1,2,…,M-1;當(dāng)做二維獨(dú)立序列進(jìn)行FFT變換,也就是先進(jìn)行行方向N點(diǎn)的FFT運(yùn)算,再進(jìn)行列方向M點(diǎn)的FFT運(yùn)算,兩者序列編號(hào)不相關(guān),運(yùn)算結(jié)果可以表示為:
當(dāng)把這段序列看做一維序列排列為二維序列時(shí),序列編號(hào)將會(huì)發(fā)生變化,對(duì)應(yīng)的FFT運(yùn)算公式也會(huì)發(fā)生變化,運(yùn)算結(jié)果表示為:
化簡(jiǎn)后得:
可以看出(1-4)和(1-2)只相差e^(-j2πnp/N)^,也就是只要使e^(-j2πnp/N)=1^即可使兩者相等,但實(shí)際上,e^(-j2πnp/N)^不可能一直等于1。
根據(jù)分析,獨(dú)立的二維序列行和列進(jìn)行級(jí)聯(lián)FFT運(yùn)算和一維序列排列成二維序列再進(jìn)行行和列的級(jí)聯(lián)FFT運(yùn)算,兩者相差一個(gè)補(bǔ)償因子e^(-j2πnp/N)^,在實(shí)際中,我們只需在中途乘上補(bǔ)償因子即可使兩者等效。
由FFT運(yùn)算的線性性質(zhì)可以得到,矩陣化后的數(shù)據(jù)進(jìn)行FFT運(yùn)算時(shí),行和列運(yùn)算順序不同不會(huì)影響最終的結(jié)果。將兩維的運(yùn)算順序調(diào)換后,也就是先進(jìn)行列方向的FFT變換,再進(jìn)行行方向的FFT運(yùn)算,運(yùn)算結(jié)果可以表示為:
進(jìn)行了列變換后,就需要加入補(bǔ)償因子,運(yùn)算過(guò)程如下:
化簡(jiǎn)后得:
綜上,級(jí)聯(lián)FFT具體過(guò)程為:首先將一維序列排列為二維序列M行N列,首先對(duì)每行進(jìn)行FFT變換,對(duì)每個(gè)元素乘以補(bǔ)償因子e^(-j2πnp/N)^,然后對(duì)每列進(jìn)行FFT變換,最后按列取出即為原一維序列FFT變換后的結(jié)果。
在本次競(jìng)賽中,我們使用了2048點(diǎn)的聲音信號(hào)做互相關(guān),并在頻域相乘之后進(jìn)行頻域補(bǔ)零,補(bǔ)為4096個(gè)點(diǎn),然后使用級(jí)聯(lián)IFFT變換取最大值,即得到互相關(guān)最終結(jié)果。
我們采樣了一組FM解調(diào)信號(hào)進(jìn)行了一系列仿真實(shí)驗(yàn),通過(guò)該信號(hào)和該信號(hào)的延時(shí)信號(hào)模擬FM和麥克風(fēng)的互相關(guān)運(yùn)算。首先是使用普通的FFT進(jìn)行互相關(guān)實(shí)驗(yàn),原始FM信號(hào)和延遲的FM信號(hào)波形圖如圖D-1所示,兩者的普通的FFT變換波形如圖D-2所示,互相關(guān)結(jié)果如圖D-3所示,使用MATLAB求互相關(guān)結(jié)果最大值,最大值點(diǎn)為第201點(diǎn),設(shè)置的延遲為100點(diǎn),因?yàn)樵陬l域中進(jìn)行了補(bǔ)零操作,所以互相關(guān)結(jié)果精度是原始點(diǎn)數(shù)的兩倍,實(shí)驗(yàn)結(jié)果正確。
▲ 普通FFT下FM信號(hào)波形和100點(diǎn)延遲的FM信號(hào)波形 ▲ 普通FFT下的兩信號(hào)FFT變換 ▲ 普通FFT下兩信號(hào)互相關(guān)結(jié)果
同理,我們使用級(jí)聯(lián)FFT,首先把2048點(diǎn)放置為兩行1024點(diǎn),先對(duì)列進(jìn)行兩點(diǎn)FFT變換,再對(duì)所有點(diǎn)數(shù)乘以補(bǔ)償因子,接著對(duì)每行進(jìn)行1024點(diǎn)的FFT變換,最后按列取出即可。然后進(jìn)行互相關(guān)運(yùn)算,接著把2048點(diǎn)的結(jié)果補(bǔ)零為4096。然后把4096點(diǎn)按列排列為4行1024點(diǎn),進(jìn)行級(jí)聯(lián)IFFT運(yùn)算,級(jí)聯(lián)IFFT可以看做級(jí)聯(lián)FFT的逆運(yùn)算。運(yùn)算步驟類似這里不進(jìn)行展開(kāi)了。MATLAB仿真結(jié)果如下,F(xiàn)M信號(hào)和FM延時(shí)信號(hào)如圖D-4所示,兩者級(jí)聯(lián)FFT變換如圖D-5所示,最終互相關(guān)結(jié)果如圖D-6所示,使用MATLAB求最大值點(diǎn),對(duì)應(yīng)為第201點(diǎn)
▲ 級(jí)聯(lián)FFT下FM信號(hào)和100點(diǎn)延時(shí)的FM信號(hào)波形 ▲ 級(jí)聯(lián)FFT下兩信號(hào)級(jí)聯(lián)FFT變換后的波形 ▲ 級(jí)聯(lián)FFT下兩信號(hào)互相關(guān)結(jié)果
從上面結(jié)果可以看出,級(jí)聯(lián)FFT運(yùn)算結(jié)果和普通FFT運(yùn)算結(jié)果完全一致,兩者是等效的,然而把級(jí)聯(lián)FFT運(yùn)用到帶有硬件FFT的MCU中就可以節(jié)省大量的運(yùn)算時(shí)間,把軟件運(yùn)算轉(zhuǎn)化為硬件計(jì)算,大大提高了運(yùn)算速度和運(yùn)算效率.
在實(shí)際使用麥克風(fēng)時(shí),很容易受到輪子噪聲,空氣中的噪聲,以及墻面反射等的影響,這會(huì)使接受到的信號(hào)產(chǎn)生失真,無(wú)論是線性失真還是非線性失真都會(huì)給我們的互相關(guān)結(jié)果帶來(lái)巨大影響。
類似于前面所說(shuō)的基本互相關(guān)方法,廣義互相關(guān)算法估計(jì)得到的時(shí)延同樣對(duì)應(yīng)于兩個(gè)麥克風(fēng)接受到的信號(hào)之間的相關(guān)函取得最大值的位置。
上面式子中, 是兩個(gè)信號(hào)之間的延時(shí), 是 和 的互功率譜。 是 的傅里葉變換, 是 的傅里葉變換。
減弱或消除實(shí)際環(huán)境中噪聲、混響的影響,可以在互功率譜頻域中使用加權(quán)函數(shù)給予一定加權(quán),再經(jīng)過(guò)IFFT變換后得到廣義互相關(guān)結(jié)果,廣義互相關(guān)函數(shù)表達(dá)式為:
為頻域加權(quán)函數(shù),加權(quán)函數(shù)不同,實(shí)際效果也會(huì)有差異,實(shí)際應(yīng)用中,可以針對(duì)噪聲和混響情況選取不同的加權(quán)函數(shù),使相關(guān)函數(shù)峰值尖銳化,從而使得估計(jì)值更加準(zhǔn)確。加權(quán)函數(shù)的選取主要有互功率譜相位(PHAT),ROTH處理器和平滑相干變換(SCOT)。
▲ 各種加權(quán)函數(shù)特性分析表格
上表中, 、 分別表示麥克風(fēng)信號(hào) 、 的自功率譜, 表示 和 的互功率譜, 定義為如下形式[2]:
廣義互相關(guān)原理圖如圖C-7所示。
▲ 廣義互相關(guān)原理圖
由于時(shí)間原因,本次備賽中我們只嘗試了GCC-PHAT和GCC-ML,其中只有GCC-PHAT試用成功了,GCC-ML還需要進(jìn)一步研究。使用MATLAB對(duì)GCC-PHAT的效果進(jìn)行仿真驗(yàn)證,F(xiàn)M信號(hào)和FM延時(shí)100點(diǎn)的信號(hào)如圖C-8所示,兩者級(jí)聯(lián)FFT結(jié)果如圖C-8所示,在頻域相乘時(shí),按照GCC-PHAT的方法要除以互功率譜的模,然后進(jìn)行級(jí)聯(lián)IFFT,結(jié)果如圖C-9所示,最后取最大值點(diǎn),MATLAB比較后最大值點(diǎn)為201。這和前面結(jié)果相同,也是符合理論結(jié)果的。
▲ 級(jí)聯(lián)FFT下FM信號(hào)的100點(diǎn)延時(shí)的FM信號(hào)波形 ▲ 級(jí)聯(lián)FFT下兩信號(hào)級(jí)聯(lián)FFT變換波形 ▲ 級(jí)聯(lián)FFT下兩信號(hào)廣義互相關(guān)后的結(jié)果
對(duì)比圖D-6和圖D-10,從級(jí)聯(lián)IFFT輸出的波形可以看出,相比于普通的互相關(guān),廣義互相關(guān)的結(jié)果最大值以外的波形更加小和平緩,沒(méi)有很大的尖峰,效果更好,說(shuō)明廣義互相關(guān)的確可以減小信號(hào)失真的影響。
對(duì)序列進(jìn)行級(jí)聯(lián)FFT變換得到的結(jié)果和普通FFT變換得到的結(jié)果是完全一致的,仿真結(jié)果也說(shuō)明使用級(jí)聯(lián)FFT代替FFT是沒(méi)有影響的,級(jí)聯(lián)FFT可以用于互相關(guān)運(yùn)算。廣義互相關(guān)可以減小系統(tǒng)噪聲、混響等的影響,通過(guò)MATLAB仿真,比較普通互相關(guān)和廣義互相關(guān)的結(jié)果,從圖像上可以看出廣義互相關(guān)的效果確實(shí)更好。
因此,在競(jìng)賽中,結(jié)合TC264DA芯片的硬件FFT運(yùn)算資源,級(jí)聯(lián)FFT可以大大減少運(yùn)算時(shí)間,加快系統(tǒng)的響應(yīng)速度;使用廣義互相關(guān)可以有效抑制噪聲、混響的干擾,提高互相關(guān)計(jì)算的準(zhǔn)確度。
我們始終相信,信號(hào)處理好,開(kāi)環(huán)也能跑 。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!