Документация Engee
Notebook

Выравнивание сигналов, смещенных во времени

Часто в ходе измерений данные приходят асинхронно с разных сенсоров. Чтобы составить совокупную картину при использовании нескольких датчиков, данные нужно синхронизировать.

Для этого примена нам будет нужна библиотека DSP для цифровой обработки сигналов и библиотека FileIO для загрузки файлов JLD2.

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]:
(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]:

Заключение

Теперь изучаемые сигналы синхронизированы по времени наступления и мы можем приступить к дальнейшей обработке.