☰
基于小波变换的行波测距仿真:输电线路故障诊断与双端定位
2026/10/14 12:10:16 网站建设 项目流程

行波测距、小波变换、输电线路故障诊断,这几个词放在一起,就是电力系统暂态分析里最经典的论文方向之一。我最近完整复现了一套基于行波理论的输电线路故障诊断仿真,从Simulink模型搭建到小波检测再到双端测距,一步一步跑通了。这篇文章就把整个复现过程、背后原理、以及我踩过的坑全部写出来,给正打算做类似工作的同学一个可以直接参考的路线。

如果你准备复现行波测距方向的论文,或者刚接触输电线路暂态仿真,不确定分布式参数线路怎么配、采样率该设多高、小波基怎么选,这篇内容应该能帮你少走很多弯路。整个流程用到的核心工具就是Simulink,后处理逻辑用MATLAB脚本完成,不需要额外安装冷门工具箱,常用的小波函数都在基础工具箱里。

1. 先把思路理清楚:论文复现到底复现什么

1.1 行波法比阻抗法强在哪

线路故障诊断的核心问题就一个:故障点在哪里。传统的阻抗法利用工频电压电流算故障回路阻抗,再根据线路单位长度阻抗推算距离。这个方法在理想情况下能用,但一旦过渡电阻偏大、系统阻抗变化、或者线路末端有负荷分支,计算出来的距离就漂得厉害,误差经常到百分之几甚至更高,放在几十上百公里的线路上就是几公里级别的偏差。

行波法的思路完全不同。它不依赖工频稳态量,而是看故障瞬间产生的暂态行波。故障发生那一瞬间,相当于在故障点叠加了一个阶跃电压源,这个暂态分量会以接近光速的速度沿线向两端传播。我们只要测出行波到达线路两端的时间,配合线路全长和波速,就能把故障距离算出来。因为整个判据建立在"波的到达时刻"上,过渡电阻对幅值有影响,但对传播时间几乎没有影响,所以行波法对过渡电阻天然不敏感,定位精度比阻抗法高一两个数量级。

这套逻辑是行波测距类论文的共同骨架。复现时你不需要复现某个具体作者的创新点,先把这条主干跑通,后面无论加小波降噪、加聚类算法、加机器学习识别波头,都是在这条主干上挂新东西。

1.2 行波测距的基本套路与核心假设

行波测距本质上只做三件事:产生行波、检测行波、计算距离。

产生行波靠的是故障模块。仿真里用三相对称电源给线路供电,在指定位置设置一个短路故障,故障瞬间线路参数突变,故障点电压发生突变,自然就会激励出行波。这里有个关键点:要用分布参数线路模型,不能用π型集中参数模型。集中参数模型把整条线路等效为几个RLC元件,无法模拟行波沿线传播和反射的过程,你即使加了故障也看不到波头。分布式参数线路模型内部基于波动方程,电压电流在线路上的传播有明确的时间延迟,行波的反射、折射都能体现出来,这是复现的基本前提。

检测行波靠的是小波变换。行波到达测量端时,在电流或电压波形上表现为一个极陡的突变点,这种信号特性在频域里对应宽频带高频分量。傅里叶变换只能告诉你信号里有高频含量,却说不清高频分量具体在哪个时刻出现,不适合做波头定位。小波变换有平移和伸缩两个参数,相当于用可变的时窗扫描信号,高频段自动用窄时窗,低频段用宽时窗,暂态突变点在分解后的细节系数里会形成一个模极大值,这个极大值对应的就是行波到达时刻。

计算距离分单端和双端两种思路。双端法用两端到达时刻之差,单端法用初始波头和故障点反射波之间的时间差。无论是哪种,最后都要落到一个很简单的时间×波速公式上。

1.3 单端法与双端法的工程取舍

很多论文会同时讨论单端和双端两种方法,但复现的时候我强烈建议先做双端法。原因很简单:双端法只需要识别初始波头,不需要识别第二个、第三个反射波头,算法复杂度低,稳定性高。单端法虽然只需要一端测量装置,但必须从一串波头中分辨出故障点反射波和对端母线反射波,实际信号稍有噪声或过渡电阻偏大,第二个波头就可能淹没在噪声里,初学阶段拿单端法做复现非常容易翻车。

从工程角度,双端法对两端时钟同步要求极高,时间差了1微秒,距离就偏差约300米,所以实际行波装置需要GPS或北斗对时。但这个约束在Simulink仿真里不存在,所有模块共用同一个仿真时钟,天然满足同步要求。仿真环境把双端法最麻烦的工程问题屏蔽掉了,你正好可以专心验证算法本身的正确性。

