2008-08-06 167 views
50

我們使用數據採集卡從設備讀取信號,將其信號增加到峯值,然後回落到接近原始值。爲了找到峯值,我們目前在陣列中搜索最高讀數,並使用索引來確定計算中使用的峯值的時間。測量信號的峯值檢測

如果最高值是我們正在尋找的峯值,但是如果設備工作不正常,我們可以看到第二個峯值可能比初始峯值高。我們在90秒內從16臺設備每秒讀取10個讀數。

我最初的想法是循環讀取檢查,看看前一個點和下一個點是否小於電流以找到峯值並構建峯值陣列。也許我們應該在當前位置的任何一邊平均觀察許多點以允許系統中出現噪音。這是繼續進行還是有更好的技術?


我們使用LabVIEW和我已經檢查了LAVA forums,並且有一些有趣的例子。這是我們的測試軟件的一部分,我們試圖避免使用太多非標準的VI庫,所以我希望對所涉及的過程/算法提供反饋,而不是特定的代碼。

回答

8

您可以嘗試信號平均,即對於每個點,將該值與周圍的3個或更多點平均。如果噪音很大,那麼即使這樣做也許沒有幫助。

我意識到這是語言不可知的,但猜測您使用的是LabView,LabView中有很多預打包的信號處理VI,您可以使用它們來進行平滑和降噪。 NI forums是獲得這方面更多專業幫助的好地方。

2

我想你想cross-correlate您的信號與預期的示範信號。但是,自從我研究信號處理已經很長時間了,甚至在那之後我沒有多少注意。

0

我不太瞭解儀器,所以這可能是完全不切實際的,但是它可能又是一個有幫助的不同方向。如果您知道讀數可能會失敗,並且在出現這種故障的峯值之間存在一定的時間間隔,那麼爲什麼不在每個時間間隔進行梯度下降。如果下降將您帶回您之前搜索過的地區,您可以放棄它。根據採樣表面的形狀,這也可能幫助您找到比搜索更快的峯值。

6

已經對此問題進行了詳細研究。

ROOT(核/粒子物理分析工具)中有一組非常新的實現。該代碼適用於一維到三維數據。

ROOT源代碼可用,所以你可以抓住這個實現,如果你想。

TSpectrum類文檔:

在這個類中使用的算法已發表在下列參考文獻中:

[1] M.Morhac等。:背景 刪除方法 多維重合伽瑪射線 光譜。核儀器和方法 在物理研究阿401 (1997)113- 132

[2] M.Morhac等人:高效一維和二維金 反褶積並將其應用到 的γ-射線光譜分解。 核儀器和方法 Physics Research A 401(1997)385-408。

[3] M.Morhac et al .: Identification of peaks in multidimensional coincidence gamma-ray spectra。 Nuclear Instruments and Methods in Research Physics A 443(2000),108-125。

論文從類文檔鏈接到那些沒有NIM在線訂閱的人。


什麼做簡短的版本是,直方圖夷爲平地,消除噪音,然後局部最大值由扁平直方圖蠻力檢測。

4

這種方法基本上是大衛馬爾的書「視野」

高斯模糊,你與你的峯值的預期寬度信號。 這可以消除噪音尖峯,並且您的相位數據完好無損。

然後邊沿檢測(LOG將盡)

那麼你的邊緣人的特徵的邊緣(如峯)。 在峯之間尋找邊緣,按大小對峯進行分類,然後就完成了。

我已經使用這個變化,他們工作得很好。

0

期望的峯值和不需要的第二峯值之間是否存在質的差異?如果兩個峯值都是「尖銳的」 - 即持續時間短 - 當在頻域中查看信號時(通過執行FFT),您將在大多數頻帶獲得能量。但是,如果「良好」峯值可靠地將能量存在於「壞」峯值中不存在的頻率上,反之亦然,那麼您可以通過這種方式自動區分它們。

82

