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

finddelay

Оценка задержки между сигналами.

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • d = finddelay(x, y) — возвращает предполагаемое значение задержки d между входными сигналами x и y. Задержки в x и y можно задать добавлением нулей.

  • d = finddelay(x, y, maxlag) — использует аргумент maxlag для определения предполагаемых значений задержки между входными сигналами x и y.

Аргументы

Входные аргументы

# x — опорный входной сигнал
вектор | матрица

Details

Опорный входной сигнал, заданный как вектор или матрица.

# y — входной сигнал
вектор | матрица

Details

Входной сигнал, заданный как вектор или матрица.

# maxlag — максимальный размер окна корреляции
скаляр | вектор

Details

Максимальный размер окна корреляции, заданный как целочисленный скаляр или вектор. Если какой-либо элемент maxlag отрицательный, то он заменяется своим абсолютным значением. Если какой-либо элемент maxlag не является целым числом, является комплексным, равен Inf или NaN, то finddelay возвращает ошибку.

Выходные аргументы

# d — задержка
скаляр | вектор

Details

Задержка между входными сигналами, возвращаемая в виде целочисленного скаляра или вектора. Если y задерживается относительно x, то d положительно. Если y опережает x, то d отрицательно. Если возможно несколько задержек, как в случае периодических сигналов, то возвращается задержка с наименьшим абсолютным значением. В случае если возможны как положительная, так и отрицательная задержки с одинаковыми абсолютными значениями, возвращается положительная задержка.

Если x — матрица размером на ( и ), а y — матрица размером на ( и ), то finddelay возвращает вектор-строку d предполагаемых значений задержек между каждым столбцом x и соответствующим столбцом y. При таком использовании x и y должны иметь одинаковое количество столбцов ( ).

Примеры

Входные сигналы X и Y — вектора, максимальный размер окна корреляции maxlag не задан

Details

Пример, когда Y задерживается относительно X на два отсчета:

import EngeeDSP.Functions: finddelay

X = [1 2 3]
Y = [0 0 1 2 3]
D = finddelay(X,Y)

print("D = ", D)
D = 2

Пример, когда Y опережает X на три отсчета:

import EngeeDSP.Functions: finddelay

X = [0 0 0 1 2 3 0 0]'
Y = [1 2 3 0]'
D = finddelay(X,Y)

print("D = ", D)
D = -3

Пример, когда Y совпадает с X, но является зашумленным:

import EngeeDSP.Functions: finddelay

X = [0 0 1 2 3 0]
Y = [0.02 0.12 1.08 2.21 2.95 -0.09]
D = finddelay(X,Y)

print("D = ", D)
D = 0

Пример, когда Y является периодической версией X и возвращается наименьшая возможная задержка:

import EngeeDSP.Functions: finddelay

X = [0 1 2 3]
Y = [1 2 3 0 0 0 0 1 2 3 0 0]
D = finddelay(X,Y)

print("D = ", D)
D = -1

Входной сигнал X — вектор, Y — матрица, максимальный размер окна корреляции maxlag — скаляр

Details

Пример, когда сигнал X — вектор, Y — матрица, максимальный размер окна корреляции maxlag — скаляр:

import EngeeDSP.Functions: finddelay

X = [0 1 2]
Y = [0 1 0 0;
     1 2 0 0;
     2 0 1 0;
     0 0 2 1]
maxlag = 3
D = finddelay(X,Y,maxlag)

print("D = ", D)
D = [0 -1 1 1]

Входные сигналы X и Y — матрицы, максимальный размер окна корреляции maxlag не задан

Details

Пример, когда сигнал X и Y — матрицы одинаковой размерности:

import EngeeDSP.Functions: finddelay

X = [0 1 0 0;
     1 2 0 0;
     2 0 1 0;
     1 0 2 1;
     0 0 0 2]
Y = [0 0 1 0;
     1 1 2 0;
     2 2 0 1;
     1 0 0 2;
     0 0 0 0]
D = finddelay(X,Y)

print("D = ", D)
D = [0 1 -2 -1]

Теперь добавим к Y еще одну строку:

import EngeeDSP.Functions: finddelay

X = [0 1 0 0;
     1 2 0 0;
     2 0 1 0;
     1 0 2 1;
     0 0 0 2]
Y = [0 0 1 0;
     0 0 0 0;
     1 1 2 0;
     2 2 0 1;
     1 0 0 2;
     0 0 0 0]
D = finddelay(X,Y)

