峰值检测测量信号

时间:2020-03-05 18:37:59  来源:igfitidea点击:

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

如果最大值是我们要寻找的峰值,则此方法效果很好,但是如果设备无法正常工作,我们可以看到第二个峰值,该峰值可能高于初始峰值。在90秒钟的时间内,我们从16台设备中每秒读取10个读数。

我最初的想法是循环遍历读数,以检查上一个点和下一个点是否小于当前点,以找到一个峰并构建一个峰阵列。也许我们应该查看当前位置两侧的平均点数,以考虑系统中的噪声。这是最好的方法还是有更好的技术?

我们确实使用LabVIEW,并且已经检查了LAVA论坛,并且有很多有趣的示例。这是我们测试软件的一部分,我们试图避免使用过多的非标准VI库,因此我希望能就所涉及的过程/算法而不是特定的代码获得反馈。

解决方案

回答

我们可以尝试信号平均,即对于每个点,将其值与周围3个或者更多点进行平均。如果噪声斑点很大,那么这可能也无济于事。

我意识到这与语言无关,但是猜测我们使用的是LabView,LabView附带有许多预打包的信号处理VI,可用于进行平滑和降噪。 NI论坛是在此类问题上获得更多专业帮助的好地方。

回答

我们可以在逻辑上应用标准划分,并注意x%以上的峰。

回答

我认为我们想使信号与预期的示例性信号互相关。但是,自从我学习信号处理以来已经有很长的时间了,即使那时我也没有引起太大的注意。

回答

我对仪器不是很了解,因此这可能是完全不切实际的,但再次可能是一个有用的不同方向。如果我们知道读数可能失败的原因,并且给出此类失败的峰之间有一定的间隔,那么为什么不每个间隔都进行梯度下降呢?如果下降使我们回到之前搜索过的区域,则可以放弃。根据采样表面的形状,这也可能会比搜索更快地找到峰。

回答

已经对该问题进行了详细的研究。

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

ROOT源代码可用,因此我们可以根据需要获取此实现。

从TSpectrum类文档中:

此类中使用的算法已在以下参考文献中发布:

[1] M.Morhac et al.: Background
  elimination methods for
  multidimensional coincidence gamma-ray
  spectra. Nuclear Instruments and
  Methods in Physics Research A 401
  (1997) 113-
  132.
  
  [2]  M.Morhac et al.: Efficient one- and two-dimensional Gold
  deconvolution and its application to
  gamma-ray spectra decomposition.
  Nuclear Instruments and Methods in
  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在线订阅的人员的。

简短的做法是将直方图展平以消除噪声,然后在展平的直方图中通过蛮力检测局部最大值。

回答

此方法基本上来自David Marr的著作" Vision"

高斯会使信号具有预期的峰宽模糊。
这消除了噪声尖峰,并且相位数据没有损坏。

然后进行边缘检测(LOG将执行)

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

我对此使用了各种变体,它们工作得很好。

回答

所需峰与不需要的第二峰之间是否存在质的差异?如果两个峰均为"尖锐",即持续时间短-在频域中查看信号(通过执行FFT)时,我们将在大多数频段获得能量。但是,如果"好"峰确实有能量存在于"坏"峰中不存在的频率上,反之亦然,则可以通过这种方式自动区分它们。

回答

有很多经典的峰值检测方法,其中任何一种都可以使用。我们必须查看特别是什么会限制数据质量。以下是基本说明:

  • 在数据中的任意两个点之间((x(0),y(0))(x(n),y(n)),将y(i + 1)-y(i)相加对于'0 <= i <n,并称其为'T(" travel"),然后将R(" rise")设置为y(n)-y(0)+ k,以获取适当的k。 " T / R> 1"表示一个峰值。如果不太可能由于噪声而导致大行程,或者噪声围绕基本曲线形状对称分布,则此方法可以正常工作。对于应用程序,接受分数超过给定阈值的最早峰,或者分析每上升值的行进曲线以获得更多有趣的特性。
  • 使用匹配的滤波器对与标准峰形的相似度进行评分(基本上,对某种形状使用归一化的点积以获得相似度的余弦度量)
  • 对标准峰形进行反卷积并检查高值(尽管我经常发现2对简单的仪器输出对噪声不太敏感)。
  • 平滑数据并检查等距三点组的三元组,如果x0 <x1 <x2,y1> 0.5 *(y0 + y2),或者检查像这样的欧几里德距离:D((x0,y0),(x1 ,y1))+ D((x1,y1),(x2,y2))> D((x0,y0),(x2,y2)),这取决于三角形不等式。使用简单的比率将再次为我们提供一种得分机制。
  • 将一个非常简单的2高斯混合模型拟合到数据(例如,"数值配方"有一个很好的现成代码块)。采取较早的高峰。这样可以正确处理重叠的峰。
  • 在数据中找到最匹配的简单高斯曲线,柯西曲线,泊松曲线或者"随你便"曲线。在宽范围内评估该曲线,并在注意到其峰值位置后从数据副本中减去它。重复。取其模型参数(可能为标准偏差,但某些应用程序可能关心峰度或者其他特征)满足某些标准的最早峰。当从数据中减去峰时,请注意是否留有伪影。最佳匹配可能取决于上面#2中建议的匹配得分类型。

我已经做过之前的工作:在DNA序列数据中查找峰,在根据测量曲线估算的导数中查找峰,并在直方图中查找峰。

我鼓励我们仔细参加适当的基准调查。在存在噪声的情况下,维纳滤波或者其他滤波或者简单的直方图分析通常是确定基线的一种简便方法。

最后,如果数据通常比较嘈杂,并且从卡中获取的数据是未引用的单端输出(或者甚至是引用的,但不是差分的),并且如果要对每个数据点平均观察值,请尝试对这些数据进行排序观察并丢弃第一个和最后一个四分位数,然后对剩余的值求平均。有许多这样的异常消除策略可能非常有用。