吉布斯现象解析
吉布斯现象是由亨利·威尔伯拉罕在1848年发现的,然后由j·威拉德·吉布斯在1899年重新发现的。
对于具有不连续的周期信号,如果通过加傅立叶级数来重构信号,则在边缘附近会出现超调。这些超调以远离边缘的阻尼振荡方式向外衰减。这被称为GIBBS现象,如下图所示。
因为,当0 f(x)=4π∑n=1,3,5,⋯1nsin(nx)\begin{equation} f(x)=\dfrac{4}{\pi}\sum_{n=1,3,5,\cdots}{\dfrac{1}{n}\sin(n x)} \end{equation}f(x)=π4n=1,3,5,⋯∑n1sin(nx) 更一般的,随着N增加,部分起伏就向不连续点压缩,但是对任何有限的N值,起伏的峰值大小保持不变,以函数f(x)=xf(x)=xf(x)=x为例,其周期为2π2\pi2π,某个定义区间为[−π,π][-\pi,\pi][−π,π],其图像为: 且它的傅里叶展开级数的系数为: bn=(1π)∫−ππxsin(nx)dx=∑n=1∞(−1)n+1(2n)\begin{equation} \begin{aligned} b_n&=(\frac{1}{\pi})\int_{-\pi}^{\pi}{x\sin(nx)}\mathrm{d}x\\ &=\sum_{n=1}^{\infty}(-1)^{n+1}(\frac{2}{n}) \end{aligned} \end{equation}bn=(π1)∫−ππxsin(nx)dx=n=1∑∞(−1)n+1(n2)则它的傅里叶级数近似结果如下: 其误差表示为: 从图中可以看出其误差最大值保持不变,约为跳变值的0.09倍。 import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,2*np.pi,5000) square_wave = np.ones_like(x) square_wave[int(x.size/2):]=-1 N = 30 fsq = np.zeros_like(x) for i in range(N): n = 2*i + 1 fsq += np.sin(n *x) / n fsq *= 4 / np.pi fig, ax = plt.subplots() ax.plot(x, square_wave, lw=5, alpha=0.5) ax.plot(x, fsq, 'r') ax.set_ylim(-1.2,1.2) plt.title('N='+str(N)) ax.set_xticks([0,1,2,3,4,5,6,7]) ax.set_xticks([0.5,1.5,2.5,3.5,4.5,5.5,6.5], minor=True) ax.set_yticks([-1, 0, 1]) ax.set_yticks(np.arange(-1.2,1.2,0.2), minor=True) ax.grid(b=True, c='k', lw=1, ls='--', which='major') ax.grid(b=True, c='0.4', lw=0.5, ls=':', which='minor') plt.show() 运行结果: