测量信号的峰值检测

我们使用数据采集卡从设备读取信号,将信号增加到峰值,然后回落到接近原始值。为了找到峰值,我们目前在阵列中搜索最高读数,并使用索引来确定计算中使用的峰值的时间。

如果最高值是我们正在寻找的峰值,这很有效,但如果设备工作不正常,我们可以看到第二个峰值可能高于初始峰值。我们在90秒内从16台设备每秒读取10个读数。

我最初的想法是在读数循环中检查,看看前一个点和下一个点是否小于电流以找到峰值并构建峰值阵列。也许我们应该在当前位置的任何一边平均观察许多点以允许系统中出现噪音。这是继续进行还是有更好的技术?


我们使用LabVIEW,并且已经检查了 LAVA论坛,并且有许多有趣的例子。这是我们的测试软件的一部分,我们试图避免使用太多非标准的VI库,所以我希望对所涉及的过程/算法提供反馈,而不是特定的代码。

0
额外 编辑
意见: 2

9 答案

您可以尝试信号平均,即对于每个点,将该值与周围3个或更多点平均。如果噪音很大,那么即使这样做也可能没有帮助。

我意识到这是语言不可知的,但是猜测你正在使用LabView,LabView中有很多预先打包的信号处理VI,可以用来进行平滑和降噪。 NI论坛是在这类事情上获得更多专业帮助的好地方。

0
额外

您可以根据自己的逻辑应用一些标准解读,并注意峰值超过x%。

0
额外

我想为这个线程贡献一个算法,该算法可以我开发自己

它基于分散性的原则:如果一个新的数据点是一个给定的x数量的标准偏离某些移动均值,算法信号(也称为 z-score )。该算法非常强大,因为它构造了一个独立的移动均值和偏差,以便信号不会破坏阈值。因此,无论先前的信号量如何,未来的信号都具有大致相同的精度。该算法需要3个输入: lag =移动窗口的滞后threshold =算法信号和影响= z之间的影响0和1)平均值和标准偏差上的新信号。例如,一个 lag 5将使用最后5个观察值来平滑数据。如果数据点距移动平均值3.5个标准偏差,那么3.5的 threshold 将发出信号。 0.5的影响给出正常数据点具有的影响的一半。同样,0的影响忽略了完全重新计算新阈值的信号:因此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

演示

演示nstration of robust thresholding algorithm

> Original answer

0
额外
@BrandonBrown那应该不会太难?只需修改原始算法,以便每次有信号时,保存所需的详细信息。例如。实现一个在峰值开始时“标记”的变量,跟踪所需的值并在峰值停止时保存它们。
额外 作者 Jean-Paul,
如果我不仅要检测峰值,还要隔离形成峰值的单个波,我怎么用这个算法来做到这一点?我不仅想要峰值,但我想知道检测到的尖峰的宽度/持续时间和上升时间/斜率
额外 作者 Brandon Brown,

这个问题已经被详细研究了。

ROOT 类的 TSpectrum * 类中有一组非常新的实现, (核/粒子物理分析工具)。该代码适用于一维到三维数据。

ROOT源代码是可用的,所以你可以抓住这个实现,如果你想。

TSpectrum 类文档:

本课程中使用的算法已在以下参考文献中发表:

[1] M.Morhac等人:背景   消除方法   多维重合伽马射线   光谱。核仪器和仪器   物理研究方法A 401   (1997)113-   132。     [2] M.Morhac等:高效的一维和二维金   解卷积及其在数据处理中的应用   伽马射线谱分解。   核仪器和方法   Physics Research A 401(1997)385-408。     [3] M.Morhac等人:鉴定峰   多维重合伽马射线   光谱。核仪器和仪器   研究物理学方法   443(2000),108-125。

这些论文是从那些没有NIM在线订阅的人的类文档链接而来的。


所做的简短版本是将直方图平坦化以消除噪声,然后通过平坦直方图中的强力检测局部最大值。

0
额外

这种方法基本上来自David Marr的书“Vision”

高斯模糊您的信号与预期的峰值宽度。 这消除了噪声尖峰,并且您的相位数据完好无损。

然后边缘检测(LOG会做)

然后你的边缘是特征的边缘(比如山峰)。 在峰的边缘之间查看,按大小对峰进行排序,然后就完成了。

