如何在噪声数据集中找到峰值的FWHM(python numpy/scipy)?

2 投票
2 回答
11450 浏览
提问于 2025-04-18 09:37

我正在分析一张有两条交叉线(像个加号)的图片,并且我提取了一条与其中一条线垂直的像素线(一个nx1的numpy数组)。这样我得到了一个浮点值的数组(代表颜色),然后我可以把这些数据画出来。我用matplotlib绘制这些数据,结果发现数据在180到200之间有很多噪声,而且中间有一个明显的峰值,峰值的值大约降到100。

我需要找出这个数据的FWHM(全宽半高)。我想我需要先过滤掉噪声,所以我用了高斯滤波器,这样数据变得平滑了一些,但顶部还是不够平坦。

  1. 我在想有没有更好的方法来过滤这些数据。

  2. 我该如何找到这个数据的FWHM呢?

如果可能的话,我希望只使用numpy、scipy和matplotlib。

这是原始数据: 原始数据

这是过滤后的数据: 过滤后的数据

2 个回答

0

你的脚本已经做了正确的计算。

不过,你在计算nearestpos_extremum之间的距离时,可能会出现一些误差。这个误差可以通过计算nearest_abovenearest_below之间的距离来减少,这两个位置分别是在极值(最大值或最小值)两侧的一半位置。

import numpy as np

# Example data
arr_x = np.linspace(norm.ppf(0.00001), norm.ppf(0.99999), 10000)
arr_y = norm.pdf(arr_x)

# Effective code
difference = max(arr_y) - min(arr_y)
HM = difference / 2

pos_extremum = arr_y.argmax()  # or in your case: arr_y.argmin()

nearest_above = (np.abs(arr_y[pos_extremum:-1] - HM)).argmin()
nearest_below = (np.abs(arr_y[0:pos_extremum] - HM)).argmin()

FWHM = (np.mean(arr_x[nearest_above + pos_extremum]) - 
        np.mean(arr_x[nearest_below]))

在这个例子中,你应该能得到FWHM和标准差之间的关系:FWHM = 2.355乘以标准差(这里是1),这个信息可以在维基百科上找到。

0

我最后没有使用任何过滤器,而是直接用了原始数据。我的步骤是:

  • 找到了数据中的最小值和最大值,然后计算了 difference = max(arr_y) - min(arr_y),也就是最大值和最小值之间的差。
  • 找到了半个最大值(在我的情况下是半个最小值),计算 HM = difference / 2
  • 找到了离HM最近的数据点: nearest = (np.abs(arr_y - HM)).argmin()
  • 计算了这个最近点和最小值之间的距离(这给了我HWHM)。
  • 然后简单地乘以2来得到FWHM。

我不知道(或者说我觉得)这是不是最好的方法,但它有效,并且根据比较来看似乎相当准确。

撰写回答