对齐时移信号¶
在测量过程中,来自不同传感器的数据往往是不同步的。在使用多个传感器时,数据必须同步才能生成全面的图像。
为此,我们需要一个用于数字信号处理的 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]:
我们可以看到,信号s2
在s1
之前,而s1
又在s3
之前。相同长度的信号之间的精确延迟可以通过函数DSP.Util.filddelay
求得,要将其应用于不同长度的信号,我们需要将所有信号的长度减小到最小信号的长度。
因此,我们会发现s2
比信号s1
早 350 个采样点,s3
比s1
晚 150 个采样点,而信号s2
比s3
早 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]:
让我们手动将这些信号与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]:
结论¶
现在,所研究的信号在起始时间上已经同步,我们可以进行进一步的处理。