如何在噪声数据集中找到峰值的FWHM(python numpy/scipy)?
我正在分析一张有两条交叉线(像个加号)的图片,并且我提取了一条与其中一条线垂直的像素线(一个nx1
的numpy数组)。这样我得到了一个浮点值的数组(代表颜色),然后我可以把这些数据画出来。我用matplotlib绘制这些数据,结果发现数据在180到200之间有很多噪声,而且中间有一个明显的峰值,峰值的值大约降到100。
我需要找出这个数据的FWHM(全宽半高)。我想我需要先过滤掉噪声,所以我用了高斯滤波器,这样数据变得平滑了一些,但顶部还是不够平坦。
我在想有没有更好的方法来过滤这些数据。
我该如何找到这个数据的FWHM呢?
如果可能的话,我希望只使用numpy、scipy和matplotlib。
这是原始数据:
这是过滤后的数据:
2 个回答
0
你的脚本已经做了正确的计算。
不过,你在计算nearest
和pos_extremum
之间的距离时,可能会出现一些误差。这个误差可以通过计算nearest_above
和nearest_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。
我不知道(或者说我觉得)这是不是最好的方法,但它有效,并且根据比较来看似乎相当准确。