我有两个信号,我计算了每个信号的局部峰值,并将它们保存在两个不同的矢量中,用于幅度,另外两个用于定时。我需要得到峰值之间的交点。每个峰值都有一个值和一个时间,所以我试图在几乎相同的时间提取几乎具有相同幅度的峰值。任何帮助??
我的代码:
[svalue1,stime1] = findpeaks(O1);
[svalue2,stime2] = findpeaks(O2);
%note that the peaks count is different in each signal
% This is my try but it is not working
x = length(intersect(ceil(svalue1),ceil(svalue2)))/min(length(svalue1),length(svalue2));
答案 0 :(得分:1)
我理解您想要确定svalue1
和svalue2
中彼此相似的值,更重要的是它们不等长度。
您可以做的是将svalue1
中的每个值与svalue2
中的每个值进行比较,以及svalue1
中的值与svalue2
中的值之间的差异是否较小如果超过一定数量,我们会将这两个元素分类为相同。
这可以通过bsxfun
使用@minus
功能实现,并使用abs
消除任何符号更改。之后,我们可以确定值低于一定数量的位置。
这样的事情:
tol = 0.5; %// Adjust if necessary
A = abs(bsxfun(@minus, svalue1(:), svalue2(:).')) <= tol;
[row,col] = find(A);
out = [row,col];
tol
是我们用来定义两个值是否靠近的容差。我选择这个是0.5,但是根据你的应用进行调整。 out
是一个二维矩阵,可以告诉您svalue1
中哪个值最接近svalue2
。我们不是给出详细的解释,而只是向您展示这种工作的一个例子,我们可以一路解释。
让我们试试这个例子:
>> svalue1 = [0 0.1 1 2.2 3];
>> svalue2 = [0.1 0.2 2 3 4];
运行上面的代码,我们得到:
>> out
ans =
1 1
2 1
1 2
2 2
4 3
5 4
现在这是有道理的。每行都会告诉您svalue1
中的哪个值接近svalue2
。例如,第一行表示svalue1
中的第一个值或0接近svalue2
中的第二个值或0.1。下一行表示svalue1
的第二个值(或0.2)接近第一个值svalue2
或0。
显然,此操作包含非唯一值。例如,[1 2]
和[2 1]
的行相同。我假设这不是问题,所以我们将单独留下。
现在我没有说明的是峰值是否也发生在同一时间值内。这可以通过对bsxfun
和stime1
的时间向量值执行另一个stime2
操作来完成,就像我们使用svalue1
和svalue2
一样,并执行两个矩阵之间的逻辑AND运算。如果峰值在 幅度和时间中相同,那么结果如下......所以像这样:
tol_amplitude = 5; %// Adjust if necessary
tol_time = 0.5;
A = abs(bsxfun(@minus, svalue1(:), svalue2(:).')) <= tol_amplitude;
Atime = abs(bsxfun(@minus, stime1(:), stime2(:).')) <= tol_time;
Afinal = A & Atime;
[row,col] = find(Afinal);
out = [row,col];
您会注意到我们有两个时间和幅度阈值。必要时调整两者。 out
将包含我们之前看到的结果,但这些将为您提供 时间和幅度都接近的指数。如果你想看看它们是什么,你可以这样做:
peaks = [svalue1(out(:,1)) svalue2(out(:,2))];
times = [stime1(out(:,1)) stime2(out(:,2))];
peaks
和times
将为您提供两个信号之间被视为“接近”的相应峰值和时间。第一列表示第一信号的峰值和时间,第二列表示第二信号的峰值和时间。列之间的差异应小于其规定的阈值。