algorithm - 测量信号的峰值检测

标签 algorithm language-agnostic

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

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

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


我们确实使用 LabVIEW,我已经检查了 LAVA forums还有很多有趣的例子。这是我们测试软件的一部分,我们正在努力避免使用太多非标准 VI 库,因此我希望获得有关所涉及的过程/算法而不是特定代码的反馈。

最佳答案

有很多经典的峰值检测方法,其中任何一种都可能有效。您必须特别了解限制数据质量的因素。以下是基本说明:

  1. 在数据中的任意两点之间,(x(0), y(0))(x(n), y(n)) , 加起来 y(i + 1) - y(i)对于 0 <= i < n并称之为 T (“旅行”)并设置 R (“上升”)到 y(n) - y(0) + k合适的小k . T/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-gaussian 混合模型(例如,Numerical Recipes 有一个很好的现成代码块)。以较早的高峰为例。这将正确处理重叠峰。

  6. 在数据中找到与简单的高斯、柯西、泊松或您拥有的曲线的最佳匹配。在较宽的范围内评估这条曲线,并在注意到它的峰值位置后从数据副本中减去它。重复。取其模型参数(可能是标准偏差,但某些应用程序可能关心峰态或其他特征)满足某些标准的最早峰值。当从数据中减去峰值时,请注意留下的伪影。 最佳匹配可能取决于上面 #2 中建议的匹配计分类型。

我已经完成了您之前所做的工作:在 DNA 序列数据中查找峰值,在根据测量曲线估计的导数中查找峰值,以及在直方图中查找峰值。

我鼓励您仔细注意适当的基线。维纳滤波或其他滤波或简单的直方图分析通常是在存在噪声的情况下确定基线的一种简单方法。

最后,如果您的数据通常是嘈杂的,并且您从卡上获取数据作为未引用的单端输出(或什至引用,只是没有差异),并且如果您对每个数据点的大量观察进行平均,尝试对这些观察结果进行排序并丢弃第一个和最后一个四分位数并对剩余的进行平均。有许多非常有用的异常值消除策略。

关于algorithm - 测量信号的峰值检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3260/

相关文章:

exception - 为什么程序员有时会默默地吞下异常?

c# - 文件哈希算法代码c#

java - 在 java 中我们可以使用 list.remove(int index) 来删除该索引中的项目,如果列表很大而我们只能使用 long 来存储索引怎么办?

algorithm - 递归下降优先级解析缺失前缀表达式

algorithm - 针对特定情况的最快排序算法

language-agnostic - 为什么箭头在继承中上升?

algorithm - 为什么斯坦福NLP类(class)中edit Distance算法的定义加2而不是1

algorithm - 我知道 2 SAT 可以在多项式时间内求解,找出强连通分量。对 3SAT 做同样的事情怎么样?

algorithm - A* 算法和启发式函数。在图上找到最佳路径。

math - 给定 f(x) 线性函数,如何获得二次贝塞尔控制点