总谐波畸变率 THD 的计算公式整理:MATLAB 官方公式与论文常用公式对比
1. 前言
在电力电子、并网逆变器、储能变流器、电机驱动以及电能质量分析中,总谐波畸变率 Total Harmonic Distortion,简称 THD,是评价电压或电流波形质量的重要指标。
例如,在并网储能变流器实验中,通常需要给出并网电流 THD,用于说明控制策略是否能够满足较好的电流质量要求。很多论文中会写:
The current THD is reduced from 5.8% to 2.3%.
但是,THD 的计算公式并不是只有一种写法。尤其是在 MATLAB 中,thd() 函数默认返回的是 dBc,而不是百分比,这一点非常容易导致误用。
本文将系统梳理以下几个问题:
- THD 到底有哪些常见计算公式?
- MATLAB 官方
thd()函数采用的公式是什么? - 电力电子论文中最常用的 THD 公式是什么?
- THD、distortion factor 和 TDD 有什么区别?
- 实验和论文中应该如何规范表述 THD?
2. THD 的基本定义
假设一个周期性电压或电流信号可以分解为:
x(t)=x1(t)+x2(t)+x3(t)+⋯+xH(t) x(t)=x_1(t)+x_2(t)+x_3(t)+\cdots+x_H(t) x(t)=x1(t)+x2(t)+x3(t)+⋯+xH(t)
其中:
- x1(t)x_1(t)x1(t):基波分量;
- xh(t)x_h(t)xh(t):第 hhh 次谐波分量;
- HHH:计算时考虑的最高谐波次数;
- X1X_1X1:基波 RMS 值;
- XhX_hXh:第 hhh 次谐波 RMS 值。
最经典、最常用的 THD 定义为:
THD=∑h=2HXh2X1×100 \mathrm{THD}=\frac{\sqrt{\sum_{h=2}^{H}X_h^2}}{X_1}\times100% THD=X1∑h=2HXh2×100
也就是:
THD=X22+X32+⋯+XH2X1×100 \mathrm{THD}=\frac{\sqrt{X_2^2+X_3^2+\cdots+X_H^2}}{X_1}\times100% THD=X1X22+X32+⋯+XH2×100
这个公式的含义非常明确:
THD = 所有谐波分量 RMS 合成值 / 基波 RMS 值。
注意,这里的分母是 基波 RMS 值,不是总 RMS 值。
3. 电压 THD 与电流 THD
对于电压信号,其总谐波畸变率可以写为:
THD∗v=∑∗h=2HVh2V1×100 \mathrm{THD}*v=\frac{\sqrt{\sum*{h=2}^{H}V_h^2}}{V_1}\times100% THD∗v=V1∑∗h=2HVh2×100
展开后为:
THDv=V22+V32+⋯+VH2V1×100 \mathrm{THD}_v=\frac{\sqrt{V_2^2+V_3^2+\cdots+V_H^2}}{V_1}\times100% THDv=V1V22+V32+⋯+VH2×100
其中:
- V1V_1V1 为基波电压 RMS 值;
- VhV_hVh 为第 hhh 次谐波电压 RMS 值。
对于电流信号,其总谐波畸变率可以写为:
THD∗i=∑∗h=2HIh2I1×100 \mathrm{THD}*i=\frac{\sqrt{\sum*{h=2}^{H}I_h^2}}{I_1}\times100% THD∗i=I1∑∗h=2HIh2×100
展开后为:
THDi=I22+I32+⋯+IH2I1×100 \mathrm{THD}_i=\frac{\sqrt{I_2^2+I_3^2+\cdots+I_H^2}}{I_1}\times100% THDi=I1I22+I32+⋯+IH2×100
其中:
- I1I_1I1 为基波电流 RMS 值;
- IhI_hIh 为第 hhh 次谐波电流 RMS 值。
在并网变流器实验中,最常见的是计算并网电流 THD,即:
THD∗i=∑∗h=2HIh2I1×100 \mathrm{THD}*i=\frac{\sqrt{\sum*{h=2}^{H}I_h^2}}{I_1}\times100% THD∗i=I1∑∗h=2HIh2×100
4. 论文中最常用的 THD 公式
在电力电子、并网逆变器、储能变流器、电机驱动等论文中,最常用的 THD 公式就是:
THD=∑h=2HXh2X1×100 \mathrm{THD}=\frac{\sqrt{\sum_{h=2}^{H}X_h^2}}{X_1}\times100% THD=X1∑h=2HXh2×100
其中,XXX 可以表示电压或电流。
例如,对于并网电流 THD,通常写为:
THD∗i=∑∗h=250Ih2I1×100 \mathrm{THD}*i=\frac{\sqrt{\sum*{h=2}^{50}I_h^2}}{I_1}\times100% THD∗i=I1∑∗h=250Ih2×100
这里取 H=50H=50H=50,表示计算到第 50 次谐波。
对于 50 Hz 系统,第 50 次谐波对应频率为:
f50=50×50=2500Hz f_{50}=50\times50=2500\mathrm{Hz} f50=50×50=2500Hz
因此,在 50 Hz 电力系统中,计算到第 50 次谐波通常意味着分析频率范围到 2500 Hz。
论文中建议写成:
The current THD is calculated as
THD∗i=∑∗h=2HIh2I1×100 \mathrm{THD}*i=\frac{\sqrt{\sum*{h=2}^{H}I_h^2}}{I_1}\times100% THD∗i=I1∑∗h=2HIh2×100
where I1I_1I1 is the RMS value of the fundamental current component, IhI_hIh is the RMS value of the hhh-th harmonic current component, and HHH is the highest harmonic order considered in the analysis.
如果是中文论文,可以写为:
其中,I1I_1I1 为基波电流有效值,IhI_hIh 为第 hhh 次谐波电流有效值,HHH 为计算中考虑的最高谐波次数。
5. MATLAB 官方 thd() 函数的公式
MATLAB Signal Processing Toolbox 中提供了 thd() 函数用于计算总谐波畸变率。
需要特别注意的是:
MATLAB 的
thd()函数默认返回的是 dBc,而不是百分比。
其官方计算本质为:
THD∗dBc=10log∗10(∑h=2HAh2A12) \mathrm{THD}*{\mathrm{dBc}}=10\log*{10}\left(\frac{\sum_{h=2}^{H}A_h^2}{A_1^2}\right) THD∗dBc=10log∗10(A12∑h=2HAh2)
等价地,也可以写成:
THD∗dBc=20log∗10(∑h=2HAh2A1) \mathrm{THD}*{\mathrm{dBc}}=20\log*{10}\left(\frac{\sqrt{\sum_{h=2}^{H}A_h^2}}{A_1}\right) THD∗dBc=20log∗10A1∑h=2HAh2
其中:
- A1A_1A1 为基波幅值;
- AhA_hAh 为第 hhh 次谐波幅值;
- ∑h=2HAh2\sum_{h=2}^{H}A_h^2∑h=2HAh2 表示所有谐波分量的功率和。
因此,MATLAB thd() 的结果本质上是:
谐波总功率与基波功率之比,再转换为 dB 形式。
6. MATLAB dBc 与百分比 THD 的转换
如果 MATLAB 得到的结果为:
thd_dbc = thd(x,Fs,N);
那么该结果单位是 dBc。
若要转换成百分比形式,应使用:
KaTeX parse error: Expected '}', got 'EOF' at end of input: …rm{dBc}}}{20}}
对应 MATLAB 代码为:
thd_dbc = thd(x,Fs,N);
thd_percent = 100*10^(thd_dbc/20);
例如,如果 MATLAB 返回:
thd_dbc = -40;
则对应的百分比 THD 为:
thd_percent = 100*10^(-40/20);
即:
KaTeX parse error: Expected '}', got 'EOF' at end of input: …imes10^{-2}=1%
所以:
−40dBc⟺1 -40\mathrm{dBc}\quad\Longleftrightarrow\quad1% −40dBc⟺1
这是实验数据处理中非常容易出错的地方。
7. MATLAB thd() 中谐波数参数的含义
MATLAB 中常用调用形式为:
r = thd(x,Fs,N);
其中:
x:输入信号;Fs:采样频率;N:参与计算的谐波数。
需要注意的是,MATLAB 中的 N 通常包含基波。
例如:
thd_dbc = thd(x,Fs,50);
表示计算基波到第 50 次谐波范围内的 THD。
如果想得到百分比形式:
thd_dbc = thd(x,Fs,50);
thd_percent = 100*10^(thd_dbc/20);
8. 由 RMS 值直接计算 THD
如果已经通过 FFT 或其他方法得到了各次谐波的 RMS 值,则可以直接计算 THD。
假设已经得到:
I1 = 10; % 基波电流 RMS
I5 = 0.3; % 5次谐波 RMS
I7 = 0.2; % 7次谐波 RMS
I11 = 0.1; % 11次谐波 RMS
则 THD 可以计算为:
THD_percent = sqrt(I5^2 + I7^2 + I11^2)/I1*100;
对应公式为:
THD∗i=I52+I72+I∗112I1×100 \mathrm{THD}*i=\frac{\sqrt{I_5^2+I_7^2+I*{11}^2}}{I_1}\times100% THD∗i=I1I52+I72+I∗112×100
如果谐波数据存储在数组中:
Ih = [10, 0.3, 0.2, 0.1]; % 第一个元素为基波,后面为谐波
I1 = Ih(1);
I_harmonic = Ih(2:end);
THD_percent = sqrt(sum(I_harmonic.^2))/I1*100;
9. 由总 RMS 计算 THD 的等效公式
如果信号中不含直流分量,或者直流分量已经被去除,则有:
Xrms2=X12+X22+X32+⋯+XH2 X_{\mathrm{rms}}^2=X_1^2+X_2^2+X_3^2+\cdots+X_H^2 Xrms2=X12+X22+X32+⋯+XH2
因此:
X22+X32+⋯+XH2=Xrms2−X12 X_2^2+X_3^2+\cdots+X_H^2=X_{\mathrm{rms}}^2-X_1^2 X22+X32+⋯+XH2=Xrms2−X12
于是 THD 也可以写为:
THD=Xrms2−X12X1×100 \mathrm{THD}=\frac{\sqrt{X_{\mathrm{rms}}^2-X_1^2}}{X_1}\times100% THD=X1Xrms2−X12×100
如果信号中包含直流分量 X0X_0X0,则需要扣除直流分量:
THD=Xrms2−X02−X12X1×100 \mathrm{THD}=\frac{\sqrt{X_{\mathrm{rms}}^2-X_0^2-X_1^2}}{X_1}\times100% THD=X1Xrms2−X02−X12×100
这种公式在实验数据处理中也很常见。
但是需要注意:
这种写法会把所有非基波成分都计入失真,包括噪声、间谐波、非整数频率分量和开关频率附近的成分。
因此,如果论文中采用该公式,需要说明数据处理方式,例如:
- 是否去除直流分量;
- 是否只统计整数次谐波;
- 是否排除间谐波;
- 是否限定最高谐波次数;
- 是否采用稳态时间窗。
10. 另一种容易混淆的公式:以总 RMS 为分母
有些资料中还会出现如下定义:
THD∗R=∑∗h=2HXh2∑h=1HXh2×100 \mathrm{THD}*R=\frac{\sqrt{\sum*{h=2}^{H}X_h^2}}{\sqrt{\sum_{h=1}^{H}X_h^2}}\times100% THD∗R=∑h=1HXh2∑∗h=2HXh2×100
也就是:
THDR=X22+X32+⋯+XH2X12+X22+⋯+XH2×100 \mathrm{THD}_R=\frac{\sqrt{X_2^2+X_3^2+\cdots+X_H^2}}{\sqrt{X_1^2+X_2^2+\cdots+X_H^2}}\times100% THDR=X12+X22+⋯+XH2X22+X32+⋯+XH2×100
该定义的分母是总 RMS,而不是基波 RMS。
它与常用 THD 定义之间的关系为:
THDR=THDF1+THDF2 \mathrm{THD}_R=\frac{\mathrm{THD}_F}{\sqrt{1+\mathrm{THD}_F^2}} THDR=1+THDF2THDF
其中:
- THDF\mathrm{THD}_FTHDF 表示以基波为分母的 THD;
- THDR\mathrm{THD}_RTHDR 表示以总 RMS 为分母的失真率。
在电力电子论文中,通常采用的是 THDF\mathrm{THD}_FTHDF,即:
THD∗F=∑∗h=2HXh2X1×100 \mathrm{THD}*F=\frac{\sqrt{\sum*{h=2}^{H}X_h^2}}{X_1}\times100% THD∗F=X1∑∗h=2HXh2×100
而不是以总 RMS 为分母的 THDR\mathrm{THD}_RTHDR。
11. THD 与 TDD 的区别
在电流谐波评价中,还经常会遇到另一个指标:TDD,Total Demand Distortion,即总需求畸变率。
THD 的定义为:
THD∗i=∑∗h=2HIh2I1×100 \mathrm{THD}*i=\frac{\sqrt{\sum*{h=2}^{H}I_h^2}}{I_1}\times100% THD∗i=I1∑∗h=2HIh2×100
而 TDD 的定义为:
TDD=∑h=2HIh2IL×100 \mathrm{TDD}=\frac{\sqrt{\sum_{h=2}^{H}I_h^2}}{I_L}\times100% TDD=IL∑h=2HIh2×100
二者的区别在于分母不同:
| 指标 | 分子 | 分母 | 常见用途 |
|---|---|---|---|
| THD | 谐波电流 RMS 合成值 | 当前基波电流 I1I_1I1 | 波形质量评价、实验结果对比 |
| TDD | 谐波电流 RMS 合成值 | 最大需求负荷电流 ILI_LIL | 电能质量标准、并网点谐波合规性评价 |
因此:
- 如果是评价变流器输出电流质量,通常使用 THD;
- 如果是按照 IEEE 519 等电能质量标准评价公共连接点谐波水平,则可能需要使用 TDD。
12. FFT 计算 THD 时的注意事项
在 MATLAB 中,如果自己通过 FFT 计算 THD,需要注意以下几点。
12.1 基波频率要准确
对于 50 Hz 系统,应保证基波频率为:
f1=50Hz f_1=50\mathrm{Hz} f1=50Hz
第 hhh 次谐波频率为:
fh=hf1 f_h=h f_1 fh=hf1
例如:
f5=5×50=250Hz f_5=5\times50=250\mathrm{Hz} f5=5×50=250Hz
f7=7×50=350Hz f_7=7\times50=350\mathrm{Hz} f7=7×50=350Hz
f50=50×50=2500Hz f_{50}=50\times50=2500\mathrm{Hz} f50=50×50=2500Hz
12.2 尽量使用整周期采样
如果采样窗口不是基波周期的整数倍,会产生频谱泄漏,导致谐波幅值计算不准确。
例如,50 Hz 系统的一个周期为:
T1=150=0.02s T_1=\frac{1}{50}=0.02\mathrm{s} T1=501=0.02s
如果选取 10 个周期,则时间窗为:
Twin=10T1=0.2s T_{\mathrm{win}}=10T_1=0.2\mathrm{s} Twin=10T1=0.2s
12.3 明确 RMS 还是峰值
THD 公式中通常使用 RMS 值。
如果 FFT 得到的是峰值幅值,只要基波和谐波均采用同一种幅值定义,则比例中 2\sqrt{2}2 会相互抵消。因此,用峰值或 RMS 计算出的 THD 比例是一致的。
但是论文中建议统一表述为 RMS 值:
THD=∑h=2HXh2X1×100 \mathrm{THD}=\frac{\sqrt{\sum_{h=2}^{H}X_h^2}}{X_1}\times100% THD=X1∑h=2HXh2×100
where XhX_hXh denotes the RMS value of the hhh-th harmonic component.
12.4 明确是否包含直流分量
THD 计算一般不包含直流分量。若信号存在直流偏置,应先去除直流分量:
x = x - mean(x);
12.5 明确是否包含间谐波和噪声
标准 THD 通常只统计整数次谐波:
2f1,3f1,4f1,⋯ ,Hf1 2f_1,3f_1,4f_1,\cdots,Hf_1 2f1,3f1,4f1,⋯,Hf1
而不包括间谐波、宽频噪声和非整数倍频率分量。
如果采用总 RMS 减基波 RMS 的方法,可能会把这些成分也纳入计算,因此需要谨慎。
13. MATLAB 手动计算 THD 示例
下面给出一个简单示例,假设信号由基波、5 次谐波和 7 次谐波组成。
clear; clc;
Fs = 10000; % 采样频率
f1 = 50; % 基波频率
T = 0.2; % 采样时长,10个基波周期
t = 0:1/Fs:T-1/Fs;
% 构造信号
x1 = 10*sqrt(2)*sin(2*pi*f1*t); % 基波 RMS = 10
x5 = 0.3*sqrt(2)*sin(2*pi*5*f1*t); % 5次谐波 RMS = 0.3
x7 = 0.2*sqrt(2)*sin(2*pi*7*f1*t); % 7次谐波 RMS = 0.2
x = x1 + x5 + x7;
% 理论 THD
I1 = 10;
I5 = 0.3;
I7 = 0.2;
THD_percent_theory = sqrt(I5^2 + I7^2)/I1*100
理论结果为:
THD=0.32+0.2210×100 \mathrm{THD}=\frac{\sqrt{0.3^2+0.2^2}}{10}\times100%=3.606% THD=100.32+0.22×100
如果使用 MATLAB thd():
thd_dbc = thd(x,Fs,7);
thd_percent = 100*10^(thd_dbc/20);
其中:
thd_dbc为 dBc;thd_percent为百分比 THD。
14. 论文中推荐的英文表述
在 IEEE 风格论文中,建议不要只写:
The THD is calculated by FFT.
这种表述过于简单,不够规范。
建议写为:
The current total harmonic distortion (THD) is calculated based on the RMS values of the harmonic components as
THD∗i=∑∗h=2HIh2I1×100 \mathrm{THD}*i=\frac{\sqrt{\sum*{h=2}^{H}I_h^2}}{I_1}\times100% THD∗i=I1∑∗h=2HIh2×100
where I1I_1I1 denotes the RMS value of the fundamental current component, IhI_hIh denotes the RMS value of the hhh-th harmonic current component, and HHH is the highest harmonic order considered in the calculation.
如果需要说明采用第 50 次谐波,可以写为:
In this study, the harmonic components up to the 50th order are considered in the THD calculation.
如果需要说明基波频率为 50 Hz,可以写为:
The fundamental frequency is 50 Hz, and the harmonic components from the 2nd to the 50th order are included.
如果需要说明 MATLAB 处理方式,可以写为:
The THD obtained by the MATLAB
thdfunction is converted from dBc to percentage usingKaTeX parse error: Expected '}', got 'EOF' at end of input: …thrm{dBc}}/20}
15. 论文中推荐的中文表述
中文论文或实验报告中可以写为:
本文采用各次谐波有效值计算并网电流总谐波畸变率,其表达式为:
THD∗i=∑∗h=2HIh2I1×100 \mathrm{THD}*i=\frac{\sqrt{\sum*{h=2}^{H}I_h^2}}{I_1}\times100% THD∗i=I1∑∗h=2HIh2×100
式中,I1I_1I1 为基波电流有效值,IhI_hIh 为第 hhh 次谐波电流有效值,HHH 为计算中考虑的最高谐波次数。本文计算至第 50 次谐波。
也可以进一步说明:
在 MATLAB 中,
thd()函数默认输出单位为 dBc,本文将其转换为百分比形式:KaTeX parse error: Expected '}', got 'EOF' at end of input: …thrm{dBc}}/20}
16. 常见误区总结
误区 1:把 MATLAB thd() 的结果直接当成百分比
错误写法:
THD_percent = thd(x,Fs,50);
这是不对的,因为 thd() 返回的是 dBc。
正确写法:
THD_dbc = thd(x,Fs,50);
THD_percent = 100*10^(THD_dbc/20);
误区 2:把总 RMS 当成分母
常用 THD 的分母是基波 RMS:
X1 X_1 X1
而不是总 RMS:
Xrms X_{\mathrm{rms}} Xrms
论文中最常用的是:
THD=∑h=2HXh2X1×100 \mathrm{THD}=\frac{\sqrt{\sum_{h=2}^{H}X_h^2}}{X_1}\times100% THD=X1∑h=2HXh2×100
误区 3:没有说明谐波次数上限
不同的 HHH 会得到不同的 THD。
例如:
H=20 H=20 H=20
和
H=50 H=50 H=50
计算结果可能不同。
因此论文中应说明:
Harmonic components up to the 50th order are considered.
误区 4:没有区分 THD 和 TDD
THD 的分母是当前基波电流:
I1 I_1 I1
TDD 的分母是最大需求负荷电流:
IL I_L IL
二者不能混用。
误区 5:没有去除直流分量
THD 一般不包括直流分量,因此在数据处理时应注意去除直流偏置:
x = x - mean(x);
17. 总结
THD 最常用、最标准的公式为:
THD=∑h=2HXh2X1×100 \mathrm{THD}=\frac{\sqrt{\sum_{h=2}^{H}X_h^2}}{X_1}\times100% THD=X1∑h=2HXh2×100
其中:
- X1X_1X1 为基波 RMS 值;
- XhX_hXh 为第 hhh 次谐波 RMS 值;
- HHH 为最高谐波次数。
MATLAB thd() 函数的官方输出为 dBc:
THD∗dBc=10log∗10(∑h=2HXh2X12) \mathrm{THD}*{\mathrm{dBc}}=10\log*{10}\left(\frac{\sum_{h=2}^{H}X_h^2}{X_1^2}\right) THD∗dBc=10log∗10(X12∑h=2HXh2)
若要转换为百分比,应使用:
KaTeX parse error: Expected '}', got 'EOF' at end of input: …rm{dBc}}}{20}}
对于电力电子和并网变流器论文,推荐采用:
THD∗i=∑∗h=250Ih2I1×100 \mathrm{THD}*i=\frac{\sqrt{\sum*{h=2}^{50}I_h^2}}{I_1}\times100% THD∗i=I1∑∗h=250Ih2×100
并在文中明确说明:
- 基波频率;
- 谐波次数上限;
- 是否去除直流分量;
- 是否只统计整数次谐波;
- MATLAB 输出是否已由 dBc 转换为百分比。
这样可以避免 THD 计算结果在 MATLAB、实验报告和论文表述之间出现不一致。
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/weixin_44114030/article/details/160922671



