news 2026/9/18 8:23:45

S变换与深度学习在配电网单相接地故障选线中的应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
S变换与深度学习在配电网单相接地故障选线中的应用

简介:《基于S变换相关度和深度学习的配电网单相接地故障选线新方法》是一项面向配电网故障诊断的学术研究成果,PDF原文共1个文件,大小3.76MB,已有146人学习下载。这项成果来自华中科技大学电气与电子工程学院,发表于《电力自动化设备》2021年第7期,针对传统零序电流幅值比较法易受故障条件和环境噪声影响的问题,利用S变换提取零序电流全频段时频信息并计算线路故障相关度,进而提出S变换相关度图形(SCF)构建方法,搭建含SCF层的卷积神经网络模型(S-CNN)。文章给出了Simulink仿真与真实配电网故障数据测试结果,验证了强噪声、不同故障位置、故障相角、过渡电阻及采样不同步等场景下的高正确率选线性能。内容偏重理论与算法实现,适合电力系统专业研究生、配电网保护研发工程师及从事深度学习电力应用的研究者阅读参考,对配电网故障选线方案设计与智能化升级具有直接借鉴价值。

1. 单相接地故障选线为什么要从频谱分析绕不开S变换

配电运维人员看故障录波图时最头疼的场景,是母线零序电压已经越限,好几条出线的零序电流波形却长得一模一样。小电流接地系统里,单相接地后的故障电流本来就小,消弧线圈还会把基波分量补偿掉,能拿来判断故障位置的只剩下暂态过程那几十毫秒里频率随时间变化的微弱信号。这种非平稳信号拿固定窗长的短时傅里叶变换去切,分辨率顾了高频就丢了低频;而S变换(Stockwell变换)的窗口宽度会随频率自动收缩,高频段看清暂态起始点,低频段盯住衰减分量,天然适合做选线特征提取。S变换相关度负责把多条馈线之间的相似性和差异性量化成矩阵,深度学习再从这个矩阵里自动学出“哪条线路内部特征跟集体不一致”,这一步就是故障选线。这篇文章写给做配网自动化、状态检修或继电保护相关系统的工程师,目标是让你从原理、特征构造到模型训练,完整复现这条技术路线。

2. S变换的时频分析原理与最小可运行实现

2.1 S变换和短时傅里叶、小波变换的差异

S变换的定义可以理解为短时傅里叶变换的“变种”,但窗函数不再是固定宽度的高斯窗,而是随频率变化的。对于一个连续信号x(t),S变换定义为

S(τ,f) = ∫ x(t) · (|f| / √(2π)) · exp(-(τ-t)²f² / 2) · e^(-j2πft) dt

其中高斯窗的标准差σ(f) = 1/|f|。这个式子最直接的含义是:频率f越高,窗越窄,时间分辨率越高;频率越低,窗越宽,频率分辨率越好。对比短时傅里叶变换固定窗宽带来的“顾此失彼”,S变换在分析电力暂态信号时能同时保留故障发生时刻的突变点和高频振荡分量。

和小波变换相比,S变换的输出直接落在时间-频率平面上,频率轴的刻度就是物理Hz,不需要做尺度到频率的换算。小波变换在分析非平稳信号时同样自适应,但工程人员在使用时面对的是一组尺度系数,必须额外做映射;S变换的输出形式对后面的机器学习工程更友好,矩阵的行列都有明确的物理标签。

特性短时傅里叶变换连续小波变换S变换
窗函数固定宽度尺度自适应频率自适应高斯窗
频率刻度线性Hz尺度,需换算直接为Hz
高频时间分辨率
低频频率分辨率
逆变换有条件

配电网暂态信号有个特点:故障起始瞬间包含大量的高频分量,随后迅速衰减,几十毫秒后只剩工频和衰减直流。这正好对应S变换在时间-频率平面上的“两头兼顾”。

2.2 用Python写一个能跑的离散S变换

论文里通常直接给公式,真正动手复现时才会发现离散实现有很多细节。下面的代码用时域卷积方式实现S变换,逻辑直观,适合理解原理;工程上要追求速度时,可以换成基于FFT的快速实现,但输出矩阵的结构相同。

