
1. 先把问题说清楚局部放电信号为什么这么难去噪做变压器局部放电检测的朋友都清楚局部放电信号检测是整个状态评估的第一道关而这道关里最磨人的就是去噪。我早年在实验室做变压器油中局部放电的在线监测项目时被现场噪声折磨得够呛。后来把空间自适应小波阈值和支持向量机SVM这套组合方案跑通效果比单纯用全局小波阈值好了不止一个档次。这篇文章就把整个方案的来龙去脉、代码级实操流程和踩坑记录完整写出来给正在做局部放电信号去噪、或者想了解小波与SVM结合应用的同行一个可复现的参考。先说结论这套方案的核心思路是先用小波分解把信号放到时频域再根据每处小波系数周边邻域的能量分布情况给不同位置设定不同的自适应阈值同时让SVM去判断哪些系数更像信号、哪些更像噪声二者配合完成精细去噪。它解决的问题很具体——现场采集到的局部放电信号里白噪声、窄带干扰、随机脉冲干扰混在一起传统的固定阈值一刀切要么把微弱的放电脉冲也削掉了要么留下大堆毛刺预处理干净。适合的读者包括电力设备状态检测方向的研究生、从事局放在线监测装置研发的工程师以及想在小波去噪流程里引入机器学习分类器的算法从业者。1.1 局部放电信号本身有哪些特点要理解去噪为什么难先得知道局部放电信号长什么样。所谓局部放电是电气设备绝缘中局部区域发生击穿但尚未形成贯穿性放电通道的现象。它的信号有几个很鲜明的特点微弱。放电量通常只有几十皮库pC到几千皮库折算成电压信号在现场传感器端往往是毫伏级别甚至更低。我做过对比一个常见的中压开关柜局放传感器输出信号幅度通常在几十毫伏以内而现场环境噪声动不动就能把它淹没。频带宽且脉冲形态复杂。一次局放脉冲本质上是纳秒到微秒级的衰减振荡频谱从几十kHz一直延伸到数GHz当然不同检测频段不一样常见超声波法在40kHz左右特高频法在300MHz-1.5GHz脉冲电流法在几十kHz到几十MHz。这意味着它在小波分解后信号能量分散在多个尺度上不是集中在某一两个频带里。具有明显的脉冲稀疏性。一个工频周期里局放脉冲往往只出现在特定相位区间而且两次脉冲之间有较长的静默期。这一特性对SVM分类非常有利——信号系数在空间分布上是稀疏的而白噪声系数是均匀铺开的两者的局部统计特征差异很明显。1.2 现场噪声来源和传统去噪的通病我在现场采集过接近两百组变压器局放数据总结下来噪声主要来自三个方向白噪声。来自传感器本身的热噪声、放大电路噪声特点是宽频带、随机性高在每一个小波分解层上都会存在频谱平坦没有明显的规律。窄带周期干扰。来自无线电广播、电力载波通信、邻近设备的高次谐波等。这类干扰在频谱上表现为一个尖锐的窄峰在时域上则是一段段规则的振荡波形。最典型的是100kHz到数百kHz的广播信号如果你做脉冲电流法检测窄带干扰特别容易跟真实局放脉冲混在一起。随机脉冲型干扰。包括接触不良产生的火花、电晕放电、开关操作时的瞬态冲击等。这类干扰在时域形态上跟局放脉冲有相似之处都是突然出现的尖峰但它们的频谱结构、重复相位稳定性和波形衰减规律往往不同。传统去噪手段主要有这么几类FIR/IIR数字滤波器、基于FFT的频域陷波、固定阈值小波去噪。它们的通病很明显——频域滤波对付窄带干扰有效但对白噪声无能为力固定阈值小波去噪比如全局的VisuShrink阈值虽然能把白噪声压下去但阈值太大容易把真实的放电脉冲细节磨平阈值太小又去不干净。尤其当信噪比降到0dB以下时固定阈值方案基本就是拆东墙补西墙。这套方案里空间自适应解决的是局部力度问题SVM解决的是系数归属问题两者配合本质上就是把用力大小和往哪个方向用力都精细化。2. 方案怎么搭空间自适应小波阈值和SVM的分工逻辑很多初学者第一次看到空间自适应小波阈值支持向量机这个组合第一反应是SVM是不是也被用来做去噪其实不是。在这个方案里SVM不是直接参与滤波它是做系数识别的。小波分解后的每一个细节系数到底属于携带放电信息的信号系数还是纯粹的环境噪声系数这个判断交给SVM来做。判断出来之后再根据这个分类结果配合空间自适应阈值做收缩处理。分清楚这一层逻辑后面的代码实现就顺了。2.1 空间自适应小波阈值到底在自适应什么常规小波阈值去噪的套路大家都很熟了对信号做小波分解得到一个近似系数和若干层细节系数然后对细节系数做阈值收缩再做逆小波变换重构。问题在于绝大多数经典方法用的是全局阈值也就是在同一层里所有系数共用同一个阈值λ比如Donoho提出的经典公式λ σ√(2lnN)其中σ是噪声标准差N是信号长度。全局阈值的缺陷得用实际场景解释。一个真实局放脉冲经过小波分解后它在某个尺度上的能量会集中在一小段连续系数里幅值由中心向两侧衰减。如果全局阈值设得偏高脉冲边缘那些幅值相对较弱的系数就会被误伤重构出来的脉冲就变瘦、变矮幅值和波形细节全丢了如果设得偏低大范围铺开的噪声系数又会残留。空间自适应阈值的思想是同一个分解层里不同位置应该用不同大小的阈值。判断依据就是该系数周围邻域内的能量集中程度。如果一个系数周围的小波系数幅值普遍偏大、变化剧烈说明这一小片区域很可能有真实脉冲成分阈值应该放宽一些保住信号如果一个系数周围全是小幅值的、杂乱无章的起伏说明这片区域大概率是噪声区阈值要收紧。具体实现上最常用的做法是对每个细节系数统计它所在邻域窗口比如左右各取3到5个点内的局部能量或局部标准差然后把这个局部统计量代人阈值公式。比如我在实验中用的自适应阈值形式是λ(j,k) σ² / mean(|w(j,k)|²) 的变体也可以写成λ(j,k) σ * √(2logN) * (1 / (1 E_local/ E_global))其中E_local是局部邻域的小波能量总和E_global是该层所有系数的平均能量。当局部能量明显高于全局平均时括号里的值变小阈值被压低从而保护信号区域反之局部能量低阈值变大噪声区域被更强地抑制。这个公式不是唯一标准换成分位数、局部方差、局部峭度都行核心是阈值随局部特征浮动。空间自适应最直接的效果是脉冲边缘保住了而平坦噪声区被彻底压平。我对比过同一组仿真数据固定阈值去噪后脉冲幅值平均损失约18%而空间自适应阈值方案的幅值误差能控制在5%以内。2.2 SVM在这里承担什么任务SVM负责的是一个典型的两分类问题对小波分解后的每一个系数点判断它是信号主导系数还是噪声主导系数。为什么不用简单的幅值阈值直接判断因为实际现场噪声复杂有些噪声尖峰的幅值比真实局放脉冲还高单看幅值根本分不开。但SVM可以用多维特征把两者的差异放大。我给SVM设计的输入特征包括这样几个维度当前系数的归一化幅值邻域窗口内系数的均值和方差当前系数幅值与邻域均值之比邻域内局部峭度用于描述系数分布的尖峰程度当前系数所在层对应的频带中心频率。这些特征组合起来能较好地区分两类系数。举个例子真实局放脉冲在高频细节层上的系数会出现中心系数大、周边系数快速衰减的形态局部峭度偏高而白噪声系的细节系数在空间上分布相对均匀每一处与邻域的比值都不会太极端窄带干扰对应的系数则呈现出规则的周期振荡特点邻域方差大但峭度低。这里有一个关键操作细节SVM的样本标签从哪里来。如果直接拿现场数据标注成本极高而且主观性强。我采取的做法是先用仿真信号生成已知答案的训练集——构造已知局放脉冲加已知噪声的数据做小波分解后用这个系数在重构信号中对应的时域幅值是否显著超过噪声水平来打标签。这样训练出来的分类器再拿到实测数据上做盲测。当然更精细的做法是可以先用传统的谱减或者带通滤波粗去噪一轮把疑似信号段挑出来做半自动标注再训练SVM。但对于第一版方案仿真标签完全够用。SVM在训练阶段使用的是RBF径向基核函数通过网格搜索确定惩罚系数C和核参数gamma。需要提一句不要一上来就追求SVM的准确率百分百。在去噪场景里把噪声误判成信号漏去噪和把信号误判成噪声过去噪两种错误的代价完全不同。我会在后面专门聊这个平衡问题。2.3 整体流程怎么串起来把这两块技术拼在一起完整流程是五步对原始信号做预处理去除直流分量、归一化、必要时做降采样选定小波基和分解层数做小波分解得到各层细节系数提取每个细节系数的邻域统计特征送入训练好的SVM分类器输出信号系数或噪声系数的类别标签对判定为噪声系数的系数施加空间自适应阈值收缩对判定为信号系数的系数保留或仅做极轻微的收缩避免二次伤害对所有处理过的系数做逆小波重构得到去噪后的时域波形。这套流程里有一个很重要但不常被提及的细节SVM的介入不能改变小波系数之间的相对相位关系。好在SVM只做分类判断实际的阈值收缩还是用连续的数学公式完成不会引入分类边界导致的阶跃突变。这也是为什么这个方案比直接用小波系数幅值聚类更平滑的原因。3. 实操全流程从仿真模型到参数调优理论讲清楚了咱们直接上手。这一节我从零开始搭建一个完整的试验环境把仿真信号构造、小波分解、空间自适应阈值、SVM训练和评价指标全部过一遍。你只要照着下面的步骤操作就能跑通整套链路同时拿到一组可以直接对比的去噪效果数据。3.1 搭一个尽量贴近实际场景的局放仿真模型先交代工具。我用的是Python 3.9核心依赖是numpy、scipy、PyWaveletspywt和scikit-learn。MATLAB用户也能等比例移植原理完全一样。第一步构造仿真局放脉冲。实验室常用的局放脉冲模型是单指数衰减振荡或双指数衰减振荡我这边用的是双指数衰减振荡形式s(t) A * (exp(-1.3t/τ) - exp(-2.2t/τ)) * sin(2πf_c t)参数取值为幅值A1归一化衰减常数τ500ns振荡中心频率f_c2MHz采样率fs100MS/s即每微秒100个采样点。生成一个包含多次局放脉冲的信号脉冲之间间隔随机每次脉冲的幅值也做微小浮动模拟放电不稳定状态。第二步叠加噪声。为了验证算法鲁棒性我构造三种噪声场景混合高斯白噪声信噪比0dB左右模拟传感器热噪声窄带正弦干扰频率3MHz幅值为信号的0.5倍模拟广播干扰随机冲击脉冲宽度较窄、幅值随机模拟外部干扰。这样一整段仿真信号的时域波形看起来非常脏仅凭肉眼几乎看不到局放脉冲在哪信噪比大约为-2dB。这一水平比很多论文里展示的干净加一点噪声的仿真要残酷得多但实测数据比这个还乱。3.2 小波分解与空间自适应阈值实现选小波基。这一步非常重要。局放脉冲是衰减振荡形态所以小波基的振荡特性和支撑长度要跟它匹配。我用db4和sym5分别在同样数据上做过对比db4的时域波形跟常见的局放脉冲更接近重构出来的脉冲前沿更陡所以默认选db4。如果你处理的信号中心频率更高可以考虑db8或者coif5如果脉冲更尖锐、更窄haar或者db2反而有优势。这个需要根据实际数据多试。分解层数选4层。层数不是越多越好——局放信号能量主要集中在前几层高频细节层数太深低频部分的细节系数几乎全是噪声还会引入较大的重构误差。我自己实测4层和5层去噪效果接近但5层重构后的波形轻微畸变更明显所以锁定4层。空间自适应阈值的核心代码如下伪代码性质只展示逻辑import pywt import numpy as np def spatial_adaptive_threshold(coeff, level_noise_std, window3): # coeff: 某一层的细节系数一维数组 thresholded np.zeros_like(coeff) n len(coeff) # 预先计算该层全部系数的能量均值 global_energy np.mean(coeff ** 2) for k in range(n): left max(0, k - window) right min(n, k window 1) local_window coeff[left:right] local_energy np.mean(local_window ** 2) # 局部能量高 - 阈值压低保护信号 ratio global_energy / (local_energy 1e-12) lam level_noise_std * np.sqrt(2 * np.log(n)) * (ratio ** 0.5) # 软阈值处理 if abs(coeff[k]) lam: thresholded[k] np.sign(coeff[k]) * (abs(coeff[k]) - lam) else: thresholded[k] 0.0 return thresholded注意窗口大小window我取3也就是左右各3个点、共7个点的窗口。窗口太小局部统计量不稳定容易受单个噪声尖峰影响导致阈值抖动窗口太大又失去了空间自适应的意义。调试的时候我对比过window1、3、5、7window3和5效果接近但window3对窄脉冲的保护更好所以锁定了3。注入代码里level_noise_std这一项是用各层细节系数绝对值的中位数除以0.6745估计出来的Donoho的经典噪声估计法。具体写法是noise_std np.median(np.abs(coeff)) / 0.6745这套实现跑完以后相比全局阈值版本去噪输出的信噪比提升大约3.6dB更关键的是脉冲幅值保真度明显更好。3.3 SVM分类器的训练与应用接下来做SVM。我用scikit-learn里的SVC核函数选RBF。训练数据怎么造我生成500段不同的仿真局放信号加不同强度的噪声做小波分解提取特征然后根据系数在重构信号中的贡献打标签。标签规则是这样的如果一个系数被置零后重构信号对应位置的最大幅值变化超过该处噪声水平的2倍就认为它是信号主导系数标记为1否则为0。这个规则听起来有点绕但本质是留一法式的敏感性判断——删掉它对结果影响大就是信号删掉没影响就是噪声。自动化批量标注时这个规则每段信号能稳定给出几千个有代表性的样本。特征提取代码逻辑如下def extract_features(coeff, k, window3): n len(coeff) current abs(coeff[k]) left max(0, k - window) right min(n, k window 1) region coeff[left:right] local_mean np.mean(np.abs(region)) local_var np.var(region) local_kurtosis ((region - np.mean(region)) ** 4).sum() / ((len(region) - 1) * (np.var(region) ** 2 1e-12)) ratio current / (local_mean 1e-12) return [current, local_mean, local_var, local_kurtosis, ratio]训练的时候直接把特征数组归一化到[-1,1]然后用GridSearchCV搜索C和gamma。我在公开对比实验里跑出来的较优参数是C8gamma0.5训练集准确率约96%五折交叉验证约93%。把训练好的模型应用到之前那段-2dB仿真数据上系数分类结果很直观被判定为信号系数的点在时频图上是稀疏的、成小簇分布的被判定为噪声系数的点则均匀铺满整个时频平面。这跟预期完全一致。应用时流程稍微调整了一下先对所有系数用SVM做分类分类为噪声的系数直接执行空间自适应阈值收缩分类为信号的系数我做了折中处理——不设阈值但乘以一个0.92的轻微衰减因子。为什么要这么做因为完全不做处理实测数据里那些紧贴真实脉冲的高频毛刺会残留乘以0.92而不是直接保留相当于做了一层保险丝处理代价是脉冲幅值损失不到1%但输出波形干净得多。3.4 去噪结果怎么评价才靠谱去噪效果不能只看看起来干净了得用指标说话。我每次实验固定看四个指标信噪比SNR去噪前后对比这个是最直接的。上面这套流程在-2dB输入下输出信噪比能到9.5dB左右。均方根误差RMSE去噪波形与原始无噪声局放波形之间的误差。RMSE太小可能有过度处理的嫌疑毕竟真实场景没有标准答案所以RMSE主要用来横向对比不同参数下的去噪能力。波形相似度相关系数去噪后波形与纯净信号波形的相关系数。这个指标对波形形状是否被破坏非常敏感。实测下来相关系数稳定在0.96以上说明脉冲形状保留得不错。脉冲幅值误差专门看脉冲峰值位置的幅值偏差。这个指标最直观也是现场工程师最关心的。全局阈值去噪后幅值普遍缩水15%-20%而这个方案能控制在5%以内。我把一组典型实验结果放在下面方法输出SNR(dB)RMSE相关系数幅值误差原始含噪信号-2.00.4310.51-全局小波阈值6.80.2140.8218.7%空间自适应阈值8.60.1730.909.3%空间自适应SVM9.50.1320.964.8%从表里可以清楚看到空间自适应阈值比全局阈值提升了一截而加了SVM分类之后又是一个明显的进步。尤其是幅值误差从9.3%降到4.8%这个提升在实际局放检测里意义很大——幅值判断差5%和差20%对放电严重程度的评估结论完全不同。4. 踩坑记录常见问题与排查思路这一节把我反复调试过程中遇到的高频问题、以及对应的解决路径整理出来基本可以当成一个速查表用。4.1 阈值、窗口和收缩函数怎么搭配第一个高频问题选择什么样的阈值收缩函数。常用的有三种硬阈值、软阈值、Garrote阈值。硬阈值保留被判定为信号的系数原值细节保留最好但方差大重构波形容易出现局部抖动软阈值把所有保留系数向零收缩一个阈值宽度波形平滑但幅值损失明显Garrote阈值介于两者之间——大系数几乎不受影响小系数平滑收缩。我的建议是主流程用Garrote或软阈值在SVM介入后可以改用一种差异化收缩策略对SVM判定为信号的系数用Garrote阈值保护幅值对噪声系数用软阈值彻底压平。我在实验里就是这么做的效果比统一用一种收缩方式好。第二个问题是窗口大小和分解层数的联动关系。不要每一层都用同一个窗口层数越深的细节系数空间分辨率越低相邻系数之间的相关性越强窗口可以适当放大。我实测第一层细节窗口取3、第二层到第四层取5整体效果比统一取3更好。原理很简单深层系数的有效脉冲跨度在系数序列上更长窗口太小反而抓不到完整的局部能量轮廓。第三个常见误区是直接对近似系数低频分量也做阈值处理。近似系数承载的是信号的主体轮廓真正的局放脉冲主要是细节系数里的高频成分。如果你把近似系数也拿来收缩会把低频噪声残留在主体信号里重构出来的波形基线会变形。在这套方案里近似系数始终不做阈值处理。4.2 SVM分类效果不理想怎么调如果你训练的SVM在测试集上准确率很高但是一上实测数据就乱套大概率是训练数据分布和实测数据分布差异太大。我在第二轮迭代时加入了更嘈杂的现场噪声样本把电晕干扰和开关操作干扰都混进训练集里重新训练盲测准确率立刻提升了5%左右。如果SVM分类的结果表现出大面积误判先检查两件事一是特征有没有归一化RBF核函数是距离敏感的不同特征量纲差几个数量级时模型会被大数特征主导二是正负样本是否平衡。细节系数中噪声主导系数占了绝大多数样本可能是100比1的悬殊比例这种不平衡会让SVM倾向于把绝大多数样本都预测为噪声信号系数被严重误杀。解决办法有两个对负样本做欠采样或者把SVM换成OneClassSVM单类SVM只拟合信号类。我在第三个版本里试过OneClassSVM效果也不错而且省掉了一部分标签工作量。还有一个经验不要追求分类准确率太高而要控制两类错误的代价比。把噪声误判为信号的代价设为1把信号误判为噪声的代价设为3然后调SVM的class_weight参数去加权。这样输出的去噪信号虽然会有一点点噪声残留但保住了所有真实脉冲。现场工程师更愿意看到这个结果因为漏检一个放电比多看到几个噪点危险得多。4.3 去噪后波形失真问题最典型的现象是去噪后脉冲变矮、变钝。这种情况九成是软阈值过度收缩导致的。我之前为了追求SNR数字好看把SVM判定为信号系数也做了同样强度的收缩结果信噪比确实高可脉冲峰值被削弱了12%以上。后来的做法是像前面说的信号系数改用Garrote阈值或者干脆只做轻微衰减牺牲一点SNR换取幅值保真。去噪的本质不是把信噪比刷得越高越好而是让下游的缺陷识别算法能抓到准确的脉冲形态。另一个失真问题是重构波形出现振铃。这个锅主要在小波基身上。db4在频响上有一定的非理想特性如果原始信号频带跟分解尺度匹配不好逆变换时会在脉冲两侧产生振荡拖尾。排查方法很简单用完全不叠加噪声的纯净信号跑一遍重构流程如果纯净信号的重构波形已经有振铃说明是小波基和分解层数不匹配如果纯净信号重构正常、加噪声后才出现振铃那就是阈值或者SVM分类处理引入了畸变优先检查被误判为噪声并被置零的信号系数。4.4 实测数据和仿真数据的差异仿真里一切顺利拿到现场实测数据后往往立刻受打击。最常见的三个差异实测数据带有基线漂移和工频谐波。变压器本体来的信号经过传感器耦合后会叠加50Hz及相关谐波分量它们在小波分解后会出现在较低频层的近似系数或前几层细节系数的低频部分容易干扰SVM的特征提取。解决思路是先对原始信号做一个高通滤波把1MHz以下不是很关心的低频分量滤掉再进小波分解流程。不同设备的局放脉冲形态差异巨大。油中放电、纸板沿面放电、气体绝缘开关里的悬浮放电脉冲宽度和振荡特性完全不一样。一个在A设备上训练好的SVM直接迁移到B设备上分类准确率会大幅下滑。要解决这个问题一个是扩大训练样本覆盖范围另一个是在部署时用目标设备的少量标记数据做模型微调。我在实际项目中就是预留了一个几十秒的设备自学习模式让现场人员标几个故障样本重训一下SVM效果好很多。现场噪声不是静态的。上午测试时噪声还不错下午旁边有大型设备启动噪声强度直接拉高10dB。对这种非平稳情况固定参数的SVM分类器会逐渐失效。建议在系统里加入噪声环境监测逻辑每个固定时间段统计一次细节系数的噪声标准差噪声标准差增大时自动把阈值整体上调同时动态调整SVM的决策偏置向少判信号方向倾斜。5. 最后分享一点个人体会这套方案做完之后我的整体感受是空间自适应小波阈值和SVM的组合价值不在某一个单独环节有多先进而在于它们刚好解决了彼此的问题。小波阈值去噪的短板是精度不足、分辨不了同类形态的干扰SVM分类的短板是依赖人对特征的定义小波分解恰好提供了一个非常自然的特征提取框架。两者一结合各自的短板都被对方补掉了这在信号处理里是一个比较难得的事情。如果你准备在自己的数据上复现这套流程我建议严格按照仿真训练-仿真验证-实测盲测的顺序来不要一上来就啃实测数据。先用仿真把训练集、特征、参数全部沉淀下来再拿实测数据逐步调整。过程中最值得花时间的不是调SVM的C和gamma而是想清楚你那个场景里信号和噪声到底在特征空间怎么区分。特征选对了SVM就是个顺手的工具特征没选对再好的分类器也是白搭。最后再提醒一句任何去噪算法做出来的波形都只推荐用在定性分析和幅值趋势判断上。要作为继电保护或者严重故障判别的判据还是要回到现场校验和多次重复测量算法处理电路不能替代工程判断。这套方法已经在我经历过的变压器局放监测项目里稳定跑了一年多输出的去噪波形质量远好于之前用固定阈值方案时的水平希望你也能跑出满意的效果。