找到保持两个信号峰值的矢量之间的交点

时间:2015-04-15 04:32:21

标签: matlab vector

我有两个信号,我计算了每个信号的局部峰值,并将它们保存在两个不同的矢量中,用于幅度,另外两个用于定时。我需要得到峰值之间的交点。每个峰值都有一个值和一个时间,所以我试图在几乎相同的时间提取几乎具有相同幅度的峰值。任何帮助??

我的代码:

    [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));

1 个答案:

答案 0 :(得分:1)

我理解您想要确定svalue1svalue2中彼此相似的值,更重要的是它们不等长度。

您可以做的是将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]的行相同。我假设这不是问题,所以我们将单独留下。


现在我没有说明的是峰值是否也发生在同一时间值内。这可以通过对bsxfunstime1的时间向量值执行另一个stime2操作来完成,就像我们使用svalue1svalue2一样,并执行两个矩阵之间的逻辑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))];

peakstimes将为您提供两个信号之间被视为“接近”的相应峰值和时间。第一列表示第一信号的峰值和时间,第二列表示第二信号的峰值和时间。列之间的差异应小于其规定的阈值。