2015-04-15 55 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