简介:本资源是一份面向材料科学与工程领域科研人员及高年级本科生的SHPB动态力学实验数据处理工具包,聚焦解决霍普金森杆实验中原始信号解析难、应力应变曲线构建繁琐等核心问题。压缩包仅含1个MATLAB脚本文件(SHPB_x.m),大小仅1KB,轻量但功能完整,涵盖滤波去噪、入射/反射/透射波识别、动态声速计算、基于应力波理论的应力应变曲线生成及非线性模型适配等关键处理流程。已有977人学习下载,适用于高校实验室SHPB实验教学辅助、科研数据快速初筛与结果可视化分析。读者可直接调用该脚本完成从原始电压信号到动态力学参数(如屈服强度、动态弹性模量)的端到端计算,并结合注释理解各步骤物理意义与算法逻辑,显著提升数据处理效率与结果可靠性。
1. SHPB到底是什么,为什么数据处理这么关键
干过冲击动力学实验的人都知道,SHPB(Split Hopkinson Pressure Bar,分离式霍普金森压杆)这名字听着高大上,实际上就是一套研究材料在高应变率下力学行为的经典装置。什么叫高应变率?简单说就是材料在极短时间内被高速压缩或拉伸,应变率能达到10²~10⁴ s⁻¹这个量级。你平时在万能试验机上拉一根钢筋,应变率大概在10⁻³ s⁻¹左右,差了至少五个数量级。
SHPB实验能解决什么问题?金属、混凝土、岩石、聚合物、泡沫材料,甚至复合材料,只要你想知道它在爆炸冲击、高速碰撞、弹道侵彻这些场景下的力学响应,都绕不开SHPB。汽车碰撞安全设计、防护结构设计、航天器抗撞击分析,这些工程问题背后的材料本构参数,很大程度上都依赖于SHPB实验数据。
但这里有一个很扎心的事实:SHPB实验的精度,很大程度上不取决于实验设备本身,而取决于数据处理。设备再精密,传感器标定再准确,如果数据处理方法不对,出来的应力-应变曲线照样是废的。
我见过不少刚入门的同学,实验做完,采集系统导出一堆电压时间曲线,对着屏幕发愣,完全不知道从哪下手。还有人拿Excel硬算,公式套错一个符号,整条曲线全废,最后还查不出问题在哪。实际上SHPB的数据处理是有固定流程的,核心公式就那么几个,难点在于每个环节怎么处理细节、怎么排除干扰、怎么判断结果是否可靠。
这篇内容就是把我这些年处理SHPB数据的经验整理出来,从应力波基础理论讲到具体操作流程,再到常见坑的排查,尽量让没有冲击动力学背景的同学也能照着做出来。适合谁看?正在做SHPB实验的研究生、刚接手SHPB设备的技术人员、以及想系统梳理数据处理流程的从业者。
说到数据处理流程,现在业内也在往数据驱动框架、批量自动化处理的方向走。以前大家习惯用Excel一步步点,效率低不说,出了错还不好追溯。我现在基本都用Python脚本做批处理,一次能处理几十组数据,滤波参数、时间对齐、应力平衡校验这些环节全部自动化,既省时间又不容易出错。这个思路后面会详细讲。
2. 处理数据前必须吃透的三个应力波基础
2.1 一维应力波理论:SHPB成立的基石
SHPB的原理其实不复杂。一根入射杆、一根透射杆,中间夹着试件,子弹以一定速度撞击入射杆的自由端,产生一个近似矩形的应力波,沿入射杆传播到试件位置,一部分反射回来,一部分透射过去。通过贴在杆上的应变片,记录下入射波、反射波和透射波三个信号,然后利用一维应力波理论反推出试件的应力、应变和应变率。
这里的一维应力波理论,是整个数据处理的理论基础。它有几个基本假设:
杆中传播的应力波是平面波,也就是说波在杆截面上的分布是均匀的,每个截面只存在轴向应力和轴向应变。第二个假设是杆始终保持弹性变形,杆的波阻抗(密度乘以波速)和试件相比足够大,这样杆上的应变信号不会因为大变形而失真。第三个假设是试件在变形过程中处于应力均匀状态,也就是试件两端承受的力相等。
这三个假设,前两个靠实验设计保证,第三个则需要数据处理时用波形去验证。如果试件太长、应变率太高,试件内部的应力可能来不及达到平衡,这时候算出来的结果就要打问号。
波速的计算也要注意。很多人直接用钢材的理论波速5190 m/s,但实际上波速和杆的弹性模量、密度有关,最好用实验实测值。方法很简单:在入射杆上贴两个应变片,间距已知,敲击一次,测量两个应变片接收到波峰的时间差,用距离除以时间差就是实际波速。这个实测波速比理论值更靠谱,因为杆材的实际弹性模量和密度往往和标称值有偏差。
2.2 三波法和二波法:两个公式走天下
处理SHPB数据,最终要得到的是试件的应力、应变和应变率随时间的变化,再通过消除时间参数,得到应力-应变曲线。这三个量怎么算?核心公式如下:
试件中的平均应力:
σ_s(t) = E_b × A_b / (2 × A_s) × [ε_i(t) + ε_r(t) + ε_t(t)]
试件的应变率:
ε̇_s(t) = C_b / L_s × [ε_i(t) - ε_r(t) - ε_t(t)]
试件的应变:
ε_s(t) = C_b / L_s × ∫₀ᵗ [ε_i(τ) - ε_r(τ) - ε_t(τ)] dτ
其中E_b是杆的弹性模量,A_b是杆的横截面积,A_s是试件的横截面积,C_b是杆中的波速,L_s是试件的初始长度,ε_i、ε_r、ε_t分别是入射波、反射波和透射波的应变信号。
这就是所谓的“三波法”,入射、反射、透射三个信号都用上了。三波法的好处是自动考虑了试件两端应力的非平衡状态,当试件比较长、应变率比较高、应力均匀性难以保证时,三波法比二波法更准确。
二波法只用反射波和透射波。因为根据一维应力波理论,在应力均匀假设成立时,入射波和反射波的关系满足ε_i = -(ε_r + ε_t),代入三波法公式可以消掉入射波,得到:
σ_s(t) = E_b × A_b / A_s × ε_t(t)
ε̇_s(t) = -2 × C_b / L_s × ε_r(t)
ε_s(t) = -2 × C_b / L_s × ∫₀ᵗ ε_r(τ) dτ
二波法计算简单,物理意义也很清晰:透射波直接反映试件中的应力,反射波直接反映试件的变形速率。在试件较短、应力均匀性好的情况下,二波法和三波法的结果应该非常接近。
那到底用哪个?我的建议是优先用二波法,同时用三波法做校验。如果两条曲线重合得很好,说明应力均匀性假设成立,结果可靠。如果差异明显,说明实验本身有问题,要么试件太长,要么应变率太高,要么波形质量太差,这时候不是纠结用哪个公式的问题,而是需要检查实验设计。
2.3 原始波形长什么样,哪段能用哪段不能用
从采集系统导出的原始数据,通常是电压随时间变化的曲线,经过应变片灵敏系数换算后才能变成应变信号。在做任何计算之前,先得搞清楚波形上哪一段是入射波、哪一段是反射波、哪一段是透射波。
典型的SHPB波形是这样的:入射杆上的应变片先记录到一个向上的矩形脉冲,这是入射波;随后会记录到一个反方向的波形,这是反射波,由入射波在试件界面反射产生。透射杆上的应变片则记录到透射波,幅值比入射波小很多,形状也相对平缓。
这里有个容易犯的错误:把入射波和反射波搞混。入射波是子弹撞击产生的正向波,反射波是试件界面反射回来的反向波,两者方向相反。如果应变片贴的是全桥或半桥接法,反射波的极性会和入射波相反,这在数据处理时要注意符号处理。
波形上的噪声处理也很有讲究。原始信号里往往混有高频振荡,这些振荡一部分来自子弹撞击时的机械振动,一部分来自电路噪声。如果直接拿原始信号去计算,积分出来的应变曲线会非常毛糙,甚至出现明显漂移。滤波是必须的,但滤波参数选不好又会把真实信号削掉,这个平衡怎么把握,后面实操部分会细讲。
还有时间零点的问题。入射波到达应变片的时间点,不等于波到达试件的时间点,两者的时间差取决于应变片到试件端面的距离和波速。在做时间对齐时,需要把三个信号统一到同一个时间基准上,通常是统一到波到达试件端面的时刻。很多刚上手的人在这一步容易出错,导致反射波和透射波的时间轴错位,算出来的应力-应变曲线就会变形。
3. 实操全过程:从原始波形到应力-应变曲线
3.1 原始数据的预处理
拿到采集系统导出的数据,第一步不是急着套公式,而是先把原始信号处理好。这一步决定了后续所有计算的质量,值得多花心思。
首先做电压到应变的换算。应变片输出的电压信号和应变之间的关系由桥路类型和灵敏系数决定。以常用的1/4桥接法为例:
ε = 2 × V_out / (V_ex × G_F)
其中V_out是桥路输出电压,V_ex是桥路激励电压,G_F是应变片的灵敏系数(通常是2.0左右)。如果是半桥或全桥接法,换算系数要相应调整。不同采集系统的换算公式可能略有差异,最稳妥的办法是用标准信号源标定一次,直接把系数标定出来。
然后是零点修正。实验前采集一小段基线信号,这段信号理论上应该是零,但由于电路漂移等原因往往有微小偏置。把所有数据减去基线的平均值,就能消除这个偏置。这一步看似简单,但如果不做,积分出来的应变会线性漂移,到最后应力-应变曲线尾段会翘上去。
接下来是滤波处理。SHPB信号中的有效成分主要在较低频段,高频振荡对积分结果影响很大。数字滤波器的选择,我比较推荐零相位滤波,也就是用filtfilt这类双向滤波方法,它可以避免普通滤波器带来的相位偏移。滤波截止频率怎么定?要看你的信号主频。一般来说,入射波脉宽对应的基频大概在几千赫兹量级,可以先做一次FFT看看频谱,把截止频率设在有效信号能量的90%以上所在的频段。
滤波是SHPB数据处理中最容易翻车的环节。截止频率设太高,高频振荡滤不干净,积分结果毛糙;设太低,把真实信号也削了,应力峰值和应变曲线的形态都会失真。我的习惯是先观察原始波形,确定信号的上升沿有多陡、振荡频率大概在哪个范围,再选截止频率。通常先试10 kHz,看滤波后波形是否平滑,如果还有明显振荡就降到5 kHz,如果波形变形就往上调。
滤波做完后,还需要做时间对齐。前面提过,入射杆和透射杆上的应变片距离试件的位置不同,信号到达时间不同。为了后续计算方便,需要把三个波形的起点统一。方法:分别找到入射波、反射波、透射波的波前起点时刻,然后以试件中心为基准做时间平移。还有一种更简单的做法:因为波速已知,直接计算应变片到试件端面的距离除以波速,得到时间偏移量,然后平移信号。
3.2 试件两端应力的计算与应力平衡校验
预处理完成后,就可以正式计算了。这里我建议先做应力平衡校验,再决定用二波法还是三波法。
应力平衡校验的思路很简单:在试件两端,入射端的力F₁由入射波和反射波共同决定,透射端的力F₂由透射波决定。如果试件处于应力均匀状态,那么F₁应该等于F₂。
F₁(t) = E_b × A_b × [ε_i(t) + ε_r(t)] F₂(t) = E_b × A_b × ε_t(t)
实际操作中,把F₁和F₂随时间变化的曲线画在同一张图上,看它们是否在整个加载过程中基本重合。如果两条曲线在上升段和峰值附近都比较接近,说明应力平衡良好。如果差异很大,说明试件内部应力不均匀,计算结果可能不可靠。
这个校验不是可做可不做的。SHPB数据处理的一个核心假设就是应力均匀,如果这个假设不成立,不管用二波法还是三波法,结果都存在问题。业内通常以F₁和F₂的偏差小于5%作为合格标准。我在实际经验中遇到的情况是,容易在混凝土、泡沫这类低波阻抗材料上出现应力平衡差的问题,因为波在试件中来回传播需要时间,试件越厚、波速越低,达到应力平衡的时间就越长。
如果应力平衡校验不通过,有几种补救思路。一是检查试件两端是否涂了润滑剂,摩擦效应会在试件内部产生不均匀的应力状态。二是检查试件的长径比是否合适,SHPB标准试件的长径比一般在0.5到1.0之间,太长的试件很难达到应力平衡。三是降低子弹速度,减小加载应变率,让试件有更充分的时间达到均匀变形。
应力平衡校验通过后,选择二波法还是三波法就有依据了。前面说了,二者结果一致说明实验质量好,如果差异在5%以内,用哪个都行。如果差异稍大,优先使用三波法,因为它不要求应力均匀假设完全成立,理论上更鲁棒。这里也要提醒一句:三波法虽然更稳健,但如果三个信号的时间对齐做得不好,反而会引入额外误差。所以时间对齐这步一定要仔细。
3.3 应变率与应变的积分
得到试件的应力后,还需要计算应变率。应变率是试件变形快慢的度量,SHPB实验的一个重要产出就是不同应变率下的应力-应变曲线。
按二波法的公式,应变率ε̇_s(t) = -2 × C_b / L_s × ε_r(t)。注意这里有个负号,因为反射波是拉伸波还是压缩波取决于实验类型。对于压缩实验,反射波通常是反向的,负号是为了让应变率为正值。很多人在这一步容易搞错符号,导致应变率是负的,整个应变轴就反了。
应变是应变率对时间的积分。积分时要注意初始条件:实验开始时试件还未变形,所以初始应变为零。实际操作中,从反射波的起点开始积分,积分到反射波结束。积分可以用数值方法,最简单的是梯形法。在Python里用numpy的cumtrapz或者scipy的integrate.cumulative_trapezoid就能搞定。
积分这个环节也有坑。最典型的问题是反射波信号如果没滤干净,积分后噪声会累积成趋势项,导致应变曲线在结束时候不为零甚至一直往上飘。这就是为什么滤波在预处理环节一定要做好。还有一种情况是积分起点没找准,提前或延后积分,会导致应变偏移。解决办法是设置一个触发阈值,当反射波幅值超过基线噪声的若干倍时才认为波前到达,从该点开始积分。
试验结束后试件会有残余变形,但应变计算的终点通常取在加载波形结束处,而不是等到试件完全卸载。因为SHPB实验关注的是动态加载阶段的材料响应,试件回弹阶段的信号已经不属于有效加载范围。具体取哪个点,可以观察反射波信号,当反射波回到基线水平时,积分停止。
应变积分完成后,把应力σ_s(t)和应变ε_s(t)对应起来画图,就得到了应力-应变曲线。注意横轴是应变,纵轴是应力,单位要统一。应力通常用MPa,应变通常用mm/mm或者百分数。如果应变率不是一个恒定值,而是一个随时间变化的过程,通常取塑性变形阶段的平均应变率作为该次实验的标称应变率。
还有个细节:试件的截面积A_s和长度L_s,到底应该用初始值还是实时值?SHPB理论公式中默认使用试件的初始尺寸,因为推导过程中做了小变形假设,用初始尺寸计算得到的应力和应变是工程应力和工程应变。如果需要真实应力和真实应变(对数应变),需要额外做转换。对于大变形材料,比如泡沫金属、橡胶这类,工程应力和真实应力的差异可以达到百分之几十,处理时要特别注意。
4. 常见问题与排查技巧实录
4.1 试件两端应力不平衡,结果还能用吗
这是我被问得最多的一个问题。应力平衡这个事,说到底是时间尺度的问题。应力波从入射端传到透射端需要时间,这个时间和试件长度成正比,和试件中的波速成反比。对于金属试件,波速高、长度短,几个微秒就能达到平衡。对于泡沫、橡胶这类软材料,波速只有几百米每秒,平衡时间就要长得多。
如果应力平衡校验没通过,并不意味着数据完全不能用,但要分情况讨论。如果应力平衡只是上升段有偏差,而峰值附近两条力曲线基本重合,那么计算出的峰值应力还是有一定参考价值的。如果整个加载过程两条力曲线都不重合,那这组数据的可信度就很低了,建议重新做实验,而不是硬着头皮处理。
有几个提高应力平衡质量的实际操作技巧:
试件两端面一定要平行,端面不平会导致局部应力集中。试件端面和杆端面之间要涂润滑剂,石墨脂或二硫化钼润滑脂都行,目的是减小端面摩擦。摩擦不仅影响应力平衡,还会让试件处于三向应力状态,算出来的单轴应力就不准了。
还有一种做法是采用“脉冲整形技术”。在子弹和入射杆之间加一片黄铜或橡胶整形片,把陡峭的矩形波变成上升沿更缓的斜坡波。这样试件承受的加载更平缓,应力均匀性显著提高。脉冲整形是解决应力平衡问题的有效手段,尤其是做软材料、脆性材料实验时基本是标配。
另外要注意试件的长径比。SHPB标准中推荐试件长径比0.5~1.0是有道理的,长径比过大,试件惯性效应明显,应力平衡更难。如果实验不允许改变试件尺寸,那就要降低加载应变率,让波在试件内有更多来回反射次数,以帮助达到应力平衡。
4.2 波形振荡太多,怎么滤波才不伤数据
SHPB波形上的高频振荡,是数据处理中无法回避的问题。振荡的来源主要有几个:子弹撞击瞬间产生的机械振动、应变片粘贴质量不佳带来的噪声、采集系统的电路噪声、以及波在杆中传播时的高阶模态弥散。
机械振动引起的振荡频率一般在几十千赫兹以上,和信号主频区分明显,滤波可以较好地处理。应变片粘贴不良导致的噪声往往带有明显的毛刺特征,滤波效果有限,更根本的解决办法是重新贴片。杆中波的弥散效应则是SHPB实验的固有物理现象,源于杆的横向惯性效应,高频成分传播速度比低频成分慢,导致波在传播过程中发生波形畸变,这种畸变无法通过滤波完全消除。
滤波参数的选择,我的经验是先做频谱分析再定截止频率。具体操作:对入射波段做FFT,观察频谱分布,通常有效信号的能量集中在一个较窄的频带内。把截止频率设在信号能量峰值的2到3倍处,既能保留信号的主要成分,又能滤掉大部分高频振荡。
我用得比较多的是巴特沃斯零相位低通滤波器,阶数一般取4阶。阶数太低,滤波效果不明显;阶数太高,可能导致信号边缘出现振铃现象。滤波过程中还有一个容易被忽视的问题:滤波起点和终点的边缘效应。因为数字滤波器的响应需要一定的过渡时间,信号两端的处理结果可能失真。解决办法是给信号两端各扩展一段数据,滤波后再截掉。Python的scipy.signal.filtfilt会自动做边缘扩展,用起来比较省心。
有一点必须强调:滤波不是万能的,不要指望靠滤波把烂数据变成好数据。如果波形振荡严重到看不出信号主轮廓,那说明实验本身可能有问题,比如杆没对中、应变片粘贴有问题、子弹速度不稳等。这时候应该排查实验问题,而不是一味调低截止频率。我见过有人把截止频率降到1 kHz,波形倒是平滑了,但应力峰值被削掉20%以上,这就完全失真了。
4.3 原始信号饱和或削顶怎么处理
采集系统量程设置不当,信号幅值超出量程范围,会出现削顶现象。波形顶部被削平,峰值信息丢失。这个问题在入射波段最常见,因为子弹撞击入射杆的瞬间产生的高幅值脉冲往往超出预期。
如果发现信号削顶,这组数据的入射波峰值已经失真,应该重新做实验,并适当调小采集系统增益或者减小子弹速度。有一种临时补救的思路:如果削顶只是发生在一个很窄的区间,而反射波和透射波都正常,可以用理论关系估算削顶部分的入射波幅值,但这只能作为权宜之计,不要作为标准做法。
预防削顶的办法:正式实验前先做一次试射,观察信号幅值是否在量程的50%到80%之间。留出一定的余量,避免因为信号波动超出量程。这个习惯值得养成,试射的成本远低于正式实验后数据作废的成本。
4.4 时间轴对不准,出来的曲线歪七扭八
时间对齐的问题,在同时采集多个通道信号时很常见。入射杆和透射杆上的应变片距离试件的位置不同,信号到达各自应变片的时间也不同。如果不做时间对齐,直接用原始时间轴计算,试件两端应力的时间关系就乱了,应力-应变曲线的形态会完全走样。
时间对齐的标准做法有以下几种:
第一,物理时间平移法。已知应变片到试件端面的距离L_g,以及实测波速C_b,那么时间偏移量Δt = L_g / C_b。入射杆应变片的信号要加上Δt,透射杆应变片的信号要减去Δt,这样所有信号就统一到了试件中心位置的时间基准上。这个方法的前提是波速准确,所以前面说的实测波速是很重要的。
第二,波前检测法。对每个通道的信号进行波前检测,找到波前到达的时刻,然后以入射波波前为基准,把所有信号平移到同一时刻。这种方法不需要依赖波速,但需要波前检测准确。
第三,互相关法。如果两个信号本身有相似性(比如入射波和透射波的上升段),可以用互相关函数计算两个信号之间的时间延迟,然后对齐。这个方法在信号质量较差时容易失效,我一般不用。
在实际处理中,我习惯同时用第一和第二种方法相互验证。如果两者给出的一致性很好,说明时间对齐没大问题。如果差异明显,就要仔细检查,可能是波速标定有误,也可能是波前检测不准。
5. 从手动处理到批量自动化:Python脚本思路
5.1 为什么建议用脚本而不是Excel
SHPB实验不是只做一次,而是要做一组,比如同一材料在不同应变率下各做3到5次,加上不同材料对比,一次实验下来几十组数据是常事。用Excel手动处理,每一步都要重复操作,费时费力不说,还容易出错。更麻烦的是,一个月后领导说“把截止频率从10 kHz改成8 kHz重新处理”,你就要把那几十组数据重新点一遍。
用脚本处理的好处是显而易见的:参数可配置、过程可复现、结果可追溯。你把所有原始数据放进一个文件夹,脚本按文件名遍历,统一做滤波、时间对齐、应力平衡校验、二波法计算,最后把应力-应变曲线和特征值汇总表输出到一个Excel里。整个过程十几秒跑完,参数改了重跑一遍,省下的时间可以用来多分析几组数据。
这也是为什么现在业内越来越强调数据驱动框架。所谓数据驱动框架,对于SHPB来说就是把“数据读取-预处理-计算-校验-可视化-结果输出”这套流程标准化、自动化、可追溯。实验数据是宝贵的,一套好的处理框架能让你从繁琐的重复劳动中解放出来,把精力放在数据分析和实验设计上。
编程语言方面,Python是目前最主流的选择。numpy做数值计算、scipy做滤波和积分、pandas做表格处理、matplotlib做绘图,这些库覆盖了SHPB数据处理的全部需求。如果没写过代码,也不用怕,照着下面这个最小可用脚本的思路改改参数就能跑。
5.2 一个最小可用的处理流程
下面是一个处理单组SHPB数据的简化流程,我用伪代码的方式展示核心逻辑,方便大家理解每一步在做什么。
import numpy as np from scipy.signal import butter, filtfilt from scipy.integrate import cumulative_trapezoid # 1. 加载原始数据 data = np.loadtxt('shot_001.csv', delimiter=',', skiprows=1) t_inc = data[:, 0] # 入射杆应变片时间 eps_inc_raw = data[:, 1] # 入射杆应变信号 t_trans = data[:, 2] # 透射杆应变片时间 eps_trans_raw = data[:, 3] # 透射杆应变信号 # 2. 参数设置 E_b = 210e9 # 杆弹性模量,单位Pa C_b = 5100.0 # 实测杆波速,单位m/s D_b = 0.02 # 杆直径,单位m A_b = np.pi * D_b**2 / 4 # 杆截面积 D_s = 0.015 # 试件直径,单位m A_s = np.pi * D_s**2 / 4 # 试件截面积 L_s = 0.010 # 试件长度,单位m # 3. 零点修正 baseline_inc = np.mean(eps_inc_raw[:200]) baseline_trans = np.mean(eps_trans_raw[:200]) eps_inc = eps_inc_raw - baseline_inc eps_trans = eps_trans_raw - baseline_trans # 4. 滤波(零相位低通) def lowpass_filter(signal, cutoff, fs, order=4): nyquist = 0.5 * fs normal_cutoff = cutoff / nyquist b, a = butter(order, normal_cutoff, btype='low') return filtfilt(b, a, signal) fs = 1.0 / (t_inc[1] - t_inc[0]) # 采样率 eps_inc = lowpass_filter(eps_inc, cutoff=10e3, fs=fs) eps_trans = lowpass_filter(eps_trans, cutoff=10e3, fs=fs) # 5. 时间对齐(假设应变片到试件端面距离已知) L_g_inc = 0.5 # 入射杆应变片到入射端距离 L_g_trans = 0.5 # 透射杆应变片到透射端距离 dt_inc = L_g_inc / C_b dt_trans = L_g_trans / C_b # 平移后的时间轴以试件中心为基准 # 具体平移量需要根据应变片位置和波传播方向确定 # 6. 应力平衡校验 # 入射端力 F1 = E_b*A_b*(eps_inc + eps_ref) # 透射端力 F2 = E_b*A_b*eps_trans # 对比F1和F2是否接近 # 7. 二波法计算 # sigma_s = E_b*A_b/A_s * eps_trans # edot_s = -2*C_b/L_s * eps_ref # eps_s = -2*C_b/L_s * integral(eps_ref, t) # 注:eps_ref是反射波信号,需要从入射杆应变信号中分离 # 8. 输出应力-应变曲线 import matplotlib.pyplot as plt plt.plot(eps_s, sigma_s/1e6) plt.xlabel('Strain') plt.ylabel('Stress (MPa)') plt.show()这个流程里还缺一个关键环节:如何从入射杆上的总信号中分离出入射波和反射波。入射杆应变片记录的是入射波和反射波的叠加,但因为两者在时间上先后到达,如果时间窗口选取得当,可以在时间轴上直接划分出“纯入射波区段”和“纯反射波区段”。做法是:先找到入射波的起点和结束点,入射波结束后反射波开始前,中间有一段信号回落到基线的窗口,这个窗口用于区分两个波。
在自动化脚本里,波前检测通常用阈值法。设置一个阈值,比如基线噪声标准差的5倍,信号超过阈值就认为是波前到达。然后从波前开始向后搜索信号回落到基线以下的点,作为波的结束点。这样就能准确截取出各段波形。
批量处理时,还有一个很实用的功能:把每一组数据的处理质量指标自动汇总。比如应力平衡的最大偏差、平均应变率、峰值应力、峰值应变这些特征值,统一输出到一个表格。这样扫一眼就能判断哪些实验数据质量好、哪些需要重做,比一张一张翻曲线高效得多。
5.3 结果验证的几个土办法
用脚本处理完数据后,不能直接拿结果就写报告。我一般会用几个“土办法”验证处理结果是否合理。
第一个土办法:把算出来的峰值应力和杆上直接测量的透射波峰值做一个粗略对比。如果透射波应变峰值乘以杆弹性模量,再乘以截面积比,得到的应力和计算出的试件峰值应力在合理范围内一致,说明计算逻辑没大问题。
第二个土办法:检查应力-应变曲线的形态是否合理。金属材料应该有明显的弹性段、屈服段和应变硬化段。如果有奇怪的波动、负应变、应力反复震荡,大概率是数据处理环节有问题。
第三个土办法:把同一条件下多次实验的曲线叠加在一起看。同一材料的重复性实验,曲线应该基本重合。如果某条曲线明显偏离,检查这组数据的原始波形、滤波参数、时间对齐,找出差异来源。
第四个土办法:把实验结束后的试件拿出来量一下残余变形,和计算得到的最终应变做个对比,差异在合理范围内说明应变计算是可靠的。这个方法虽然土,但非常管用。有一次我用脚本处理完一组泡沫铝数据,最终应变算出来是0.42,量了下试件,理论残余应变应该在0.48左右,差异比较大,后来查出来是积分窗口没取对,修正后差异就缩小到了5%以内。
6. 不同材料类型的处理差异与进阶经验
6.1 金属材料:常规流程基本够用
金属材料是SHPB最经典的适用对象。强度高、波速高、试件尺寸标准,数据处理相对简单。中低应变率下,应力平衡很好,二波法和三波法结果几乎一致。处理金属材料数据时,重点注意两点:一是确认试件是否发生大塑性变形,如果工程应变超过0.1,要考虑是否转换为真实应力应变;二是注意应变率的均匀性,如果反射波在加载过程中形状不规则,应变率就会波动明显,这时候可以用应变率-时间曲线来标定“平均应变率”,而不是简单取峰值。
金属材料还有一个常见问题:入射波幅值大,透射波幅值也相对大,透射波信号质量通常很好。但也正因为透射波幅值大,如果透射杆上的应变片量程不够或者增益设置不当,容易出现削顶。我处理过一批高强钢数据,透射杆信号削顶后峰值应力明显偏低,最后只能重做实验。所以测高强材料前,一定要预估透射波幅值,适当降低增益。
6.2 脆性材料:处理细节决定成败
混凝土、岩石、陶瓷这类脆性材料,在SHPB实验中破坏应变很小,通常只有千分之几到百分之几,但破坏过程极其短暂。数据处理时最大的难点是:试件在很短时间内就开裂破坏,应力平衡很难在破坏前完成。所以脆性材料SHPB实验,应力平衡校验往往是不过关的。
这就引出一个业界常用的后处理技巧:通过“选波”来获取有效数据。脆性材料试件破坏后,透射波会发生突然跌落,这个跌落点就是试件破坏的时刻。在数据处理时,只取破坏时刻之前的数据用于计算,破坏之后的数据已经不能反映试件的完整力学行为。这样处理出来的“峰值应力”实际上代表了材料的动态强度。
脆性材料的应变计算也有特殊性。因为破坏应变小,积分窗口短,对时间对齐和滤波参数的敏感度很高。滤波截止频率稍微调低一点,峰值应变可能就会差10%以上。处理这类数据时,我建议把滤波截止频率固定在一个标准值,比如10 kHz,并且记录每次实验的处理参数,方便横向对比。
还有脉冲整形技术在脆性材料实验中几乎是必须的。不加整形片的情况下,脆性材料试件在应力波上升沿阶段就提前破坏,无法测量到峰后行为。加了整形片之后,加载波上升沿变缓,试件内部应力分布更均匀,破坏前的应力平衡质量显著改善。
6.3 软材料与泡沫材料:信号弱是最大的坎
泡沫铝、橡胶、凝胶这类材料,波阻抗远低于金属杆。实验结果的特点是:透射波幅值很小,反射波幅值很大。透射波信号往往淹没在噪声里,信噪比很差。这是所有SHPB数据处理中最难处理的情况。
对于这类材料,有几个工程化的处理手段。一是用半导体应变片替代金属箔式应变片,灵敏度可以提高几十倍,能够捕捉更微弱的透射信号。二是增加透射杆应变片的桥路增益,但这同时会放大噪声,需要在硬件上做好屏蔽。三是采用石英晶体传感器嵌入透射杆测量透射力,这种方法在超软材料测量中很常见,但数据处理流程和传统应变片方法略有不同,需要用传感器的标定系数直接把电压换算成力。
软材料的应力平衡问题也很突出。由于试件中波速很慢,应力平衡时间很长,在高应变率下几乎不可能达到理想平衡。所以软材料SHPB实验的应变率范围通常比金属材料低一个数量级。在处理这类数据时,要特别关注反射波的形状,反射波应该是一个光滑的近似矩形波,如果反射波形状怪异,说明试件变形不均匀。
我在处理泡沫材料数据时还遇到过一个坑:试件变形量很大,甚至超过了初始长度的50%,试件的实时截面积和长度都在显著变化,再用初始尺寸计算应力应变会产生显著误差。这时候需要采用“名义应力-名义应变”加“体积不变假设”修正,或者直接使用高速摄影测量试件的实时变形,把实时尺寸代入计算。高速摄影和SHPB的同步,现在是做超大变形材料实验的标配方案。
7. 数据质量管理与可重复性
7.1 数据质量评估的几个硬指标
处理完数据后,不能光看曲线好不好看,还要有几个量化指标来评估数据质量。我通常关注以下几个指标,并在实验记录表中逐项登记:
应变率均匀性:把应变率-时间曲线画出来,看加载段内应变率的波动范围。好的实验应在塑性变形阶段保持相对稳定的应变率,波动范围最好在20%以内。如果应变率波动大,说明试件变形不稳定,结果要谨慎使用。
应力平衡偏差:计算整个加载过程中入射端力和透射端力的最大偏差百分比。偏差在5%以内为优秀,5%到10%为可用,超过10%建议重新实验。
波形一致性:同一条件下重复多次实验,各次实验的入射波应该基本一致,说明子弹速度稳定、实验条件可控。如果入射波本身偏差大,那后续计算结果的可比性就无从谈起。
信噪比:透射波峰值幅值与噪声幅值的比值。对于金属材料,信噪比通常很高,几十甚至几百都很正常;对于软材料,信噪比可能只有个位数,这时候数据质量就很勉强了。
每次实验结束后,我习惯把原始数据、处理脚本、处理参数、输出结果、质量指标全部归档在一个文件夹里,文件名带日期和实验编号。这样后续复查、重新处理,或者写论文时补充分析,都能很快找到所有相关信息。这套习惯看起来简单,但真到出成果的时候,能省出大量时间。
7.2 重复性与标定:别让数据骗了你
SHPB实验的可重复性,直接影响数据可信度的上限。同一条件下做3次实验,每次算出来的峰值应力差异如果在5%以内,说明实验系统稳定、数据处理可靠。如果差异超过10%,就要回头找原因是实验设备问题还是数据处理问题。
标定方面,除了前面提到的波速标定,还有一个容易被忽略的环节:系统延时标定。采集系统的触发和信号记录之间可能存在固定延时,这个延时虽然很小(微秒量级),但对于高应变率实验来说可能对应几个百分点的应变偏差。建议在实验前用同步方波信号测试一下采集系统的通道间延时,把这个值记录在案,在数据处理时统一扣除。
还有一个标定是应变片灵敏系数的验证。应变片出厂时标称灵敏系数为2.0±1%,但粘贴后的实际灵敏系数可能因粘贴质量有偏差。严谨的做法是在正式实验前,用一根已知弹性模量的标准杆做一次已知应力波传播的标定实验,反算实际灵敏系数。这个系数如果偏离2.0太多,就要检查应变片的粘贴质量了。
数据管理这件事,往往被很多实验室忽视。等到论文返修时,审稿人要求补充某组数据的处理细节,如果文件归档混乱,找起来会非常痛苦。我现在处理SHPB数据的习惯是:每完成一组实验,当天就把原始数据和初步处理结果归档,并写清楚实验参数和处理参数。这套流程看起来繁琐,但长期坚持下来,对科研效率的提升是非常显著的。
7.3 论文和报告中该汇报哪些关键信息
写论文或者实验报告时,SHPB数据的汇报方式也有讲究。很多初学者只放一张最终的应力-应变曲线,完全不交代实验条件和数据处理细节,这在同行评审时是站不住脚的。我建议在报告中至少包含以下信息:
实验的基本参数:杆的材料和直径、试件的材料和尺寸、子弹的速度或入射波幅值、加载应变率。这些直接决定实验的可比性和可信度。
波形验证图:把入射波、反射波、透射波的原始波形经过滤波后画出来,至少放一张代表性的波形图。审稿人可以通过波形判断实验质量,这是SHPB论文的标配。
应力平衡验证图:入射端力与透射端力随时间变化的对比图,用于证明应力均匀性假设成立。如果论文涉及脆性材料或高应变率,这个图尤为重要。
处理参数的说明:滤波截止频率、积分窗口、时间对齐方法等。不同实验室的处理方法可能不同,写清楚能让读者理解和复现。
应力-应变曲线的统计信息:至少给出3次重复实验的代表性曲线和平均值,并标注误差范围。单一曲线代表不了实验的可重复性,审稿人对这一点很敏感。
做到这几点,SHPB数据报告的专业度会有质的提升。很多人在不同实验室之间对比数据,发现同样的材料测出来差异很大,往往不是材料批次问题,而是实验条件和数据处理方法不一致。数据可比性的根子在于标准化,把数据处理流程规范起来、把关键参数记录清楚,是每个做SHPB实验的人都应该重视的基本功。
我个人在实际操作中的体会是,SHPB数据处理说难不难,说简单也不简单。公式就那么几个,但每一步都有讲究,一个参数选错、一个符号搞反,结果可能就完全跑偏。最实用的建议就是:固定一套流程、固定一组参数,形成自己的处理规范,每次实验都用同一套逻辑处理,这样出来的数据才有一致性。后面数据处理多了,你看到曲线形态基本就能判断实验做得好不好、数据可不可信,这种直觉是练出来的,不是看教程看出来的。
最后再分享一个小技巧:拿到一组新数据,先别急着全套处理,先挑一组信号质量最好的数据,手动一步步算一遍,把每一步的中间结果记下来。然后用脚本处理同一组数据,对比结果是否一致。如果一致,说明脚本逻辑正确,再放心跑批量。这个验证步骤只花十几分钟,但能避免批量处理完发现逻辑错误、所有结果报废的灾难。
本文还有配套的精品资源,点击获取