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 на схеме Argand.

  • Если массивы являются вещественными матрицами, функция использует 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,myk,n)*(xk,myk,n)

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

    dmn(X,Y)=k=1K(xk,myk,n)*(xk,myk,n)

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

    dmn(X,Y)=k=1K|xk,myk,n|=k=1K(xk,myk,n)*(xk,myk,n)

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

    dmn(X,Y)=k=1K(xk,myk,n)(logxk,mlogyk,n)

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

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

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

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

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

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

свернуть все

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

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

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

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.
Введенный в R2016b