MATLAB中findsignal函数使用

目录

语法

说明

示例

在数据中定位信号


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

        如图所示:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值