方波的分解和再现python
时间: 2023-06-17 18:04:05 浏览: 54
方波可以通过傅里叶级数进行分解和再现,下面给出一个Python实现:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义方波函数
def square_wave(x, duty=0.5):
x = np.mod(x, 2*np.pi) / (2*np.pi)
return 2*(x <= duty) - 1
# 计算傅里叶级数系数
def fourier_coefficients(n_max, duty=0.5):
a0 = np.mean(square_wave(np.linspace(0, 2*np.pi, 1000), duty=duty))
an = np.zeros(n_max)
bn = np.zeros(n_max)
for n in range(1, n_max+1):
integrand_cos = lambda x: square_wave(x, duty=duty) * np.cos(n*x)
integrand_sin = lambda x: square_wave(x, duty=duty) * np.sin(n*x)
an[n-1] = 2*np.pi * (1/np.pi) * np.trapz(integrand_cos(np.linspace(0, 2*np.pi, 1000)), dx=2*np.pi/1000)
bn[n-1] = 2*np.pi * (1/np.pi) * np.trapz(integrand_sin(np.linspace(0, 2*np.pi, 1000)), dx=2*np.pi/1000)
return a0, an, bn
# 计算傅里叶级数的和
def fourier_series(x, a0, an, bn, n_max):
f = a0/2
for n in range(1, n_max+1):
f += an[n-1] * np.cos(n*x) + bn[n-1] * np.sin(n*x)
return f
# 绘制原始方波和傅里叶级数分解的结果
x = np.linspace(0, 2*np.pi, 1000)
f = square_wave(x)
a0, an, bn = fourier_coefficients(n_max=10)
f_fourier = fourier_series(x, a0, an, bn, n_max=10)
plt.plot(x, f, label='Square Wave')
plt.plot(x, f_fourier, label='Fourier Series')
plt.legend()
plt.show()
```
上述代码中,`square_wave`函数定义了方波函数,`fourier_coefficients`函数计算傅里叶级数系数,`fourier_series`函数计算傅里叶级数的和,最终绘制出原始方波和傅里叶级数分解的结果。