使用Matlab计算逆变器输出电压的THD

使用Matlab计算逆变器输出电压的THD本程序的作用是计算逆变器输出电压的THD,介绍了FIR直流分量去除,移动平均值滤波,分段求频谱再平均等方法。

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

使用Matlab计算逆变器输出电压的THD

0.要求

本程序的作用是计算逆变器输出电压的THD(Total Harmonic Distortion,总谐波失真或谐波总畸变率),计算方法是除基波外各次谐波幅值的平方和再开根号,然后与基波(50Hz)幅值的比值即为THD。

要求如下:

  • 系统计算的最高次谐波是18次谐波;
  • 采样数据已提供,在data.mat中,采样频率5000Hz,共5万个点,可用load命令读入;
  • 设计一个低通滤波器(m语言编程或matlab自带工具箱),滤除采样数据中高于最高次谐波的频率,滤波后的数据再用来计算THD;
  • 请用MATLAB语言完成一个函数来计算电压的THD,输出参数为THD计算结果,函数的输入参数为电压采样值x
  • 计算过程中注意结合课程中所讲过的信号处理方法,如去除直流分量、移动平均滤波、分段求频谱再平均等方法;
  • 要求有信号时域波形图(取200点)、滤波前信号的频谱图、滤波后信号的频谱图等;

1 使用load读取信号

 load data.mat
 Fs = 5000;                      
 T = 1/Fs;              
 L = length(data);  

2 使用fft函数绘制信号的单边频谱

相关代码如下:

 % 绘制输入信号频谱
 Yin = fft(data);
 P2In = abs(Yin/L);
 P1In = P2In(1:L/2+1);
 P1In(2:end-1) = 2*P1In(2:end-1);
 fIn = Fs*(0:(L/2))/L;
 plot(fIn,P1In) 
 title('滤波前信号的频谱图')
 xlabel('f (Hz)')
 ylabel('单侧幅值频谱|P1(f)|')

得到结果如下:

输入信号的频谱

3 选择合适的滤波器

FIR滤波器是有限长单位冲激响应滤波器,又称为非递归型滤波器,是数字信号处理系统中最基本的元件,它可以在保证任意幅频特性的同时具有严格的线性相频特性。同时其单位抽样响应是有限长的,因而滤波器是稳定的系统。

由于输入的信号是逆变器输出电压,需要满足线性相位,故这里使用FIR滤波器。

设计并应用滤波器的代码如下。

 % 2 
 % 使用低通滤波器处理信号
 % 最高次谐波是18次谐波,通带0-900Hz,阻带950Hz
 Fpass = 900;
 Fstop = 950;
 Ap = 1;
 Ast = 30;
 lowpassfirFilter = designfilt('lowpassfir','PassbandFrequency',Fpass,...
   'StopbandFrequency',Fstop,'PassbandRipple',Ap,...
   'StopbandAttenuation',Ast,'SampleRate',Fs);
 % fvtool(lowpassfirFilter,"Fs",Fs);
 dataOut = filtfilt(lowpassfirFilter,data);

生成滤波器的幅频响应和相频响应图如下:

滤波器

4. 绘制输出信号的频谱

做图方式同步骤2,得到滤波后信号频谱如下,不难发现19及更高次谐波已被过滤。

输出信号的频谱

对应以下程序,为了方便对比,将滤波前函数的频谱和滤波后的频谱进行对比。

 % 3
 % 滤波后信号的频谱图
 Yout = fft(dataOut);
 P2Out = abs(Yout/L);
 P1Out = P2Out(1:L/2+1);
 P1Out(2:end-1) = 2*P1Out(2:end-1);
 fOut = Fs*(0:(L/2))/L;
 figure(1)
 subplot(1,2,1)
 plot(fIn,P1In) 
 title('滤波前信号的频谱图')
 xlabel('f (Hz)')
 ylabel('单侧幅值频谱|P1(f)|')
 subplot(1,2,2)
 plot(fOut,P1Out) 
 title('滤波后信号的频谱图')
 xlabel('f (Hz)')
 ylabel('单侧幅值频谱|P1(f)|'

滤波效果对比

5. 用 MATLAB 语言编写一个函数来计算电压的 THD的函数

为了确保自己编写的thd函数的正确性,首先使用Matlab的函数thd求解。

matlab提供的函数返回结果

接着介绍如何自己实现thd函数。

首先对输入的信号进行移动平均值滤波。

定义滤波阶数为meanFitLeval。第n个点的数据为第n-meanFitLeval个点至第n点的平均值。

 % 移动平均值滤波 
     meanFitLeval = 23;
     myDataMean = dataOut*0;
     myDataMean(1:meanFitLeval) = dataOut(1:meanFitLeval);
     i = meanFitLeval+1;
     while i<length(dataOut)
         myDataMean(i) = sum(dataOut(i-meanFitLeval:i))/meanFitLeval;
         i=i+1;
     end

接着去除信号中的直流分量,将信号减去均值。

  % 去除直流分量
     myDataMeanAC = myDataMean-mean(myDataMean)

做出去除直流分量并进行平均值滤波后的信号与原始信号的对比图。

 figure(3)
 hold on;
 plot((1:200)/Fs,vthSig(1:200));
 plot((1:200)/Fs,data(1:200));
 xlabel('时间')
 ylabel('输出电压')
 legend("移动平均值滤波+去除直流后的信号","原始信号")
 hold off;

信号处理前后对比

使用分段求频谱再平均的方法优化thd的计算。将输入信号按时间分为10组,求出各组信号的fft结果,并取平均值,最后根据公式计算thd值。

 % 分段求频谱再平均,输入信号分为10组
     lengthOfPart = length(myDataMeanAC)/10;
     fftPart = zeros(1,lengthOfPart);
     for i=1:10
         thisPart = myDataMeanAC(1+lengthOfPart*(i-1):lengthOfPart*i);
         fftPart = fftPart + abs(fft(thisPart));
     end
     fftPart = fftPart/10;
     P2fftPart = abs(fftPart/lengthOfPart);
     P1fftPart = P2fftPart(1:lengthOfPart/2+1);
     P1fftPart(2:end-1) = 2*P1fftPart(2:end-1);
     ansfftPart = Fs*(0:(lengthOfPart/2))/lengthOfPart;
     % 求thd
     sumf218 = 0;
     for i=3:18
         sumf218 =  sumf218+P1fftPart(i*50+1)^2;
     end
     VthdMy = 10*log10(sqrt(sumf218)/P1fftPart(50+1));

计算得对于输入信号的前18次谐波的THD值,Matlab thd函数结果为-12.059dB,自行实现的 thd函数结果为-12.067dB,自行实现的函数误差在合理范围内,满足要求。

 "Matlab Thd=-12.059dB My Thd=-12.067dB"
 "Matlab Thd=0.062 My Thd=0.062"

今天的文章使用Matlab计算逆变器输出电压的THD分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/17280.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注