☰
声发射信号上升时间计算详解:定义、算法与工程避坑
2026/10/3 8:55:12 网站建设 项目流程

简介:这份资源面向声学无损检测及材料状态分析领域的研究者与工程人员,围绕声发射(Acoustic Emission, AE)信号处理,提供一个MATLAB计算脚本。压缩包内含1个m文件,整体仅2KB,小巧精简,适合快速调用与二次修改。脚本可用于计算声发射信号的上升时间、信号幅度、持续时间、计数和能量等关键时域特征,其中上升时间反映事件发生的快慢,幅度与能量关联材料应变和损伤程度,计数则体现声发射活动频度。通过滤波、阈值设定等处理步骤提取这些特征参数,能够辅助识别疲劳裂纹、塑性变形等不同声发射源,为工程结构安全评估、故障诊断及材料性能研究提供量化依据。已有495人学习下载,对于需要入门声发射信号特征计算或验证算法的读者,这份脚本可以直接参考甚至复用,降低从理论到代码的落地门槛。

1. 上升时间这个参数,在 Acoustic_signal_computing 里为什么值得单独拎出来

声发射检测里我们记录到的是一条电压随时间变化的波形,上升时间就是从信号越过触发阈值到达到峰值的一小段。做声发射信号处理的人都知道,上升时间比幅度和能量难算得多,因为它对触发点、采样率、滤波器和传感器带宽都极其敏感。这个参数直接对应声源加载的快慢——ESD放电、裂纹扩展、纤维断裂都会在波形前沿留下各自的指纹。把上升时间算准了,声发射信号计算才算有了可靠的地基;算不准,后面所有特征判断都白搭。这篇文章写给正在搭声发射采集系统、或者需要分析瞬态声信号波形的人。

2. 上升时间的物理意义与定义口径:为什么同一个波形能算出两个结果

2.1 声发射特征参数里的上升时间到底指哪一段

在声发射检测标准里,上升时间通常被定义为信号幅值从超过阈值电平到达到最大幅值所经过的时间。这是一个以“阈值”为起点的工程定义,而不是教科书里信号幅度从10%涨到90%那个定义。换成波形图就是:估计一条AE波形,先画一条触发电平线,波形第一次穿过这条线那个时刻记为 t0,然后在后面找到波的最高峰的 t_peak,那么 t_peak 减 t0 就是上升时间。这个定义在传感器数据里很好理解,因为真实采集时,信号来之前是噪声,我们不可能从信号本身确定“0%幅度”起点,只能拿阈值和峰值两个点说话。

实际采集系统里传感器的带宽会限制上升时间的可测性。一个标称中心频率150kHz的谐振传感器,对陡峭前沿的响应本质上是一个衰减振荡,出来的波形上升时间由传感器Q值决定,可能被拉到好几个微秒。这意味着我们在示波器上看到的“上升时间”,并不完全是声源本身的属性,而是声源、传播路径、传感器和采集电路四者卷积的结果。理解这一点,就不会拿着一个绝对上升时间去硬套声源类型。

但这也会带出另一个经典问题:阈值的绝对电平和幅度百分比选法不同,最终上升时间就可能差出几倍。习惯上有的算法用固定电压阈值,比如2V;有的用信号峰值的一定比例,比如20%。如果波形前沿很陡,这两种算法结果差异很小;如果前沿缓,差异非常大。因此凡是跟上升时间相关的分析,都必须先把定义口径锁死,否则你拿两台仪器测同一个声源,数据都对,但算出来的上升时间对不上。

2.2 从物理过程看:上升时间反映声源的加载速度和传播路径

声发射源在材料内部发生瞬间能量释放时,会在结构里激发出弹性波。作用时间越短,激发的波频带就越宽,波形前沿也就越陡。这里有个很直观的关系:加载时间短,相当于在结构上猛敲一下,波的频谱分量明显变宽;加载时间长,波形前沿就变缓。所以上升时间在声发射源识别里被当成“加载快慢”的标记。

反过来,波在材料里传播过程中,高频分量衰减比低频快,这意味着距离声源越远,记录到的上升时间越长。同一个裂纹源,贴在5厘米处的传感器和贴在30厘米处的传感器算出的上升时间完全不同。弹性波在板结构中传播时还存在频散现象——不同频率的波传播速度不同,离声源稍远,波形前沿就会被拉散,上升时间显著变长。这和一个尖锐脉冲走过一段色散介质后被“摊开”是同样的道理。

