拓冰建站拓冰建站
首页 / 资讯中心 / 正文

同步相量计算四算法对比:FFT、窗函数、HHT与小波变换的Matlab实现

做电力系统信号分析的人十有八九都会在同步相量计算这件事上折腾过几轮。明明就是“算个幅值、算个相角、算个频率”看起来简单可真到了电网频率偏移、谐波污染、低频振荡叠加的场景里传统傅里叶方法一下就露馅了。这个项目趁着Matlab环境把FFT、窗函数法、希尔伯特-黄变换HHT、小波变换四套算法全部拉出来统一用同步相量计算的场景做横向对比代码给出了完整的实现路径。对正在做PMU算法研究、电能质量分析或者继电保护算法验证的工程师来说这套代码最大的价值不是某一个算法多新多复杂而是它把四条技术路线放在同一套测试信号下对比让你清楚知道什么场景该用哪个。这个方向很少能看到有人把四种算法全部实现并放在一起做对比很多文章要么只讲FFT和窗函数要么单独吹HHT或小波真正落到同步相量计算上的案例更少。这项目的好处是直接给出了Matlab实现从信号构造、算法实现到误差分析都能跑通适合刚入门想找参考框架的研究生也适合已经在做宽频测量、想评估算法边界的老手。1. 先把同步相量计算这件事拆明白同步相量这个概念字面上看就是“带时标的幅值和相角”但真落到电力系统里它需要同时输出四个量幅值、相角、频率、相角变化率ROCOF。IEEE C37.118标准对同步相量的定义很明确要求测量结果必须带有绝对时标而且对幅值误差、相角误差、频率误差都有严格限值。国内在做PMU入网检测的时候也是按国标GB/T 26862那一套指标来卡。所以同步相量计算不是“算出正弦波的幅值”这么简单它面对的信号往往长这样基波之外的2、3、5、7次谐波叠加甚至还有间谐波系统频率偏离50Hz比如49.8Hz或者50.2Hz而且可能一直在变化低频振荡带来的幅值波动和相角摆动故障暂态过程中的非周期分量和突变量这些因素叠加在一起同步相量算法的鲁棒性就成了核心问题。传统过零检测法在谐波存在时根本没法用因为它天然默认信号是纯正弦波。FFT类方法可以对谐波做一定程度抑制但前提是要先解决频谱泄露和栅栏效应。HHT和基于小波的算法之所以被引入到这个领域是因为它们都不依赖“信号平稳”这个假设能处理幅值、频率同时变化的非平稳信号这正好切中电力系统动态过程的需求。其实你把这四种算法放在一起看就能看出一个清晰的递进关系FFT是频域定点估计窗函数法是FFT的改进补丁HHT是时频自适应分解小波变换则是时频联合分析。四种算法在不同假设下对同一个信号做估计对比它们在不同工况下的表现这个项目本质上做的是算法适用性边界研究。2. FFT和窗函数法经典路线但细节决定成败FFT做同步相量计算的思路非常直接对采样序列做离散傅里叶变换找到基波频率对应的谱线从这条谱线的实部和虚部提取幅值和相角。问题是电力系统的实际频率不是固定50Hz当实际频率落在两根谱线之间时只取一根谱线的幅值会产生明显误差这就是栅栏效应。再加上非同步采样导致的截断能量会从主瓣泄漏到旁瓣波及附近所有的谐波分量这就是频谱泄露。这两件事是FFT方法永远绕不过去的坎。解决办法常规就是加窗函数用窗函数把截断信号的边缘压下去降低旁瓣泄漏然后再用插值算法对栅栏效应做补偿。窗函数的选择其实就是在主瓣宽度和旁瓣衰减之间做折中。矩形窗主瓣最窄但旁瓣太高电力系统谐波丰富用了矩形窗等于把噪声全放进来了所以实际工程中很少直接用不加窗的FFT。汉宁窗在同步相量计算里用得最多旁瓣衰减速度够快计算量小插值修正公式也成熟。Matlab里面实现加窗FFT的关键流程大概是这样的% 假设采样率 fs采样点数 N N 1024; fs 12800; % 汉宁窗 win hanning(N); % 截取N点数据加窗 xw x(1:N) .* win; % 做FFT X fft(xw, N); % 基波频率附近的谱线找幅值最大的两根 [~, k1] max(abs(X(2:N/2))); if k1 1 || abs(X(k1-1)) abs(X(k11)) k0 k1 - 1; else k0 k1 1; end % 双谱线插值修正幅值和频率双谱线插值的原理不复杂基波能量实际上落在峰值谱线附近的若干条谱线上取幅值最大的两条谱线按照它们之间的比例关系估算真实频率偏移量再做幅值修正。这个修正能显著降低栅栏效应带来的误差实测下来频率偏差在0.5Hz以内时幅值误差能从百分之几降到千分之几的水平。但要注意插值修正公式和窗函数是绑定的你用的是汉宁窗就必须用汉宁窗对应的修正公式换窗不换公式结果就是灾难。这个方向最大的问题是窗函数选择跟响应速度冲突。窗越长频率分辨率高、旁瓣泄漏小但参与计算的采样点多数据窗对应的响应时间就长。PMU的P类保护类要求数据窗尽量短报告速率高响应时间在几十毫秒级别而M类测量类更看重精度数据窗可以拉长到上百毫秒。实际做算法选型的时候要清楚自己的指标要求别为了精度把数据窗拉太长最后响应时间不达标。注意加窗FFT在频率偏移超过1Hz、或者存在较大间谐波的情况下10%左右的误差是非常常见的。这种情况下不要再试图加更长的窗而是要考虑换算法。3. 希尔伯特-黄变换一条不太一样的路HHT彻底换了一个思路不再假设信号是平稳正弦波的叠加而是先把信号分解成本征模态函数IMF然后对每个IMF做Hilbert变换求瞬时幅值和瞬时频率。这样的好处在于基波分量对应某个IMF它的幅值和频率随时间自然变化同步相量的四个量都能顺带算出来尤其是频率和频率变化率天然就是时变的这比固定数据窗的FFT更贴近电网动态过程的真实特性。EMD分解的迭代过程说白了是“筛”出信号里的波动成分。每次筛分时对信号上下包络取平均值用原始信号减去均值得到一个逼近IMF的分量然后反复迭代直到上下包络近似对称。对同步相量计算来说基波分量通常是第一个或者第二个IMF谐波分量会在更高阶IMF里被分离。这样就不需要担心像FFT那样把谐波能量泄漏到基波谱线附近了。在Matlab里实现HHT可以借助自带的emd函数也可以去下载第三方EMD工具箱逻辑是一样的% 对信号进行EMD分解 imfs emd(x); % 选择基波对应的IMF通常是幅值最大、能量最集中的一条 % 对选中的IMF做Hilbert变换求瞬时频率 h hilbert(imf_selected); inst_phase unwrap(angle(h)); inst_freq diff(inst_phase) / (2 * pi * dt); inst_amp abs(h);瞬时频率就是相位对时间的导数所以相位解卷绕那一步特别关键。如果信号里有噪声或者分解出来的IMF有毛刺瞬时频率会剧烈跳动算出来的频率抖动可能达到0.5Hz以上。这个抖动不是真实存在的是算法本身对噪声敏感的结果。HHT在实际落地中最大的痛点是模态混叠。如果基波频率离某个谐波频率比较近EMD分解很可能把一个IMF里面同时包含基波和那个谐波成分这时候瞬时幅值和瞬时频率都会出现周期性的调制波动。为了解决这个问题很多人会改用集合经验模态分解EEMD或者CEEMDAN往信号里加白噪声做多次分解再取均值付出的代价就是计算量大增。同样一段数据FFT几毫秒能出结果EEMD可能要跑到几秒钟甚至更久这个代价在实时PMU场景里是很难接受的。端点效应也是个必须处理的坑。EMD筛分过程中包络在信号两端会发散导致端部附近瞬时频率发生很大的偏移普通线性延拓根本压不住。实测下来处理同步相量计算时尽量截取数据窗中间部分作为有效输出把两端各丢弃若干个周期的数据这比任何延拓算法都省事可靠。4. 小波变换时频联合分析带来的额外视角小波变换的核心贡献在于用一族小波基函数在时间域和频率域同时定位信号特征弥补了FFT只能看纯频域信息的不足。在同步相量计算这个场景里小波变换可以做两类事一是连续小波变换CWT得到时频图直观看到频率随时间的变化线二是离散小波变换DWT把信号分解成不同频带重构出干净的基波分量再做相量计算。两种方式对应的场景不一样。CWT的分辨率足够高适合分析电压暂降、暂态振荡这一类事件观察基波频率线和它的幅值包络随时间的变化。DWT计算量小、实现简单更适合做基波提取的前置处理。Matlab的Wavelet Toolbox在这块封装得很好老一点的版本和新版本在cwt函数的语法上有差异老版本需要传入尺度向量新版本直接传采样频率就能用% 新版Matlab写法cwt(x, fs) 默认使用Morse小波 [wt, f] cwt(x, fs); % 要指定复数Morlet小波控制带宽参数 [wt, f] cwt(x, fs, cmor3-3);小波基函数和尺度参数的选取是整个方法性能的胜负手。cmor3-3里的3-3表示中心频率3Hz、带宽3Hz这直接决定了频率定位的精度。尺度到实际频率的映射关系又跟采样率挂钩所以同一个尺度在不同采样率下对应的物理频率完全不一样。我在调试的时候把采样率从6400Hz换到12800Hz复用原来那套尺度参数结果频率全部漂移这点务必要注意。小波变换在同步相量计算里的另一个微妙处是计算窗口长度。你要得到低频振荡那一带的频率变化信息至少需要覆盖一两个振荡周期的数据窗这又回到了响应时间和精度之间的老矛盾。与HHT相比小波变换的计算稳定性要好一些对噪声不那么敏感但是它的频率分辨率和母小波的选择强相关一旦母小波跟实际信号的形态不匹配边缘会出现比较明显的“伪频率”。说句实话纯从同步相量的实时精度要求来看小波变换在稳态测量上未必比加窗FFT有优势但它处理暂态事件时很出彩。电压骤降、电流突变的起止时刻在CWT时频图上一眼就能看出来。所以这四套算法放在一起研究不是为了分个你死我活而是各管一摊。5. 把四套算法放在同一张测试台上对比为了验证算法效果项目构造了含基波、3次谐波、5次谐波和随机噪声的测试信号并且在信号中加入了工频频率的缓慢偏移和幅值波动。传统基波分量用50Hz正弦波叠加谐波之后再对四种算法的输出做误差分析。测试执行完结果其实非常有工程参考价值。FFT直接不加窗时幅值误差在5%左右频率误差可以达到0.1Hz量级谐波越大误差越明显。加窗并做双谱线插值以后基波幅值误差能降到0.5%以内频率误差也能控制到0.01Hz以下效果非常明显这说明在信号相对稳定的工况下加窗FFT完全可以胜任同步相量计算不需要上更复杂的算法。HHT在稳态测试中表现并没有超越窗函数FFT太多误差大致在同一个级别。但当测试信号加入低频振荡调制也就是基波的幅值和相角都在随时间波动时HHT的瞬时频率跟踪能力就体现出来了它能给出随时间连续变化的频率轨迹而FFT只能算出这段时间窗内的平均频率无法描述频率变化过程。不过在谐波含量较高且与基波频率相近时HHT模态混叠导致瞬时频率跳动这个现象肉眼可见需要靠EEMD来缓解。小波变换在稳态幅值测量上误差比加窗FFT略大但优势在于暂态事件检测。给测试信号加一个持续0.1s的电压暂降小波变换能在时频图上清晰地标出暂降的起止时刻FFT类方法要做到这件事是比较费劲的。这么跑下来最终结论其实很清晰稳态测量加窗插值FFT是首选计算效率高、精度足够、实现成熟频率动态变化过程需要详细追踪时HHT有优势但要处理好模态混叠和端点效应检测暂态事件的起止时刻小波变换最好用。6. 项目代码里看不到的那些细节代码实现本身不难真正在复现过程中容易踩的坑我逐个说一下。第一个坑是滤波器的设计。别以为有了算法就万事大吉信号进来要先做抗混叠处理。同步相量计算需要的采样率一般是工频的整数倍比如6400Hz、12800Hz防止高频信号混叠进基波频带在ADC之前加抗混叠滤波器是必须的。如果直接拿原始采样序列送给算法采样率不高或者前级滤波不到位谐波混叠后的分量会把基波相角的计算结果直接带偏。第二个坑是时标对齐。IEEE C37.118标准要求相量带有UTC时标如果你的算法计算出来的是数据窗中间时刻的相值那整个数据窗内信号的相位变化都会影响输出结果。数据窗开始时刻和计算时刻之间如果存在偏差相角误差和频率误差都会被放大。这是很多刚接触PMU的人容易忽略的问题。第三个坑是频率跟踪。就算基波标称值是50Hz实际电网频率可能是49.9Hz。采样率如果按50Hz整数倍来定实际频率偏移会导致每个工频周期内的采样点数不是整数这又引入了新的频谱泄漏。所以工程上往往先做一次粗略的频率估计把它反馈给采样时钟或者重采样模块再来计算同步相量这样才能从根本上改善非同步采样的问题。表格里做个总结方便对照参考算法稳态精度动态跟踪能力暂态事件检测计算开销主要风险直接FFT低差无极小栅栏效应、频谱泄漏加窗插值FFT高中弱小对间谐波敏感HHT中强较强很大模态混叠、端点效应小波变换中中强大母小波与尺度选择同步相量计算做了这么久我个人最深的体会是没有哪个算法能当万能钥匙。稳态精度、响应速度、计算开销、暂态检测能力这四样东西你要什么就得取舍什么。作为入门和对比研究把这四套算法的实现都跑一遍对理解PMU整个算法架构非常有帮助。真到了工程落地阶段90%的场景我还是会选择加窗插值FFT配上频率跟踪环路HHT和小波则作为离线分析和事件诊断的辅助手段。先用简单成熟的方案把系统跑稳定再考虑复杂算法这是我在这个项目里最大的收获。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门