关于matlab分析电流THD的一些探究和记录

我其实一直对matlab中分析FFT存在一定的疑问。今天从头开始梳理一下。

1 电流THD的定义

总谐波失真 Total Harmonic Distortion(THD) 通常定义为各次谐波分量的均方根值之和与基波分量的均方根值之比,用百分比表示。对于电流信号,标准计算公式为:

其中 I1 为基波电流有效值,Ih 为第 h 次谐波电流有效值。谐波次数通常计算到 40 次或 50 次。

我们构造一个模型,对公式进行验证。

信号1:

  • 基波电流为 66.667Hz,幅值为1A;
  • 谐波电流为 5*66.667Hz,幅值为0.1A;

此时电流 THD 理论值为

此时Simulink FFT Analyzer 分析结果如下所示,与理论一致。

信号2:

  • 基波电流为 66.667Hz,幅值为1A;
  • 谐波电流为 5*66.667Hz,幅值为0.1A;
  • 谐波电流为 7*66.667Hz,幅值为0.2A;
  • 谐波电流为 11*66.667Hz,幅值为0.1A;
  • 谐波电流为 13*66.667Hz,幅值为0.2A;

此时电流 THD 理论值为

此时Simulink FFT Analyzer 分析结果如下所示,与理论一致。此时5次谐波幅值为0.1A,纵轴幅值为10%,此时7次谐波幅值为0.2A,纵轴幅值为20%,此时11次谐波幅值为0.1A,纵轴幅值为10%,此时13次谐波幅值为0.2A,纵轴幅值为20%。整体THD大小为31.62%。对的上没有问题。

在分析真实电流的时候就出现了非常有意思的现象:

分析结果1:

分析结果2:

Max frequency for THD computation存在两个选项。Nyquist frequency 和 Same as Max frequency 分析的结果不同。

其中Nyquist frequency :这个选项会将THD计算的积分上限扩展到奈奎斯特频率。奈奎斯特频率 = 采样率 / 2,它是该仿真系统在理论上能够处理的最高频率

其中Same as Max frequency: 这个选项告诉软件,只在你当前频谱图显示的频率范围内计算THD。通常,这个范围的上限是你在FFT分析工具中设定的"最大频率"。一般来说,用户设定的 Max frequency 会刚好覆盖到关心的最高次谐波就停止。

4 直接计算与Nyquist frequency 分析结果的区别?

我们将FFT的分析表格导出,通过THD计算公式计算:

整体处理数据:

整体计算下来:

对平方和开根号;最终电流THD计算结果为 2.64% 。相对的Nyquist frequency 所得的电流THD为 5.61%。相对来说Nyquist frequency 要远大于纯粹通过谐波频次计算所得的电流THD。

5 为什么Nyquist选项会让THD变高?

当选择"Nyquist frequency"时,THD的计算公式变成了:

我尝试过 第2小节中构造信号的两种不同选项,其中Nyquist frequency 和 **Same as Max frequency 分析结果完全一致。**这是因为构造的信号中完全没有高频噪声,其分析结果完全是纯净的,结果完全和理论对应。但是真实电流中混叠分量非常多、高频噪声份量多,因此电流THD就不一样了。

这也是为什么通过命令行计算电流THD与通过Simulink FFT Analyzer 分析电流THD之间存在较大区别的原因。

6 命令行FFT函数结果与理论值对比

信号1:

  • 基波电流为 66.667Hz,幅值为1A;
  • 谐波电流为 5*66.667Hz,幅值为0.1A;

此时电流 THD 理论值为

此时通过命令行分析结果与Simulink FFT Analyzer一致,与上面分析的理论一致。

真实电流信号:

这个结果和通过整体处理数据后获得的电流THD相近,但是与Simulink FFT Analyzer存在较大差距。并且通过命令行计算Nyquist frequency 的THD结果相对实现过程较为困难。

7 总结

(1)这一节文章内容梳理了一下我心中一直存在的一个疑问,为什么谐波幅值被抑制得非常明显,但是电流THD却降低不太明显。并且通过FFT谐波幅值表格结合正确的THD公式,却永远计算不出来和Simulink FFT Analyzer 一样的值。

(2)通过理想 构造信号 和 真实电流 之间的分析结果区别,明细了问题的原因(混叠分量的影响)。

相关推荐
bkspiderx7 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
程序员老陆7 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光7 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
码云数智-园园7 小时前
unique_ptr 还是 shared_ptr?C++ 智能指针选型与内存泄漏实战分析
java·开发语言
禾小西8 小时前
07丨Redis 哨兵机制:主库故障后,如何恢复服务?
java·开发语言·redis
我不是阵雨8 小时前
JDK 21虚拟线程Pinning陷阱:一文拔钉解困
java·开发语言
徐小黑ACG9 小时前
Golang 基础05 结构体struct
开发语言·算法·golang
优橙教育9 小时前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
SEO_juper10 小时前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
西柚小萌新10 小时前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库