exponenta event banner

findsignal

Поиск местоположения сигнала с помощью поиска подобия

Описание

пример

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

пример

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

пример

findsignal(___) без графиков выходных аргументов data и выделяет любые выявленные случаи signal.

  • Если массивы являются действительными векторами, функция отображает data как функция номера образца.

  • Если массивы являются комплексными векторами, функция отображает data на диаграмме Арганда.

  • Если массивы являются вещественными матрицами, функция использует imagesc показать signal на вложенной графике и data с выделенными областями на другом вложенном графике.

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

Примеры

свернуть все

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

fs = 1e3;

t = 0:1/fs:0.5;
data = gauspuls(t,5,0.5);

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

ts = 0:1/fs:0.15;
signal = cos(2*pi*10*ts);

subplot(2,1,1)
plot(t,data)
title('Data')
subplot(2,1,2)
plot(ts,signal)
title('Signal')

Figure contains 2 axes. Axes 1 with title Data contains an object of type line. Axes 2 with title Signal contains an object of type line.

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

figure
findsignal(data,signal)

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 1 contains 2 objects of type line. These objects represent data, signal.

Добавьте в набор данных два четко очерченных раздела. Найдите сегмент, наиболее близкий к сигналу в смысле наличия наименьшего абсолютного расстояния.

dt = data;
dt(t>0.31&t<0.32) = 2.1;
dt(t>0.32&t<0.33) = -2.1;

findsignal(dt,signal,'Metric','absolute')

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 1 contains 2 objects of type line. These objects represent data, signal.

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

findsignal(dt,signal,'TimeAlignment','dtw','Metric','absolute')

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 1 contains 2 objects of type line. These objects represent data, signal.

Добавьте в набор данных еще два внешних раздела.

dt(t>0.1&t<0.11) = 2.1;
dt(t>0.11&t<0.12) = -2.1;

findsignal(dt,signal,'TimeAlignment','dtw','Metric','absolute')

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 1 contains 2 objects of type line. These objects represent data, signal.

Найдите два сегмента данных, ближайших к сигналу.

findsignal(dt,signal,'TimeAlignment','dtw','Metric','absolute', ...
    'MaxNumSegments',2)

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 2 contains 2 objects of type line. These objects represent data, signals.

Вернитесь к поиску одного сегмента. Выбирать 'edr' в качестве критерия растяжения по оси X. Выберите для редактирования допуск расстояния 3. Редактируемое расстояние между несопоставляемыми образцами не зависит от фактического разделения. 'edr' устойчивы к отклонениям.

findsignal(dt,signal,'TimeAlignment','edr','EDRTolerance',3, ...
    'Metric','absolute')

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 1 contains 2 objects of type line. These objects represent data, signal.

Повторите расчет, но теперь нормализуйте данные и сигнал.

  • Определите движущееся окно с 10 выборками с каждой стороны каждой точки данных и сигнала.

  • Вычитание среднего значения данных в окне и деление на локальное стандартное отклонение.

Найдите нормализованный сегмент данных, имеющий наименьшее абсолютное расстояние до нормализованного сигнала. Отображение ненормализованных и нормализованных версий данных и сигнала.

findsignal(dt,signal,'TimeAlignment','edr','EDRTolerance',3, ...
    'Normalization','zscore','NormalizationLength',21, ...
    'Metric','absolute','Annotate','all')

Figure contains 4 axes. Axes 1 with title Signal contains an object of type line. Axes 2 with title Normalized Signal contains an object of type line. Axes 3 with title Data contains 2 objects of type line. These objects represent data, signal. Axes 4 with title Normalized Data contains 2 objects of type line. These objects represent data, signal.

Создать случайный массив данных, где:

  • Среднее значение является постоянным в каждой из семи областей и резко изменяется от области к области.

  • Стандартное отклонение является постоянным в каждой из пяти областей и резко изменяется от области к области.

lr = 20;

mns = [0 1 4 -5 2 0 1];
nm = length(mns);

vrs = [1 4 6 1 3]/2;
nv = length(vrs);

v = randn(1,lr*nm*nv);

f = reshape(repmat(mns,lr*nv,1),1,lr*nm*nv);
y = reshape(repmat(vrs,lr*nm,1),1,lr*nm*nv);

t = v.*y+f;

Постройте график данных, выделяя этапы его построения. Отображение среднего и стандартного отклонения для каждой области.

subplot(2,2,1)
plot(v)
title('Original')
xlim([0 700])

