做泄漏检测的朋友应该都有过这种经历:现场传感器采回来的信号,打开波形一看,头都是大的——泵的运转噪声、阀门冲击、电磁干扰全混在里面,泄漏特征早就被埋得看不见了。尤其是气体泄漏的声发射信号,本质是一个瞬态冲击,持续时间短、幅值又不大,稍一疏忽就被背景噪声完全吞掉。所以降噪这一步根本不是锦上添花,而是决定泄漏能否被准确识别的前提。
今天想聊的技术路线,核心是三个词:NGO、VMD、小波阈值。说白了,就是用北方苍鹰优化算法(NGO)自动整定VMD的分解参数,再用改进的小波阈值做二次精去噪,最终把气体泄漏信号从强噪声里捞出来。这套组合我在气体泄漏信号上反复验证过,比单独用VMD或者传统小波去噪的效果要明显高一个档次。适合正在做声发射泄漏检测、管道安全监测、或者各种非平稳信号去噪方法对比研究的同学参考。
1. 为什么是NGO、VMD、改进小波阈值这套组合拳
1.1 气体泄漏信号到底难在哪儿
气体泄漏检测常用的声发射信号,有一个很让人头疼的特点:泄漏源本身产生的弹性波是典型的非平稳瞬态信号,频带往往很宽,而且幅值很低。与此同时,工业现场的背景噪声极其复杂,既有泵和压缩机带来的周期性机械振动(低频、强能量),也有电磁干扰和流体湍流产生的高频随机噪声。泄漏信号夹杂在中间,就像站在嘈杂集市里听一个低声说悄悄话的人,直接听是听不清的。
更麻烦的是,这种泄漏信号往往没有足够长的平稳段可供分析。工程上通常只能截取一小段数据,依靠短时能量、包络形态、频带能量分布来判断有没有泄漏。如果这段数据里的噪声没有处理干净,后续不管是提取峰峰值、做包络谱还是输入分类器,判断结果都会严重失真。所以我一直觉得,泄漏检测算法的第一道坎不是分类器选得有多好,而是能不能把去噪这一步做到位。
1.2 单靠一种方法为什么不够用
最早做这类信号处理,很多人会先想到带通滤波,把感兴趣频带之外的东西一刀切掉。这种做法对平稳环境里的周期性噪声有效,但对非平稳的泄漏冲击是灾难——滤波器会把冲击信号的上升沿磨平,幅值也压得厉害,泄漏特征不完整了。
后来常用的是小波变换去噪。小波方法确实比固定滤波器灵活,但它依赖选定的基函数和分解层数,信号特性一旦变化,参数就得重新调。再后来VMD(变分模态分解)火起来,因为它是自适应地把信号分解成若干个窄带模态,不用像经验模态分解那样递归剥离,理论框架更干净。但VMD有个绕不过去的坎:模态个数K和惩罚因子α得预先设定,这两个参数对分解结果影响巨大,调不好就过分解或欠分解。
所以现实情况是:一种方法撑不起完整去噪链路。VMD负责把信号按频带切开,但参数需要有人给它定;小波阈值可以在模态上做精细处理,但传统软硬阈值各有缺陷,直接套用会损失信号能量或留下震荡毛刺。把这些角色凑在一起,各干各擅长的活,才是工程上真正能落地的方案。
1.3 三条技术路线如何分工
我习惯把这条链路理解成一条“分离、筛选、精修”的流水线。先用VMD把混合信号分解成频率上更单纯的分量;然后用相关性、峭度这类指标筛选出含有泄漏冲击的模态;最后对含噪模态做改进的小波阈值去噪。NGO不直接参与信号处理,它只负责解决一个关键问题——VMD的K和α怎么选,把这个最耗人工的参数整定工作自动化。
| 环节 | 承担方法 | 要解决的问题 |
|---|---|---|
| 频带分离 | VMD分解 | 把泄漏冲击与背景噪声在频域上切到不同模态 |
| 参数寻优 | NGO算法 | 自动确定VMD的模态数K和惩罚因子α |
| 精细去噪 | 改进小波阈值 | 抑制残留在模态里的噪声,同时保住泄漏瞬态幅值 |
| 融合重构 | 筛选与相加 | 剔除纯噪声分量,保留有效成分后重建干净信号 |
整条流程走下来就是:含噪原始信号 → 预处理 → NGO搜索最优VMD参数 → VMD分解 → 计算各模态相关性和峭度 → 筛选有效模态 → 对高噪模态做改进小波阈值去噪 → 叠加重构 → 包络谱分析或特征提取。这套流程跑稳了,后面做泄漏定位、类型识别,输入质量就有保障了。
2. 核心算法原理:先把VMD、NGO、改进阈值函数的底摸透
2.1 VMD怎么把一个复杂信号“切”成K个模态
VMD全称是Variational Mode Decomposition,中文叫变分模态分解,由Dragomiretskiy在2014年提出。它的核心思路很直白:把原始信号分解成K个有限带宽的模态分量,每个模态都围绕一个中心频率分布,并且全部模态叠加起来能近似还原原始信号。优化目标是让所有模态的估计带宽之和最小。
数学上它构造了一个变分约束问题:一边要求模态是带限信号,中心频率越集中越好;另一边要求所有模态加起来等于原始信号。VMD通过引入二次惩罚项α和拉格朗日乘子来处理这个带约束的优化问题,再用交替方向乘子法(ADMM)迭代更新模态、中心频率和乘子。因为整个过程是频域迭代求解,所以VMD分解出的模态通常是窄带、准正交的,很适合用来分离泄漏冲击与宽带噪声。
在落到代码之前,有几个参数必须搞清楚,它们是VMD性能的关键:
| 参数 | 含义 | 经验取值 |
|---|---|---|
| K | 模态数量 | 3到10之间,一般从4、5起步 |
| α | 惩罚因子,权衡信号保真度与带宽 | 常用1000到5000 |
| tau | 噪声容忍度,控制更新步长 | 一般设为0 |
| DC | 是否单独保留直流分量 | 设为0即可 |
| init | 中心频率初始化方式 | 设为1,均匀分布更稳定 |
| tol | 收敛容限 | 1e-6到1e-7 |
这里K和α尤其要注意。K设大了,一个真实频带可能被劈成好几个中心频率靠得很近的虚假模态;K设小了,不同频带的成分会挤在同一个模态里,后面想靠阈值去噪也无从下手。α设太大,每个模态带宽被压得极窄,泄漏冲击的瞬态细节会被“拧”成纯正弦片段;α设太小,模态带宽过宽,频带相互重叠,分离意义就没有了。我试过的最舒服的做法,是先固定一个合理范围,把K和α交给优化算法去搜,而不是手动一个个试。
2.2 NGO凭什么能给VMD做参数寻优
NGO是Northern Goshawk Optimization的缩写,中文名是北方苍鹰优化算法,由Dehghani等人在2022年提出,灵感来自北方苍鹰捕猎时的两个阶段行为。第一阶段是“识别猎物并发起攻击”:苍鹰会在搜索空间里随机选定一个猎物位置,然后俯冲过去,这个阶段对应算法的全局勘探,负责在大范围内探索可能有解的区域。第二阶段是“追击猎物”:猎物企图逃跑,苍鹰会尾随并反复调整追击方向,这个阶段对应局部开发,负责在已发现的优质解附近精细搜索。
算法流程并不复杂。初始化一群候选解之后,每轮迭代先对每个个体随机选一个参考猎物,按照第一阶段公式更新位置,如果新解的适应度更好就替换;然后在第二阶段里以猎物位置为圆心做领域搜索,同样只接受更优的位置。两个阶段配合下来,既不会过早收敛到局部最优,也有足够能力在后期精修最优解。
我选择NGO而不是粒子群或者遗传算法,主要原因是它在参数很少的前提下,勘探和开发的平衡做得比较好。实际对比下来,NGO在VMD参数寻优这类中等规模优化问题上,收敛速度快、实现代码也不容易出错。优化变量只有两个(K和α),种群设30个个体、迭代50次左右就能稳定得到一个足够好的参数组合,这在现场项目里是可以接受的计算量。
要让NGO知道“什么样的VMD参数是好的”,必须定义适应度函数。我最常用的指标是包络熵,对每个模态先求Hilbert包络,再计算包络的熵值。包络熵越大说明包络越混乱,里面大概率有很多噪声成分;包络熵越小说明包络越稀疏、越有冲击特征。把一次VMD分解出来的所有模态包络熵求和,作为当前参数的适应度,NGO要做的事情就是找到让这个总熵最小的K和α组合。参数搜出来之后,VMD分解出的模态里蕴含的泄漏冲击特征就会更集中,后续处理也更好做。
整个优化过程的伪代码大致是这样的:
初始化NGO种群,每个个体代表一组 [K, alpha] for t = 1 to T: for i = 1 to N: 阶段1:随机选猎物,更新位置,若新解更优则接受 阶段2:围绕猎物领域搜索,更新位置,若更优则接受 对种群中每个个体: 取该个体的 [K, alpha] 运行VMD 计算所有模态的包络熵之和,作为适应度 记录全局最优个体 return 最优 [K, alpha]2.3 改进小波阈值比传统软硬阈值强在哪
小波阈值去噪的基本逻辑,是把含噪信号变换到小波域,在分解层上把绝对值小于阈值的小波系数置零或者收缩,再把系数反变换回来。传统做法有硬阈值和软阈值两种,但都有明显缺陷。
硬阈值函数是“过阈值保留原样,不过阈值直接置零”。好处是能保留信号细节和幅值,坏处是阈值处不连续,重构信号容易产生振荡和毛刺。软阈值函数是“过阈值系数向零收缩一个阈值量”,连续性好了,但所有保留系数都被系统性削减,重构信号的幅值会偏低,能量被磨掉。对泄漏检测来说,幅值偏低会直接影响后续的泄漏强度判断;毛刺太多又会影响时域特征提取。
我实际用的改进阈值方案,核心是构造一条介于软硬之间的可调阈值函数,通过一个参数在软阈值和硬阈值之间连续过渡。当参数接近硬阈值端时,幅值保留力度强;当参数接近软阈值端时,信号平滑度更好。这样可以在保留泄漏冲击幅值和抑制重构毛刺之间找到平衡点。
同时,阈值本身也应该自适应。传统固定阈值λ=σ√(2lnN)对每层都用一个尺度,效果很粗糙。改进做法是用MAD(中值绝对偏差)来稳健估计噪声标准差σ,避免泄漏冲击本身的极端值把噪声方差估计带偏;阈值再随分解层数适当衰减,让低层细节保留更多有用成分,高层细节更积极地抑制噪声。这样每个尺度上的阈值都有各自的合理值,去噪后信号既干净又有物理意义。
3. 实操全过程:从原始信号到干净泄漏特征
3.1 信号准备与基础预处理
第一步当然是把数据采回来。气体泄漏声发射信号的频率范围比较宽,采样率至少要放到100kHz以上才够看;如果是做负压波检测,采样率可以低不少,但处理思路基本一致。我习惯先采集一段背景噪声作为参考,再采集包含泄漏工况的信号段,后续评价去噪效果时能多一个对比基准。
拿到原始数据之后,先做几个基础操作:去均值、去趋势、缩放到合适量纲,然后做一次带通预滤波,把明显超出传感器响应范围的极低频和极高频噪声先削掉。这里要注意,预滤波的带宽要留足余量,不能正好卡在泄漏可能出现的频带边缘,否则会把真正有用的瞬态分量切掉一部分。
分段也很关键。小波变换对数据长度有要求,最好把数据切成2的幂次长度,比如4096点或8192点一段。每一段单独走后面的VMD和阈值去噪流程,保证整段信号的统计特性不会因为时间太长而变化。实测信号现场环境不稳定,长时间记录里噪声分布可能漂移,按段处理比整段一口气处理稳得多。
3.2 用NGO给VMD调参的具体做法
把预处理后的信号交给NGO-VMD之前,先要把算法参数设置好。我这里用一个自己常用的配置作为参考:
| 算法/参数 | 设置值 | 说明 |
|---|---|---|
| NGO种群数 | 30 | 中等规模,兼顾计算速度和解质量 |
| 最大迭代次数 | 50 | 通常20到30次已经收敛,50次是保险 |
| K搜索范围 | 3到10 | 常见泄漏声发射信号不会超过这个范围 |
| α搜索范围 | 1000到5000 | 覆盖常用惩罚因子区间 |
| 适应度函数 | 包络熵之和 | 衡量分解模态的稀疏性 |
在工程代码里,我会先封装两个函数:一个是单次VMD分解函数,输入是信号、K、α、tau等参数,输出是各模态时域波形和中心频率;另一个是包络熵计算函数,对每个模态做Hilbert变换、取包络、归一化后算Shannon熵。这两个函数准备好之后,NGO的迭代循环只需要反复调用它们。
实际跑的时候有个经验:不要一开始就在整段长信号上做NGO优化,计算量太大。先截取一小段有代表性的数据,比如4000点左右,在这一小段上把K和α搜出来;确定参数后,再用同样的参数对剩余所有数据段做VMD。这个做法能把优化阶段的计算时间压缩到原来的几十分之一,而且参数一旦选定,整段数据的分解特性基本是稳定的。
我踩过的一个坑是,直接把群体里的每个候选解都跑完VMD再算适应度,结果一次迭代就要拆几十轮分解,现场电脑卡得没法用。后来改成先对小段数据快速预估,再拉长信号复核,计算压力小了很多。
3.3 模态筛选:留下哪些分量,丢掉哪些分量
VMD分解完不是所有模态都要保留。有些模态里主要是低频趋势和周期机械噪声,有些模态里几乎全是随机噪声,如果一股脑全加回来,去噪效果等于没有。筛选模态我主要看三个指标。
第一个指标是相关系数,计算每个模态与原始信号之间的Pearson相关系数。能量大且与原始信号轨迹接近的模态,通常是主要成分,必须保留;相关系数极低的小能量模态,大概率是噪声尾部,可以丢弃。第二个指标是峭度。峭度对冲击型信号特别敏感,泄漏声发射的瞬态冲击会让某个模态的峭度明显高于其他模态,所以峭度偏高的模态往往是含泄漏特征的目标模态。第三个指标是能量占比,防止只留下高峭度但总能量过小的“细枝末节”。
| 指标 | 关注点 | 筛选倾向 |
|---|---|---|
| 相关系数 | 与原始信号的相似程度 | 系数高的保留 |
| 峭度 | 冲击特征强度 | 峭度明显偏高的重点保留 |
| 能量占比 | 模态对总信号的贡献 | 占比极低且无冲击特征的丢弃 |
实际判断时,我会把各模态的中心频率列一张表,结合频谱观察。低频模态如果对应工频和机械振动,即便能量高也往往不是泄漏主成分;而泄漏冲击常常出现在中高频谱段,对应的模态峭度高、包络形态呈衰减振荡。找到这类模态,就抓住了去噪的主要目标。
3.4 改进小波阈值逐模态去噪
筛选出来的模态里,有些还混着不少噪声,需要进一步净化。这个过程我用改进的小波阈值,对每个含噪模态单独处理,而不是对原始信号直接做小波去噪。因为模态已经是窄带信号,小波分解后的系数分布更规整,阈值的作用点更精准。
具体参数上,我常用sym8或db8小波基,分解层数设在4到6层。每层细节系数的噪声标准差用MAD法估计,即对细节系数取绝对值再求中位数,然后除以0.6745。阈值按下式构造:λ_j = σ_j·√(2lnN_j)/ln(j+1),其中j是分解层序号。这样高层细节的阈值更大,低层细节的阈值温和一些,防止泄漏冲击的高频边沿被过量压缩。
阈值函数用改进的可调形式,参数a在0和1之间取值。a越接近0,函数越像硬阈值,幅值保留最完整,但可能留少量毛刺;a越接近1,函数越接近软阈值,平滑效果更好,但可能削幅值。我的经验是先取a=0.2左右跑一遍,看包络谱里泄漏频率峰值是否突出,再微调方向。
这个环节最忌讳的是对所有模态用同一个阈值参数。低频主模态里如果混有一些机械噪声,可以直接用温和阈值稍作平滑;高频含噪模态里的纯随机噪声成分多,阈值要更积极。不同模态分开处理,最后相加起来才不会互相污染。
3.5 重构信号与评价指标计算
处理完各个模态之后,把保留下来的模态(去噪后的高噪模态 + 未强处理的低噪模态)直接叠加,得到重构的干净信号。到这里,去噪的两个环节——VMD频带分离和小波阈值精细去噪——就完成了。
评价去噪效果,不能只靠肉眼盯着波形说“看起来干净多了”。如果有仿真原始纯净信号,或者现场能采集到无泄漏工况的参考信号,就可以用信噪比SNR、均方根误差RMSE、重构信号与纯净信号的相关系数三个量化指标来对比。SNR越高、RMSE越低、相关系数越接近1,说明去噪方法保留有用信息的能力越强。
| 评价指标 | 计算方式 | 判断标准 |
|---|---|---|
| SNR | 10lg(Ps/Pn) | 越大越好,但过大可能过度平滑 |
| RMSE | 均方误差开方 | 越小说明与纯净信号越接近 |
| 相关系数 | Pearson系数 | 取绝值后越接近1越好 |
| 包络谱峰值 | 对包络做FFT后看泄漏频率幅值 | 峰值越突出越容易辨识泄漏 |
| 能量熵 | 对重构信号求熵值 | 越低说明结构越清晰 |
仿真验证时,我通常构造一个衰减冲击叠加多频噪声和随机白噪声的复合信号,把完整链路跑一遍,跟经典的小波软阈值、单独VMD、EMD+阈值等方法做横向对比。在我的测试条件下,组合方案的SNR提升比单用小波软阈值高出3到5dB,重构信号的峭度也更接近纯净泄漏冲击的峭度。现场实测信号没有真值参考时,我会靠包络谱的峰值突出程度、时域波形冲击形态和能量熵三个维度综合判断,三个指标同时变好才敢说这套参数是有效的。
4. 实际工程项目里的坑与排查方法
4.1 模态数量不对:出现过分解或欠分解
NGO虽然能搜出最优K,但搜索范围设置不合理时,仍然会出问题。过分解的表现是:有两个或两个以上模态的中心频率非常接近,波形形状也相似,说明一个真实分量被劈成了几份。欠分解的表现是:某个模态频谱很宽,里面明显能看出多个频率成分挤在一起。
排查手段很简单,把VMD输出的中心频率表打出来看。如果相邻中心频率之差小于频率分辨率的几倍,基本可以判断是过分解;如果某个模态的频谱铺得很开,说明K不够。遇到这种情况,先检查K的搜索范围是否覆盖了真实模态数,再检查α是不是设得过大或过小。我曾遇到一个案例,把α搜到8000,分解出来的信号出现纯正弦样式的碎片模态,把α限制在5000以内后,波形恢复正常。
4.2 惩罚因子α带来的模态失真
α这个参数很阴险,它不像K那样直观。α过大的时候,VMD为了保证每个模态带宽足够窄,会把瞬态冲击的突变细节抹掉,分解结果看起来“过度纯净”,但丢失了泄漏特征。α过小的时候,模态之间频带重叠,噪声和信号容易混在一起。
如果优化结果里出现中心频率很接近、波形高度正弦化的情况,先怀疑α偏高。我习惯的做法是,先用固定的K做一次α扫描,把α从1000到5000按500步长扫一遍,观察包络熵曲线和模态波形。包络熵曲线通常会先降后升,低谷附近就是比较可靠的α区间。这样做虽然多花几分钟,但比盲目跑完整优化更省时间。
4.3 去噪过头:泄漏信号被当成噪声干掉
小波阈值去噪最常见的翻车现场是阈值太大或者参数a太偏向软阈值,结果重构后的信号变得很光滑,包络峰值被压平,泄漏冲击几乎消失了。比如现场把阈值倍率设到3倍以上,很多真实冲击细节会被一起丢掉。
我后来加了一个保护措施:在重构之前,对比去噪前后峭度的变化。泄漏冲击本身峭度很高,如果处理后峭度从20掉到5以内,大概率削过头了;如果峭度变化不大而噪声功率明显下降,说明处理是合理的。另一个辅助检查是看包络峰值的下降幅度,一般不应该降到原来的70%以下,否则泄漏强度判断会严重失真。
4.4 NGO优化结果不稳定
NGO本身是随机优化算法,每次运行结果会有差异。如果种群太小或迭代次数太少,搜出来的参数可能每次都变。解决起来不复杂:固定随机种子,保证结果可复现;种群规模至少30;同一组数据跑3到5次,取多次结果里出现频率最高的K和α,或者取适应度最好的一次。实在不行就把NGO搜索范围缩小,比如K在[4,8]之间,α在[1500,3500]之间,搜索空间小了稳定性自然上来。
4.5 现场实测信号没有真值参考,怎么评估
实测信号永远比仿真脏得多,而且没有所谓的纯净信号做对照。这时候再纠结SNR没有意义,我把评估重心放在三个“能看懂”的指标上:一是包络谱在泄漏特征频率处是否出现明显谱峰;二是时域包络的冲击衰减形态是否清晰可辨;三是背景噪声段在去噪前后的能量是否显著下降。三个条件同时满足,就说明去噪流程在真实场景里是有效的。
另外,可以在现场人为制造一个已知的小泄漏工况,用这套流程处理后看能不能稳定识别出泄漏特征。能识别出来,说明系统的实际灵敏度没问题;识别不出来,就要回头检查传感器频响、采样率、模态筛选范围这些前端环节。
5. 一点个人体会与扩展示路
这套方法在我自己项目里最大的价值,不是把某个去噪指标刷到多高,而是把耗人耗时的调参环节省下来了。老实说,VMD分解效果好不好,八成取决于K和α,剩下两成才是阈值函数怎么改。NGO把最头疼的“猜参数”环节自动化之后,整条链路才真正具备从仿真走向实机的可能。
我自己实际操作的体会是,不要一上来就在现场数据上跑完整优化。先在仿真信号上把流程跑稳定、把参数范围标定好,再迁移到实测信号微调,这是最稳妥的顺序。如果后续想把这套方法扩展,可以把包络熵适应度改成综合指标,或者把筛选出的模态特征直接接进分类器做泄漏类型识别,效果还能进一步放大。