谐波波形傅里叶分析(交流电气分析):频域图无法清晰区分基波与3、5、7次谐波问题
谐波波形傅里叶分析(交流电气分析):频域图无法清晰区分基波与3、5、7次谐波问题
我来帮你解决这个电气领域的傅里叶分析问题!你遇到的频域图模糊不清、谐波峰值混在一起的问题,核心是信号生成时用角度轴而非时间轴,以及FFT频率轴没有对应真实的电气频率单位,咱们一步步来修正:
问题根源分析
你当前的代码用角度(0-360度)生成信号,相当于把信号当成了一个720点的离散序列,但没有定义实际的采样频率和时间维度。这样rfftfreq输出的是归一化频率(范围0到0.5),既没有对应到电气领域常用的Hz单位,也因为频率分辨率的问题,导致谐波峰值看起来重叠在一起。
修正后的完整代码
我们按照电气信号的实际物理意义来重构代码,以常用的50Hz基波为例(你可以根据需求改成60Hz):
import numpy as np import matplotlib.pyplot as plt from scipy.fft import rfft, rfftfreq # 电气信号参数定义 f0 = 50 # 基波频率,单位Hz fs = 1000 # 采样频率,要满足奈奎斯特准则(需大于2倍最高谐波频率,这里最高是7*50=350Hz,1000Hz足够) duration = 0.2 # 采样时长,设为基波周期的整数倍(50Hz周期0.02s,0.2s是10个周期,减少频谱泄漏) # 生成时间轴 t = np.linspace(0, duration, int(fs * duration), endpoint=False) # 生成包含基波和3、5、7次谐波的信号 # 注意用2π*f*t的形式,符合正弦信号的时间域表达式 signal = (10 * np.sin(2 * np.pi * f0 * t) + 5 * np.sin(2 * np.pi * 3*f0 * t) + 5 * np.sin(2 * np.pi * 5*f0 * t) + 11 * np.sin(2 * np.pi * 7*f0 * t)) # 绘制时域波形 plt.figure(figsize=(10, 4)) plt.plot(t, signal) plt.xlabel('Time (s)') plt.ylabel('Amplitude') plt.title('Time Domain Waveform (Fundamental + 3rd/5th/7th Harmonics)') plt.grid(True) plt.show() # 应用FFT fft = rfft(signal) # 计算真实频率轴(单位Hz),第二个参数是采样间隔1/fs frequencies = rfftfreq(len(signal), 1/fs) # 绘制频域图,只显示0到400Hz的范围,聚焦谐波区域 plt.figure(figsize=(10, 4)) plt.plot(frequencies, np.abs(fft)) plt.xlabel('Frequency (Hz)') plt.ylabel('Amplitude') plt.title('Frequency Domain Spectrum') plt.xlim(0, 400) # 限制x轴范围,清晰展示基波和3、5、7次谐波 plt.grid(True) plt.show()
修正后的效果说明
- 时域信号:基于真实时间轴生成,符合电气系统中电压/电流信号的实际形式
- 频域信号:你会清晰看到在
50Hz(基波)、150Hz(3次谐波)、250Hz(5次谐波)、350Hz(7次谐波)处出现尖锐的峰值,每个峰值的振幅也和你定义的信号系数(10、5、5、11)对应,完全符合你的预期。
额外小贴士(电气领域专属)
- 采样频率一定要大于2倍最高谐波频率(奈奎斯特准则),避免混叠
- 采样时长尽量设为基波周期的整数倍,减少频谱泄漏,让谐波峰值更尖锐
- 如果需要更高的频率分辨率,可以增加采样时长(比如把duration改成0.4s)
备注:内容来源于stack exchange,提问作者David Wigley
相关产品推荐
相关产品推荐