print("D = ", D)
D = [1 2 -1 0]

Входные сигналы X и Y — матрицы, максимальный размер окна корреляции maxlag — вектор

Details

Создадим два многоканальных сигнала X и Y таким образом, чтобы каждый канал Y имел задержанную идентичную копию каждого канала X. Установим максимальный размер окна корреляции 8 для каждого канала и рассчитаем задержки по столбцам:

import EngeeDSP.Functions: finddelay

X = [1 3 2 0 0 0 0 0;
     0 0 0 0 0 1 3 2]'

Y = [0 0 0 1 3 2;
     1 3 2 0 0 0]'
maxlag = [8 8]
D = finddelay(X,Y,maxlag)

print("D = ", D)
D = [3 -5]

Уменьшим размер окна корреляции до 3 для первого канала и до 5 для второго:

import EngeeDSP.Functions: finddelay

X = [1 3 2 0 0 0 0 0;
     0 0 0 0 0 1 3 2]'

Y = [0 0 0 1 3 2;
     1 3 2 0 0 0]'
maxlag = [3 5]
D = finddelay(X,Y,maxlag)

print("D = ", D)
D = [3 -5]

Увеличим размер окна корреляции до 5 для первого канала и уменьшим до 3 для второго:

import EngeeDSP.Functions: finddelay

X = [1 3 2 0 0 0 0 0;
     0 0 0 0 0 1 3 2]'

Y = [0 0 0 1 3 2;
     1 3 2 0 0 0]'
maxlag = [5 3]
D = finddelay(X,Y,maxlag)

print("D = ", D)
D = [3 -3]

Советы

  • Аргументы x и y не обязательно должны быть точными запаздывающими копиями друг друга, поскольку finddelay(x, y) возвращает оценку задержки посредством кросс-корреляции. Однако эта оценка задержки имеет смысл только при наличии достаточной корреляции между запаздывающими версиями x и y.

  • Расчет вектора предполагаемых значений задержки d зависит от x, y и maxlag, как показано в таблице.

    maxlag x y d

    Целочисленный скаляр

    Вектор-строка, вектор-столбец или матрица

    Вектор-строка, вектор-столбец или матрица

    Кросс-корреляция столбцов x и y в диапазоне периода задержки от maxlag до maxlag.

    Вектор-строка или вектор-столбец с целочисленными значениями

    Вектор-строка, вектор-столбец длины

    Матрица размерностью на ( )

    Кросс-корреляция x и столбца матрицы y в диапазоне периода задержки от maxlag до maxlag для .

    Вектор-строка или вектор-столбец с целочисленными значениями

    Матрица размерностью на ( )

    Вектор-строка, вектор-столбец длины

    Кросс-корреляция столбца матрицы x и y в диапазоне периода задержки от maxlag до maxlag для .

    Вектор-строка или вектор-столбец с целочисленными значениями

    Матрица размерностью на ( )

    Матрица размерностью на ( )

    Кросс-корреляция столбца матрицы x и столбца матрицы y в диапазоне периода задержки от maxlag до maxlag для .

  • Если вы хотите рассматривать вектор-строку x длины как содержащий один отсчет из различных каналов, то необходимо добавить к x одну или несколько строк нулей, чтобы он принял вид матрицы. Тогда каждый столбец x будет считаться каналом.

    Например, x = [1 1 1 1] считается одним каналом, содержащим четыре отсчета. Чтобы рассматривать его как четыре различных канала, каждый из которых содержит один отсчет, определите новую матрицу xm, такую, что каждый столбец xm соответствует одному каналу, каждый из которых содержит отсчеты 1 и 0.

xm = [1 1 1 1;
      0 0 0 0]

Алгоритмы

Функция finddelay использует функцию xcorr для определения взаимной корреляции между каждой парой сигналов при всех возможных задержках, указанных пользователем. Затем рассчитывается нормализованная взаимная корреляция между каждой парой сигналов. Оценочная задержка определяется как отрицательное значение запаздывания, для которого нормализованная взаимная корреляция имеет наибольшее абсолютное значение.

Если возможно несколько задержек, как в случае периодических сигналов, то возвращается задержка с наименьшим абсолютным значением. В случае если возможны как положительная, так и отрицательная задержки с одинаковыми абсолютными значениями, возвращается положительная задержка.

Пары сигналов не обязательно должны быть точными запаздывающими копиями друг друга. Однако оцененная задержка имеет смысл только при наличии достаточной корреляции хотя бы между одной парой задержанных сигналов.