之前在《学习LabVIEW(六)——匹配滤波的简单仿真》中,我们直接利用“信号处理->信号运算->互相关”节点实现了匹配滤波。框图非常简单,把信号序列和同步序列同时输入到互相关节点,输出就是想要的结果了。互相关节点如何运算互相关呢?它包含了两种算法,一种是时域的卷积,另一种是频域的相乘,利用FFT提高计算效率。今天我们自己利用数据队列和向量点积(内积)实现互相关的运算。数据队列节点发挥了一组移位寄存器的作用(见《幽默的LabVIEW编程之滥用多个移位寄存器》),点积节点则实现了加权求和。这就是内积或者相关的运算本质。
首先,信号的构造还是使用了MATLAB节点,这样比较方便而且便于调整,如下图所示:
MATLAB节点输出的信号是一个数组,我们利用for-loop和索引模式的隧道,将数组拆成一个一个的元素,在循环中依次处理,相当于把一个Buffer中的数据转换成了一个标量构成的数据流。注意syncHead进入循环的隧道没有使用索引模式,因为在循环内部要把syncHead当做一个整体来处理。在循环内部,将外部来的数据流中的标量数据输入到数据队列节点,然后将数据队列节点的输出与同步头使用点积节点作内积运算。运算得到的标量通过一个索引模式的隧道连接到循环之外的scope,这样就能在界面上看到滤波的结果。完整的程序框图如下所示:
程序的一次运行结果如下图所示:
至于这种在时域实现的相关运算,是不是不如基于FFT的频域运算高效呢?实际上,序列点数很少时,时域的实现更高效一些。