大家好。我收到数百种这种形式的信号
检测到高于某个阈值的峰。




我将峰宽定义为FWHM(半峰全宽)。但是,我已经将三次多项式拟合到信号的波谷,因此我定义了一个峰值,即从该基线到该峰值的相同索引处的距离。

我正在将峰宽计算为信号与直线最大交点之间的最大距离。看起来像这样:

roots = indeces_of_intersections

intersection_lengths=[abs(y - x) for x, y in it.combinations(roots, 2)]

calculated_width = max(intersection_lengths)


我在始终如一地计算峰宽时遇到问题,这是因为有时线与不同峰上的点相交。



我限制了定义此相交线的域:

域= [在峰的左边,在峰的右边]

但是此域限制对于所有峰都是相同的。

我曾考虑过以某种方式针对不同的峰更改此域,但不确定如何实现。我的代码几乎是完全自动化的,因此必须保持这种方式。

最佳答案

将我的问题发布到此处有助于我实现一个简单的解决方案:

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轴向右增加)。如此简单快捷!

关于numpy - 改善信号峰值分析的技巧。 (峰宽),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28839927/

10-12 21:38