ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

同步相量计算怎么才准?FFT、窗函数、小波与HHT四大算法对比与Matlab实现

同步相量计算怎么才准?FFT、窗函数、小波与HHT四大算法对比与Matlab实现 做电力系统同步相量计算这个方向很多人第一时间会想到直接用FFT调包fft(x)一把梭然后取幅值、取角度以为就算完了。但真拿实际电网信号去跑你会发现结果惨不忍睹相角上蹿下跳、谐波干扰严重、频率一偏移误差就飙到离谱。我前阵子做微电网实验台数据整理时就栽过这个跟头同一个电压信号用不同方法算出来的相角最大能差3度以上对于继保和同步测量来说这个误差已经足以影响决策。于是我把快速傅里叶变换FFT、窗函数法、希尔伯特-黄变换HHT和小波变换这四条技术路线完整梳理了一遍用Matlab逐一实现并对比这篇文章就是把整个研究过程和踩坑记录整理出来希望能帮到正在做同步相量计算、PMU算法仿真或者电能质量分析的朋友。1. 同步相量的本质算法选型之前先搞清楚你在算什么1.1 从一次相角跳变说起先说我自己遇到的具体问题。实验台采集的是380V三相电压采样率1280Hz对应每周波64个点。我最初用FFT直接分析发现在某段时间窗口内A相电压的相角会突然跳变将近15度然后过两三个周波又跳回来。当时我第一反应是硬件同步触发出了问题检查GPS授时模块、ADC采样时钟折腾半天都没找到原因。后来把那段波形打印出来细看才发现是三相电压中叠加了一个高频衰减振荡分量持续时间大约5个周波FFT在非整周期截断的情况下把这个暂态分量算进了基波相角里。这件事让我意识到同步相量计算本质上不是一个简单的测量问题而是一个估计问题——我们需要在噪声、谐波、暂态分量和频率偏移的共同干扰下从一段有限长度的离散采样序列中估计出基波相量的幅值、相角、频率和频率变化率。算法的鲁棒性决定了估计值偏离真实值的程度。1.2 同步相量的数学定义与技术指标教科书上一般把电网电压基波表示为[ x(t) X_m \cos(2\pi f_0 t \varphi) ]其中 (X_m) 是峰值幅值(f_0) 是额定频率50Hz或60Hz(\varphi) 是初相角。但在实际测量中信号还会叠加谐波分量、间谐波、噪声和暂态扰动所以离散采样后得到的是[ x[n] X_m \cos(2\pi f_0 \frac{n}{f_s} \varphi) \sum_{k} A_k \cos(2\pi f_k \frac{n}{f_s} \varphi_k) w[n] ]同步相量测量单元PMU的算法目标就是从 (x[n]) 中精确估计出 (X_m) 和 (\varphi)并且给计算结果打上统一时标这样才能把不同变电站的数据放到同一时间轴上比较。这里有几个硬指标需要关注总向量误差TVE必须在标准范围内——IEEE C37.118标准规定在标称频率下TVE不得超过1%当频率偏移在±5Hz范围内时TVE不得超过1%到3%对相角的响应时间也有要求一般要在几十毫秒级别。这就意味着算法不仅要准还要快不能把整个周波的采样数据都堆到一块慢慢算。1.3 四种方法的定位差异FFT是频域最基础的工具适合稳态场景但对非整周期截断和非平稳信号很敏感。窗函数法本质上是FFT的前置处理通过加权削边来压频谱泄漏但它不改变FFT的底层缺陷只能缓解。小波变换具有时频局部化能力能同时在时间和频率维度上刻画暂态事件但对稳态高精度相量估计它的频率分辨率反而不如FFT。希尔伯特-黄变换则是完全从数据本身出发的自适应分解方法对非线性、非平稳信号有天然优势但计算量大、理论保证薄弱工程实时性差。先把这四条路线的定位摸清楚后面选型和做对比才不会被带偏。2. FFT相量估计基础流程与两个绕不过去的误差源2.1 FFT提取基波分量的标准流程用FFT做同步相量估计的流程其实很固定核心步骤就四步第一步对连续电压波形按固定采样率 (f_s) 采样得一帧长度为 (N) 的离散序列。第二步对序列做FFT得到复数频谱。第三步在频谱中定位基波频率对应谱线取出该处的复数幅度。第四步将复数幅度换算为基波的幅值和相角。换算公式注意几个细节。Matlab中fft的结果没有除以 (N)所以单频正弦信号的幅值要除以 (N/2) 才能还原真实幅值。相角直接用angle函数取但得到的是以(-\pi)到(\pi)为范围的弧度值需要根据工程习惯转换。基波谱线的位置取决于频率分辨率频率分辨率等于 (f_s/N)因此如果 (N640)、(f_s1280)分辨率为2Hz50Hz基波正好对应第25条谱线。看起来完美实际却隐藏着问题——这是以信号频率刚好落在谱线上为前提的。一个可以立即跑通的Matlab基线代码如下%% 同步相量计算的FFT基线实现 fs 1280; % 采样率每周波64点 f0 50; % 额定工频 N 640; % 10个周波的数据窗 t (0:N-1) / fs; % 构造测试信号基波幅值100相角30度含3次和5次谐波 x 100*cos(2*pi*f0*t pi/6) ... 5*cos(2*pi*150*t 0.5) ... 3*cos(2*pi*250*t 0.8); X fft(x); k0 round(f0/fs*N) 1; % 基波对应索引Matlab从1开始 mag_est abs(X(k0)) / (N/2); ph_est angle(X(k0)); fprintf(FFT幅值估计: %.4f p.u.\n, mag_est); fprintf(FFT相角估计: %.4f rad\n, ph_est);这段代码在信号频率严格等于50Hz时能把幅值和相角算得准到小数点后五六位。然而电网频率不是恒定的白天负荷波动、机组出力调整都会让频率在49.9到50.1Hz区间飘移。一旦频率不再精确等于 (k_0) 对应的谱线频率FFT的输出就会迅速恶化。2.2 频谱泄漏非整周期采样的代价频谱泄漏的本质是有限长度截断带来的。假设信号是50Hz分析窗正好覆盖整数个周波比如10个周波那么FFT在频域就能精确地从窗函数的等效频率响应中提取出只在50Hz处有响应的频谱。但若是窗覆盖了10.3个周波窗内信号起点和终点不连续等效于把一个无限长信号乘上了一个矩形窗在频域上就是原频谱与矩形窗频谱的卷积结果能量从50Hz处泄漏到旁边的谱线上并且泄漏出来的分量会直接污染基波谱线的幅值和相角。实测数据中我试过让频率从50Hz偏移到50.1Hz其他条件不变FFT基波幅值估计误差可以到0.5%以上相角误差在数据窗持续时间内不断累积到达0.06弧度以上。看着只是微小偏差但在IEC/IEEE标准中TVE超1%就算不合格。2.3 栅栏效应与频域插值修正FFT能观测到的频率点只有 (k f_s/N) 这些离散位置如果信号真实频率落在这两个离散谱线之间那么你只能看到它邻近两条谱线的幅值相当于透过栅栏去观察频谱这就是栅栏效应。栅栏效应的修正方法通常采用频域插值最常用的是双谱线插值法——利用基波邻近的两条谱线幅值之比来估计真实频率和幅值。推导过程不细说了工程上可以这样实现k round(f0/fs*N); if k 2 || k N/2 error(谱线位置越界); end % 取基波邻近两条谱线幅度 amp1 abs(X(k)); % 左谱线 amp2 abs(X(k1)); % 右谱线 beta (amp2 - amp1) / (amp2 amp1); % 基于主瓣函数解析式的插值修正Rife-Vincent近似 del 2 * beta; % 频率偏移比例因子 f_est (k-1 del) * fs / N; % 修正后幅值 CG pi * del / sin(pi * del); mag_est (amp1 amp2) * CG / N * 2;插值修正能明显改善泄漏影响但它的前提是信号频谱相对纯净谐波不至于太强。谐波特别重的场合比如变频器负载的母线插值法会被临近谐波带偏此时必须改用更强的抗谐波策略。2.4 FFT基线的工程局限总结FFT作为基线方法的价值是速度快、思路简单、实现成本低。但它有两个先天的结构性问题第一固定频率分辨率意味着无法同时追求高频谱分辨率和高时间分辨率第二矩形窗截断带来的泄漏是内在的只能通过加窗或插值缓解不能根除。理解了这两点就不会迷信FFT算不准就上更复杂的算法这种思路——复杂算法也各有各的短板。3. 窗函数法花最小的代价把FFT的精度拉回来3.1 加窗在做什么从矩形窗说起不进行任何加权处理就用FFT等价于让数据乘了一个矩形窗。矩形窗的频率响应主瓣很窄但旁瓣很高第一旁瓣只比主瓣低13dB左右这意味着离基波很远的谐波和噪声分量仍然可能通过旁瓣耦合进基波谱线。加窗的核心目的是压低旁瓣同时接受主瓣变宽的现实。窗函数作用于时域数据本质上是在做削边——让数据窗两端的信号幅值平滑衰减到接近零从而消除截断造成的不连续。有一点必须说清楚加窗之后FFT谱线的幅度需要修正。因为加窗会让信号总能量降低如果不修正估算出来的幅值会偏小。修正系数就是窗函数的相干增益等于窗函数的均值。比如汉宁窗的相干增益是0.5因此幅值修正时要除以0.5。Matlab里用sum(win)/N就可以得到窗函数的相干增益。3.2 常用窗函数性能对比与选型逻辑工程上常用的窗函数有这样几个汉宁窗Hann、汉明窗Hamming、布莱克曼窗Blackman、凯塞窗Kaiser和布莱克曼-哈里斯窗Blackman-Harris。它们各自的主瓣宽度和旁瓣衰减水平差异很大我整理了一个实测对比表窗函数主瓣宽度分辨率影响第一旁瓣衰减幅值修正系数相干增益适用场景矩形窗最窄-13dB1.0频率成分简单、同步采样良好汉宁窗较宽-31dB0.5通用场景谐波中等汉明窗较宽-43dB0.54旁瓣衰减要求略高时布莱克曼窗更宽-58dB0.42谐波污染较重时布莱克曼-哈里斯窗最宽-92dB0.36弱信号检测、强干扰抑制凯塞窗可调参数可调随参数变化需要权衡分辨率与旁瓣时选窗逻辑其实是一个权衡游戏频率分辨率要求高优先用汉宁窗因为它的主瓣比布莱克曼窄可以区分更近的频谱成分谐波抑制要求高优先用布莱克曼系列因为旁瓣更低能更好地隔离谐波污染。做同步相量计算电网频率本身的动态范围不算大45到55Hz已经是极端情况谐波才是主要矛盾我个人会更倾向于汉宁窗起步谐波严重时切换为布莱克曼窗。3.3 加窗相量计算的Matlab实现代码上和FFT基线版本差别很小关键是时域逐点相乘和幅值修正%% 加窗FFT相量估计 win hanning(N, periodic); xw x .* win; Xw fft(xw); k0 round(f0/fs*N) 1; % 幅值修正除以相干增益 CG sum(win) / N; mag_est abs(Xw(k0)) / (N/2) / CG; ph_est angle(Xw(k0)); fprintf(加窗FFT幅值估计: %.4f\n, mag_est); fprintf(加窗FFT相角估计: %.4f rad\n, ph_est);hanning(N, periodic)和hanning(N)是有区别的。periodic选项生成的窗序列首尾不重复适用于频谱分析不指定的话窗的首尾相等用于滤波器设计更多。同步相量计算严格讲属于频谱分析场景推荐使用periodic形式。这个细节我在代码评审时经常看到有人忽略值得专门提一句。3.4 我踩过的窗函数坑踩坑一窗长和信号周期的关系比很多人想的更敏感。窗函数只能压旁瓣并不能解决频率偏离谱线中心的问题——频率偏移导致的相角估计误差依然存在只不过幅值误差被压小了。我之前用汉宁窗加40ms窗长测50.2Hz信号相角估计误差反而比某些窗长更糟糕因为窗长不同导致主瓣宽度变化频率偏移在频域中的表现随之改变。想固定抑制频率偏移影响光靠换窗不够还得配合相位补偿算法。踩坑二多窗长策略在标准符合性测试中很有用。IEEE C37.118规定PMU在稳态条件下响应性能满足要求但动态条件下如功率振荡又需要另一套性能指标。单一窗长很难同时满足。我的做法是正常情况下用多个周波的汉宁窗保证精度检测到频率或幅值快速变化时动态切换到短窗长或矩形窗提高响应速度。这种双窗切换的思路工程上比一味追求复杂算法更实用。踩坑三加窗FFT在数据窗滑动时相邻窗之间的相角会不稳定。原因在于每次移动半个周波再加窗窗函数与信号的相对位置发生改变相角的参考基准就变了。为了让相角数据可比较必须引入基准相位对齐逻辑——以窗起点对应的额定频率相角为参考把每次估计的相角折算到同一个时间点上。这些细节在论文里往往一句话带过但实际写代码时没有处理干净就是误差来源。4. 小波变换暂态场景下的时频显微镜4.1 为什么暂态过程中FFT会失效电网并网、故障切除、变压器励磁涌流等场景会产生短时脉冲或衰减振荡分量。这类暂态信号的频带很宽且持续时间远远短于FFT分析窗长度。用FFT处理时暂态分量会被平均到整个窗上表现为基波谱线附近的抬升你根本无法判断它到底是从哪一刻出现的。更关键的是同步相量计算如果被这种短暂能量干扰相角会发生跳变而这个跳变在保护算法看来就是故障特征。时频分析工具的目标就是解决何时发生、频率多少的问题。小波变换通过伸缩和平移一个小波基函数在低频部分用宽窗获得高频率分辨率在高频部分用窄窗获得高时间分辨率恰好适合电网暂态信号的分析。4.2 连续小波与离散小波的分工小波变换有连续CWT和离散DWT两大分支。连续小波变换对尺度进行连续采样得到的是高冗余的时频表示适合观察信号的整体时频结构尤其是频谱细节离散小波变换通过二进伸缩和平移得到的是降采样后的系数计算高效适合信号分解重构、特征提取。对于同步相量计算我遇到的一个常见疑问是直接用DWT提取基波幅值不行吗。理论上可以因为DWT可以把信号分解到不同频带然后选取基波所在频带重构再估算相量。但实际执行起来问题不少DWT的频带划分是二进制的50Hz基波在常见采样率下往往被分割在两个相邻子带之间重构后的幅值精度不如FFT加窗相角计算也不直观你需要重构时域信号后再用过零检测或正交解调的方式估计相角。所以在相量估计这个任务上CWT做特征分析、FFT做定量估计是更合理的分工。4.3 用Matlab小波工具箱提取特征参数Matlab从2016b之后的小波工具箱非常完善CWT可以用cwt函数一行调用但是要注意参数设置%% 连续小波变换分析暂态电压 fs 1280; t (0:1023) / fs; % 构造含暂态跌落信号第0.2秒附近幅值跌落到70% x 220*sqrt(2)*sin(2*pi*50*t); idx find(t 0.2 t 0.3); x(idx) x(idx) * 0.7; [wt, f] cwt(x, fs, amor, VoicesPerOctave, 8); % 绘制时频图 figure; imagesc(t, f, abs(wt)); set(gca, YScale, log); ylim([10, 500]); colorbar; xlabel(时间/s); ylabel(频率/Hz);VoicesPerOctave这个参数决定了每倍频程内采样多少个小波尺度。默认是10数值越大时频图越精细但计算量也线性增加。我用8到12之间比较平衡。母亲小波amor是Morlet复小波能同时给出幅值和相位信息比实小波更适用。如果信号实部、虚部都需要amor是不错的选择。在同步相量场景中CWT谱图可以帮你快速定位暂态时刻但它本身不直接输出基波幅值相量。我通常的做法是先用CWT识别暂态区间再将暂态区间从原始信号中剔除或加权重做处理保证稳态相量计算不被污染。4.4 小波方法的边界与成本小波的坑也很明显。一是边界效应CWT在数据窗两端的小波系数不可靠系数幅值会异常大需要丢弃边缘区域drop zone二是计算量大连续小波的复杂度不低在嵌入式PMU上基本跑不动三是连续小波分解后不同尺度之间存在能量混叠不能把它当作严格的多分辨率分解。小波在同步相量计算中的正确定位是暂态特征提取的前端工具而不是相量计算的主力算法。5. 希尔伯特-黄变换不假设平稳的自适应分解5.1 EMD分解流程与IMF的物理意义希尔伯特-黄变换HHT是黄锷在1998年提出的非平稳信号分析方法核心由经验模态分解EMD和Hilbert变换两部分组成。EMD的思路是把复杂信号分解成一组固有模态函数IMF每个IMF满足两个条件整个数据段的极值点数量与过零点数量最多相差1在任意时刻上下包络线的均值须为零。EMD的分解过程形象地说就是把信号一层层剥皮。每一次迭代先找出信号的上下包络线通过三次样条插值连接极值点取均值再从原信号中减去均值得到一个更干净的余量反复迭代直到余量满足IMF条件。剩余部分再次执行同样的流程最终得到一组从高频到低频排列的IMF和一个残余趋势项。这个分解过程听起来很美实际运行速度却不快。三次样条插值逐次迭代Matlab纯代码实现时一帧100毫秒的数据分解出四五个IMF耗时可能上百毫秒实时性没法保证。5.2 Hilbert谱与瞬时频率提取得到IMF之后对每个IMF做Hilbert变换构造解析信号[ z_i(t) \text{IMF}_i(t) j \cdot \mathcal{H}[\text{IMF}_i(t)] a_i(t) e^{j\theta_i(t)} ]瞬时幅值 (a_i(t)) 就是基波包络瞬时频率就是相位导数 (f_i(t) \frac{1}{2\pi}\frac{d\theta_i(t)}{dt})。在同步相量的定义里基波瞬时频率的变化率是一个重要状态量ROCOF。HHT不需要预先设定频率网格也不受限于频率分辨率因此能比较顺滑地追踪基波频率的连续变化。这一点是FFT法没有的优势。5.3 Matlab下HHT的实现路径Matlab官方不直接提供HHT工具箱但这几年社区实现的质量已经不错。G. Rilling等人编写的EMD工具箱是最常用的一个下载解压后加入路径即可调用emd函数。另一个选择是使用MathWorks File Exchange上的hht相关函数包。核心调用逻辑如下%% HHT估计基波幅值与频率 [imf, residual] emd(x, Display, 0); % 取第一个IMF作为主振荡分量做Hilbert变换 hip hilbert(imf(:,1)); inst_amp abs(hip); inst_freq fs * diff(unwrap(angle(hip))) / (2*pi); % 在数据窗中部取平均规避两端边界效应 mid round(N*0.3):round(N*0.7); f0_est mean(inst_freq(mid)); mag_est mean(inst_amp(mid));这里emd返回的IMF第一个分量是频率最高的分量电网中基波通常是高能量分量但在谐波存在时第一个IMF可能是谐波而非基波。所以直接取第一个IMF并不安全。我通常会先计算各IMF的瞬时频率均值选出频率最接近50Hz的那个IMF作为基波分量再做相角估计。这个细节看似简单却能避免很多误判。5.4 HHT的典型痛点端点效应与模态混叠HHT有两个绕不开的工程痛点。第一个是端点效应。EMD在拟合上下包络线时信号两端的极值信息不充分三次样条会在端点附近产生严重的过冲或欠冲导致末端IMF严重失真。解决方式通常是对信号做镜像延拓或多项式延拓然后再分解分解完再把延拓部分切掉。第二个是模态混叠。如果信号中存在间歇性高频成分会把不同时间尺度的分量混入同一IMF中导致一个IMF里既有高频又有低频。模态混叠的缓解手段是集合经验模态分解EEMD即在原信号上叠加白噪声再做多次EMD取平均。白噪声的幅值一般设为原始信号标准差的0.1到0.2倍集合次数在几十到几百次之间计算量进一步倍增。所以HHT在同步相量计算中的实际定位更像是一种研究工具和离线分析工具用来处理那些FFT和小波都搞不定的极端非平稳突变场景。实时PMU里很少见到HHT算力不允许稳定性也没有保证。但如果你做的是离线故障数据分析、极端工况回放HHT能给你提供别的工具给不了的波形细节。6. 四种方法横向对比与工程选型建议6.1 不同信号场景下的误差表现我用四类信号分别测过这四种方法覆盖稳态、频率偏移、谐波污染、暂态突变四种场景结果整理如下场景FFT窗函数FFT小波变换HHT标称频率稳态优误差0.1%优误差0.1%良频率分辨率有限良端点效应影响边界频率缓慢偏移差误差随窗长累积中需配合插值修正良时频追踪能力好良瞬时频率追踪平顺谐波污染严重差谱间干扰大中加窗后改善明显中频带划分受限良EMD能分离谐波暂态突变差相角跳变差跳变仍存在优时频定位能力强优自适应分解捕捉突变这张表是我多次实验的平均体会不同论文里可能有不同结论因为采样率、窗长、噪声水平都会影响结果。但大体趋势是稳定的。6.2 计算量与实时性视角如果按计算量从低到高排顺序是FFT约等于加窗FFT明显小于小波CWT远小于HHT。FFT一帧640点数据的计算在普通计算机上微秒级CWT要几十毫秒级别视尺度数而HHT的EMD分解一帧数据做几十上百次迭代几百毫秒都正常。实时性层面还牵扯一个事情数据窗长度等于你观察数据的延迟。FFT用10周波200ms数据窗响应时间自然比4周波80ms数据窗慢。PMU标准允许不同性能等级采用不同报告率你要是把数据窗搞太长系统对突发事件的响应就来不及。所以工程上普遍采用低延迟精estimating和高精度状态跟踪双轨制——短窗做检测长窗做确认。6.3 我推荐的分层混合框架综合不同方法的优缺点我目前在项目里实际采用的分层框架是这样的先用加窗FFT汉宁窗4周波做实时相量估计对每个数据窗计算频谱平坦度指标如果频谱中非基波频率能量占比明显升高就用CWT对暂态时刻精确定位并把该时间段的数据剔除或降权对最终的相量估计结果用HHT离线处理特殊时段的波形确认是否有模态混叠或其他异常成分。这样既保证了实时性又能利用小波和HHT各自的长处做精细分析不至于被单一方法的局限拖垮。这套框架不是万能的但至少在我的微电网场景下它的TVE实测能稳定在0.3%以内比单纯FFT好一个数量级。6.4 一点个人经验如果让我给刚入坑同步相量计算的朋友一句实在话先别急着上HHT和小波。先把加窗FFT做透搞清楚频谱泄漏和栅栏效应到底对结果产生了多大的影响再做算法升级。因为这个领域很多问题不是算法不够高级而是对信号本身的物理特性理解不够深。我见过不少代码用高级算法跑出来的结果还不如一个加汉宁窗再插值的FFT精度高原因就是基础没打牢。话说回来四类方法不是对立的。FFT提供骨架窗函数负责打磨小波负责侦察HHT负责档案复盘。真正可靠的同步相量计算系统往往需要这几样工具配合使用而不是指望某一种算法单打独斗。
返回列表