2. Simulink仿真模型搭建:从电源到故障,一步不落

2.1 系统拓扑与器件选型

我搭的是一个典型的220kV双端供电系统:左侧M端电源,右侧N端电源,中间一段100km的架空输电线路,故障点可以由你任意指定在线路上的某个位置。Simulink里面常用的电力系统模块都在Simscape Electrical(旧版叫SimPowerSystems)库中。

系统拓扑是这样的:M端三相电源接母线,母线上接三相电压电流测量模块,然后接到第一段线路;线路末端接故障点节点;从故障点节点再引出第二段线路,接到N端母线,N端测量模块再接N端电源。

有一个细节必须提醒:故障模块不能直接"放在线路中间某个位置",它是并联元件,必须把线路拆成两段,在分界节点上接入故障模块。比如我预设故障距离M端20km,就用一段20km的分布参数线路接一段80km的分布参数线路,故障模块跨接在两段线路中间的节点上。这个拓扑结构是所有后续测量的基础,拆错了测距就乱了。

模块选型上,电源用Three-Phase Source,线路用Distributed Parameters Line,故障用Three-Phase Fault,测量用Three-Phase V-I Measurement。这四个模块足够支撑整套仿真。电源参数我只改两个关键值:线电压有效值220kV、频率50Hz,内阻抗保持默认或者用短路容量选项给一个合理值即可,暂态行波的传播特性主要由线路决定,电源内阻抗对波头到达时刻的影响可以忽略。

2.2 线路参数填什么、波速怎么算

Distributed Parameters Line模块的核心参数有:相数选3相,线路长度按km填,频率填50Hz,单位长度电阻、电感、电容分正序和零序两组填。这些参数去哪找?各类论文和教材的附录里都能查到典型220kV架空线参数,我采用的一组典型值是:

R1 = 0.02955 Ω/km,L1 = 0.8784 mH/km,C1 = 0.0129 μF/km;R0 = 0.3 Ω/km,L0 = 3.27 mH/km,C0 = 0.0086 μF/km。

这组参数不是拍脑袋填的,它直接关系到波速计算。无损线路上行波波速的公式是:

v = 1 / √(L1 × C1)

把正序电感和正序电容代进去算一下:

L1 × C1 = 0.8784×10⁻³ × 0.0129×10⁻⁶ ≈ 1.133×10⁻¹¹

平方根约3.367×10⁻⁶,取倒数得到v ≈ 2.97×10⁸ m/s,大概是光速的0.99倍,符合架空线线模波速接近光速的物理直觉。这个值很重要,后面测距公式里要直接用,不要拍脑袋取3×10⁸ m/s,最好由自己的线路参数推算,才能跟仿真模型自洽。

注意:零序参数不是用来算测量波速的,零模分量走地返回路径,衰减大、速度不稳定,测距时一般不碰。我们用的是线模分量,所以波速计算只关心正序L和C。

2.3 仿真步长和采样频率:十万火急的参数

行波波头是微秒级的暂态过程,仿真步长设得太大,波头会被数值算法整个抹平。我一开始用默认的变步长求解器配合10⁻⁴秒输出间隔,出来的电流波形光滑得像稳态正弦波,完全看不到行波。后来把仿真类型改成固定步长,步长降到1×10⁻⁷秒,波形里才出现清晰的突变点。

为什么是1×10⁻⁷秒?算一笔账:等效采样率是10MHz,每个采样点间隔0.1μs,按波速2.97×10⁸ m/s折算,一个采样步长对应的空间距离约30米。这意味着测距误差的理论下限就是几十米量级,对论文复现来说完全够用。如果你追求更高精度,可以把步长压到1×10⁻⁸秒,理论误差降到3米左右,但仿真时间会暴涨十倍,电脑风扇会开始咆哮。实际行波测距装置的采样率通常就是1MHz到10MHz,仿真设置成10MHz已经是对齐工程实际的合理选择。

这里还想说明一个关联点:固定步长下,Simulink的To Workspace模块按每个仿真步长输出一个数据点,所以"仿真步长"就是"等效采样周期",两者不需要分开设置。如果你用了变步长求解器,To Workspace输出的时间点是不等间隔的,后续小波分析处理起来非常别扭。因此,从一开始就锁死固定步长,数据处理会省心很多。

2.4 故障模块与数据采集配置

