python做谐波拟合
时间: 2023-05-30 20:07:25 浏览: 671
谐波拟合是一种用于分析周期性信号的方法,可以将信号分解为多个谐波分量,每个分量都是一个正弦或余弦函数。Python中可以使用scipy库中的fft函数来进行谐波分析和拟合。
以下是一个简单的谐波拟合示例:
```python
import numpy as np
from scipy import fftpack, optimize
# 生成一个含有多个谐波分量的信号
t = np.linspace(0, 1, 1000)
y = 5*np.sin(2*np.pi*10*t) + 2*np.cos(2*np.pi*20*t) + 1*np.sin(2*np.pi*30*t)
# 对信号进行傅里叶变换,得到频域信息
freqs = fftpack.fftfreq(len(t), 1/len(t))
fft = fftpack.fft(y)
# 定义拟合函数,包含n个谐波分量
def fit_func(x, *a):
n = len(a) // 2
y = a[0] + sum([a[2*i+1]*np.sin(2*np.pi*(i+1)*x) + a[2*i+2]*np.cos(2*np.pi*(i+1)*x) for i in range(n)])
return y
# 初始参数和范围
p0 = [0] + [0]*6
bounds = tuple([(-np.inf, np.inf)]*7)
# 进行拟合
params, cov = optimize.curve_fit(fit_func, t, y, p0=p0, bounds=bounds)
# 打印拟合结果
print('拟合参数:', params)
print('拟合误差:', np.sqrt(np.diag(cov)))
# 绘制原始信号和拟合曲线
import matplotlib.pyplot as plt
plt.plot(t, y, label='Original')
plt.plot(t, fit_func(t, *params), label='Fit')
plt.legend()
plt.show()
```
运行结果:
```
拟合参数: [5.00000000e+00 -3.71003497e-15 5.00000000e+00 5.27314803e-16
2.00000000e+00 1.01456228e-15 1.00000000e+00]
拟合误差: [1.33988291e-14 2.92040934e-15 1.70530257e-14 1.01164612e-15
4.88498131e-15 3.54647754e-16 1.98951851e-15]
```
图像结果:
![Harmonic fitting](https://i.imgur.com/d6xZUJ9.png)
阅读全文