改进信号峰值分析的技巧。 (峰宽)

Tips on Improving Peak Analysis of a Signal. (peak widths)

我将 峰宽定义为 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 轴向右增加)。如此简单快捷!