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
findsignal(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')

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

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

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

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')

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

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

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

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

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

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

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

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

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

Сгенерируйте случайный массив данных где:

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

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

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'))

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'))

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

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

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

findsignal(t,sg)

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

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

findsignal(t,sg)

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

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

findsignal(t,sg)

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

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

findsignal(t,sg)

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

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

Создайте гарнитуру, которая напоминает выход ранних компьютеров. Используйте его, чтобы записать слову 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

Сгенерируйте еще одну поврежденную версию слова. Ищите шумную версию буквы "A". Отобразите расстояние между поисковым массивом и сегментом данных, самым близким к нему. Сегмент проникает в "T", потому что горизонтальные оси тверды.

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

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

dst
dst = 0

Повторите расчет с помощью встроенной функциональности findsignal. Разделитесь на локальное среднее значение, чтобы нормировать данные и сигнал. Используйте симметричную метрику Kullback-Leibler.

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

Входные параметры

свернуть все

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

Типы данных: 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 th выборка X и n th выборка 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' — Симметричная метрика Kullback-Leibler. Эта метрика допустима только для действительных и положительных X и Y:

    dmn(X,Y)=k=1K(xk,myk,n)(журналxk,mжурналyk,n)

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

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

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

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

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

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

свернуть все

Сегмент запускает и заканчивает индексы, возвращенные как целочисленные скаляры или векторы.

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

Введенный в R2017b