【发布时间】:2015-05-04 14:00:36
【问题描述】:
- 大家好。我有数百个这种形式的信号 检测到高于某个阈值的峰值。
我将峰宽定义为 FWHM(半峰全宽)。但是,我已将三次多项式拟合到信号的谷值,因此我将峰值定义为与该基线的距离,该距离与峰值到峰值的索引相同。
我将峰值宽度计算为信号与最大一半处的线的交点之间的最大距离。它看起来像这样:
roots = indeces_of_intersections
intersection_lengths=[abs(y - x) for x, y in it.combinations(roots, 2)]
calculated_width = max(intersection_lengths)
我在持续计算峰宽时遇到问题,这是因为有时线与不同峰上的点相交。
我已限制了定义此相交线的域:
域 = [在峰的左边一点,在峰的右边一点]
但是这个域限制对于所有的峰都是一样的。
我曾考虑过以某种方式针对不同的峰值更改此域,但不确定如何实现。我的代码几乎是完全自动化的,我必须保持这种状态。
【问题讨论】:
-
另外,让我澄清一下:如果我将相交线域设置得太小,它将无法检测到较大的峰。我考虑过实现一条从中间开始向外延伸的线,直到它到达两边的第一个交叉点。另外,如果我有交叉点的索引,我想我可以找到哪一对是最小的,它也包含峰值索引。'
-
您可以使用样条插值来计算数据的一阶和二阶导数,从中您可以确定峰值以及其他峰值何时开始。如果您的数据是噪音,您也可以尝试使用一些平滑方案。
-
感谢您的建议。这些都是好点,但是,我已经有一个离散信号,因此插值会更慢并且可能导致错误。我仍然不清楚这将如何帮助我解决交叉问题(我认为这是一种测量宽度的简单方法,并且我现在已经解决了一个问题)。
-
使用spline interpolation scheme,您将获得分段多项式,通常是数据点之间每个间隔的单个多项式,为您提供近似的连续函数。但由此,您可以查看每个数据点的导数,并确定斜率是上升还是下降(因此是峰值或谷值)。除非您要实时处理千兆字节的数据,否则我认为您不会遇到性能问题。
标签: numpy machine-learning computer-vision signal-processing scientific-computing