之前在《學(xué)習(xí)LabVIEW(六)——匹配濾波的簡(jiǎn)單仿真》中,我們直接利用“信號(hào)處理->信號(hào)運(yùn)算->互相關(guān)”節(jié)點(diǎn)實(shí)現(xiàn)了匹配濾波??驁D非常簡(jiǎn)單,把信號(hào)序列和同步序列同時(shí)輸入到互相關(guān)節(jié)點(diǎn),輸出就是想要的結(jié)果了?;ハ嚓P(guān)節(jié)點(diǎn)如何運(yùn)算互相關(guān)呢?它包含了兩種算法,一種是時(shí)域的卷積,另一種是頻域的相乘,利用FFT提高計(jì)算效率。今天我們自己利用數(shù)據(jù)隊(duì)列和向量點(diǎn)積(內(nèi)積)實(shí)現(xiàn)互相關(guān)的運(yùn)算。數(shù)據(jù)隊(duì)列節(jié)點(diǎn)發(fā)揮了一組移位寄存器的作用(見(jiàn)《幽默的LabVIEW編程之濫用多個(gè)移位寄存器》),點(diǎn)積節(jié)點(diǎn)則實(shí)現(xiàn)了加權(quán)求和。這就是內(nèi)積或者相關(guān)的運(yùn)算本質(zhì)。
首先,信號(hào)的構(gòu)造還是使用了MATLAB節(jié)點(diǎn),這樣比較方便而且便于調(diào)整,如下圖所示:
MATLAB節(jié)點(diǎn)輸出的信號(hào)是一個(gè)數(shù)組,我們利用for-loop和索引模式的隧道,將數(shù)組拆成一個(gè)一個(gè)的元素,在循環(huán)中依次處理,相當(dāng)于把一個(gè)Buffer中的數(shù)據(jù)轉(zhuǎn)換成了一個(gè)標(biāo)量構(gòu)成的數(shù)據(jù)流。注意syncHead進(jìn)入循環(huán)的隧道沒(méi)有使用索引模式,因?yàn)樵谘h(huán)內(nèi)部要把syncHead當(dāng)做一個(gè)整體來(lái)處理。在循環(huán)內(nèi)部,將外部來(lái)的數(shù)據(jù)流中的標(biāo)量數(shù)據(jù)輸入到數(shù)據(jù)隊(duì)列節(jié)點(diǎn),然后將數(shù)據(jù)隊(duì)列節(jié)點(diǎn)的輸出與同步頭使用點(diǎn)積節(jié)點(diǎn)作內(nèi)積運(yùn)算。運(yùn)算得到的標(biāo)量通過(guò)一個(gè)索引模式的隧道連接到循環(huán)之外的scope,這樣就能在界面上看到濾波的結(jié)果。完整的程序框圖如下所示:
程序的一次運(yùn)行結(jié)果如下圖所示:
至于這種在時(shí)域?qū)崿F(xiàn)的相關(guān)運(yùn)算,是不是不如基于FFT的頻域運(yùn)算高效呢?實(shí)際上,序列點(diǎn)數(shù)很少時(shí),時(shí)域的實(shí)現(xiàn)更高效一些。