Выравнивание сигналов, смещенных во времени¶
Часто в ходе измерений данные приходят асинхронно с разных сенсоров. Чтобы составить совокупную картину при использовании нескольких датчиков, данные нужно синхронизировать.
Для этого примена нам будет нужна библиотека DSP для цифровой обработки сигналов и библиотека FileIO для загрузки файлов JLD2.
Pkg.add( ["DSP", "JLD2"] )
Прочитаем входные данные и построим графики:
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
)
Как мы видим, сигнал s2
приходит до s1
, а s1
, в свою очередь, опережает s3
. Точную задержку между сигналами одинаковой длины можно найти при помощи функции DSP.Util.filddelay
, а чтобы ее применить на сигналы разной длины, мы сократим длину всех сигналов до длины наименьшего из них.
В итоге мы заметим, что s2
опережает сигнал s1
на 350 отсчетов, что s3
опаздывает относительно s1
на 150 отсчетов, а также что сигнал s2
опережает s3
на 500 отсчетов.
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
Выровняем сигналы вручную относительно s2
(который приходит раньше всех):
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" )
К смещению добавлены единицы, поскольку при смещении 0 нужно вывести сигнал, начиная с индекса 1. Проще было бы воспользоваться функцией DSP.Util.shiftsignal
.
Избежать промежуточных операций нам позволит функция alignsignals
. Она задерживает более ранние сигналы, так что все сигналы будут смещены к моменту наступления сигнала s3
.
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
)
Заключение¶
Теперь изучаемые сигналы синхронизированы по времени наступления и мы можем приступить к дальнейшей обработке.