识别数据中的峰值

计算科学 scipy 曲线拟合 信号处理
2021-12-24 03:04:02

我有一些背景上有峰值的数据,例如:

在此处输入图像描述

在 ~390 和 ~450 处的两个突出峰,以及在 ~840 处的小得多的峰。使用 Python/SciPy 以编程方式查找此类峰的位置(即 x 坐标)有哪些选项?

2个回答

拟合伽马谱峰是乏燃料无损分析或中子活化分析中的典型任务。由于这些应用程序已经“相当陈旧”,因此有一些标准软件可用,例如Genie 20002015 年的一篇论文《用于伽马光谱分析的峰值拟合软件评估》比较了其中的一些工具。但是,它们中的大多数是商业的。

所有方法都基于“基函数”的概念,通常是高斯函数,用于线性组合。然后两个主要问题是估计峰值的数量和估计它们的位置。两者都是使用先验知识完成的:用户认为样本中存在什么?完成此操作后,将使用非线性优化算法 (Levenberg-Marquardt) 以最小化拟合和测量数据之间的误差。但是,正如 EMP 在评论中提到的那样,其中很多都是旁观者的眼睛。大多数商业软件都有一个 GUI,允许用户与代码交互以“叮当直到收敛”(其中收敛的意思是“它适合我的肉眼和我认为我的材料中的放射性物质”)。

可以在此处找到描述使用 Levenberg-Marquardt 方法的非线性拟合过程的论文这会给你一些数学背景。这篇论文“高分辨率伽马射线光谱的峰值拟合和识别软件库”也给出了一些数学背景。可以在此处找到描述此问题的较早报告。基于后者和 SciPy 中可用的求解器,您应该能够滚动自己的代码。

这看起来像一个光谱(X 射线(?))。如果您有任何关于您期望峰值落在哪里的先验信息,您可以为您的拟合算法提供该信息。例如:“适合 390 到 415 之间的高斯峰”。这有点难看,因为您必须手动编码这些范围,但至少您可以在以后自动扫描时重新使用它。