【问题标题】:Tips on Improving Peak Analysis of a Signal. (peak widths)改进信号峰值分析的技巧。 (峰宽)
【发布时间】: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


【解决方案1】:

在这里发布我的问题帮助我实现了一个简单的解决方案:

more_than_peak=[x for x in it.ifilter(lambda x: x if x>peaks[i] else 0, roots)]
less_than_peak=[x for x in it.ifilter(lambda x: x if x<peaks[i] else 0, roots)]
if len(more_than_peak)>0 or len(less_than_peak)>0:
     width = min(more_than_peak)-max(less_than_peak)

在这里,我找到了峰值索引左侧和右侧的交叉点。然后,我在峰值右侧找到最小的一个,在左侧找到最大的一个(x 轴向右增加)。如此简单快捷!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多