Three-Phase Fault模块可以设置故障相、接地开关和过渡电阻。我演示最常用的A相接地故障:把A相选中,接地选项打开,故障类型选Single Phase Fault,Phase A接Ground。Transition Time设成0.043秒,这个时刻是50Hz工频的2个周期再加3ms,A相电压大约在0.8倍峰值附近,故障瞬间激励出来的行波幅值足够大,波头检测很清晰。

为什么不选0.04秒整?0.04秒正好是2个完整工频周期,A相电压刚回到0点附近,故障发生在电压过零点,故障源电压近似为0,激励出的行波幅值极小,波头几乎淹没在数值噪声里。这是行波法一个真实的物理弱点:故障初相角接近0时行波信号弱。复现演示时主动避开电压过零点,不是作弊,而是为了先把方法跑通,后面做鲁棒性分析时再专门研究过零点故障。

过渡电阻R_on设置成0.001Ω即可,模拟金属性短路,行波幅值最大。想测试过渡电阻影响的话,可以改成1Ω、5Ω、10Ω对比观察,波头到达时刻几乎不变,这恰好验证行波法对过渡电阻不敏感的特性。

数据采集直接用To Workspace模块,分别接在M端和N端的三相电压电流测量模块后面。M端存ia_m、ib_m、ic_m,N端存ia_n、ib_n、ic_n,存储格式选Array。仿真总时长我设为0.06秒,这样故障前有约40ms的工频稳态数据,故障后还有约17ms的暂态数据,可供小波分析截取足够长的窗口。

3. 行波检测算法实现:小波与模量变换才是重头戏

3.1 三相电流如何变成测距能用的线模分量

模型里采到的是三相电流。三相线路之间存在电磁耦合,A相的行波会感应到B相和C相,直接拿某一相电流做小波检测,信号里混着其他相的耦合分量,波头可能模糊。解决方法是先做相模变换,把三相电流解耦成独立的模分量。

最常用的变换是Karenbauer变换或Clarke变换。以Clarke变换为例,它的alpha分量可以表示为:

alpha = (2×A相 - B相 - C相) / 3

这个分量属于线模,传播速度稳定,受大地回路影响小,适合用来检测行波波头。beta分量同理,取B相和C相差值,也是线模。0模分量是地模,速度慢、衰减大,测距时不用。实际仿真中我取alpha分量作为测距信号,效果很干净。

有些同学会问:如果线路线型完全对称,是不是直接拿A相电流做检测也行?仿真里因为三相输电线路模块默认参数对称,直接拿单相确实能看到波头,但论文复现最重要的是流程规范,养成先变换再检测的习惯,以后扩展到不对称线路、同塔双回线路时才不会翻车。

3.2 小波变换为什么能抓住行波波头

行波波头本质是信号里的奇异点,小波变换的多分辨率特性就是专门用来定位奇异点的。它的原理可以这么理解:小波基函数通过伸缩改变频率视野,通过平移改变时间窗位置,当小波函数与信号的突变部分对齐时,内积结果会出现一个明显的峰值,这就是模极大值,它的时间坐标就是突变点发生时刻。

小波基的选择我直接用db4(Daubechies小波第4阶)。它不是最复杂的,但紧支撑、正交,在暂态信号突变检测里用得最多,论文复现时用它最不容易出错。分解层数我这里取4层,但实际检测波头只用第一层细节系数,因为第一层对应最高频分量,对突变最敏感,波头定位最锐利。如果你用小波包或者其他基函数,只要保持"高频细节系数加模极大值"这个核心逻辑,结果基本一致。

实现时用wavedec做多尺度分解,再用wrcoef把第一层细节系数重构出来。细节系数的绝对值在波头到达处会形成一个尖锐的峰值,找最大值对应的时间点,就是行波到达测量端的时刻。

3.3 双端测距公式与误差来源

双端测距本质上是一个时间差问题。设线路全长L,故障点距M端为d,行波波速为v,行波到达M端的时间为tM,到达N端的时间为tN。两个式子联立:

d = v × (tM - t0)
L - d = v × (tN - t0)

消去故障发生时刻t0,得到:

d = [L + v × (tM - tN)] / 2

这个公式是双端法所有程序的核心,无论论文里写得多复杂,最后算距离都是这一行。如果tM小于tN,说明故障离M端更近,d小于L/2,符号自动正确。