import numpy as np def stockwell_conv(x, fs, fmin=20.0, fmax=5000.0, n_std=3): """ 时域卷积方式计算离散S变换。 参数 ---- x : np.ndarray, shape (n,) 输入信号,例如零序电流的采样序列 fs : float 采样率,单位 Hz fmin, fmax : float 需要分析的频率范围,单位 Hz n_std : int 高斯窗保留的宽度,取 3 个标准差以上会截断 返回 ---- st_matrix : np.ndarray, shape (n_freq, n) 行对应频率,列对应采样时刻 freqs : np.ndarray 频率轴 """ n = len(x) t = np.arange(n) / fs freqs = np.linspace(fmin, fmax, int((fmax - fmin) / 2) + 1) # 构造解析信号,去掉负频率带来的镜像干扰 analytic = np.fft.ifft(np.fft.fft(x) * (2 * (np.arange(n) < n // 2))) analytic = analytic.real st_matrix = np.zeros((len(freqs), n), dtype=np.complex128) for idx, f in enumerate(freqs): if f <= 0: continue sigma = 1.0 / f if f > 0 else 1.0 # 高斯窗宽度与频率成反比 half = int(n_std * sigma * fs) half = min(half, n // 2) # 对基波做频率搬移后做局部加权 base = analytic * np.exp(-2j * np.pi * f * t) win = np.exp(-(t - t[n // 2]) ** 2 / (2 * sigma ** 2)) # 卷积中保证窗的峰值对准不同时刻 weighted = base * win st_matrix[idx, :] = np.fft.fftshift(np.fft.ifft(np.fft.fft(weighted))) return st_matrix[:, :n], freqs

这段代码的核心思路是:对于每个目标频率f,先把信号搬移到基带,再乘上一个宽度为1/f的高斯窗,最后卷积。代码里的analytic构造了解析信号,目的是消除负频率分量的影响,否则在低频段会产生明显的交叉干扰。fminfmax控制了输出矩阵的行数,实际分析中不要无脑从0Hz开始——配电网暂态信号的能量主要分布在100Hz到5kHz,直流附近的频率既没有诊断价值,还会因为窗太宽而引入数值噪声。

2.3 配电网零序信号分析的频率段和时间窗设置

S变换虽然数学形式漂亮,但直接用在故障选线上需要先确定两个重要参数:采样率与分析时间窗。现场故障录波装置常见采样率是10kHz,即每周期200个点,对暂态高频分量来说已经足够,不需要额外插值。

时间窗的选择更考究。故障前取5ms到10ms作为参考段,故障后取40ms到80ms,这样既能覆盖暂态首波,又能看到高频衰减到稳态的过程。如果时间窗取太长,例如一个完整工频周期加暂态共120ms,S变换矩阵里高频分量的能量会被低频部分稀释,后面深度学习模型要关注的重点反而被压制。我一般让时间窗内的采样点数在1000到2000之间,这样S变换直接计算的时间在几百毫秒量级,完全能满足批量预处理的需求。

还有一个容易踩的坑:零序电流互感器的二次侧信号通常有较强的直流偏置和低频漂移,直接做S变换会在频率轴最低端产生一片伪能量。处理办法是先做50Hz陷波和100Hz以下的高通滤波,把漂移去掉,再进S变换。滤波阶数不宜过高,二阶巴特沃斯就够,避免把有用的低频衰减分量一并滤掉。

3. 从S变换到相关度特征:构造深度学习能用的样本

3.1 为什么要计算S变换相关度而不直接把矩阵塞进网络

S变换输出的是一个二维复数矩阵,幅值谱和相位谱能描述单个信号的时频特性,但故障选线本质上是一个多通道比较问题。某个馈线是否故障,取决于它和其他馈线的行为差异,而不是它自己单独长什么样。把多条馈线的S变换矩阵直接拼接成一个高维向量喂给网络,网络确实能学,但需要大量样本来拟合“谁跟谁不一致”这种关系。相关度计算在这里相当于把比较逻辑显式地做进了特征里,让模型不需要从头总结“不一致”的统计规律。