有很多很多經典的峯值檢測方法,其中任何一種都可能奏效。你將不得不看到什麼,特別是,限制你的數據的質量。以下是基本的描述:

  1. 任意兩點之間的數據,(x(0), y(0))(x(n), y(n)),爲0 <= i < n加起來y(i + 1) - y(i)並稱之爲T(「旅行」),並設置R(「崛起」),以y(n) - y(0) + k爲適當小kT/R > 1表示峯值。如果由於噪音引起的大行程不太可能,或者噪音圍繞基曲線形狀對稱分佈,則此功能可以正常工作。對於您的應用程序,請以高於給定閾值的分數接受最早的峯值,或者分析每個上升值的行程曲線以獲取更多有趣的屬性。

  2. 使用匹配濾波器將比分相似標準的峯形(基本上,使用規範化點積對一些形狀來獲得餘弦計量相似的)

  3. 卷積對一個標準的峯形和檢查對於高數值(儘管我經常發現2對於簡單的儀器輸出對噪聲不太敏感)。

  4. 平滑數據和檢查的等距點,其中,如果x0 < x1 < x2, y1 > 0.5 * (y0 + y2),或檢查歐幾里德距離這樣三胞胎:D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)),其依賴於三角不等式。使用簡單的比率將再次爲您提供評分機制。

  5. 適合一個非常簡單的2高斯混合模型對您的數據(例如,數值方法有代碼的一個很好的現成的塊)。走較早的高峯。這將正確處理重疊峯。

  6. 查找數據的最佳匹配一個簡單的高斯,柯西,泊松,或什麼都有,你的曲線。在廣泛的範圍內評估該曲線,並在記錄其峯值位置之後從數據副本中減去該曲線。重複。以模型參數(標準偏差可能,但一些應用可能關心峯度或其他特徵)的最早峯值符合一些標準。當從數據中減去峯值時,留意遺留的文物。 最佳匹配可能取決於上面#2建議的比賽得分類型。

我做你在做什麼之前:發現在DNA序列數據的山峯,發現從測量曲線估計衍生物峯,並在直方圖發現峯。

我鼓勵你仔細參加適當的基線。維納濾波或其他濾波或簡單的直方圖分析通常是噪聲存在時基線的簡單方法。最後,如果您的數據通常是嘈雜的,並且您將數據作爲未引用的單端輸出(甚至是引用的,只是沒有差異),並且如果您將大量觀察數據平均到每個數據點,嘗試整理這些觀察結果,並丟棄第一個和最後一個四分位數,並平均剩下的。有許多這樣的異常消除策略可能非常有用。

+0

哇,感謝所有這些信息。我一直在幹這些策略(很糟糕),並解決了我的峯值檢測問題,但我將更好地考慮第1點。感謝這些大量的數據。 約翰。 – 2010-01-26 10:19:33

5

我想貢獻給這個線程I have developed myself的算法:

它是基於dispersion原理:如果一個新的數據點的標準偏差的一個給定的x個遠離一些移動平均的算法信號(也稱爲z-score)。該算法非常強大,因爲它構造了一個單獨的移動平均值和偏差,以便信號不會破壞閾值。因此,無論先前的信號量如何,未來的信號都具有大致相同的精度。該算法需要3個輸入:lag = the lag of the moving windowthreshold = the z-score at which the algorithm signalsinfluence = the influence (between 0 and 1) of new signals on the mean and standard deviation。例如,5中的lag將使用最後5次觀察來平滑數據。如果數據點距移動平均值3.5個標準偏差,則3.5的一個threshold將發信號。 0.5的influence給出正常數據點具有的影響的信號一半。同樣地,0的influence完全忽略了重新計算新閾值的信號:因此0的影響是最穩健的選項。

其工作原理如下:

# Let y be a vector of timeseries data of at least length lag+2 
# Let mean() be a function that calculates the mean 
# Let std() be a function that calculates the standard deviaton 
# Let absolute() be the absolute value function 

# Settings (the ones below are examples: choose what is best for your data) 
set lag to 5;   # lag 5 for the smoothing functions 
set threshold to 3.5; # 3.5 standard deviations for signal 
set influence to 0.5; # between 0 and 1, where 1 is normal influence, 0.5 is half 

# Initialise variables 
set signals to vector 0,...,0 of length of y; # Initialise signal results 
set filteredY to y(1,...,lag)     # Initialise filtered series 
set avgFilter to null;       # Initialise average filter 
set stdFilter to null;       # Initialise std. filter 
set avgFilter(lag) to mean(y(1,...,lag));  # Initialise first value 
set stdFilter(lag) to std(y(1,...,lag));  # Initialise first value 

for i=lag+1,...,t do 
    if absolute(y(i) - avgFilter(i-1)) > threshold*stdFilter(i-1) then 
    if y(i) > avgFilter(i-1) 
     set signals(i) to +1;      # Positive signal 
    else 
     set signals(i) to -1;      # Negative signal 
    end 
    # Adjust the filters 
    set filteredY(i) to influence*y(i) + (1-influence)*filteredY(i-1); 
    set avgFilter(i) to mean(filteredY(i-lag,i),lag); 
    set stdFilter(i) to std(filteredY(i-lag,i),lag); 
    else 
    set signals(i) to 0;      # No signal 
    # Adjust the filters 
    set filteredY(i) to y(i); 
    set avgFilter(i) to mean(filteredY(i-lag,i),lag); 
    set stdFilter(i) to std(filteredY(i-lag,i),lag); 
    end 
end 

演示

Demonstration of robust thresholding algorithm

> Original answer