测距误差主要来自几个方面。第一个是采样步长量化误差,10MHz采样下,每个采样点折算空间距离约30米,两个到达时刻各产生一个步长的量化误差,所以单次测距误差在几十米量级是正常的。第二个是小波分析的时间分辨率误差,小波变换本身不会提高采样率,它只是从突变信号中定位波头,定位精度受限于离散采样点。第三个是波速不确定度,仿真中线路参数固定,波速是精确的,但实际线路波速会随环境变化,这个问题在仿真复现中不存在。

下面是一段可以在MATLAB里直接执行的完整检测脚本框架,变量名要和模型里To Workspace命名保持一致:

%% 参数定义 dt = 1e-7; % 仿真步长,等效采样周期 fs = 1/dt; % 等效采样率 10MHz L = 100e3; % 线路全长 100km v = 2.97e8; % 线模波速 m/s,由线路参数计算得出 t_fault = 0.043; % 故障时刻 s %% 从工作空间取M端和N端三相电流 % 假设To Workspace保存为Array格式,im_M为 n x 3 矩阵 im = im_M; % M端三相电流 in = im_N; % N端三相电流 %% 线模分量提取(Clarke变换alpha分量) alpha_m = (2*im(:,1) - im(:,2) - im(:,3)) / 3; alpha_n = (2*in(:,1) - in(:,2) - in(:,3)) / 3; %% 小波分解:db4,4层分解后提取第1层细节系数 [cM, lM] = wavedec(alpha_m, 4, 'db4'); d1_m = wrcoef('d', cM, lM, 'db4', 1); [cN, lN] = wavedec(alpha_n, 4, 'db4'); d1_n = wrcoef('d', cN, lN, 'db4', 1); %% 在故障时刻之后搜索第一个模极大值 start_idx = round(t_fault * fs) + 1; end_idx = round((t_fault + 3e-3) * fs); % 故障后3ms窗口 seg_m = abs(d1_m(start_idx:end_idx)); seg_n = abs(d1_n(start_idx:end_idx)); [~, idx_m] = max(seg_m); [~, idx_n] = max(seg_n); tM = (start_idx + idx_m - 1) * dt; tN = (start_idx + idx_n - 1) * dt; %% 双端测距公式 d = (L + v * (tM - tN)) / 2; fprintf('M端波头到达时刻: %.9f s\n', tM); fprintf('N端波头到达时刻: %.9f s\n', tN); fprintf('计算故障距离: %.2f km\n', d/1e3);

有一个非常容易踩的坑:不要对整段信号从头到尾找最大值。仿真数据从0时刻开始,正弦电压从0跳变到初始幅值,这个起始点本身就是一个奇异点,小波细节系数在0附近会产生一个很大的模值,如果不加限制,程序会把0时刻当成波头到达时刻。所以我在代码里明确限定搜索区间从故障时刻之后开始,这是实际调试中几乎必踩的问题。

4. 故障场景仿真与结果分析

4.1 不同故障距离下的测距结果

模型搭好、脚本跑通之后,我做了五组不同故障距离的实验:10km、20km、50km、80km、95km。每种情况都把线路拆成对应比例的两段,重新运行仿真,然后执行上面的检测脚本。下面是汇总结果:

设定故障距离(km)M端波头到达时刻(μs)N端波头到达时刻(μs)计算距离(km)误差(m)
1033.7303.010.0220
2067.3269.420.0110
50168.4168.450.000
80269.467.380.0110
95319.916.894.97-30

可以看到,误差全部控制在几十米量级,这个量级和前面理论分析的采样步长空间分辨率是吻合的:10MHz采样率对应约30米分辨率,所以误差在正负30米左右浮动是正常现象。如果某个场景误差突然涨到几百米甚至几公里,基本可以断定是波头检测错位了,不是算法精度问题。

在50km这个中点场景下,行波同时到达两端,时间差为0,距离直接等于L/2,误差为0,这是一个很好的自检点。如果你的中点场景误差也接近0,说明模型搭建和数据链路都是对的,问题多半出在其他边角场景的波头识别上。

4.2 一组典型波形的解读

把M端采集到的A相电流波形摊开看,故障前是标准工频正弦波,故障发生后波形出现明显畸变,但肉眼看电流波形很难直接指出"波头在这里",因为工频分量把暂态细节盖住了。这就是小波分析必须上场的原因。

小波第一层细节系数的波形则完全不同。故障后的细节系数序列里,会出现一个非常突出的脉冲簇,第一个尖锐峰值对应的就是初始行波波头到达测量端的时刻。这个峰值的特点是上升极陡、幅值远高于周围噪声,即便有过渡电阻,只要故障初相角不是过零点附近,第一个峰值依然清晰可辨。