常见做法是计算两类相关度:一是每条馈线的零序电流S变换与母线零序电压S变换之间的相关系数;二是馈线两两之间的S变换幅值谱相关系数矩阵。前者的物理意义是故障线路的暂态电流和母线电压的波形特征更接近,后者刻画的是健全线路之间的时频结构相似度,故障线路在相关度矩阵里会体现出明显的“离群”。

3.2 计算S变换相关度矩阵并做成单通道样本

在采集到多通道零序信号后,第一件事是把每一条馈线的S变换幅值谱做归一化,因为它们量纲相同但幅值可能差一个数量级。归一化后再计算相关度矩阵就稳定得多。下面的代码展示了如何把8条馈线的S变换幅值谱整理成一个相关度矩阵。

def feeder_corr_matrix(st_magnitudes): """ 输入多馈线S变换幅值谱,输出馈线间的相关度矩阵。 参数 ---- st_magnitudes : np.ndarray, shape (n_feeder, n_freq, n_time) 所有馈线的S变换幅值谱 返回 ---- corr : np.ndarray, shape (n_feeder, n_feeder) 这是给深度学习模型用的二维特征图 """ n_feeder = st_magnitudes.shape[0] corr = np.eye(n_feeder) # 每条馈线分别做 L2 归一化,避免幅值差异主导相关系数 norm_feats = [] for i in range(n_feeder): flat = st_magnitudes[i].flatten() normed = (flat - flat.mean()) / (flat.std() + 1e-8) norm_feats.append(normed) for i in range(n_feeder): for j in range(i + 1, n_feeder): r = np.corrcoef(norm_feats[i], norm_feats[j])[0, 1] corr[i, j] = r corr[j, i] = r return corr

np.corrcoef计算Pearson相关系数是最直接的做法。注意代码里做了一次L2归一化,因为馈线的零序电流幅值往往不在同一个量级,如果不归一化,相关系数会被幅值最大的那条馈线主导,弱故障特征反而被淹没。

把相关度矩阵当作特征图输入模型时,数据维度不大,8条馈线对应的就是8×8的矩阵。如果你的配电网出线数不固定,需要先确定一个最大馈线数M,不足M条的补零,否则模型输入会变长导致训练不稳定。相关度矩阵也可以和S变换降采样后的幅值谱做多通道输入,让网络同时看到绝对特征和相对特征,但这种做法要求样本量足够大,否则过拟合风险高。

3.3 故障样本覆盖范围与数据增强

工况参数典型取值说明
故障角0°、30°、60°、90°、120°90°附近暂态能量最强,0°附近最弱
接地电阻0Ω、100Ω、500Ω、2000Ω、5000Ω高阻接地是选线的主要难点
消弧线圈补偿度欠补偿5%、过补偿5%、过补偿10%补偿度影响残流大小
噪声水平SNR 20dB、30dB、40dB模拟现场录波噪声
馈线结构架空线、电缆、混合线路阻尼率不同,暂态衰减速率不同

仿真时可以把这些参数做全组合,一个典型配电网模型能生成几千个样本。但样本之间不能直接按随机顺序切分训练集和测试集,必须以“仿真场景”为单位划分,同一个故障角、同一组接地电阻的样本如果同时出现在训练集和测试集里,评估出来的准确率会虚高,后面换到现场数据时立刻露馅。

数据增强方面,常见做法是在S变换前对原始波形做小幅时间抖动和幅值缩放,模拟录波装置触发时刻的微小差异。这种做法比增强S变换后的矩阵更合理,因为增强发生在物理域而不是特征域,不会破坏时频结构的一致性。

4. 深度学习模型选型与训练:把故障选线做成分类任务

4.1 用轻量级CNN从相关度特征中学出故障线路

故障选线的样本量通常不大,几千条仿真样本已经算多,所以模型结构不能用力过猛。大部分论文会用VGG或ResNet来展示效果,实际工程上更加合适的做法是先从一个三层卷积网络开始,验证特征有效性后一步步加深。下面的PyTorch模型就是为8条馈线的选线任务设计的。