所以在做声源分类时,上升时间必须和幅度、持续时间、振铃计数放在一起看,单独拿上升时间判断声源类型容易翻车。ESD放电这类电磁干扰源也常常在声发射监测里被“顺带”收到,它的特点就是放电时间极短,激发的弹性波前沿非常陡。实际记录到的ESD相关声信号,上升时间往往被传感器谐振和采集系统带宽共同塑造,不一定等于真实物理过程,这一点后面第4章单独展开。

2.3 三种常用计算口径和它们的适用场景

Acoustic_signal_computing 流程里,上升时间至少有三种不同的算法口径,下面这张表列清楚,后面写代码也按它走:

计算口径起点定义终点定义典型适用场景
阈值-峰值法信号越过固定/自适应阈值的时刻峰值电压最大点的时刻声发射标准特征参数,最通用
10%-90%法包络上升到峰值10%的时刻包络上升到峰值90%的时刻传感器性能测试,脉冲整形评估
斜率外推法拟合前沿最大斜率直线,外推到零的截距最大斜率直线外推到峰值的截距极窄脉冲、ESD放电信号,抗噪声强

阈值-峰值法最适合当成通用基线,因为声发射采集器自带硬件阈值,能直接输出这个参数。10%-90%法对前沿形状更敏感,但容易被叠加在平台上的振铃干扰。斜率外推法在上升时间很短的窄脉冲里表现好,因为你不需要准确找到10%点,只要前沿中段有一段直线段。

这三种口径应该怎么选?我通常的决策顺序是这样:如果数据来自标准声发射采集卡,阈值-峰值法最接近硬件里实际计算的数值,适合与历史数据对比;如果目标是评价传感器响应或者标定系统带宽,用10%-90%法;如果面对的是ESD耦合这类极窄前沿信号,斜率外推法更能反映系统能捕捉到的极限上升时间。不管用哪种,先固定下来,在整批数据里不要中途切换算法。

2.4 实测项目里怎么确定上升时间的测量窗口

上升时间计算并不是在整条波形上从头搜到尾,那样做几乎必然出错。真实AE波形持续几百微秒到几毫秒,包含多个振铃周期和可能的反射波,如果全局搜索峰值,很可能会在尾部几十个振铃之后才找到最大幅值,从而把上升时间算成整个衰减过程。

我一般会先定位触发点,再以触发点往后取一个与载波周期相关的窗口。窗口宽度通常是主频周期的2到5倍,既能涵盖第一个主峰,又不至于把第二、第三个振铃峰值带进来。窗口宽度也要记录到处理参数里,因为它是上升时间测量一致性的关键。工程上还有一种做法是直接搜索“触发点后的首个局部极大值”,将它的位置当作峰值点,这个办法对谐振型传感器特别有效。

3. 用 Python 算声发射信号上升时间:最小可跑通的实现与三个算法

3.1 准备一条可复算的波形:读文件、归一化与视野设置

我通常把声发射波形存成CSV或者WAV,先用Python读进来,看一眼原始波形再定算法。下面这段代码生成一条模拟AE波形,目的是让你不依赖实测数据也能完整跑通流程:

import numpy as np # 生成一条模拟声发射波形:衰减正弦带振铃,采样率1MHz,时长5ms fs = 1e6 t = np.arange(0, 0.005, 1 / fs) carrier = np.sin(2 * np.pi * 40000 * t) envelope = np.exp(-t * 800) window = (t > 0.0005) & (t < 0.0045) waveform = 0.8 * envelope * carrier * window # 加一点噪声,模拟真实前置放大器底噪 rng = np.random.default_rng(42) waveform += 0.01 * rng.standard_normal(len(t))

生成逻辑:载波40kHz,指数衰减包络时间常数约1.25毫秒,信号从0.5毫秒处开始出现,这样波形前沿就在0.5毫秒附近。加上0.01幅度的白噪声,模拟一个信噪比不高的采集环境。实际读数据时,用np.loadtxt或者scipy.io.wavfile.read替换掉生成逻辑就行。