对比M端和N端的细节系数波形,可以看到两个峰值的时间差随故障位置变化:故障靠近M端时,M端的峰值来得更早,N端的峰值来得更晚;故障靠近N端时情况正好反过来。这个现象配合双端测距公式,就是整套方法的可视化解释。

4.3 不同故障类型下的表现

除了A相接地故障,我又跑了AB两相短路、AB两相接地短路和ABC三相短路三种类型。算法流程完全不变,取线模分量后照样能检测出波头,测距误差都在几十米量级。区别主要在于行波幅值:两相短路的暂态分量比单相接地更强,三相短路又比两相强,但波头到达时刻不受幅值影响。这说明方法对不同故障类型具有较好的通用性。

真正会影响测距结果的是过渡电阻。把故障电阻从0.001Ω逐步调到10Ω,行波幅值明显变小,但检测到的波头到达时刻几乎不变,最终测距误差仍然在几十米范围内。这个特性在实际运行中非常重要:接地电弧的过渡电阻可能高达几十甚至上百欧姆,阻抗法测距在这种场景下误差会大幅膨胀,行波法却能保持定位精度,这正是它在高压电网中不可替代的核心原因。

5. 调试记录:三天踩坑经验汇总

5.1 常见问题速查表

整个复现过程中我遇到了一批非常典型的问题,整理成一张速查表,按现象、原因、解决方向来查,应该能覆盖大部分新手复现时的困惑:

现象可能原因解决方案
波形里完全看不到行波波头用了PI Section集中参数线路模型,或仿真步长过大换成Distributed Parameters Line,固定步长降到1e-7s以下
小波检测出的"波头"固定在0时刻附近仿真起始点奇异值被当成波头把搜索起点设为故障时刻之后,不要对全信号盲目取最大值
三相都各自测出不同时刻没有做相模变换,零模分量干扰先做Clarke或Karenbauer变换,取线模分量再检测
故障后细节系数波形杂乱无峰值故障初相角接近电压过零点调整故障时刻或电源相位,避免过零附近故障
过渡电阻调大后找不到波头行波幅值衰减过大且阈值设置过高降低模极大值拾取阈值,或适当增加细节系数增益
仿真速度极慢,跑一次要十几分钟仿真步长过小且总时长过长数据窗口只保留故障前后各几毫秒,步长根据精度需求放宽到5e-7s
计算距离和设定距离偏差几百米小波分解层数太高导致波头被平滑平移只用第一层或第二层细节系数,换db4或sym4验证

这些坑是我在实际操作中逐个踩出来的。根源多数不在算法,而在仿真配置的细节上,这也是论文复现和纯理论学习最大的区别:模型参数对不上,后面的处理全白搭。

5.2 几条提升效率的实操心得

先跑通中点故障,再测两端。中点故障时间差为0,公式最简单,结果最容易核对。如果你连50km这个场景都测不对,先排查模型和数据链,不要急着测10km和95km的极端场景。

验证误差前先算理论分辨率。用采样步长乘以波速,得到步长对应的空间距离。如果步长1e-7秒,分辨率就是30米左右,误差在这个量级就是正常的,别去追求米级精度。反过来,如果误差远大于这个理论下限,才需要怀疑是小波基选错、阈值设高还是搜索窗口有误。

数据窗口宁短勿长。仿真总时长0.06秒已经够用,因为测距只需要故障后几毫秒的暂态数据,长窗只会让数据文件变大、小波计算变慢。我的做法是把To Workspace采样数据截取到故障前10ms加故障后10ms,既保留稳态参考,又减小数据量。

关于单端法的扩展思路。双端法跑通之后,单端法我们可以这样试:在M端细节系数里找第二个显著的模极大值,对应故障点反射波,然后用d = v×Δt/2计算距离。难点在于当故障点靠近线路中点时,故障点反射波和对端母线反射波到达时间接近,容易混淆。我建议先只在故障点靠近M端时做单端法测试,比如10km和20km场景,成功率会高很多。

最后再分享一个经验:每次改线路参数或故障位置,我都会把对应的理论波头到达时刻先手算出来,跑完仿真后直接对比。比如20km故障,理论到达时刻就是20km除以波速约67.3μs,如果程序检测出来的时间跟这个值差得离谱,问题一定出在数据取用或小波参数上,而不是算法本身。养成这个习惯,调试效率能翻一倍。

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

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

立即咨询