import torch import torch.nn as nn class FeederSelector(nn.Module): def __init__(self, n_feeder=8, in_channels=2): super().__init__() # 输入通道2:一个通道是馈线相关度矩阵,另一个是各馈线S变换幅值的频域轮廓 self.features = nn.Sequential( nn.Conv2d(in_channels, 32, kernel_size=3, padding=1), nn.BatchNorm2d(32), nn.ReLU(inplace=True), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.BatchNorm2d(64), nn.ReLU(inplace=True), nn.MaxPool2d(2), ) self.classifier = nn.Sequential( nn.AdaptiveAvgPool2d((4, 4)), nn.Flatten(), nn.Dropout(0.3), nn.Linear(64 * 4 * 4, 128), nn.ReLU(inplace=True), nn.Dropout(0.2), nn.Linear(128, n_feeder) ) def forward(self, x): x = self.features(x) x = self.classifier(x) return x

模型输入是2通道的二维特征图,输出是长度为8的向量,对应8条馈线各自成为故障线路的概率。第一层卷积使用BatchNorm2d,因为相关度矩阵经过补零后边缘数值会有跳变,批归一化可以稳定前面几层梯度的分布。池化层用MaxPool2d保留强响应位置,这对“找出离群线路”的任务是合理的,因为故障线路的特征差异通常体现在少数时频区块上。

隐藏层的通道数控制在32和64,这是有意的选择。故障选线样本量少,特征维度太高很容易过拟合,验证集准确率会在第10轮左右开始不再上升。如果一定要加深网络,必须在每层后面紧跟Dropout并把Dropout率提高到0.4,否则训练集能到99%以上,测试集掉到80%是很常见的现象。

4.2 训练参数设置和损失函数选择

模型输出层没有经过Softmax,配合PyTorch的CrossEntropyLoss使用即可,它在内部已经做了Softmax和交叉熵的计算,不需要自己再做一层。

参数推荐取值注意事项
优化器AdamW比Adam多一个权重衰减项,防止模型在少量样本上产生大范数权重
初始学习率3e-4高于1e-3会导致损失不收敛
权重衰减1e-4和Dropout搭配使用
批大小32样本量低于2000时用16更稳
训练轮数50以验证集Early Stopping为准
类别权重按馈线样本数反比避免馈线数量不平衡

训练时会发现一个现象:验证集准确率在90%附近徘徊,但误选掉的那部分样本几乎都集中在高阻接地场景里。这不是模型问题,而是高阻接地时故障馈线与健全馈线的S变换相关度差值确实很小,任何分类器都难以区分。处理方案有两个方向,一是把接地电阻大于2000欧姆的样本单独建模,二是训练分类器时对低置信度样本增加损失权重。实践里前者效果更好,因为建模目标更单纯。

4.3 评估指标要看误选率和拒选率,而不是准确率

故障选线的评价体系和通用图像分类不太一样。图像分类里90%准确率可以接受,但选线任务里,选错线路意味着把健康线路当作故障线路来停电,代价远大于“选不出来”。所以工程上更倾向把模型输出看成两个环节:先判断哪条线路最可能,再判断这个判断是否可靠。

常见评价指标包括选线准确率、误选率和拒选率。拒选率指的是当模型输出的最大类别概率低于某个阈值时,系统主动放弃本次选线,由人工介入。举例来说,假设阈值设成0.6,模型输出的softmax概率是[0.55, 0.15, ...],那么系统不应该选0号线路,而是直接报“无法判定”。这个机制在现场非常有价值。

def select_with_reject(logits, threshold=0.6): """ 带拒选逻辑的故障选线输出。 参数 ---- logits : torch.Tensor / np.ndarray, shape (n_feeder,) 模型输出的原始logits threshold : float, 默认0.6 最低置信度阈值 返回 ---- select_idx : int / None, 选中的馈线编号或None表示拒选 confidence : float, 最大的softmax概率 """ probs = torch.softmax(torch.tensor(logits), dim=-1).numpy() top1_idx = int(probs.argmax()) top1_conf = float(probs.max()) if top1_conf < threshold: return None, top1_conf return top1_idx, top1_conf

这个代码直接把模型输出转成带拒选结果的判断,后端装置接到None时可以发告警给值班员,而不是自动去跳闸。阈值的选取可以基于验证集上的分布曲线,保证拒选率不超过10%的前提下阈值设得越高越保守;现场有人值守的变电站阈值可以设到0.7以上,无人站可以放宽到0.5,具体的数值取决于自动化程度和停电成本。

