2015-07-10 153 views
0

我有一個波浪像高斯或半高斯的信號。我想要的是計算波峯發生時的實時時間和波的長度。比如我有以下信號:實時檢測信號中的波形

enter image description here

我要檢測的信號的5個主要波峯。他們的最大值,持續時間和價值。我怎樣才能實時找到它們?我的信號存儲在C#隊列中。我應該如何執行以實時檢測波浪?

if (currentValue >threshold1 && (currentValue - previousValue) > 0) 
{ 
     firstCondition = true; 
} 
if (currentValue > threshold2 && currentValue < threshold2 && (currentValue - previousValue) > 0 && firstCondition == true) 
{ 
     secondCondition = true; 
} 
if (currentValue > (threshold2-0.02) && (currentValue) < threshold2 && (currentValue - previousValue) < 0 && firstCondition == true && secondCondition == true) 
{ 
     thirdCondition = true; 
     secondCondition = false; 
} 
if (currentValue > threshold1 && currentValue <threshold1 && (currentValue - previousValue) < 0 && thirdCondition == true) 
{ 
     fourthCondition = true; 
     firstCondition = false; 
     secondCondition = false; 
     thirdCondition = false; 
     counter++; 
} 

我的代碼似乎是執行基本檢測。不過,我似乎在放鬆一些波浪。我猜這是基於門檻。我的第二個問題是,我怎樣才能保留從波浪起點到終點相關的時間戳?

+2

我投票結束這個問題作爲題外話,因爲這是要求算法 – DavidG

+0

你可以使用平滑來簡化搜索(框平滑將是最簡單的)。之後的事情應該非常簡單。 – Paul

+0

我在第一步做的是將信號與參考波互相關。因此,我得到了一個平滑信號的互相關輸出信號。但是,在信號平滑之後,我必須實施一些啓發式操作才能獲得所需的波形? –

回答

1

您需要按樣品處理樣品。如果sample> min-threshold-1,它可能是一個wave begininig。然後你開始反擊。每個高於最小閾值2的新樣本(比最小閾值1低一點)遞增計數器。如果計數器>最小波長,那麼你有一波。但你仍在處理。如果樣品< min-threshold-2,那麼它結束。然後重複一遍又一遍。

+0

請您詳細說明一下。例如,min_threshold-1可能爲0.4(爲什麼min-threshold-2低於min-1?),我的信號取值爲0-1。你能給我簡單的例子嗎? –

+0

看右側的圖片:https://en.wikipedia.org/wiki/Schmitt_trigger – zgnilec

+0

好吧,這意味着我的信號必須從第一個閾值通過,並開始計數,然後從第二個閾值。如果計數器的波長大於第三閾值,我就得到一個窗口。我對嗎?我該如何做到這一點實時。我是否必須創建標誌以檢查是否滿足這些條件? –