本文摘要:(由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 np
import matplotlib.pyplot as plt
def 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 / T
waveform = np.zeros_like(t)
waveform[((t+0.25*T) % T) < (duty_cycle * T )] = 1
waveform1=np.ones_like(t)*0.5
return t, waveform,waveform1
def 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 / T
component = amplitude * np.cos(2* np.pi * frequency*t)
return t, component
def main():
"""Main function."""
T = 1 # Period
tau = 0.5 * T # Pulse width
num_periods = 5 # Number of periods to plot
num_harmonics = 1001 # Number of harmonics to include
# Generate the fundamental square wave
t, waveform,waveform1 = square_wave(T, tau, num_periods)
# Plot the fundamental square wave
plt.figure(figsize=(10, 6))
# plt.plot(t, waveform, label='Fundamental')
# Generate and add harmonic components
for n in range(1, num_harmonics + 1):
_, component = harmonic_component(T, n, np.sinc(n/2),num_periods)
waveform1 += component
plt.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()