本文摘要:(由ai生成)
本文首先分享了作者育儿日常,随后深入探讨了方波信号的傅里叶级数展开。作者计算了占空比为50%的方波的傅里叶系数,并说明了如何通过叠加余弦信号逼近方波。文中还提及了吉布斯现象,即在不连续点附近谐波叠加产生的过冲现象。最后,给出了用Python生成方波信号及其谐波叠加图形的示例代码,为读者提供了实用的学习资料。
今日碎碎念
今天早上老三,没睁眼就开始嚎叫,然后持续了大概大半个小时才消停。前几天在文章中感慨俩小娃轮流哭的艰难,号友发消息问说,有没有办法找出原因,然后复盘。
话说,这个原因真的很难找,小娃自己可能也不知道自己是啥情绪,然后情绪过了,小娃自己都忘记她为啥发脾气了,所以纯粹靠大人去猜。
老大的时候,看了很多育儿书,也许会去使劲找找原因;等到老二老三,真的没有这功夫了,还是善待善待自己吧,大家都过得去就行。
不过,说到原因,我总结了一下两次的客观情况,发现有一个共同点,就是我早起了。唉,结合小娃娃对妈妈的那种天然的依恋,难道是因为这个?
但是,就算这个原因,我也不能就干耗着等她们醒吧。写到这,我决定晚上回去以后,和她们商量商量。
今日正文
(1) 占空比为50%的方波的傅里叶级数展开
假设有一个方波,周期是T,占空比τ为0.5,幅度为1,如下图所示。

周期信号的傅里叶级数为:

因此,可以求得,方波的各个频率分量所对应的傅里叶系数Ck,分别为:

也就是说,方波用傅里叶级数暂开后,可以得到:

也就是说,上述图示的方波是由直流和一系列不同幅度的余弦函数构成的。
(2) 演示一下,用各个分量,慢慢叠加,形成方波。
当只有直流时,图形为:

叠加上频率为w0的余弦信号,图形为:

叠加上频率为3w0的余弦信号,图形为:

叠加上频率为5w0的余弦信号,图形为:

......
叠加上频率为101w0的余弦信号,图形为:

......
叠加上频率为1001w0的余弦信号后,图形为:

(3) 吉布斯现象(Gibbs phenomenon)
由上面的叠加图形可以看到,当用余弦波叠加去逼近方波信号时,所用的谐波次数N即使增加到1001后,在不连续点的附近,仍然会出现过冲。
N越大,过冲的最大值越接近不连续点,但其峰值并不下降,而是大约等于原函数在不连续点处跳变值的9%。
(4) 上面的图形的Python程序
import numpy as npimport matplotlib.pyplot as pltdef square_wave(T, tau, num_periods):"""Generate a square wave."""t = np.linspace(-T * num_periods / 2, T * num_periods / 2, 100000)duty_cycle = tau / Twaveform = np.zeros_like(t)waveform[((t+0.25*T) % T) < (duty_cycle * T )] = 1waveform1=np.ones_like(t)*0.5return t, waveform,waveform1def harmonic_component(T, n, amplitude,num_periods):"""Generate a harmonic component."""t = np.linspace(-T * num_periods / 2, T * num_periods / 2, 100000)frequency = n / Tcomponent = amplitude * np.cos(2* np.pi * frequency*t)return t, componentdef main():"""Main function."""T = 1 # Periodtau = 0.5 * T # Pulse widthnum_periods = 5 # Number of periods to plotnum_harmonics = 1001 # Number of harmonics to include# Generate the fundamental square wavet, waveform,waveform1 = square_wave(T, tau, num_periods)# Plot the fundamental square waveplt.figure(figsize=(10, 6))# plt.plot(t, waveform, label='Fundamental')# Generate and add harmonic componentsfor n in range(1, num_harmonics + 1):_, component = harmonic_component(T, n, np.sinc(n/2),num_periods)waveform1 += componentplt.plot(t, waveform1)plt.xlabel('Time')plt.ylabel('Amplitude')plt.title('Square Wave Reconstruction with Harmonic Components')plt.legend()plt.grid(True)plt.show()if __name__ == "__main__":main()