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'), ...
    '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])

Создайте случайный сигнал со средним значением нуля и стандартным отклонением 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)(logxk,mlogyk,n)

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

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

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

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

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

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

свернуть все

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

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

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

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

Введенный в R2017b
Для просмотра документации необходимо авторизоваться на сайте