拿到数据先做两件事。第一,确认波形峰值和噪声底;第二,确定分析的搜索窗口,不要在整条记录上找峰值,否则远处一旦出现更大的振铃或干扰,会把峰值点和上升时间整个带偏。窗口可以取触发时刻后0.5毫秒到1毫秒,具体长短根据信号的持续时间和衰减快慢调整。

3.2 阈值-峰值法:最基础也最容易埋雷的实现

先写一个直观的阈值-峰值法函数,输入是波形数组和时间轴,输出上升时间:

def rise_time_threshold(waveform, t, threshold): # 找第一次越过阈值的位置 over = np.where(waveform >= threshold)[0] if len(over) == 0: return np.nan # 阈值太高,整个波形都没触发 start_idx = over[0] # 峰值搜索窗口:从触发点往后看1/4信号长度,防止远处干扰 search_end = start_idx + len(waveform) // 4 segment = waveform[start_idx:search_end] peak_idx_local = np.argmax(segment) peak_idx = start_idx + peak_idx_local rise_time = t[peak_idx] - t[start_idx] # 线性插值修正过阈点,让起点更接近真实穿越时刻 t_cross = t[start_idx - 1] + (threshold - waveform[start_idx - 1]) / \ (waveform[start_idx] - waveform[start_idx - 1]) * (t[start_idx] - t[start_idx - 1]) rise_time_interp = t[peak_idx] - t_cross return rise_time, rise_time_interp

说明几点。第一,np.where(waveform >= threshold)取第一个过阈点,如果噪声先碰线,就会提前触发,所以阈值必须高于噪声底,否则算出的上升时间毫无意义。第二,峰值搜索窗口限定在触发后四分之一信号长度内,这是为了防止波形尾部出现更大的反射波或振铃导致峰值点跑远,实际项目里窗口应根据声源的持续时间来设。第三,返回两个值,一个是粗糙过阈时刻对应的上升时间,一个是经过线性插值修正过的结果。

插值修正很有用,尤其是采样率不够高时,阈值穿越点落在两个采样点之间,不修正的话起点误差就是一个采样周期。阈值取多少也很讲究。阈值设得很低、接近噪声底,起点就落在波形刚冒头的地方,上升时间偏长;阈值设到峰值的一半,起点后移,上升时间偏短。整批事件分析里,阈值必须保持不变,数据之间才有可能比。

3.3 10%-90%法与斜率外推法:处理窄脉冲时更稳

10%-90%法先把波形取绝对值,再做包络,避免载波过零导致阈值附近来回穿越。下面是核心代码:

from scipy.signal import hilbert def rise_time_10_90(waveform, fs): # 希尔伯特变换提取包络,相当于取信号外包络 analytic = hilbert(waveform) env = np.abs(analytic) peak = np.max(env) # 从峰值往前找10%和90%位置 p90 = 0.9 * peak p10 = 0.1 * peak idx_peak = np.argmax(env) seg = env[:idx_peak] idx90 = np.argmin(np.abs(seg - p90)) idx10 = np.argmin(np.abs(seg - p10)) if idx10 < idx90: return (idx90 - idx10) / fs return np.nan

用hilbert提取包络是常规做法,对衰减正弦也适用。10% 和 90% 都定义在包络上,从峰值位置往前找,保证起始点在上升沿上。这个算法对振铃不敏感,因为包络去掉了载波快速起伏,但要小心包络峰值如果取到过冲尖峰,90% 位置会被人为抬高。解决办法是先用截止频率合理的低通滤波器平滑包络,再进行百分比测量。

斜率外推法适合上升时间极短、采样点不够密的ESD类波形。原理是在前沿最大斜率处做一条直线,外推到基线和峰值水平线,两个交点的横坐标差就是上升时间:

def rise_time_extrapolate(waveform, fs): # 对波形做3点移动平均,防止单点噪声干扰斜率判断 kernel = np.ones(3) / 3 w = np.convolve(waveform, kernel, mode='same') diff = np.diff(w) idx_max_slope = np.argmax(diff) # 最大斜率位置 # 用最大斜率前后各几个点拟合直线 fit_start = max(0, idx_max_slope - 3) fit_end = min(len(w) - 1, idx_max_slope + 3) x = np.arange(fit_start, fit_end) y = w[fit_start:fit_end] k, b = np.polyfit(x, y, 1) # 与外推零电平和峰值电平求交点 baseline = np.min(w[:100]) peak = np.max(w) t_base = (baseline - b) / k t_peak = (peak - b) / k return (t_peak - t_base) / fs

