findsignal

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

Синтаксис

[istart,istop,dist] = findsignal(data,signal)
[istart,istop,dist] = findsignal(data,signal,Name,Value)
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 на схеме Аргана.

  • Если массивы являются действительными матрицами, то функция отображает 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 должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

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

  • 'none' Не нормировать.

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

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