实验室待久了你会发现,XRD数据处理这事儿,真正卡人的往往不是衍射仪本身,而是拿到图谱之后怎么把它掰开揉碎。很多人只会用Jade对个标准卡片,真到要算晶粒尺寸、算晶格应变、确定低含量第二相的时候,还是得回到Origin里做全峰拟合。这篇我把从数据导入、基线扣除、峰形函数选择到弱峰处理的完整流程拆开讲,尽量写到每一步点哪里、参数填多少,给正在被XRD拟合折磨的同学一个能直接照抄的作业。
不管你是刚进组的研一新生,还是被审稿人要求补XRD精修的老油条,这套流程都适用。我默认你电脑上已经装好了Origin,版本不用太新,2018到2024都行,中文英文界面不影响操作逻辑,我下面会把菜单路径和中文翻译一起写出来。
1. 动手前的准备:软件、数据与工作区
1.1 Origin版本和工作区布局怎么搞定
先说软件。Origin这软件说不上难,但版本差异确实会让人懵。老版本比如Origin 2017、2018,和新版本比如2021、2024,菜单名称略有差别,但核心功能都集中在Analysis菜单下面,找“Peaks and Baseline”这一项就行。如果你用的是中文界面,对应的是“分析”→“峰值与基线”→“多峰拟合”。
我个人建议把工作区布局调成三窗口模式:左侧是Project Explorer,中间是数据表和绘图窗口,右侧是Object Manager。这样你在做拟合的时候,能同时看到数据表、图谱和拟合参数,不用来回切窗口。怎么调?在View菜单里勾选Project Explorer和Object Manager即可。
还有一个很实用的习惯:新建项目后,先把数据表重命名。比如“Sample_A_24h”,而不是默认的“Book1”。拟合时你会生成一堆派生表、结果表,命名清晰一点,导出数据的时候才不会手忙脚乱。
1.2 XRD数据怎么导进Origin
数据导入这块是很多人第一步就卡住的地方。XRD衍射仪导出的数据格式五花八门,常见的包括:
- 文本文件(.txt或.csv),两列:第一列是2θ角度,第二列是强度
- Excel文件(.xls或.xlsx),同样通常是两列
- Bruker的.raw格式,Rigaku的.rd文件,这类专有格式Origin往往不能直接读,需要先用衍射仪自带软件导出成通用文本格式
最省事的导入方式是这个:直接用鼠标把txt或csv文件拖进Origin的空白区。松开鼠标后,Origin会自动弹出导入向导,默认识别逗号和Tab作为分隔符。绝大多数XRD文本文件都能一次性导对。如果拖进去发现只有一列,别急,多半是分隔符识别错了,重新走一遍File → Import → Single ASCII,在自定义分隔符里手动勾上“Tab”和“逗号”。
导入之后,要确认两列数据的类型。这一列必须是X轴,右键点击列头,选“设为X”,另一列设为Y。很多人导入后没设X列,结果画图时横坐标是1、2、3……根本不是角度,这步注意一下。
如果你手里的数据是多个扫描段拼起来的,比如低温段和高温段分开扫的,要先在Origin里按顺序追加合并。一个技巧是:把第二段数据的X列坐标整体加上一个偏移量,让两段角度连起来,然后用“合并工作表”功能拼到一起。不过大多数物相分析用不到这一步,知道有这功能就行。
1.3 数据预处理:平滑、截断与背景观察
数据导进来后,先别急着拟合。第一步是画图,双击工作表里任意单元格,选中X和Y两列,然后点下方工具栏的Line图或Scatter图。XRD图谱一般用线图,强行用散点图会密成一片黑。
画完图,第一件事是观察整体形状。如果你的图谱在低角度区有一堆乱七八糟的鼓包,或者高角度区全是噪声,建议先把有效范围截出来。比如你主要分析10°到80°之间的衍射峰,就把两个坐标轴的范围改一下。双击横轴,在Scale选项卡里填上From=10,To=80。其实这一步和你后面拟合的稳定性关系很大——范围越小,拟合时的计算量越小,自动寻峰出错率越低。
平滑做不做?我的建议是:如果你用的是普通铜靶XRD、狭缝和扫描速度正常,尽量别平滑。因为拟合算法本身能容忍一定噪声,你强行平滑反而可能把弱峰抹掉。只有在样品结晶度差、峰形完全被噪声盖住的情况下,才考虑用Analysis → Signal Processing → Smooth,默认方法选Savitzky-Golay,窗口大小别超过5,平滑次数1次就够。窗口开太大,峰高会被削低,半峰宽会被拉宽,后面算晶粒尺寸就废了。
数据准备的最后一步,是判断背景形状。XRD背景通常来自非晶相、荧光、空气散射等,整体是缓慢变化的曲线,个别区域还有鼓包。拟合前你要在心里清楚:哪些区域是没有衍射峰的纯背景区,比如谱图最前端和最末端,以及两个峰距离较远时的底部区域。这些背景点是你之后扣基线时的重要参考。
2. 关于拟合你不得不知道的几个参数
2.1 全峰拟合的数学模型到底是怎么回事
把XRD拟合说透,其实就是一句话:用一组已知形状的函数去叠加,逼近你实测的图谱曲线。每个衍射峰对应一个数学函数,峰函数的叠加结果加上背景函数,就是拟合曲线。
你可以把它想成拼乐高。每个衍射峰是一个标准零件,背景是底座,你需要调整每个零件的位置(峰位)、大小(峰高、峰面积)和宽度(半峰宽),拼出来的整体轮廓要和实测曲线尽可能像。拟合算法做的事,就是不断调整这些参数,让拟合值和实测值之间的残差平方和最小化。
Origin里的非线性拟合就是干这个的。它用的核心算法通常是Levenberg-Marquardt,一种兼顾速度与稳定性的迭代优化算法。你不用懂算法细节,但有两个概念必须清楚:初始值和收敛。初始值给得越接近真实值,拟合越容易收敛;初始值离谱,算法就可能跑到沟里去,甚至直接报错。
2.2 峰形函数怎么选:高斯、洛伦兹还是伪Voigt
峰形函数的选择直接决定拟合质量。常见的峰形函数有三个:
- 高斯函数(Gaussian):峰形比较圆润,适合仪器宽化占主导的情况,比如高分辨衍射仪测出的峰
- 洛伦兹函数(Lorentzian):峰形有较长的尾巴,适合晶粒细化、微观应变引起的宽化
- 伪Voigt函数(PseudoVoigt):高斯和洛伦兹的加权组合,一个参数就能调节两者比例,适用范围最广
我在实际项目里,90%的情况直接用PseudoVoigt。它能兼顾两种宽化机制,拟合结果也稳定。只有一种情况我建议用纯高斯:峰特别弱、信噪比差的时候。峰形函数越简单,拟合参数越少,越不容易发散。
在Origin里选峰形函数的位置是:Analysis → Peaks and Baseline → Multiple Peak Fit → Open Dialog,在弹出的界面里找到“Peak Function”下拉框,选PseudoVoigt。中文界面就叫“伪Voigt”。
如果你发现样品峰形明显不对称,比如低角度侧拖尾、高角度侧陡峭,标准对称峰函数拟合不好,可以考虑A Pearson VII或者Clauss峰形,但这类情况通常会建议你去做结构精修,而不是在Origin里死磕。Origin毕竟不是专门做晶体结构精修的软件,它的长项是快速提取峰参数。
2.3 基线背景怎么设,半峰宽基线范围怎么选
基线问题是XRD拟合里最容易扯皮的地方,也是网上搜索最多的关键词之一。很多人问“半峰宽基线范围怎么选取”,其实它说的是同一件事:一个衍射峰的左右两个端点落在哪里。
半峰宽(FWHM)的定义是峰高一半处的宽度,但这个宽度受到基线位置的直接影响。如果你基线抬高了,峰看起来变矮,半峰宽会变化;基线歪了,峰面积也会偏。所以基线范围选取的原则非常明确:必须取在峰两侧没有其他衍射峰干扰的区域。
实操中怎么找这个区域?先把图谱局部放大,找到这个峰的左右两侧。一般取峰的底部最接近背景的那两个点作为起止范围。如果相邻峰靠得很近,底部互相交叠,就取两个峰之间的谷底作为边界。如果谷底不明显,一个妥协办法是——用局部最小值的连线作为基线延伸,但这个操作要小心,选错了会把肩峰全吃掉。
Origin的Multiple Peak Fit工具里,自动寻峰后会为每个峰自动生成一个基线范围,默认是连接两个端点的一条直线。这属于线性基线,适合简单情况。如果整个图谱背景本身就有弧度,比如非晶鼓包比较大,建议在拟合之前先手动扣除背景:Analysis → Peaks and Baseline → Baseline → Create Baseline,选好背景点后让软件插值生成一条背景曲线,再Subtract掉。
注意:基线范围只影响当前峰的宽度和面积计算,如果你的样品本身非晶含量很高,背景是一个明显的漫散鼓包,用线性基线必然导致峰面积虚高。这种情况最好用插值法做背景扣除,或者把背景函数加入拟合。
3. 保姆级实操:在Origin里完成XRD全峰拟合
3.1 先用单个峰试手:完整跑一遍拟合流程
第一次做全峰拟合,别贪多,先选一个独立、强度高、周围没有邻居峰的衍射峰练手。这样你能直观看到每个参数的作用,也不至于被一堆峰搞乱。
大致流程是这样的:
把数据表和绘图窗口准备好,确保横轴是2θ、纵轴是强度。然后到菜单栏找Analysis → Peaks and Baseline → Multiple Peak Fit → Open Dialog。英文版这里会弹出一个拟合向导,第一步让你选择需要拟合的数据,一般默认就是当前激活的绘图数据,点OK继续。
接着它会让你选峰形函数和基线类型。峰形选PseudoVoigt,基线类型选Linear或Constant。再点下一步,来到自动寻峰界面。这里有两个参数需要设置:Threshold(阈值)和Smoothing(平滑点数)。
Threshold表示峰高的阈限,软件会忽略峰值强度低于这个阈值的峰。初始值可以设成图谱最大强度的1%到5%,后期根据弱峰识别情况再调低。Smoothing是寻峰前做的平滑窗口,一般设3到5就够,太高会把真正的峰平滑掉。
点击Find Peaks后,软件会在图谱上标记出找到的峰。这时候把窗口关闭,回到图上,你会发现每个峰的位置多了一条垂直线和中心点。检查一下有没有峰被漏掉或者多出来,手动调整的办法是:在Multiple Peak Fit界面里选择Add或Modify,直接在图谱上点击你想要的位置,或者编辑参数表里的Center值。
最后点击Fit,软件开始迭代。迭代结束后,结果会输出到一张新工作表,里面有每个峰的Center、FWHM、Height、Area,还有拟合的R²值。一个新手上路,能把这套流程完整走通,就相当于学会了八成。
3.2 多峰拟合:一次处理整个XRD图谱
单峰练熟后,就可以上全峰拟合了。全峰拟合和单峰的区别,只是把“自动寻峰”得到的多个峰同时拟合。步骤上,你在同一个Multiple Peak Fit向导里,把Threshold调低,让软件识别出尽可能多的峰,然后手动整理峰列表。
一个很重要的原则:自动寻峰只是一个起点,永远不要指望它一次到位。你必须在拟合前对照XRD标准卡片,把你预计存在的峰全部检查一遍。比如某种材料在33°附近理论上应该有衍射峰,但强度很低,自动寻峰没识别出来,你就得手动加进去。
整理好峰列表后,点击Fit。这时还有几个参数可以设置:
- 迭代次数:默认100,一般够用,但如果你发现拟合不收敛,可以增加到500
- 收敛容差:默认1E-9,通常不用动
- 权重:XRD强度数据本身遵循泊松统计,强度越大误差越小,用1/Y作为权重更合理
这些选项在More按钮里,英文界面叫“Fit Options”。如果你刚开始用,可以直接默认设置,遇到问题再调整。
多峰拟合经常会遇到的一个现象是:拟合出来某几个峰的位置偏移了正常值。排除样品本身的问题,大概率是因为相邻峰重叠严重,互相拉扯,导致峰位偏移。解决办法是给峰位加边界约束,比如你从卡片上知道这一相的标准峰位在28.44°,就把Center的上下限设为28.4±0.1°。这个操作在参数表里直接编辑即可,右键“Parameter”列,可以勾选“Fixed”或者设置Bound。
3.3 参数锁定和分段拟合:让结果更稳定的实战策略
全峰拟合最怕的是把所有峰和参数一股脑丢给算法,让它自由调整。尤其是在弱峰多、重叠多的情况下,算法很容易跑飞。我常用的套路是“先强后弱,逐段锁定”。
具体操作分三步:
先把图谱中几个强度较高、独立性好、卡片索引明确的峰挑出来,只拟合这几个峰。拟合完成后,记录下它们的峰位、峰高、半峰宽。然后把这些峰的参数从自由改为固定或者给很窄的上下限。最后,把剩下的弱峰、肩峰加入列表,再次拟合。此时因为强峰已经稳定,弱峰受到的拉扯会小很多,拟合更容易收敛。
这个策略在处理多相混合物的XRD时尤其好用。比如你的样品里主相是A,第二相B含量不到5%,B的峰只有一两个若隐若现的小鼓包。你如果一上来就全峰自由拟合,算法很可能把B的小鼓包当背景或者噪声处理掉。但先把A相所有峰锁定好,再强制把B相的峰加进列表,B峰才能被“逼”出来。
另一个技巧是分段拟合。如果图谱的角度范围很大,比如10°到100°,前面的峰和后面的峰峰形差异很大,建议把范围切开,比如10°到50°一段,50°到100°一段,分别拟合。段与段之间留着一些重叠区域,拟合完对比一下重叠处峰的参数是否一致,一致就说明结果可靠。
3.4 拟合结果怎么看,晶粒尺寸怎么算
拟合完成后,Origin会在工作区生成一个结果表,表里的核心参数有这几列:
- 峰序号(Peak Index)
- 峰中心位置(Center)
- 峰面积(Area)
- 峰高(Height)
- 半峰宽(FWHM)
- 每个参数的拟合误差(Standard Error)
看结果时,第一件事不是看R²,而是看Standard Error。如果某个峰的标准误差大得离谱,比如峰位误差有±0.5°,说明这个参数没有很好地被约束,你需要回去加边界限制重新拟合。
R²一般是0.99以上才算拟合得好,但R²高不代表峰参数就对。更可靠的判断是看残差曲线,Origin拟合后会生成残差图,残差应该均匀地分布在零线附近,而不是有明显规律性的波浪。残差出现波浪,说明你漏掉了一个峰,或者峰形函数选得不对。
用FWHM算晶粒尺寸,公式是Scherrer公式:
D = K·λ / (β·cosθ)
这里D是晶粒尺寸(nm),K是形状因子,一般取0.9;λ是X射线波长,铜靶取0.15406 nm;β是半峰宽,单位必须换算成弧度,且要先扣除仪器宽化;θ是衍射峰的布拉格角,单位是角度。
举个例子:某衍射峰位于2θ=38.2°,也就是θ=19.1°,FWHM实测为0.32°,换算成弧度是0.32 × π/180 = 0.005585 rad。假设仪器宽化已经扣掉,那么D = 0.9 × 0.15406 / (0.005585 × cos19.1°)。cos19.1°约等于0.945,算出来D ≈ 0.1387 / 0.005278 ≈ 26.3 nm。整个过程直接塞进Excel或者Origin公式列就能批量算。
4. 弱峰处理:这可能是你最需要的部分
4.1 为什么你的弱峰总是拟合失败
弱峰之所以让人头疼,不是因为峰本身有多难拟合,而是它和噪声之间的界限实在太模糊。XRD图谱里,真正的衍射峰是宽的、有一定对称性的凸起,而噪声是高频率、小振幅的抖动。当峰强只有噪声的两三倍时,人的眼睛还能勉强看出来,但自动寻峰算法经常会忽略,或者把噪声当成峰。
更麻烦的是,弱峰往往和旁边的大峰距离很近,大部分峰身都压在大峰的尾巴上。这种情况下,如果基线选得不够好,弱峰分分钟被基线吞掉。很多同学拟合弱峰失败,不是算法不行,而是前期准备时根本没给弱峰留活路。
4.2 四种让弱峰现形的办法
对付弱峰,我有四个常用的办法,按推荐顺序排列:
第一是局部放大。把Y轴范围缩到弱峰峰强附近的区间,比喻说整体强度是5万,弱峰可能只有300,把坐标范围改成0到1000,你会发现原本埋在底部的那些小凸起有一个其实是峰。双击Y轴,在Scale里调整From和To就行。
第二是平滑。前面我说过不建议对全谱平滑,但针对弱峰区域做轻度平滑是可以的。方法是用工具菜单里的Smooth选项,选Savitzky-Golay,窗口3到5。平滑后,高低起伏的噪声会被捋平一点,弱峰的轮廓会稍微清晰一些。注意平滑只用于辅助判断,不要用平滑后的数据做最终拟合,我一般还是用原始数据拟合。
第三是二阶导数法。很多重叠峰的位置在原始图谱上看不出来,但它们的二阶导数会发生符号变化。Origin里可以在数据分析菜单找Derivative,对Y列求二阶导,然后观察导数值的局部极值来判断是否存在隐藏峰。这个方法对分析肩峰特别管用,我有一次在45°附近一个看似单峰的鼓包里,用二阶导数找出了三个重叠峰,后来对照卡片完全吻合。
第四是对照PDF卡片。如果你已经用Jade或者其他工具大概知道样品里有哪些物相,直接查PDF卡片上各物相的标准峰位,看看你图谱上对应角度是否有一点点异常。哪怕只是有稍微的鼓起,都值得把峰加进拟合列表试一下。
4.3 弱峰拟合的实战参数设置技巧
经过上面四步,你已经确定某个角度存在弱峰,接下来就是怎么拟合才不会翻车。我的建议如下:
先拟合强峰并锁定。这个前面讲过,不再重复,这是弱峰拟合成功的前提。
弱峰峰值初始值不要给太高。弱峰的真实高度大概就在你估的范围内,别给一个明显超过周围噪声的初始值。初始值给太高,拟合时会往下压,容易跑偏;给太低,峰可能被算法判定为不需要。
给弱峰设置严格的参数上下限。峰位上下限可以根据卡片值,比如卡片上写33.12°,你就设33.0°到33.3°。FWHM上下限也要设,比如不能低于0.1°、不能高于1.0°。这样即使算法迭代时想跑飞,也会撞到边界弹回来。
弱峰用简单峰形函数。建议用高斯函数,参数少,稳定。
弱峰拟合是一个反复试探的过程,通常你加了峰、设好参数、拟合完之后发现残差变得更整齐了,就说明加对了。如果拟合后弱峰峰位飘得很远,或者峰面积变成负的,说明这个位置其实没有峰,趁早删掉。
注意:弱峰的峰面积本身误差就很大,如果你要用弱峰面积去做定量分析,至少要将拟合的Standard Error控制在20%以内。控制不住的话,只能增加实验时的扫描时间,从数据源头提高信噪比。
5. 常见问题与排查技巧实录
5.1 拟合不收敛,多半病根在初始值
我遇到过太多人说“拟合不收敛”,但其实问题不是算法不行,而是初始值给得太离谱。比如你让算法从峰位20°开始拟合一个实际在38°的峰,算法可能迭代几百次也找不到正确的谷底。
解决办法很简单:先自动寻峰,把自动寻峰的峰位当作初始值,然后稍微调整后再拟合。如果还是收敛不了,就减少待拟合的峰数量,或者把固定几个参数锁定。还有一种可能,是图谱本身信噪比太差,算法无法判断峰的真实位置,这种情况就回到实验层面,重新扫描或者提高扫描计数时间。
5.2 拟合结果R²很高,但算出来的晶粒尺寸明显不合理
R²高不代表拟合结果物理上合理。一个典型的例子:你把几个弱峰强加进去,拟合曲线确实就把噪声盖住了,残差也小,但那些“峰”其实是纯噪声,它们的FWHM随机分布,算出的晶粒尺寸自然乱七八糟。
所以一定要养成看残差图和峰参数误差的习惯。如果某个峰的Standard Error很大,尤其FWHM的误差超过20%,这个峰的参数就不要用来做后续分析。还有一种情况是,有人把Kα2峰和Kα1峰当成两个独立峰拟合了,导致FWHM数值偏低。铜靶衍射仪如果不加单色器,Kα2峰会跟随在Kα1峰高角度一侧形成肩峰,拟合时需要把它纳入峰形模型,或者先用软件剥离Kα2,否则FWHM会失真。
5.3 半峰宽基线范围到底怎么选才稳
这个话题值得再强调一次。基线范围直接影响FWHM和面积,但很多同学对“范围”的理解是,光谱上左右各选两点就行。其实更稳的做法是分三步走:
先不要设基线,直接用默认线性基线拟合一次,看拟合结果的残差。残差在峰底部出现系统性下弯,说明基线设定范围太宽,把邻峰的尾巴也算进来了;残差在峰底部出现上鼓,说明基线范围太窄,没有包含足够的背景区域。根据残差方向,微调峰的起点和终点,反复试几次,直到残差在峰两侧基本平直。
这个“残差反馈法”是我在无数份数据里试出来的,比盯着图谱凭感觉猜要靠谱得多。特别是处理密集多峰区时,基线范围稍微差一丁点,出来的峰面积能差百分之十几。
5.4 快速排查表:常见问题的原因和解决办法
| 现象 | 可能原因 | 解决办法 |
|---|---|---|
| 拟合不收敛 | 初始值偏差大、峰数量过多 | 自动寻峰结果作为初值、减少峰数、锁定部分参数 |
| 峰位偏移很大 | 邻峰重叠拉扯、初始值误差 | 设置峰位上下限、先拟合强峰再拟合弱峰 |
| 峰面积是负的 | 该位置没有真实峰、基线选取错误 | 删除该峰、重新设定基线范围 |
| 残差有规律波浪 | 漏峰、峰形函数不合适 | 添加遗漏峰、改用伪Voigt |
| FWHM算出的粒径太小 | Kα2未剥离、把噪声当峰拟合 | 剥离Kα2、检查弱峰可信度 |
| 中文界面找不到英文菜单 | 版本和语言差异 | 对照菜单翻译表,或者切换英文界面 |
5.5 中英文界面菜单对照,别被教程绕晕
网上的教程大部分是英文界面,你用中文版找起来确实会懵。这里整理了一份高频菜单对照:
- Analysis → Peaks and Baseline → Multiple Peak Fit(分析 → 峰值与基线 → 多峰拟合)
- Fit Options(拟合选项)
- Peak Function(峰函数)
- Baseline Mode(基线模式)
- Threshold(阈值)
- Find Peaks(自动寻峰)
- Fix/Free(固定/释放参数)
- Residual(残差)
- Standard Error(标准误差)
把这几组词记下来,你在任何版本里都不会迷路。
6. 写在最后的真心话
XRD全峰拟合这个东西,说难也难,说简单也简单。难在你要懂一点峰形函数的背景知识,要会判断基线范围,要有耐心去处理一堆弱峰。简单在只要你按部就班走一遍流程,把初始值给好、把参数约束设好,大部分拟合问题都能解决。
我自己做了几十组数据之后最大的体会是,拟合之前一定要先想清楚“我这个样品里应该有什么相”,而不是漫无目的地让软件去找峰。你如果对样品体系有预判,拟合时就会主动很多,弱峰不会被漏掉,结果也更可信。刚开始拟合得一团乱也别慌,把峰的位置初值改成标准卡片的值再试一次,很多莫名其妙的错误一下就消失了。
最后分享一个我一直在用的小习惯:拟合完不要只在Origin里看一眼R²就关掉,把拟合参数导出成文本,连同残差图一起存到项目文件夹里,后面写文章、补审稿意见的时候,你会感谢当时的自己。