我在这方面使用了变化,他们工作得很好。

0
额外

有很多很多经典的峰值检测方法,其中任何一种都可以工作。你将不得不看到什么,特别是,限制你的数据的质量。这里是基本的描述:

  1. Between any two points in your data, (x(0), y(0)) and (x(n), y(n)), add up y(i + 1) - y(i) for 0 <= i < n and call this T ("travel") and set R ("rise") to y(n) - y(0) + k for suitably small k. T/R > 1 indicates a peak. This works OK if large travel due to noise is unlikely or if noise distributes symmetrically around a base curve shape. For your application, accept the earliest peak with a score above a given threshold, or analyze the curve of travel per rise values for more interesting properties.

  2. Use matched filters to score similarity to a standard peak shape (essentially, use a normalized dot-product against some shape to get a cosine-metric of similarity)

  3. Deconvolve against a standard peak shape and check for high values (though I often find 2 to be less sensitive to noise for simple instrumentation output).

  4. Smooth the data and check for triplets of equally spaced points where, if x0 < x1 < x2, y1 > 0.5 * (y0 + y2), or check Euclidean distances like this: D((x0, y0), (x1, y1)) + D((x1, y1), (x2, y2)) > D((x0, y0),(x2, y2)), which relies on the triangle inequality. Using simple ratios will again provide you a scoring mechanism.

  5. Fit a very simple 2-gaussian mixture model to your data (for example, Numerical Recipes has a nice ready-made chunk of code). Take the earlier peak. This will deal correctly with overlapping peaks.

  6. Find the best match in the data to a simple Gaussian, Cauchy, Poisson, or what-have-you curve. Evaluate this curve over a broad range and subtract it from a copy of the data after noting it's peak location. Repeat. Take the earliest peak whose model parameters (standard deviation probably, but some applications might care about kurtosis or other features) meet some criterion. Watch out for artifacts left behind when peaks are subtracted from the data. Best match might be determined by the kind of match scoring suggested in #2 above.

我已经完成了以前的工作:在DNA序列数据中找到峰值,从测量曲线中估计出衍生物峰值,并在直方图中找到峰值。

我鼓励你仔细参加正确的基线。维纳滤波或其他滤波或简单的直方图分析通常是噪声存在时基线的简单方法。

最后,如果您的数据通常很嘈杂,并且您将数据作为未引用的单端输出(或者甚至是引用的,只是没有差异),并且如果您将大量观察数据平均到每个数据点,请尝试对这些数据进行排序观察并丢弃第一个和最后一个四分位数并平均剩下的。有许多这样的异常消除策略可能非常有用。

0
额外
这个答案有更好的语言不可知信息 - 特别是我知道符合高斯的数字配方代码运行良好,因为我们在这里使用FFT输出。
额外 作者 Brendan,
关于“适合小k的+ k”,k是所有计算的常数值吗?你如何挑选它?适合小的意思是什么?
额外 作者 Loren,
哇,感谢所有这些信息。我一直在干这些策略(很糟糕),并且解决了我的峰值检测问题,但我将更好地考虑第1点。感谢这些大量的数据。约翰。
额外 作者 John Ballinger,
只是为了防止溢出:当用T除以R,如果曲线平坦或接近平坦或者第一个和最后一个y值相等或接近相等,则R将处于或接近零。当R不接近零时,合适的小尺寸将足够小以避免非常大的比率。这主要是一个实际的经验问题。这只是为了防止零分,你可能会选择以另一种方式进行。
额外 作者 Thomas Kammeyer,

我不太了解仪器仪表,所以这可能是完全不切实际的,但它可能又是一个有帮助的不同方向。如果您知道读数可能会失败,并且在出现这种故障的峰值之间存在一定的时间间隔,那么为什么不在每个时间间隔进行梯度下降。如果下降将您带回您之前搜索过的地区,您可以放弃它。根据采样表面的形状,这也可能帮助您找到比搜索更快的峰值。

0
额外

期望的峰值与不需要的第二峰值之间是否存在质的差异?如果两个峰值都是“尖锐的” - 即持续时间短 - 当在频域中查看信号时(通过执行FFT),您将在大多数频带获得能量。但是,如果“良好”峰值可靠地将能量存在于“坏”峰值中不存在的频率上,反之亦然,那么您可以通过这种方式自动区分它们。

0
额外