subplot(2,2,2)
plot([f;v+f]')
title('Means')
xlim([0 700])
text(lr*nv*nm*((0:1/nm:1-1/nm)+1/(2*nm)),-7*ones(1,nm),num2str(mns'), ...
    'HorizontalAlignment',"center")

subplot(2,2,3)
plot([y;v.*y]')
title('STD')
xlim([0 700])
text(lr*nv*nm*((0:1/nv:1-1/nv)+1/(2*nv)),-7*ones(1,nv),num2str(vrs'), ...
    'HorizontalAlignment',"center")

subplot(2,2,4)
plot(t)
title('Final')
xlim([0 700])

Figure contains 4 axes. Axes 1 with title Original contains an object of type line. Axes 2 with title Means contains 9 objects of type line, text. Axes 3 with title STD contains 7 objects of type line, text. Axes 4 with title Final contains an object of type line.

Создайте случайный сигнал со средним значением нуля и стандартным отклонением 1/2. Найдите и отобразите сегмент массива данных, который лучше всего соответствует сигналу.

sg = randn(1,2*lr)/2;

findsignal(t,sg)

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 1 contains 2 objects of type line. These objects represent data, signal.

Создайте случайный сигнал со средним значением нуля и стандартным отклонением 2. Найдите и отобразите сегмент массива данных, который лучше всего соответствует сигналу.

sg = randn(1,2*lr)*2;

findsignal(t,sg)

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 1 contains 2 objects of type line. These objects represent data, signal.

Создайте случайный сигнал со средним значением 2 и стандартным отклонением 2. Найдите и отобразите сегмент массива данных, который лучше всего соответствует сигналу.

sg = randn(1,2*lr)*2+2;

findsignal(t,sg)

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 1 contains 2 objects of type line. These objects represent data, signal.

Создайте случайный сигнал со средним значением -4 и стандартным отклонением 3. Найдите и отобразите сегмент массива данных, который лучше всего соответствует сигналу.

sg = randn(1,2*lr)*3-4;

findsignal(t,sg)

Figure contains 2 axes. Axes 1 with title signal contains an object of type line. Axes 2 with title signal matches found: 1 contains 2 objects of type line. These objects represent data, signal.

Повторите вычисление, но на этот раз вычтите среднее значение как из сигнала, так и из данных.

findsignal(t,sg,'Normalization','zscore','Annotate','all')

Figure contains 4 axes. Axes 1 with title Signal contains an object of type line. Axes 2 with title Normalized Signal contains an object of type line. Axes 3 with title Data contains 2 objects of type line. These objects represent data, signal. Axes 4 with title Normalized Data contains 2 objects of type line. These objects represent data, signal.

Разработайте шрифт, напоминающий выходные данные ранних компьютеров. Используйте его для записи слова MATLAB ®.

rng default

chr = @(x)dec2bin(x')-48;

M = chr([34 34 54 42 34 34 34]);
A = chr([08 20 34 34 62 34 34]);
T = chr([62 08 08 08 08 08 08]);
L = chr([32 32 32 32 32 32 62]);
B = chr([60 34 34 60 34 34 60]);

MATLAB = [M A T L A B];

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

c = @(x)x(:,sort([1:6 randi(6,1,2)]));

subplot(4,1,1,'XLim',[0 60])
spy(MATLAB)
xlabel('')
ylabel('Original')

for kj = 2:4
    subplot(4,1,kj,'XLim',[0 60])
    spy([c(M) c(A) c(T) c(L) c(A) c(B)])
    xlabel('')
    ylabel('Corrupted')
end

Figure contains 4 axes. Axes 1 contains an object of type line. Axes 2 contains an object of type line. Axes 3 contains an object of type line. Axes 4 contains an object of type line.

Создайте еще одну поврежденную версию слова. Поиск шумной версии буквы «А». Отображение расстояния между массивом поиска и ближайшим к нему сегментом данных. Сегмент разливается в «Т», поскольку горизонтальные оси являются жесткими.

corr = [c(M) c(A) c(T) c(L) c(A) c(B)];

sgn = c(A);

[ist,ind,dst] = findsignal(corr,sgn);

clf
subplot(2,1,1)
spy(sgn)
subplot(2,1,2)
spy(corr)
chk = zeros(size(corr));
chk(:,ist:ind) = corr(:,ist:ind);
hold on
spy(chk,'*k')
hold off

Figure contains 2 axes. Axes 1 contains an object of type line. Axes 2 contains 2 objects of type line.

dst
dst = 11

Разрешить растягивание горизонтальных осей. Ближайшим сегментом является пересечение массива поиска и первого экземпляра «A». Расстояние между сегментом и массивом равно нулю.

[ist,ind,dst] = findsignal(corr,sgn,'TimeAlignment','dtw');

subplot(2,1,1)
spy(sgn)
subplot(2,1,2)
spy(corr)
chk = zeros(size(corr));
chk(:,ist:ind) = corr(:,ist:ind);
hold on
spy(chk,'*k')
hold off

Figure contains 2 axes. Axes 1 contains an object of type line. Axes 2 contains 2 objects of type line.

dst
dst = 0

Повторите вычисления, используя встроенные функциональные возможности findsignal. Делите на локальное среднее для нормализации данных и сигнала. Используйте симметричную метрику Куллбэка-Лейблера.

findsignal(corr,sgn,'TimeAlignment','dtw', ...
    'Normalization','power','Metric','symmkl','Annotate','all')

Figure contains 4 axes. Axes 1 with title Signal contains an object of type image. Axes 2 with title Normalized Signal contains an object of type image. Axes 3 with title Data contains 3 objects of type image, patch. Axes 4 with title Normalized Data contains 3 objects of type image, patch.

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

свернуть все

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

Типы данных: single | double
Поддержка комплексного номера: Да

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

Типы данных: single | double
Поддержка комплексного номера: Да

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'MaxNumSegments',2,'Metric','squared','Normalization','center','NormalizationLength',11 находит два сегмента массива данных, которые имеют наименьшие квадратные евклидовы расстояния до сигнала поиска. И данные, и сигнал нормализуются путем вычитания среднего значения скользящего окна. Окно имеет пять выборок с каждой стороны каждой точки, для общей длины 5 + 5 + 1 = 11 выборок.

Статистика нормализации, указанная как пара, разделенная запятыми, состоящая из 'Normalization' и одно из этих значений:

  • 'none' - Не нормализуйтесь.

  • 'center' - Вычесть локальное среднее.

  • 'power' - Делить на местное среднее.

  • 'zscore' - Вычитание локального среднего и деление на локальное стандартное отклонение.

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

Типы данных: single | double

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

Типы данных: single | double

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

Типы данных: single | double

Метод временной синхронизации, указанный как пара, разделенная запятыми, состоящая из 'TimeAlignment' и одно из этих значений:

  • 'fixed' - Не растягивайте и не повторяйте образцы, чтобы минимизировать расстояние.

  • 'dtw' - Попытка уменьшить расстояние путем растяжения временной оси и повторения выборок либо в данных, либо в сигнале. Посмотрите dtw для получения дополнительной информации.

  • 'edr' - минимизировать количество изменений, чтобы расстояние между каждой оставшейся выборкой сегмента данных и его аналогом сигнала находилось в пределах заданного допуска. Правка состоит из удаления образца из данных, сигнала или того и другого. Задайте допуск с помощью 'EDRTolerance' аргумент. Используйте эту опцию, если любой из входных массивов имеет отклонения. Посмотрите edr для получения дополнительной информации.

Редактировать допуск расстояния, заданный как разделенная запятыми пара, состоящая из 'EDRTolerance' и реальный скаляр. Используйте этот аргумент для поиска сигнала при 'TimeAlignment' аргумент пары имя-значение имеет значение 'edr'.

Типы данных: single | double

Метрика расстояния, заданная как разделенная запятыми пара, состоящая из 'Metric' и один из 'squared', 'absolute', 'euclidean', или 'symmkl'. Если X и Y оба являются K-мерными сигналами, то Metric предписывает dmn (X, Y), расстояние между m-м образцом X и n-м образцом Y. Для получения дополнительной информации о dmn (X, Y) см. Динамическое искажение времени.

  • 'squared' - квадрат евклидовой метрики, состоящий из суммы квадратичных разностей:

    dmn (X, Y) =∑k=1K (xk, m yk, n) * (xk, m − yk, n)

  • 'euclidean' - корневая сумма квадратных разностей, также известная как евклидова или ℓ2 метрика:

    dmn (X, Y) =∑k=1K (xk, m yk, n) * (xk, m − yk, n)

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

    dmn (X, Y) =∑k=1K'xk,m−yk,n|=∑k=1K (xk, m yk, n) * (xk, m − yk, n)

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

    dmn (X, Y) =∑k=1K (xk, m yk, n) (logxk, m − logyk, n)

Стиль печати, заданный как разделенная запятыми пара, состоящая из 'Annotate' и одно из этих значений:

  • 'data' строит график данных и выделяет области, которые лучше всего соответствуют сигналу.

  • 'signal' строит график сигнала на отдельном вложенном графике.

  • 'all' строит график сигнала, данных, нормализованного сигнала и нормализованных данных на отдельных вложенных графиках.

Этот аргумент игнорируется при вызове findsignal с выходными аргументами.

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

свернуть все

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

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

Расширенные возможности

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.
Представлен в R2016b