斜率外推法抗噪声能力比10%-90%法弱,如果前沿叠加了明显噪声,最大斜率位置可能跳来跳去。工程上我会先做3点移动平均再求差分,最大斜率就不会被单点噪声干扰。外推法算出的上升时间比10%-90%法普遍偏小,因为它的含义是“如果一直维持最大加载速率”,本质上是一个极限估算。

3.4 预处理顺序:先通带、再包络、后测沿

不管用哪种算法,预处理顺序都会直接改变上升时间。常见顺序是先做带通滤波,再做包络,最后在包络上测沿。下面是一个可复用的预处理函数:

from scipy.signal import butter, filtfilt def preprocess_ae(waveform, fs, low=10e3, high=150e3): # 声发射信号典型频带10kHz-150kHz,滤掉电源噪声和高频EMI b, a = butter(4, [low / (fs / 2), high / (fs / 2)], btype='band') filtered = filtfilt(b, a, waveform) return filtered

参数说明:butter四阶带通,filtfilt做零相位滤波,避免群延迟把上升时间拉长。普通filter有相位延迟,会让波形前沿整体后移,虽然不影响阈值-峰值法的差值,但会让触发时刻变来变去;零相位滤波保证前沿位置不偏移。低通上限定在150kHz对大多数声发射事件够用,但如果信号本身带宽超出这个范围,比如某些ESD放电激励出的宽频响应,就需要把high抬高到采集系统能承受的极限。

预处理与上升时间测量的关系经常被忽略。高通滤波会削掉低频前沿,让波显得更陡;低通滤波会抹平高频,让上升沿变缓。所以同一波形,滤波参数一改,上升时间就会跟着变。写大批量处理脚本时,滤波器参数必须和采集参数一样写进配置中心,不能在代码里随手硬编码。

4. ESD放电这类窄脉冲声信号:采集参数怎么设才能保住上升时间

4.1 ESD放电的时间尺度对声发射分析意味着什么

静电放电ESD的电流脉冲特点是持续时间极短,脉冲宽度通常在1ns以下到200ns之间,上升时间则可以从200ps以下到10ns。这个量级比常见声发射源快得多,材料内部微裂纹扩展的上升时间是微秒级别,而ESD进入结构后激励出的弹性波前沿可以被压缩得非常陡。

对声发射采集系统来说,真正困难的是ESD的电磁脉冲会直接耦合进传感器信号线,被当成“完整声发射事件”记下来。你去看波形,前沿陡、幅度大、振铃丰富,很容易被误判成高强度的裂纹信号。这时候上升时间是个极好的鉴别特征:正常结构声发射的上升时间很难低于几百纳秒,而ESD耦合信号的上升时间往往就落在几纳秒到几十纳秒。算准上升时间,就能把这类干扰从事件流里筛出来。

4.2 采样率与带宽:要抓住纳秒级前沿,得多快才够

工程上一个经验法则是信号上升时间与带宽的乘积约为0.35到0.4。上升时间10ns对应约35MHz带宽,采样率至少要350MHz才能在前沿上保留几个有效采样点。如果上升时间真的到200ps,带宽需求直接跳到1.75GHz,普通声发射采集卡完全跟不上,必须用高速数字化仪。下面给一张工程估算参考表:

目标上升时间估算信号带宽采样率下限建议
10ns约35MHz350MHz-1GS/s
100ns约3.5MHz35MHz-100MS/s
1微秒350kHz3.5MHz-10MS/s

我一般会按“采样率至少是信号带宽的10倍”来配系统,但声发射传感器本身有谐振频率,通常在几十kHz到几百kHz,所以传感器才是瓶颈。几十万元的高速采集卡接到一个150kHz的谐振传感器上,记录到的上升时间仍然是传感器的响应时间,不是ESD的真实物理量。因此4.1节说的“ESD上升时间在10ns以下”,在实际声发射系统里几乎测不到,正是传感器带宽限制的结果。这个认知要先建立起来,不要拿高速示波器测到的电气参数直接套到声信号计算里。

