You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python的光谱FWHM计算:求半高平行线与谱线交点坐标

自动化计算光谱半高直线与谱线的交点坐标

既然你已经完成了数据插值,那接下来的自动化找交点其实很直接——核心思路就是在峰的左右两侧分别寻找跨越半高值的相邻数据点,再通过线性插值计算精确的交点x坐标(因为插值后的数据是连续平滑的,相邻点间用线性插值足够准确)。

下面给你具体的步骤和代码示例(假设你用NumPy处理数据,这是光谱分析里最常用的工具):

1. 准备基础数据

首先确认你已经有这些变量:

  • x: 插值后的横坐标数组(比如波长、波数)
  • y: 插值后的强度数组
    先计算半高值:
import numpy as np

y_max = np.max(y)
y_half = y_max / 2

2. 定位峰的中心位置

为了避免误找到峰另一侧的交点(比如左边找了右边的点),先确定峰的索引,把数据分成左右两部分:

peak_idx = np.argmax(y)  # 找到强度最大的点的索引

# 拆分左右两侧数据:左侧从开头到峰位,右侧从峰位到结尾
x_left, y_left = x[:peak_idx+1], y[:peak_idx+1]
x_right, y_right = x[peak_idx:], y[peak_idx:]

3. 寻找左侧交点

遍历左侧数据,找到第一个跨越y_half的相邻点对,用线性插值算x坐标:

# 计算每个点与半高值的差值符号,找符号变化的位置(说明穿过了半高直线)
left_sign_changes = np.diff(np.sign(y_left - y_half)) != 0
# 找到第一个符号变化的索引
left_intersect_idx = np.where(left_sign_changes)[0][0]

# 用线性插值计算交点x值
x1, x2 = x_left[left_intersect_idx], x_left[left_intersect_idx+1]
y1, y2 = y_left[left_intersect_idx], y_left[left_intersect_idx+1]
x_left_intersect = x1 + (y_half - y1) * (x2 - x1) / (y2 - y1)
left_point = (x_left_intersect, y_half)

4. 寻找右侧交点

同理处理右侧数据,注意右侧是从峰位往下降,所以找符号变化的点:

right_sign_changes = np.diff(np.sign(y_right - y_half)) != 0
right_intersect_idx = np.where(right_sign_changes)[0][0]

x1, x2 = x_right[right_intersect_idx], x_right[right_intersect_idx+1]
y1, y2 = y_right[right_intersect_idx], y_right[right_intersect_idx+1]
x_right_intersect = x1 + (y_half - y1) * (x2 - x1) / (y2 - y1)
right_point = (x_right_intersect, y_half)

5. 验证与扩展

  • 如果你的插值数据里刚好有某个点的强度等于y_half,那直接取对应的x值即可(可以在代码里加个判断,先检查np.any(y == y_half))
  • 如果有多个峰,你需要先定位每个峰的位置,再对每个峰重复上述步骤
  • 最后计算FWHM就是x_right_intersect - x_left_intersect

这样就完全实现了自动化,不用手动光标读取啦!

内容的提问来源于stack exchange,提问作者Shubhadip Chakraborty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:09:51