第四节:谱图预处理——背景扣除、平滑与归一化

拿到一张XPS原始谱图,别急着分析。我见过太多人上来就拟合,结果峰位、峰面积全是错的。为什么?因为原始数据里藏着背景信号、噪声干扰,还有样品间的强度差异。预处理这一步,说白了就是给数据「洗个澡」,洗干净了才能看清真面目。

这一节,我带你过一遍三个关键步骤:背景扣除、平滑处理、归一化。每一步都有讲究,做对了事半功倍,做错了...嗯,数据可能就废了。

4.1 背景扣除:把「脏东西」去掉

XPS谱图里,除了我们想看的特征峰,还有一大片连续背景。这些背景来自非弹性散射电子——光电子在逸出样品表面时,跟其他电子碰撞损失了能量,就落在低动能端,形成一条「拖尾」。背景不扣掉,峰面积算不准,定量分析就是扯淡。

常用的背景扣除方法有两种:ShirleyTougaard。我分别说说。

4.1.1 Shirley 背景:简单粗暴,但够用

Shirley 方法的思路很直观:背景强度跟峰的总面积成正比。说白了,峰越高、越宽,它底下的背景就越高。算法会迭代计算,直到收敛。

我个人习惯,对于大多数过渡金属的2p、3d峰,Shirley 背景就够用了。它计算快,参数少,不容易出幺蛾子。

Shirley 背景的适用场景:

  • 峰形对称,或者轻微不对称
  • 背景变化平缓,没有剧烈起伏
  • 能量范围较窄(比如只扫一个元素的主峰)

代码实现也不复杂。下面是一个简单的 Shirley 背景扣除示例(Python 伪代码):

def shirley_background(energy, intensity, max_iter=100, tol=1e-6):
    # 初始化背景为常数
    bg = np.full_like(intensity, intensity.min())
    for _ in range(max_iter):
        # 计算峰面积(总强度减去背景)
        peak_area = np.trapz(intensity - bg, energy)
        # 更新背景:从高能端到低能端,背景与累积峰面积成正比
        new_bg = intensity.min() + (intensity.max() - intensity.min()) * \
                 np.cumsum(intensity - bg) / np.sum(intensity - bg)
        # 检查收敛
        if np.max(np.abs(new_bg - bg)) < tol:
            break
        bg = new_bg
    return bg

注意:Shirley 背景要求你手动指定两个端点——高能端和低能端的背景点。选错了,结果就偏了。我建议你选在峰两侧平坦的区域,别选在峰肩上。

4.1.2 Tougaard 背景:更物理,更准确

Tougaard 背景是基于非弹性散射的物理模型推导出来的。它认为背景的形状由材料的电子结构决定,而不是简单地跟峰面积成正比。对于宽能量范围的扫描(比如价带谱、宽扫全谱),Tougaard 背景明显优于 Shirley。

我记得有一次分析一个含碳的聚合物样品,C 1s 峰旁边有个很宽的π-π*卫星峰。用 Shirley 扣背景,卫星峰被严重低估;换成 Tougaard,结果就合理多了。

我的经验:

如果你不确定用哪种,先试 Shirley。如果 Shirley 扣完后基线在峰两侧明显不平(比如左边高右边低),那就换 Tougaard。Tougaard 的参数(B、C、C'、D)一般用默认值就行,除非你特别了解你的材料。

Tougaard 背景的数学形式稍微复杂一点:

def tougaard_background(energy, intensity, B=2866, C=1643, C2=1.0, D=1.0):
    # Tougaard 通用参数
    # 实际计算需要卷积,这里只展示核心公式
    # 背景 J(E) = ∫[E, ∞] I(E') * T(E' - E) dE'
    # 其中 T(E) = B * E / (C + E^2)^2 + C2 * E / (D + E^2)^2
    pass

警告:

不要对同一张谱图反复尝试不同的背景方法,直到「看起来好看」。这是数据造假的前兆。选定一种方法后,同一批样品要保持一致。

4.2 平滑处理:去噪,但别把峰磨平了

XPS 数据难免有噪声,尤其是采集时间短、或者元素含量低的时候。平滑可以改善信噪比,但过度平滑会丢失细节——峰变宽、变矮,甚至小峰被抹掉。

常用的平滑方法有:

  • Savitzky-Golay 滤波:我最推荐的方法。它在滑动窗口内做多项式拟合,既能去噪,又能保留峰的形状和位置。
  • 移动平均:简单,但会让峰展宽。我基本不用。
  • 傅里叶滤波:适合周期性噪声,但 XPS 里不常见。

Savitzky-Golay 的参数有两个:窗口宽度和多项式阶数。窗口越大,平滑越强,但峰形失真也越严重。我一般用 5-9 个点的窗口,多项式阶数 2 或 3。

from scipy.signal import savgol_filter

# 窗口宽度=7,多项式阶数=2
smoothed_intensity = savgol_filter(intensity, window_length=7, polyorder=2)

避坑指南:

我曾经遇到一个学生,把窗口设到 21 个点,结果两个本该分开的峰被平滑成一个宽包。他拿着这个结果去拟合,还问我为什么峰面积对不上。嗯,你想想看,数据都变形了,拟合能对吗?

我的建议:平滑前后对比一下,如果峰位偏移超过 0.1 eV,或者半峰宽变化超过 0.05 eV,那就是平滑过度了。

4.3 归一化处理:让数据可以比较

归一化的目的,是把不同条件下采集的谱图放到同一个尺度上。比如,你测了两个样品,一个采集了 10 分钟,另一个只采了 5 分钟,强度自然不一样。不归一化,直接比峰高就是耍流氓。

常见的归一化方式:

方法 做法 适用场景
最大强度归一化 所有数据除以谱图中的最大强度 比较峰形、峰位,不关心绝对强度
面积归一化 所有数据除以谱图的总面积 定量分析,消除采集时间、X射线通量的影响
参考峰归一化 用内标峰(如 C 1s 284.8 eV)的强度做基准 不同样品间的相对含量比较

我个人习惯,做定性分析(看峰位、峰形)时用最大强度归一化;做定量分析(算原子百分比)时用面积归一化。参考峰归一化适合有内标的情况,比如你往样品里掺了已知量的金或硅。

归一化的一个坑:

如果你用最大强度归一化,一定要确保那个「最大强度」是真实的峰,不是噪声尖峰。我见过有人把噪声尖峰当成主峰,归一化后整个谱图都变形了。所以,归一化之前,先看一眼数据,确认主峰位置。

知识体系总览

下面这张图,把谱图预处理的三个步骤串起来了。你可以把它当作一个检查清单:

XPS 谱图预处理流程 原始谱图 步骤1:背景扣除 Shirley 或 Tougaard 去除非弹性散射背景 步骤2:平滑处理 Savitzky-Golay 滤波 窗口5-9点,阶数2-3 步骤3:归一化处理 最大强度 / 面积 / 参考峰 确保数据可比

你看,流程是线性的:先扣背景,再平滑,最后归一化。顺序不能乱。如果你先平滑再扣背景,平滑会把背景的形状也改变了,扣背景时就容易出错。

好了,谱图预处理就讲到这里。记住一句话:预处理做得好,后续分析没烦恼。别嫌麻烦,这一步值得花时间。


公众号:蓝海资料掘金营,微信deep3321