5. 模型落地时的边界条件与调优技巧

5.1 从仿真到现场,最先失效的往往是样本分布

仿真样本里母线电压严格正弦、故障瞬间干净利落,现场录波数据则夹杂着负荷投切、谐波源和电压互感器铁磁谐振带来的干扰。直接把仿真数据训练出的模型拿到现场测试,准确率可能从95%掉到60%以下。常见应对方案是把仿真数据和现场录波数据混合训练,现场数据不用太多,20到50条有效故障样本就能对迁移效果产生明显帮助。

5.2 多时段特征融合的选线技巧

S变换对整个时间窗做平均会丢掉暂态早期的重要信息。故障发生后前5ms内,高频分量最丰富、故障线路特征最突出;故障后20ms到80ms,高频衰减后主要依靠功率频率附近的残流差异。常见做法是分别用两个时间窗计算S变换相关度矩阵,一个取故障后5ms,另一个取故障后60ms,把两个矩阵作为两个通道一起喂给模型。这种多时段融合结构,比我用单个宽窗的效果明显稳定,特别是高阻接地场景下,短窗口能保留故障特征,长窗口能提供稳态对比。

5.3 对新配电网的快速迁移

当模型要适配一条网络拓扑完全不同的馈线时,不需要重新做整套仿真。把已有模型的全连接层换成随机初始化的新层,冻结卷积层,用目标网络少量标注样本只训练最后两层,学习率降到1e-5,通常几十轮迭代就能收敛。这种迁移学习方式能让一个已经训练好的选线模型在新配电网里迅速达到可用的置信度,并且为后续补充仿真样本争取时间。冷启动时不要直接拿新网络的数据去微调全部参数,样本量太小时底层特征会被噪声淹没。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 8:23:34

强化学习基础:REINFORCE算法原理与实践

1. 理解强化学习与策略梯度REINFORCE算法是强化学习领域最基础的策略梯度方法&#xff0c;由Ronald J. Williams在1992年提出。这个算法直接优化策略函数本身&#xff0c;而不是像Q-learning那样间接通过价值函数来改进策略。想象你正在教一个机器人学习走路&#xff1a;REINFO…

作者头像 李华
网站建设 2026/9/18 8:22:36

Ontology Playground 部署指南:Azure Static Web Apps 完整配置教程

Ontology Playground 部署指南&#xff1a;Azure Static Web Apps 完整配置教程 【免费下载链接】Ontology-Playground Free, open-source web app for learning about ontologies and Microsoft Fabric IQ. Explore a catalogue of pre-built ontologies, design your own vis…

作者头像 李华
网站建设 2026/9/18 8:21:40

open-code-review:一个让代码评审标准化、可度量的开源工具

1. 为什么我会去做 open-code-review 这个项目先说个背景。我在团队里当了很多年技术负责人&#xff0c;日常除了写业务代码&#xff0c;做得最多的一件事就是“看代码”。可是代码评审这件事&#xff0c;从我入行到现在&#xff0c;一直是团队协作里最难标准化、也最容易被敷衍…

作者头像 李华
网站建设 2026/9/18 8:19:34

STM32CubeMX2与Keil Studio构建体系深度解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 8:17:06

跨标签页通信方案选型:BroadcastChannel原理与实战避坑指南

不用慌&#xff0c;跨标签页通信这件事&#xff0c;表面上看就是“发个消息、收个消息”&#xff0c;但真等到线上出问题的时候&#xff0c;你会发现坑一个接一个。我之前在一个数据管理后台里做“多标签页实时同步”功能&#xff0c;选型时查了一堆资料&#xff0c;最后用 Bro…

作者头像 李华
网站建设 2026/9/18 8:16:12

AST与调用链分析在智能回归测试筛选中的应用

1. 项目背景与核心价值在持续集成和敏捷开发成为主流的今天&#xff0c;每次代码提交后的回归测试执行时间已经成为制约研发效率的瓶颈。某互联网企业的实测数据显示&#xff0c;其核心业务系统每次代码提交平均需要执行3872个回归测试用例&#xff0c;耗时达到47分钟。而经过分…

作者头像 李华