2015-04-15 28 views
1

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

我的代码:

[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

这是我的理解,你要确定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是一个2D矩阵,告诉您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]的行是相同的。我认为这不是一个问题,所以我们会一个人离开。


现在我没有覆盖的是峰值是否也发生在同一时间值内。这可以通过对stime1stime2的时间向量值执行另一个bsxfun操作来完成,就像我们对svalue1svalue2所做的那样,并且在这两个矩阵之间执行逻辑与运算。如果峰值在的振幅和时间都相同,那么结果如下....所以像这样:

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会给你什么样的相应的峰值和时间分别为,将被视为“关”两个信号之间。第一列表示第一信号的峰值和时间,第二列表示第二信号的峰值和时间。列之间的差异应该小于规定的阈值。

+0

谢谢@rayryeng,但时间很重要。所以例如我在时间10处有一个峰值,幅度为100,在另一个矢量中,我在时间10.1处有一个峰值,幅度为95 ..这意味着在时间和幅度几乎相同时有交集。 – SMH

+0

@SMH - 没问题。我更新了我的帖子。看一看。 – rayryeng

+0

@SMH - 我做了进一步的修改。注意到我的逻辑有缺陷。 – rayryeng