目录
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')
如图所示:
