python傅里叶变换,将一段自定义曲线分解为多个波形,进行周期分析
时间: 2024-02-22 16:56:26 浏览: 15
好的,这里提供一个自定义曲线数据的示例代码,供您参考:
```python
import numpy as np
import matplotlib.pyplot as plt
# 自定义曲线函数
def f(x):
return np.sin(x) + np.sin(2*x) + np.sin(3*x)
# 生成自定义曲线数据
x = np.linspace(0, 10, 500)
y = f(x)
# 对数据进行傅里叶变换
fft_vals = np.fft.fft(y)
# 分解实部和虚部
real = np.real(fft_vals)
imag = np.imag(fft_vals)
# 计算幅值和相位
amplitudes = np.abs(fft_vals)
phases = np.angle(fft_vals)
# 过滤掉一些噪声
amplitudes[amplitudes < 100] = 0
# 对处理后的频域数组进行反变换
ifft_vals = np.fft.ifft(amplitudes * np.exp(1j * phases))
# 绘制多个波形
plt.plot(x, y, label='Original')
plt.plot(x, np.real(ifft_vals), label='Wave 1')
plt.plot(x, np.imag(ifft_vals), label='Wave 2')
plt.plot(x, np.abs(ifft_vals), label='Wave 3')
plt.legend()
plt.show()
# 计算最大幅值的频率和周期
max_idx = np.argmax(amplitudes)
max_freq = max_idx / x[-1]
max_period = 1 / max_freq
print('Max frequency:', max_freq)
print('Max period:', max_period)
```
在这个示例代码中,我们定义了一个自定义曲线函数f(x),将三个正弦波叠加在一起。然后,我们使用numpy的linspace函数生成了一个从0到10的等差数列,共计500个数据点,并将这个数列作为自变量,计算出对应的因变量。接着,对这个数据进行傅里叶变换,并分解出实部、虚部、幅值和相位等信息。我们过滤掉幅值较小的部分,只保留幅值较大的波形信息,并进行反变换,得到多个波形的实际值。最后,我们将这些波形绘制在同一张图上,以比较它们的形态。
此外,我们还可以计算出幅值最大的频率和周期,用于进行周期分析。在这个示例代码中,我们使用numpy的argmax函数计算出幅值最大的波形的下标,然后根据采样点数和自变量范围计算出对应的频率和周期。最后,我们输出这些结果,以供参考。