4.3 传感器与前置放大器选型:上升时间测准的前提

要保住微秒级声发射上升时间,传感器谐振频率至少要在信号频带以上。压电声发射传感器有宽频型和谐振型两类:谐振型灵敏度高但带宽窄,记录出来的上升时间会被谐振拉长;宽频型带宽平直,记录的前沿更接近真实。若目标是分析上升时间,我宁可牺牲一点灵敏度,也要选带宽覆盖主要频段的宽频传感器。

前置放大器的高通滤波对上升时间影响极大。有些商用声发射前置放大器内置了30kHz或50kHz的高通,目的是滤掉低频振动干扰,但同时会把上升时间人为变陡。这时如果信号真实频谱集中在100kHz以下,出来的波形前沿完全失真。我在测试环境里会有意识地用全通或低截止频率的放大器做对比,确认内置滤波到底改了什么。

4.4 触发设置与预触发长度:别让上升时间被拦腰截断

声发射采集卡大多支持上升沿触发,触发电平设多高,直接决定记录的开始点。如果触发电平设到峰值的一半,波形从半山腰才开始记录,起点比真实过阈点晚了不知多少,算出来的上升时间就是一个无意义的残段。正确做法是把触发电平压到略高于噪声底的位置,同时打开预触发,记录触发前一段波形,保证峰值点之后的分析完整。

预触发长度一般设置成信号预期上升时间的好几倍。上升时间在1到5微秒时,预触发1毫秒都是合理的。窄脉冲ESD干扰反而要小心预触发太长,连续触发的多个窄脉冲会把缓冲区占满,导致丢事件。现场大量ESD干扰时,我会把触发电平提高一点,从“检测一切事件”切换为“只关心有实际结构损伤的大事件”,用牺牲小信号的代价换掉无关的数据。

5. 上升时间计算避坑:五个真实场景里的翻车记录

上升时间计算链路不长,却处处有玄学。触发点、滤波、峰值点、插值、通道校准,每一个环节改动都会让结果变样。下面这5个案例是我在声发射系统调试里真正遇到过的,按“现象到原因到解决”写清楚。

5.1 阈值定太高,起跑线后移,上升时间凭空缩水

现象:同一批断铅测试波形,用2V阈值算出的平均上升时间是8微秒,改成500mV阈值变成15微秒,差出一倍多,但没人发现标准变了。

原因:阈值越高,波形越晚被“算作开始”,峰值点不变,前后一减,上升时间必然变短。这个坑最容易藏在大批量自动处理脚本里。脚本里写threshold = 0.6,一个月后新同事不知道0.6是伏特还是比例,直接抄到新数据集上,整个实验结论都变了。

解决:把阈值定义统一为“峰值幅度的固定比例”,比如20%,并用手动标定过的固定峰值参考电平校验,不要用随手定的电压值。我的习惯是把阈值写进配置字典,和采集参数放一起,输出结果里带一行参数摘要。

5.2 低通滤波把前沿抹平,上升时间被人为拉大

现象:给波形加了150kHz低通后,上升时间从3微秒变成5微秒,还以为是声源变缓了。

原因:低通滤波会直接滤掉高频成分,前沿斜率被削减,测量结果被滤波器自身响应主导。滤波器的类型和阶数也影响前沿,Butterworth四阶的群延迟比Bessel大,但波形过渡带更陡。

解决:先确认声源自身带宽,让滤波器截止频率明显高于信号主要能量所在频段,至少是中心频率的3倍以上;测量上升时间时把滤波器参数写进结果。想要稳定对比,全程只用同一种滤波器和同一阶数,不能今天切Butterworth明天切Chebyshev。

5.3 采样率不足,峰值点没采到,前沿看起来成了平顶

现象:用250kHz采一个上升时间1微秒的信号,前沿只有不到4个采样点,波形顶部和真实峰值差了10%以上。

原因:欠采样导致峰值点落在采样网格之间,找峰值时只能用邻近采样点凑合。

