Найти местоположение сигнала используя поиск подобия
[
возвращает начальный и стоповый индексы сегмента массива данных, 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 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
Сгенерируйте еще одну поврежденную версию слова. Поиск зашумленной версии буквы «А». Отобразите расстояние между поисковым массивом и ближайшим к нему сегментом данных. Сегмент разливается в «Т», поскольку горизонтальные оси жесткие.
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
. Разделите локальным средним для нормализации данных и сигнала. Используйте симметричную метрику Куллбека-Лейблера.
findsignal(corr,sgn,'TimeAlignment','dtw', ... 'Normalization','power','Metric','symmkl','Annotate','all')
data
- Массив данныхМассив данных, заданный как вектор или матрица.
Типы данных: single
| double
Поддержка комплексного числа: Да
signal
- Поисковый массивПоисковый массив, заданный в виде вектора или матрицы.
Типы данных: 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'
Статистика нормализации, заданная как разделенная разделенными запятой парами, состоящая из 'Normalization'
и одно из следующих значений:
'none'
- Не нормализоваться.
'center'
- Вычесть локальное среднее.
'power'
- Разделить по локальному среднему значению.
'zscore'
- Вычесть локальное среднее и разделить на локальные стандартные отклонения.
'NormalizationLength'
- Длина нормализацииlength(data)
(по умолчанию) | целочисленный скалярДлина нормализации, заданная как разделенная разделенными запятой парами, состоящая из 'NormalizationLength'
и целочисленный скаляр. Это значение представляет минимальное количество выборок, над которыми можно нормализовать каждую выборку как в данных, так и в сигнале. Если сигнал является матрицей, то 'NormalizationLength'
представляет ряд столбцов.
Типы данных: single
| double
'MaxDistance'
- Максимальное расстояние между сегментамиInf
(по умолчанию) | положительный действительный скалярМаксимальное расстояние между сегментами, заданное как разделенная разделенными запятой парами, состоящая из 'MaxDistance'
и положительный действительный скаляр. Если вы задаете 'MaxDistance'
, затем findsignal
возвращает начальный и стоповый индексы всех сегментов data
чьи расстояния от signal
являются как локальными минимумами, так и меньше 'MaxDistance'
.
Типы данных: single
| double
'MaxNumSegments'
- Максимальное количество возвращаемых сегментов1
(по умолчанию) | положительный целочисленный скалярМаксимальное количество возвращаемых сегментов, заданное как разделенная разделенными запятой парами, состоящая из 'MaxNumSegments'
и положительный целочисленный скаляр. Если вы задаете 'MaxNumSegments'
, затем findsignal
определяет местоположение всех сегментов data
чьи расстояния от сигнала являются локальными минимумами и возвращаются к 'MaxNumSegments'
сегменты с наименьшими расстояниями.
Типы данных: single
| double
'TimeAlignment'
- Метод выравнивания по времени'fixed'
(по умолчанию) | 'dtw'
| 'edr'
Метод выравнивания по времени, заданный как разделенная разделенными запятой парами, состоящая из 'TimeAlignment'
и одно из следующих значений:
'fixed'
- Не растягивайте и не повторяйте выборки, чтобы минимизировать расстояние.
'dtw'
- Попытка уменьшить расстояние путем растяжения оси времени и повторения выборок в данных или сигнале. Посмотрите dtw
для получения дополнительной информации.
'edr'
- Минимизируйте количество правок так, чтобы расстояние между каждой оставшейся выборкой сегмента данных и ее аналогом сигнала лежало в пределах заданного допуска. Редактирование состоит из удаления выборки из данных, сигнала или обоих. Задайте допуск, используя 'EDRTolerance'
аргумент. Используйте эту опцию, когда любой из входных массивов имеет выбросы. Посмотрите edr
для получения дополнительной информации.
'EDRTolerance'
- Изменение допуска расстоянияИзмените допуск расстояния, заданный как разделенная разделенными запятой парами, состоящая из 'EDRTolerance'
и настоящий скаляр. Используйте этот аргумент, чтобы найти сигнал, когда 'TimeAlignment'
для аргумента пары "имя-значение" задано значение 'edr'
.
Типы данных: single
| double
'Metric'
- Метрика расстояния'squared'
(по умолчанию) | 'absolute'
| 'euclidean'
| 'symmkl'
Метрика расстояния, заданная как разделенная разделенными запятой парами, состоящая из 'Metric'
и один из 'squared'
, 'absolute'
, 'euclidean'
, или 'symmkl'
. Если X и Y оба являются K -мерными сигналами, то Metric
предписывает dmn (X, Y), расстояние между m-й выборкой X и n-й выборкой Y. Для получения дополнительной информации о dmn (X, Y) см.
'squared'
- Квадрат евклидовой метрики, состоящий из суммы квадратов различий:
'euclidean'
- корневая сумма квадратов различий, также известная как Евклидова или ℓ 2 метрика:
'absolute'
- Сумма абсолютных различий, также известная как Манхэттен, городской блок, таксикаб или ℓ 1 метрика:
'symmkl'
- Симметричная метрика Кулбэка-Лейблера. Эта метрика действительна только для реальных и положительных X и Y:
'Annotate'
- Стиль графика'signal'
(по умолчанию) | 'data'
| 'all'
Стиль графика, заданный как разделенная разделенными запятой парами, состоящая из 'Annotate'
и одно из следующих значений:
'data'
строит графики данных и подсвечивает области, которые лучше всего соответствуют сигналу.
'signal'
строит график сигнала на отдельном подграфике.
'all'
строит графики сигнала, данных, нормированного сигнала и нормализованных данных на отдельных подграфиках.
Этот аргумент игнорируется, если вы вызываете findsignal
с выходными аргументами.
istart,istop
- Начальный и конечный индексы сегментаНачальный и конечный индексы сегмента, возвращенные как целочисленные скаляры или векторы.
dist
- Минимальное расстояние между данными и сигналамиМинимальное расстояние сигнала данных, возвращаемое в виде скаляра или вектора.
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.