方波的Gibbs现象简析

描述

今日正文

(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()

 

 

 

审核编辑:刘清
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分