Engee 文档
Notebook

对齐时移信号

在测量过程中,来自不同传感器的数据往往是不同步的。在使用多个传感器时,数据必须同步才能生成全面的图像。

为此,我们需要一个用于数字信号处理的 DSP 库和一个用于加载 JLD2 文件的 FileIO 库。

In [ ]:
Pkg.add( ["DSP", "JLD2"] )

让我们读取输入数据并绘制图表:

In [ ]:
using JLD2
@load "relategsignals.jld2"

plot(
    plot( s1, label=L"s_1" ),
    plot( s2, label=L"s_2" ),
    plot( s3, label=L"s_3" ),
    layout=(3,1), link = :x
)
Out[0]:

我们可以看到,信号s2s1 之前,而s1 又在s3 之前。相同长度的信号之间的精确延迟可以通过函数DSP.Util.filddelay 求得,要将其应用于不同长度的信号,我们需要将所有信号的长度减小到最小信号的长度。

因此,我们会发现s2 比信号s1 早 350 个采样点,s3s1 晚 150 个采样点,而信号s2s3 早 500 个采样点。

In [ ]:
using DSP

min_size = min( size(s1,1), size(s2,1), size(s3,1) )
t12 = DSP.Util.finddelay(s1[1:min_size], s2[1:min_size])
t31 = DSP.Util.finddelay(s3[1:min_size], s1[1:min_size])
t32 = DSP.Util.finddelay(s3[1:min_size], s2[1:min_size])

t12, t31, t32
Out[0]:
(350, 150, 500)

让我们手动将这些信号与s2 (最早出现)对齐:

In [ ]:
plot( s1[t12+1:end], label=L"s_1", size=(600,300) )
plot!( s2, label=L"s_2" )
plot!( s3[t32+1:end], label=L"s_3" )
Out[0]:

由于在偏移量 0 处我们需要输出从索引 1 开始的信号,因此偏移量中要加上单位。使用函数DSP.Util.shiftsignal 会更方便。

为了避免中间操作,我们可以使用函数alignsignals 。它可以延迟较早的信号,因此所有信号都将移至信号开始的时刻s3

In [ ]:
x1 = s1[1:min_size]
x2,t21 = DSP.Util.alignsignals( s2[1:min_size], s1[1:min_size] )
x3,t31 = DSP.Util.alignsignals( s3[1:min_size], s1[1:min_size] );

plot(
    plot( x1 ),
    plot( x2 ),
    plot( x3 ),
    layout=(3,1), leg=false
)
Out[0]:

结论

现在,所研究的信号在起始时间上已经同步,我们可以进行进一步的处理。