解决:先估计最小上升时间,再倒推采样率。例如目标上升时间1微秒,带宽约350kHz,采样率至少3.5MHz。如果硬件已经固定,那就用插值补点,但插值只能做初步补位,不能替代真实采样密度。这个案例也解释了一个常见现象:同一波形,示波器算出来的上升时间明明很稳,PC端一算就乱,本质是不同设备重采样和对峰值的保真度不一样。波形文件一旦被压缩或降采样,上升时间信息就永久丢失了。

5.4 过冲和振铃导致峰值点后移,上升时间被拉长

现象:波形峰值后面拖着一串振铃,峰值点其实出现在第一个峰,但程序找最大值时选到了后面某个振铃尖刺,上升时间被拉长成整个衰减过程。

原因:简单argmax在天生多峰的AE信号里不可靠。

解决:在上升沿后一个固定时间窗内找峰值,窗口宽度取信号载波周期的1到2倍;或者先做短时包络再找首个局部极大值。我个人更推荐“首个局部极大值”而不是全局最大值,因为声发射的峰值定义就应该是最早到达的最大幅值,后续振铃属于谐振或多径反射,不该参与上升时间计算。这个改动看似微小,却能让上升时间从“玄学”变成可复现的指标。

5.5 硬件通道间相位差和时钟抖动,多通道对比时上升时间系统性偏移

现象:同一个断铅信号,两个传感器通道同时采集,1通道算出的上升时间总是比2通道大0.8微秒。

原因:两路模拟前端的滤波器和ADC时钟存在固定相位差或通道间时延。

解决:做通道间校准,用同一电脉冲或同一传感器激励信号采集两个通道,计算固定时延差并在上升时间结果里做补偿。多通道声发射定位系统里这个偏移如果不去掉,不光上升时间,连时差定位都会跟着歪。校准方法不复杂,给两路同时送同一个脉冲,先测出通道间的固定延迟,再写入软件校准表即可。

6. 进阶:用上升时间做声源初判和传感器一致性校验

6.1 用断铅信号的上升时间快速筛选传感器

断铅是声发射现场最常用的标准激励源,波形重复性好。我给新到货的传感器做验收时,会在同一块钢板上固定一个标准断铅位置,逐个换上传感器采集波形,只比较两个指标:峰值幅度和上升时间。上升时间明显偏离基准值且带宽相近的传感器,多半是耦合不良或内部谐振异常。这个办法比看厂家频响曲线直观得多,现场五分钟就能筛出一批传感器里的异常件。筛选时耦合剂厚度要控制,太厚上升时间会变长,太薄灵敏度下降。

6.2 上升时间和峰值幅度的联合判据

从经验数值看,宽带声发射传感器的波形峰值幅度和上升时间常常成反比关系:急剧加载产生高幅度、短上升时间;慢性损伤产生低幅度、长上升时间。于是很多算法用“峰值幅度除以上升时间”作为特征判据,相当于用斜率近似加载速率。我一般在分类器里加这个组合特征,但不会单独用上升时间。联合判据要注意量纲和噪声底。幅度在噪声底附近时,上升时间噪声极大,比值没有意义,所以先做幅度筛选,只有峰值超过某阈值的事件才进入比值计算。这个两阶段策略能大幅减少误判。

6.3 批量处理时的自动阈值与上升时间稳定性

批量处理几百兆波形时,不能每个事件都手工调阈值。我常用的自动阈值是噪声均方差乘以固定系数,比如6倍标准差,再配合预触发段波形计算噪声统计量。这个方案在噪声平稳时很稳定,但如果现场出现间歇电磁干扰,噪声统计量会周期性跳高,导致触发阈值变来变去。处理办法是把自动阈值设计成滑动窗口模式,只取触发前一小段算噪声,而不是整文件统计。上升时间作为声发射计算里的基本特征,看着简单,实际上触发、滤波、峰值点、插值、通道校准每一个环节都会改动它。这些年我在现场吃过不少亏,最早做ESD放电干扰滤除时,误把上升时间当成“绝对物理量”来用,结果不同传感器测出来的数据对不上,折腾一周才发现是传感器谐振频率不同造成的。后来养成习惯:记录上升时间前先记录传感器型号、滤波参数、阈值定义,保证原始数据里的每一个波形都能追溯测出它时的环境。希望这些踩坑经验对你有用,至少让你少走一段我在声信号采集上走过的弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询