找回密码
 注册

QQ登录

只需一步,快速开始

搜索

基于MATLAB的电力谐波分析,在有频谱泄露、栅栏效应

[复制链接]
bosa 发表于 2021-5-9 01:13:18 | 显示全部楼层 |阅读模式
基于MATLAB FFT的电力谐波分析,输入时域信号采样值,在有频谱泄露、效应的前提下计算基波和谐波的频率、幅度、相位。根据论文《基于加汉宁窗的FFT高精度谐波检测改进算法》实现。函数[f_HA,A_HA,phi_HA]=harmonic_analysis(x,fs,N_HA)实现频谱分析的功能,主函数test_FFT产生仿真采样信号并调用频谱分析函数,计算电力质量指标。代码中有详细的注释。
  1. function test_FFT

  2. %信号采样的参数
  3. N_HA=9;%待分析的谐波个数
  4. fs=1024;%采样频率,大于谐波最高频率乘以2,至少N_HA*50*2或者N_HA*60*2
  5. Nsample=2048;%1024,2048,4096
  6. Nbit=12;%ADC采样的位数,取值8,10,12
  7. kADC=280*sqrt(2)/2^(Nbit-1);%ADC的比例系数,允许最大电压为正负280*sqrt(2)

  8. %电力质量数据缓存
  9. Sizebuffer=10000;
  10. U1buffer=zeros(1,Sizebuffer);%存储U1的缓存
  11. f1buffer=zeros(1,Sizebuffer);%存储基波频率的缓存
  12. harmonic_all_buffer=zeros(1,Sizebuffer);%总谐波比例
  13. harmonic_even_buffer=zeros(1,Sizebuffer);%偶次谐波比例
  14. harmonic_odd_buffer=zeros(1,Sizebuffer);%奇次谐波比例

  15. for i=1:Sizebuffer
  16.    
  17.     %用采集卡采集电压数据
  18.     %采样结果放到数组x中,x的数据点数为Nsample
  19.     %TODO: 添加从采集卡中读取数据程序
  20.    
  21.    
  22.    
  23.     %软件测试时用matlab产生测试数据
  24.     %电压信号的参数
  25.     f1=50+randn()*0.3;%基波的频率,50,49.6,50.1
  26.     %谐波(包含基波和高次谐波)的频率、幅度有效值(V)、初始相位(角度)
  27.     f_HA_groundtruth=f1*(1:9);
  28.     U1=220+randn()*5;
  29.     Uharmonic=[5.3,3.2,2,9,1.1,8,1,0.5];%谐波的幅度
  30.     Uharmonic(1:2:end)=Uharmonic(1:2:end)*rand()*1;%偶次谐波乘以系数,*0.5, *1, *3
  31.     Uharmonic(2:2:end)=Uharmonic(2:2:end)*rand()*1;%奇次谐波乘以系数,*0.5, *1, *3
  32.     A_HA_groundtruth=[U1,Uharmonic];
  33.     phi_HA_groundtruth=[0,10,9,8,30,8,60,8,8];%有谐波信号
  34.     %A_HA_groundtruth=[220,0,0,0,0,0,0,0,0];phi_HA_groundtruth=[0,0,0,0,0,0,0,0,0];%标准信号
  35.     %生成采样数据
  36.     t=(0:Nsample-1)/fs;%采样时刻数组
  37.     x_contious=zeros(1,Nsample);
  38.     for i_harmonic=1:numel(f_HA_groundtruth)
  39.         x_contious=x_contious+A_HA_groundtruth(i_harmonic)*sqrt(2)*cos(f_HA_groundtruth(i_harmonic)*2*pi*t+phi_HA_groundtruth(i_harmonic)/180*pi);
  40.     end
  41.     %建模ADC采样的幅度离散化
  42.     ADCvalue=round(x_contious/kADC);
  43.     x=ADCvalue*kADC;
  44.    
  45.    
  46.    

  47.     %谐波分析
  48.     [f_HA,A_HA,phi_HA]=harmonic_analysis(x,fs,N_HA);
  49.     %比较计算结果
  50.     %[f_HA;A_HA;phi_HA]
  51.     %[f_HA_groundtruth;A_HA_groundtruth;phi_HA_groundtruth]
  52.     U1buffer(i)=A_HA(1);
  53.     f1buffer(i)=f_HA(1);
  54.     harmonic_all_buffer(i)=norm(A_HA(2:end))/A_HA(1);
  55.     harmonic_even_buffer(i)=norm(A_HA(2:2:end))/A_HA(1);
  56.     harmonic_odd_buffer(i)=norm(A_HA(3:2:end))/A_HA(1);
  57.    
  58.     %结果分析
  59.     figure(1),
  60.     subplot(2,3,1)
  61.     plot(U1buffer(1:i));
  62.     ylabel('基波电压有效值(V)');
  63.     subplot(2,3,2)
  64.     plot(f1buffer(1:i));
  65.     ylabel('基波频率(Hz)');
  66.     subplot(2,3,4)
  67.     plot(harmonic_all_buffer(1:i)*100);
  68.     ylabel('总谐波比例(%)');
  69.     subplot(2,3,5)
  70.     plot(harmonic_even_buffer(1:i)*100);
  71.     ylabel('偶次谐波比例(%)');
  72.     subplot(2,3,6)
  73.     plot(harmonic_odd_buffer(1:i)*100);
  74.     ylabel('奇次谐波比例(%)');
  75.    
  76.     pause(0.5);%延时,使用数据采集卡时延时可以长些,模拟产生测试数据时减小延时
  77. end


  78. end


  79. %电力谐波分析函数[f_HA,A_HA,phi_HA]=harmonic_analysis(x,fs,N_HA)
  80. %根据论文基于加汉宁窗的FFT高精度谐波检测改进算法实现。
  81. %在中心谱线估计中,针对两种极端情况进行近似计算,提高数值稳定性,避免得到错误结果。
  82. %输入参数
  83. %    x:数组长度为2^N,离散化后的电压采样值,单位为V。
  84. %    fs:基波和各次谐波的频率。
  85. %    N_HA:待分析的谐波个数。注意,f1*N_HA*2<fs。
  86. %输出参数
  87. %    f_HA:估计的谐波的频率,长度为N_HA。
  88. %    A_HA:估计的谐波的幅度有效值(V),长度为N_HA。
  89. %    phi_HA:估计的谐波的角度,长度为N_HA。
  90. function [f_HA,A_HA,phi_HA]=harmonic_analysis(x,fs,N_HA)

  91. %检查采样频率大于信号最高频率的2倍
  92. if N_HA*50*2>fs
  93.     error('N_HA*50*2>fs');
  94. end

  95. f_HA=zeros(1,N_HA);
  96. A_HA=zeros(1,N_HA);

  97. %时域采样值加汉宁窗
  98. Nsample=numel(x);
  99. x=x.*hanning(Nsample).';
  100. plot(x);

  101. %计算加窗采样值的FFT
  102. XH=fft(x);
  103. plot(abs(XH))
  104. plot(angle(XH)/pi*180)

  105. %计算基波的频率、幅度、相位
  106. %搜索主值谱线
  107. df=fs/numel(x);%谱线间隔
  108. k0=round(50/df)+1;%50Hz处的谱线位置
  109. search_radius=round(15/df);%搜索半径,允许最大频偏15Hz
  110. XH5_search=XH(k0-search_radius:k0+search_radius)/60 ...
  111. -(XH(k0-1-search_radius:k0-1+search_radius)+XH(k0+1-search_radius:k0+1+search_radius))/90 ...
  112. +(XH(k0-2-search_radius:k0-2+search_radius)+XH(k0+2-search_radius:k0+2+search_radius))/360;
  113. mag_XH5_search=abs(XH5_search);
  114. %ka,kb,km都是在mag_XH5_search中的下标
  115. [~,ka]=max(mag_XH5_search);
  116. if mag_XH5_search(ka-1)<mag_XH5_search(ka+1)
  117. kb=ka+1;
  118. else
  119. kb=ka-1;
  120. end
  121. km=min(ka,kb);
  122. %计算幅值比alpha_m
  123. alpha_m=mag_XH5_search(km)/mag_XH5_search(km+1);
  124. %计算偏移值dkm
  125. dkm=(4-3*alpha_m)/(1+alpha_m);
  126. %校正谐波参数
  127. f_HA(1)=(km+k0-search_radius-1+dkm-1)*df;
  128. if abs(dkm)<1e-3
  129. A_HA(1)=abs((dkm^2-1)*(dkm^2-4)*(dkm^2-9))*4*pi/Nsample/pi*mag_XH5_search(km)/sqrt(2);%有效值
  130. elseif abs(dkm-1)<1e-3
  131. A_HA(1)=abs(dkm*(dkm+1)*(dkm^2-4)*(dkm^2-9))*4*pi/Nsample/pi*mag_XH5_search(km)/sqrt(2);%有效值
  132. else
  133. A_HA(1)=abs(dkm*(dkm^2-1)*(dkm^2-4)*(dkm^2-9))*4*pi/Nsample/sin(pi*dkm)*mag_XH5_search(km)/sqrt(2);%有效值
  134. end
  135. phi_HA(1)=angle(XH5_search(km))/pi*180-dkm*180;

  136. %计算高次谐波的频率、幅度、相位
  137. for order_HA=2:N_HA %谐波的序号
  138. km=floor(f_HA(1)/df*order_HA+1);
  139. dkm=f_HA(1)/df*order_HA+1-km;

  140. XH5_km=XH(km)/60 ...
  141. -(XH(km-1)+XH(km+1))/90 ...
  142. +(XH(km-2)+XH(km+2))/360;
  143. mag_XH5_km=abs(XH5_km);
  144. f_HA(order_HA)=f_HA(1)*order_HA;%高次谐波的频率
  145. if abs(dkm)<1e-3
  146. A_HA(order_HA)=abs((dkm^2-1)*(dkm^2-4)*(dkm^2-9))*4*pi/Nsample/pi*mag_XH5_km/sqrt(2);%有效值
  147. elseif abs(dkm-1)<1e-3
  148. A_HA(order_HA)=abs(dkm*(dkm+1)*(dkm^2-4)*(dkm^2-9))*4*pi/Nsample/pi*mag_XH5_km/sqrt(2);%有效值
  149. else
  150. A_HA(order_HA)=abs(dkm*(dkm^2-1)*(dkm^2-4)*(dkm^2-9))*4*pi/Nsample/sin(pi*dkm)*mag_XH5_km/sqrt(2);%有效值
  151. end
  152. phi_HA(order_HA)=angle(XH5_km)/pi*180-dkm*180;
  153. end

  154. %限定相位角在[-180,180]
  155. phi_HA(phi_HA<-180)=phi_HA(phi_HA<-180)+360;

  156. end
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-26 03:55

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表