Numpy 关于改进信号峰值分析的提示。(峰值宽度) 大家好。我有数百种这种形式的信号 检测到高于某个阈值的峰值。

Numpy 关于改进信号峰值分析的提示。(峰值宽度) 大家好。我有数百种这种形式的信号 检测到高于某个阈值的峰值。,numpy,machine-learning,computer-vision,signal-processing,scientific-computing,Numpy,Machine Learning,Computer Vision,Signal Processing,Scientific Computing,我将峰值宽度定义为最大值一半时的半高宽全宽。然而,我用一个三次多项式拟合了信号的谷值,所以我定义了一个峰值,即从基线到峰值的距离,其指数与峰值到峰值的指数相同 我将峰值宽度计算为信号交叉点与直线之间的最大距离,为最大距离的一半。它如下所示: roots = indeces_of_intersections intersection_lengths=[abs(y - x) for x, y in it.combinations(roots, 2)] calculated_width = max

我将峰值宽度定义为最大值一半时的半高宽全宽。然而,我用一个三次多项式拟合了信号的谷值,所以我定义了一个峰值,即从基线到峰值的距离,其指数与峰值到峰值的指数相同

我将峰值宽度计算为信号交叉点与直线之间的最大距离,为最大距离的一半。它如下所示:

roots = indeces_of_intersections

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

calculated_width = max(intersection_lengths)
我在一致地计算峰宽时遇到了问题,这是因为有时线与不同峰上的点相交

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

Domain=[峰值左侧一点,右侧一点]

但是这个域限制对于所有峰值都是相同的

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


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

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轴的左边,增加到右边。如此简单和快速

另外,让我澄清一下:如果我将相交线域设置得太小,它将无法检测到较大的峰值。我曾经考虑过要建立一条线,从中间开始向外延伸,直到到达两边的第一个交叉点。另外,如果我有交点的指数,我可以找到哪一对最小,我想它也包含峰值指数。你可以使用样条插值来计算数据的一阶导数和二阶导数,从中你可以确定峰值以及其他峰值何时开始。如果你的数据是噪声,你也可以尝试使用一些平滑方案。谢谢你的建议。这些都是很好的观点,但是,我已经有了一个离散信号,所以插值会比较慢,并且可能会导致错误。我仍然不清楚这将如何帮助我解决相交问题,我认为这是一种测量宽度的简单方法,我现在已经解决了这个问题。使用a,你将获得分段多项式,通常是数据点之间每个间隔的一个多项式,给你一个近似的连续函数。但是从这里,你可以看到每个数据点上的导数,并计算出斜率是向上还是向下,从而得到一个峰值或谷值。除非您有千兆字节的数据需要实时处理,否则我认为您不会有性能问题。