主要内容

在数据中找到信号

这个例子展示了如何使用findsignal在你的数据中找到一个时变信号。它包括如何通过使用距离度量来找到精确和紧密匹配的信号的例子,如何补偿一个缓慢变化的偏移,以及使用动态时间扭曲来允许采样的变化。

找到精确匹配

当你希望找到数值精确匹配的信号,可以使用strfind执行匹配。

例如,如果我们有一个数据向量:

数据= [1 4 3 2 55 2 3 1 5 2 55 2 3 1 6 4 2 55 2 3 1 6 4 2];

我们想要找到信号的位置

Signal = [55 2 3 1];

我们可以使用strfind只要信号和数据在数值上是精确的,就可以找到信号在数据中存在的位置的起始索引。

iStart = strfind(数据、信号)
iStart =1×35 11日18

找到最接近的匹配信号

strfind适用于数值精确匹配。然而,当信号中可能存在量化噪声或其他伪影导致的错误时,这种方法就会失败。

例如,如果你有一个正弦曲线:

data =罪(2 *π* (25)/ 16);

你想要找到信号的位置

信号= cos(2 *π* (0:10)/ 16);

strfind无法在从第五个样本开始的数据中定位正弦波:

iStart = strfind(数据、信号)
iStart = []

strfind无法在数据中找到信号,因为由于舍入误差,不是所有值在数值上都相等。要看到这一点,从匹配区域的信号中减去数据。

数据(5:15)信号
ans =1×1110-15年× 0 0 0 0.0555 0.0612 0.0555 0 0.2220 0 0.2220 0

在1e-15的数量级上存在差异。

为了补救,你可以使用findsignal默认情况下,该程序会将信号扫过数据,并计算信号与本地每个位置的数据之间的差异平方和,寻找最小的和。

要生成突出显示最佳匹配位置的信号和数据图,可以调用findsignal如下:

findsignal(数据、信号)

图中包含2个轴。带有标题信号的轴1包含一个类型为line的对象。轴2与标题信号匹配发现:1包含2个类型为line的对象。这些对象表示数据、信号。

在阈值下找到最接近的匹配

默认情况下findsignal总是返回信号与数据最接近的匹配。若要返回多个匹配项,可以指定最大差值平方和的界限。

data =罪(2 *π* (0:100)/ 16);信号= cos(2 *π* (0:10)/ 16);findsignal(数据、信号、“MaxDistance”1 e-14)

图中包含2个轴。带有标题信号的轴1包含一个类型为line的对象。轴2与标题信号匹配发现:6包含2个类型为line的对象。这些对象表示数据、信号。

findsignal以接近的排序顺序返回匹配项

[iStart, iStop, distance] = findsignal(数据,信号,“MaxDistance”1 e-14);流('iStart iStop总平方距离\n'
iStart是总平方距离
流(' % 4我% .7g \ n ' % 5, (iStart;iStop;距离)
53 63 0 69 79 0 85 95 0 5 15 21 31 1.776357e-15 37 47 1.776357e-15

基于变偏置的复杂信号轨迹的搜索

下一个示例演示如何使用findsignal找到一个能追踪已知轨迹的信号。cursiveex文件”。当笔尖在一张纸上描出“磷光”这个词时,笔尖的x和y位置就记录下来了。x、y数据分别被编码为复信号的实分量和虚分量。

负载cursiveex情节(数据)包含(“真实”的) ylabel (图像放大的

图中包含一个坐标轴。轴包含一个线型对象。

同一个作者用字母“p”作为模板信号。

情节(信号)标题(“信号”)包含(“真实”的) ylabel (图像放大的

图中包含一个坐标轴。带有标题信号的轴包含一个类型为line的对象。

您可以很容易地使用数据中的第一个“p”findsignal.这是因为在数据开始时,信号的值排列得相当好。

findsignal(数据、信号)

图中包含2个轴。带有标题信号的轴1包含一个类型为line的对象。轴2与标题信号匹配发现:1包含2个类型为line的对象。

然而,第二个"p"有两个特点,使它难以findsignal识别:它与第一个字母有一个显著但恒定的偏移量,并且部分字母是以与模板信号不同的速率绘制的。

如果您只对匹配字母的整体形状感兴趣,您可以从signal和data元素中减去一个有窗口的局部平均值。这可以让你减轻不断变化的影响。

为了减轻绘制字母的不同速度的影响,你可以使用动态时间扭曲,它将信号或数据拉伸到一个共同的时间基数,因为它执行搜索:

findsignal(数据、信号、“TimeAlignment”“dtw”...“归一化”“中心”...“NormalizationLength”, 600,...“MaxNumSegments”, 2)

图中包含2个轴。带有标题信号的轴1包含一个类型为line的对象。找到标题信号匹配的轴2:2包含2个类型为line的对象。

寻找时间紧张的电力信号

下一个示例演示如何使用findsignal找出一个口语单词在短语中的位置。

下面的文件包含短语“加速工程和科学的步伐”的音频录音,以及由同一人讲的另一段“工程”的音频录音。

负载口号soundsc(短语、fs) soundsc (hotword fs)

同一个人在一个句子或短语中不同的发音是很常见的。在这个例子中,讲话者用两种不同的方式来发音“engineering”:讲话者用了大约0.5秒的时间来发音短语中的单词,重读第二个音节(“en-GIN-eer-ing”);同一个说话者花了0.75秒来单独发这个单词,重读第三个音节(“en-gin-EER-ing”)。

为了补偿这些在时间和体积上的局部变化,您可以使用光谱图来报告随着时间变化的光谱功率分布。

首先,使用频率分辨率相当粗糙的声谱图。这样做是为了故意模糊声道的窄频带声门脉冲,只留下口腔和鼻腔的宽频带共振不受干扰。这可以让你锁定一个单词的发音元音。辅音(尤其是爆破音和摩擦音)要用声谱图来识别要困难得多。下面的代码计算一个声谱图

Nwindow = 64;Nstride = 8;β= 64;Noverlap = Nwindow - Nstride;[~,~,~,PxxPhrase] = spectrogram(phrase, kaiser(Nwindow,Beta), Noverlap);[~,~,~,PxxHotWord] = spectrogram(hotword, kaiser(Nwindow,Beta), Noverlap);

现在你有了短语和搜索词的谱图,你可以使用动态时间扭曲来解释单词长度的局部变化。类似地,您可以通过将幂归一化与对称的库尔贝克-雷伯尔距离结合使用来解释幂的变化。

[start,istop] = findsignal(PxxPhrase, PxxHotWord,...“归一化”“权力”“TimeAlignment”“dtw”“指标”“symmkl”
istart = 1144
istop = 1575

设计和玩识别的单词。

findsignal (PxxPhrase PxxHotWord,“归一化”“权力”...“TimeAlignment”“dtw”“指标”“symmkl”

图中包含2个轴。带有标题信号的轴1包含一个类型为image的对象。轴2与标题信号匹配发现:1包含3个类型为image, patch的对象。

soundsc(短语(Nstride * istart-Nwindow / 2: Nstride * istop + Nwindow / 2), fs)

另请参阅