目录
语法
说明
示例
在数据中定位信号
findsignal函数的功能是使用相似性搜索查找信号位置。
语法
[istart,istop,dist] = findsignal(data,signal)
[istart,istop,dist] = findsignal(data,signal,Name,Value)
findsignal(___)
说明
[istart,istop,dist] = findsignal(data,signal)返回与搜索数组信号最匹配的数据数组数据段的开始和停止索引。最佳匹配的片段是这样的,dist,片段和搜索阵列之间的平方欧几里得距离,是最小的。如果数据和信号是矩阵,那么findsignal会查找与信号最匹配的数据区域的开始列和结束列。在这种情况下,数据和信号必须具有相同的行数。
[istart,istop,dist] = findsignal(data,signal,Name,Value)使用名称-值对参数指定附加选项。选项包括要应用的归一化、要报告的线段数以及要使用的距离度量。
不带输出参数的findsignal(___)绘制数据并突出显示任何已识别的信号实例。
如果数组是实向量,该函数将数据显示为样本数的函数。
如果数组是复数向量,该函数将在Argand图上显示数据。
如果数组是实矩阵,该函数使用imagesc在一个子绘图上显示信号,在另一个子绘图上显示带有突出显示区域的数据。
如果数组是复矩阵,该函数在每个图像的上半部分和下半部分绘制它们的实部和虚部。
示例
在数据中定位信号
产生由50%带宽的5 Hz高斯脉冲组成的数据集,以1 kHz的速率采样半秒。
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')
如图所示: