第四节:谱图预处理——背景扣除、平滑与归一化
拿到一张XPS原始谱图,别急着分析。我见过太多人上来就拟合,结果峰位、峰面积全是错的。为什么?因为原始数据里藏着背景信号、噪声干扰,还有样品间的强度差异。预处理这一步,说白了就是给数据「洗个澡」,洗干净了才能看清真面目。
这一节,我带你过一遍三个关键步骤:背景扣除、平滑处理、归一化。每一步都有讲究,做对了事半功倍,做错了...嗯,数据可能就废了。
4.1 背景扣除:把「脏东西」去掉
XPS谱图里,除了我们想看的特征峰,还有一大片连续背景。这些背景来自非弹性散射电子——光电子在逸出样品表面时,跟其他电子碰撞损失了能量,就落在低动能端,形成一条「拖尾」。背景不扣掉,峰面积算不准,定量分析就是扯淡。
常用的背景扣除方法有两种:Shirley 和 Tougaard。我分别说说。
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)的强度做基准 | 不同样品间的相对含量比较 |
我个人习惯,做定性分析(看峰位、峰形)时用最大强度归一化;做定量分析(算原子百分比)时用面积归一化。参考峰归一化适合有内标的情况,比如你往样品里掺了已知量的金或硅。
归一化的一个坑:
如果你用最大强度归一化,一定要确保那个「最大强度」是真实的峰,不是噪声尖峰。我见过有人把噪声尖峰当成主峰,归一化后整个谱图都变形了。所以,归一化之前,先看一眼数据,确认主峰位置。
知识体系总览
下面这张图,把谱图预处理的三个步骤串起来了。你可以把它当作一个检查清单:
你看,流程是线性的:先扣背景,再平滑,最后归一化。顺序不能乱。如果你先平滑再扣背景,平滑会把背景的形状也改变了,扣背景时就容易出错。
好了,谱图预处理就讲到这里。记住一句话:预处理做得好,后续分析没烦恼。别嫌麻烦,这一步值得花时间。
公众号:蓝海资料掘金营,微信deep3321