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

findsignal

Находит местоположение сигнала с помощью поиска по сходству.

Библиотека

EngeeDSP

Синтаксис

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

  • istart, istop, dist = findsignal(data, signal) — возвращает начальный и конечный индексы сегмента массива данных data, который наилучшим образом соответствует массиву поиска signal. Наилучшим соответствием считается сегмент, для которого квадрат евклидова расстояния между сегментом и массивом поиска dist является наименьшим. Если data и signal — матрицы, то findsignal находит начальный и конечный столбцы массива data, которая наилучшим образом соответствует signal. В этом случае data и signal должны иметь одинаковое количество строк.

  • istart, istop, dist = findsignal(data, signal, Name,Value) — использует дополнительные параметры, заданные одним или несколькими аргументами Name,Value. Параметры включают в себя применяемую нормализацию, количество сегментов для отчета и используемую метрику расстояния.

Аргументы

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

# data — массив данных
вектор | матрица

Details

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

Типы данных

Float32, Float64

Поддержка комплексных чисел

Да

# signal — массив поиска
вектор | матрица

Details

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

Типы данных

Float32, Float64

Поддержка комплексных чисел

Да

Входные аргументы «имя-значение»

Укажите необязательные пары аргументов в формате Name, Value, где Name — имя аргумента, а Value — соответствующее значение. Аргументы типа «имя-значение» должны располагаться после других аргументов, но порядок пар не имеет значения.

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

Пример: findsignal([10,12,3,4], [10.3,12.3], "MaxDistance", 0.2).

# Normalization — статистика нормализации
"none" (по умолчанию)

Details

Статистика нормализации. В текущей реализации доступен только режим "none" — не нормализовать.

# NormalizationLength — длина нормализации
скаляр

Details

Длина нормализации, заданная как целочисленный скаляр. Это значение представляет собой минимальное количество отсчетов, по которым нормализуется каждый отсчет как в данных, так и в сигнале. Если сигнал представляет собой матрицу, то NormalizationLength представляет собой количество столбцов.

Типы данных

Float32, Float64

# MaxDistance — максимальное расстояние
Inf (по умолчанию) | скаляр

Details

Максимальное расстояние сегмента, заданное как положительный вещественный скаляр. Если указано MaxDistance, то findsignal возвращает начальный и конечный индексы всех сегментов data, расстояния которых от signal являются локальными минимумами и меньше MaxDistance.

Типы данных

Float32, Float64

# MaxNumSegments — максимальное количество возвращаемых сегментов
1 (по умолчанию) | скаляр

Details

Максимальное количество возвращаемых сегментов, заданное как положительный целочисленный скаляр. Если указано MaxNumSegments, то findsignal находит все сегменты data, расстояния которых от signal являются локальными минимумами, и возвращает до MaxNumSegments сегментов с наименьшими расстояниями.

Типы данных

Float32, Float64

# TimeAlignment — метод выравнивания по времени
"fixed" (по умолчанию) | "dtw"

Details

Метод выравнивания по времени:

  • "fixed" — не растягивать и не повторять отсчеты для минимизации расстояния;

  • "dtw" — попытка сократить расстояние путем растяжения временной оси и повторения отсчетов либо в данных, либо в сигнале.

# Metric — метрика расстояния
"squared" (по умолчанию) | "absolute" | "euclidean" | "symmkl"

Details

Метрика расстояния, заданная как одно из значений: "squared", "absolute", "euclidean" или "symmkl". Если и являются -мерными сигналами, то метрика задает — расстояние между -м отсчетом и -м отсчетом .

  • "squared" — квадрат евклидовой метрики, состоящий из суммы квадратов разностей:

  • "euclidean" — корень из суммы квадратов разностей, также известный как евклидова метрика или :

  • "absolute" — сумма абсолютных разностей, также известная как расстояние городских кварталов, метрика Манхэттена, метрика такси или :

  • "symmkl" — симметричная метрика Кульбака—Лейблера. Эта метрика верна только для вещественных и положительных и :

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

# istart, istop — начальный и конечный индексы сегмента
скаляр | вектор

Details

Начальный и конечный индексы сегмента, возвращаемые в виде целочисленного скаляра или вектора.

# dist — минимальное расстояние между данными и сигналом
скаляр | вектор

Details

Минимальное расстояние между данными и сигналом, возвращаемое в виде скаляра или вектора.

Примеры

Нахождение сигнала в данных

Details

Сгенерируем набор данных, состоящий из гауссова импульса частотой 5 Гц с полосой пропускания 50%, дискретизированного в течение половины секунды с частотой 1 кГц. Создадим сигнал, состоящий из полутора периодов синусоиды частотой 10 Гц. Построим графики набора данных и сигнала.

import EngeeDSP.Functions: findsignal
import EngeeDSP.Functions: gauspuls

fs = 1e3

t = 0:1/fs:0.5
ts = 0:1/fs:0.15

data_result = gauspuls(t, 5, 0.5)
data = data_result.yc

signal = cos.(2π * 10 * ts)

p1 = plot(t, data, title="Data", legend=false)
p2 = plot(ts, signal, title="Signal", legend=false)

plot(p1, p2, layout=(2,1))

findsignal 1

Найдем сегмент данных с наименьшим квадратом евклидова расстояния до сигнала. Построим график данных и выделим этот сегмент.

result = findsignal(data, signal)

plot(t, data, label="Data", linewidth=2)
plot!(t[result[1]:result[1]+length(signal)-1], data[result[1]:result[1]+length(signal)-1],
      label="Signal", linewidth=3)
title!("Signal Matches Found")

findsignal 2

Добавим в набор данных два явно выпадающих участка. Найдем сегмент, который находится ближе всего к сигналу (с точки зрения наименьшего абсолютного расстояния). Построим график данных и выделим этот сегмент.

dt = data
dt[(t .> 0.31) .& (t .< 0.32)] .= 2.1
dt[(t .> 0.32) .& (t .< 0.33)] .= -2.1

result = findsignal(dt,signal,"Metric","absolute")

plot(t, data, label="Data", linewidth=2)
plot!(t[result[1]:result[1]+length(signal)-1], data[result[1]:result[1]+length(signal)-1],
      label="Signal", linewidth=3)
title!("Signal Matches Found")

findsignal 3

Пусть ось x растягивается, если растяжение приводит к меньшему абсолютному расстоянию между ближайшим сегментом данных и сигналом.

result = findsignal(dt,signal,"TimeAlignment", "dtw", "Metric","absolute")

plot(t, data, label="Data", linewidth=2)
plot!(t[result[1]:result[1]+length(signal)-1], data[result[1]:result[1]+length(signal)-1],
      label="Signal", linewidth=3)
title!("Signal Matches Found")

findsignal 4