ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于MATLAB的声发射RA-AF裂纹模式识别脚本解析

基于MATLAB的声发射RA-AF裂纹模式识别脚本解析 搞材料分析的朋友应该都遇到过这种情况声发射仪采了一堆数据波形图密密麻麻但真正要回答的问题只有一个——这批信号里到底是拉伸裂纹多还是剪切裂纹多我今天要分享的MATLAB脚本就是专门干这件事的自动算RA值幅度比和AF值频率比然后一键出图把裂纹模式直观分出来。适合正在做混凝土、岩石、金属或复合材料声发射实验又不想在数据整理上耗太多时间的人。先说清楚这个脚本不会帮你解决“怎么采集信号”的问题它解决的是采集之后最头疼的环节把波形里的特征参数提取出来算成RA和AF再画成散点图。整个过程不需要手动挑数据也不需要在Excel里来回折腾。我自己最初是拿实验室积累的旧数据来试的后来发现换一批材料、换一个采集系统也照样能跑只要把阈值参数重新标定一下就行。这篇文章就把脚本的拆分思路、核心代码、踩过的坑一次讲完。1. 先搞清楚RA值和AF值到底在衡量什么1.1 声发射检测里裂纹类型为什么要“认出来”声发射AE说白了就是材料在受力时内部裂纹萌生、扩展所释放的弹性波。传感器贴在试件表面把这种微小的振动变成电信号。信号里藏着很多信息比如波形峰值多大、持续时间多长、频率多高。但问题是材料内部的裂纹不是一个模子刻出来的——有些是张开型裂纹拉伸主导有些是滑移型裂纹剪切主导。这两种裂纹对结构安全的影响完全不同所以光知道“有裂纹”远远不够还得知道“什么类型的裂纹”。这就是裂纹模式识别的价值。早期做声发射的工程师基本靠波形形状猜上升时间短、幅值高的信号通常被认为和拉伸裂纹相关上升时间长、频率偏低则倾向于剪切裂纹。问题在于人工判断效率低而且标准不统一同一个信号两个人能看出两种结果。后来行业内逐步形成了以RA值和AF值两个参数为核心的定量判别方法正好适合脚本自动化处理。1.2 RA和AF的物理含义与组合逻辑RA值的中文叫幅度比等于上升时间除以幅值。上升时间指信号从越过触发阈值开始到达到最大振幅所经过的时间幅值就是信号峰值的绝对值。可以这样理解如果裂纹扩展很“干脆”波形一下子就冲到峰值那么上升时间短RA值就小如果波形拖拖拉拉、慢慢爬升到峰值RA值就大。后者在剪切型裂纹中更常见。AF值的全称是平均频率等于振铃计数除以持续时间。振铃计数是信号在阈值上下振荡的次数持续时间是信号从触发到回落到阈值以下的时间长度。平均频率高说明这个事件振荡得又密又快通常对应高频的拉伸裂纹平均频率偏低则更像低频的剪切活动。单独看RA或单独看AF都会误判但把两个放在一张图里横轴RA、纵轴AF信号会自动分成两个区域——这就是所谓的RA-AF关联分析。从物理机制上看这个组合逻辑并不复杂拉伸裂纹扩展速度快、释放能量集中波形尖锐且高频成分丰富剪切裂纹往往伴随摩擦滑移波形更宽、上升更缓、持续时间更长。RA-AF关联图利用的正是这两类裂纹在波形形态上的系统性差异。需要提醒的是这个方法属于参数分析法不是万能的不同材料的阈值会有差别但作为第一层快速分类手段实用价值非常高。2. 脚本设计的四个模块从波形文件到分类结果2.1 整体流程和MATLAB为什么顺手整个脚本的流程可以压缩成四句话读入波形切出单个AE事件提取特征参数最后计算RA/AF并绘图。我最初考虑过用Python写但最后还是回到MATLAB原因有三个。第一实验室的采集系统很多都直接导出成MATLAB能读的mat格式或TDMS格式省去了格式转换的麻烦。第二信号处理工具箱里的滤波、峰值查找、过零检测函数非常成熟写代码能少一半工作量。第三也是最实际的——出图太方便了。科研和工程报告里最需要的是能直接用的图scatter、histogram、set(gca,XScale,log)这些命令几行就能搞定。脚本本身不追求把每个功能都做成一个独立函数而是分成四个模块。这样做的直接好处是你换了实验设备或者改了采样率只需要动第一段想改分类判据只需要动第三段想换个样式的图只需要动第四段。模块之间通过几个变量衔接不看代码也能猜到数据流。2.2 模块划分与每步的输入输出第一个模块是数据导入。输入是原始波形文件输出是一个时间序列数组和采样率Fs。这个模块看起来简单但一定要搞清楚单位。很多数据采集卡导出的电压单位是伏特也有些系统给的是毫伏。如果这里不统一后面算RA值会差出一千倍整个图直接废掉。第二个模块是事件切分。原始波形不是每一段都有信号没有裂纹扩展时基本是噪声。脚本用阈值触发的方式找出“值得分析”的片段超过阈值的地方标记为事件起点掉回阈值以下并持续一段时间后标记为事件终点。这一步的输出是一个结构体数组每个元素包含一个事件的时间索引范围。第三个模块是特征提取。对每个事件分别计算四个基础参数上升时间、幅值、振铃计数、持续时间。这四个参数对应标准声发射仪里常说的“AE特征”。第四个模块负责计算RA值和AF值做分类然后绘图。到这里脚本的核心功能就闭环了。实际写的时候我会把事件切分和特征提取做成函数因为这两个模块在不同数据上反复用到。其他部分直接写在主脚本里方便根据当天数据的情况手动调参。3. 核心代码拆解特征提取、RA/AF计算与自动分类3.1 从一个AE事件里把特征抠出来假设你已经从原始波形里切出了一段疑似AE事件的信号数组sig采样率是Fs单位Hz时间轴可以表示为t(0:length(sig)-1)/Fs。下面这段代码处理单个事件也是整个脚本最核心的部分。% 单个AE事件特征提取 vTh 0.05; % 触发阈值单位与sig一致伏特或毫伏 idx find(abs(sig) vTh); if isempty(idx) return; end tStart t(idx(1)); % 首次越过阈值的时间 tEnd t(idx(end)); % 最后越过阈值的时间 [peakA, idxPeak] max(abs(sig)); % 峰值幅值和位置 tPeak t(idxPeak); % 峰值时间 riseTime tPeak - tStart; % 上升时间单位秒 amplitude peakA; % 幅值单位取决于输入信号 upCount sum(diff(sig vTh) 1); % 正向上穿阈值次数 downCount sum(diff(sig -vTh) 1); % 负向下穿阈值次数 counts upCount downCount; % 振铃计数 duration tEnd - tStart; % 持续时间单位秒 % 计算RA和AF RA riseTime / amplitude; % 幅度比单位 s/V或 s/mV AF counts / duration; % 平均频率单位 Hz这里有两个细节容易翻车。第一峰值位置的判断。如果阈值设得很低idx(end)可能比真正的峰值位置晚很多导致riseTime偏大。稳妥的做法是用max(abs(sig))找峰值点而不是用最后一个过阈值点。第二振铃计数。有些采集系统把振铃计数定义为越过阈值的次数有些定义为包含正负方向的振荡次数。上面代码用的是正方向加负方向的计数和多数设备输出更接近。如果你拿到的设备已经有导出的AE参数表可以直接跳过这段把现成的rise time、amplitude、counts、duration读进来算RA和AF。3.2 单位换算与RA/AF计算最容易错的地方RA和AF的计算公式一分钟就能背下来但单位问题能让结果完全变样。常见文献里RA值用的是ms/V也有的用µs/mV两者数值差一千倍AF值常写成kHz但有些数据集duration给的是秒有些给的是毫秒。脚本里最好一开始就约定好上升时间统一转换成毫秒ms幅值统一转换成伏特V持续时间统一转换成秒s振铃计数保持无量纲。这样RA的单位就是ms/VAF的单位是Hz换算成kHz时除以1000。我在实际处理中遇到过这样的数据某实验室采集卡的幅值默认输出为毫伏而上升时间单位是微秒。直接按文献阈值去套RA值全部小到接近零图上所有点都挤在左下角。后来花了一晚上排查才发现是单位没换算。所以脚本里专门写了一段单位归一化代码把不统一的输入强制转成约定格式。配上一个简单的计算示例会更直观。设一个事件上升时间32µs幅值500mV持续时间120µs振铃计数15。换算后上升时间0.032ms幅值0.5V持续时间0.00012s。RA0.064ms/VAF15÷0.00012125000Hz125kHz。如果把幅值单位写成mV直接代入RA会变成0.000064ms/V差了一千倍这个错在报告里极难发现。3.3 自动分类固定阈值还是聚类RA/AF计算完成之后下一步就是分类。分类有两种常见思路一种简单粗暴固定阈值划分另一种相对智能用聚类算法自动分堆。固定阈值适合你已经对材料特性比较了解的场景聚类适合你手头数据混杂、想先快速探索一下分布特征的场景。固定阈值的代码很直接RA_th 50; % ms/V可根据材料标定 AF_th 20; % kHz label zeros(length(RA), 1); label(AF AF_th RA RA_th) 1; % 拉伸裂纹 label(AF AF_th RA RA_th) 2; % 剪切裂纹 label(label 0 (AF AF_th | RA RA_th)) 3; % 混合/过渡聚类方式稍复杂一点。先用kmeans把数据分成两类再根据两个簇中心的RA大小判断哪个簇更像剪切裂纹% 注意直接对RA和AF做kmeans前建议先归一化或取对数 [idx, C] kmeans([RA(:), AF(:)], 2, Replicates, 5); if C(1,1) C(2,1) shearIdx (idx 1); tensIdx (idx 2); else shearIdx (idx 2); tensIdx (idx 1); end如果数据本身没有明显分离特征聚类结果会很飘。我建议先用固定阈值跑一遍再用聚类结果对照验证两种方法结论接近才说明分类可信。此外对AF取对数后再聚类往往效果更好因为AF值跨度可以从几kHz到几百kHz线性空间下低值区的差异会被高值区掩盖。4. 出图和结果解读怎么判断脚本跑得对不对4.1 三张图散点图、时序图、幅值图出图是MATLAB的强项也是这套脚本最提升效率的地方。第一张图是RA-AF散点图横轴RA、纵轴AF。拉伸裂纹集中分布在左上区域剪切裂纹集中在右下区域。把两类点用不同颜色标出来再加一条分界线一行legend就能表达清楚。figure; hold on; scatter(RA(tensIdx), AF(tensIdx), 30, b, filled); scatter(RA(shearIdx), AF(shearIdx), 30, r, filled); set(gca, XScale, log, YScale, log); xlabel(RA值 (ms/V)); ylabel(AF值 (kHz)); legend({拉伸裂纹, 剪切裂纹}, Location, best); grid on;这里推荐用log坐标。原因很简单AF值范围经常横跨两个数量级线性坐标下低频点全部挤在一起看不出分布趋势。双对数坐标能同时照顾高值和低值区域散点分布会清晰得多。第二张图是时间演化图把每个事件按发生时间着色看裂纹模式随加载过程怎么变化。很多试件在加载早期以拉伸裂纹为主到了临近破坏阶段剪切裂纹占比上升。这种趋势在散点图上用颜色渐变就能直观反映出来。scatter(RA, AF, 30, eventTime, filled); colorbar; xlabel(RA值 (ms/V)); ylabel(AF值 (kHz)); title(裂纹模式随时间演化);第三张图是把RA和AF分别按事件序号画成折线图配合幅值一起看。有时候会发现在某个时间点RA突然激增、AF骤降这种情况往往对应一次显著的剪切滑移事件值得回头去看原始波形。只画一张散点图容易漏掉时间维度上的关键转折。4.2 结果合理性判断方法和材料相关性图出来之后第一反应不应该是“好看”而是“这结果对不对”。我的判断顺序是先看散点是否形成了可区分的簇再看簇的位置是否符合材料常识。比如混凝土受弯构件加载初期拉伸裂纹主导散点应该偏左上接近破坏时剪切裂纹增多右下的点会明显变密。如果实验过程明明是压剪加载结果却几乎全是拉伸裂纹那更像是阈值选错了而不是材料行为反常。另一个需要结合材料判断的点是阈值标定。前面示例里RA_th50ms/V、AF_th20kHz是混凝土领域常用的经验值直接拿到金属材料上就不一定成立。金属的声发射信号频率普遍更高持续时间短AF值整体会偏大。正确的做法是先用聚类自动识别再把簇中心坐标作为该材料下的参考阈值记录到脚本里。以后处理同种材料的数据固定阈值就用得上了。我还会做一次“人工抽样验证”从散点图的不同区域随机挑三五个事件回到原始波形看形状。左上区域的波形应该是尖峰、快速衰减右下区域的波形则更宽、有较长的拖尾。如果抽样结果不符合这个规律说明特征提取有问题而不是分类的问题。5. 常见问题与排查技巧实录5.1 高频问题速查表问题现象可能原因排查思路RA值整体偏小散点全挤在左下角幅值单位是mV但当成V计算检查幅值单位统一性确认是否除以1000AF值异常高达到MHz量级持续时间单位是ms但当成s计算把duration换算成秒后重新计算所有点分不出两个簇触发阈值过低把噪声也算成事件提高阈值或过滤掉幅值过小的事件聚类结果每次跑都不一样kmeans初始点随机或特征未归一化固定随机种子对特征取对数或归一化拉伸/剪切标签和试验常识完全相反聚类中心判断逻辑写反检查代码中簇中心RA大小比较方向图中出现大量孤立点某个事件被切分得不完整检查事件切分的最小持续时间限制以上这些问题我都实际踩过。尤其是聚类标签反了的那次代码逻辑看着没问题但忘了两个簇中心的顺序是随机的导致剪切簇和拉伸簇标反。后来改成根据RA均值大小强制指定才彻底解决。5.2 几个只有实测才能发现的坑第一个坑是阈值触发事件时会遇到信号在阈值附近反复穿越的“振铃尾巴”。一个完整AE事件可能被切成了好几段每段都只提取出一个很小的RA值导致散点图左下角堆出一片假象。解决方法是给事件切分加两个限制单段最小时间长度比如不少于30µs以及两段之间的最小时间间隔比如小于100µs就合并成同一个事件。第二个坑跟滤波有关。有些高频噪声会让振铃计数大幅增加AF值虚高把剪切裂纹的信号硬生生抬到拉伸区。处理方法是先对原始波形做高通或带通滤波MATLAB里用bandpass函数。sigFilt bandpass(sig, [20e3 400e3], Fs);然后基于滤波后的信号做特征提取。注意滤波频率范围要根据传感器频响来设置不能胡乱套用全网通用的参数。第三个坑是事件数量太少时统计结果没有意义。有些实验整个加载过程只采到几十个事件画在散点图上稀稀拉拉此时无论RA和AF趋势多明显都建议谨慎下结论。做声发射模式识别至少要几百个有效事件这个数量级下统计特征才稳定。最后分享一个我自己的实操体会RA-AF分类本质上是统计性判断不能迷信单个点。一次异常跳变可能只是采集卡受干扰但如果上千个点形成清晰的两团分布那结论基本可信。处理新数据时我都会先不加任何分类阈值看一眼裸散点图的形状再决定用固定阈值还是聚类——先观察再判断这套流程比拿到数据就硬套公式要靠谱得多。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进