如何得到一段曲线中所有波峰的部分。如下图所示
我想得到红圈圈出的部分,基本上都是局部波峰的位置左右,我寻思通过平滑曲线变成红色线条那样,然后求取导数找穿越位置就能找到局部波峰的位置,但是由于数据波动比较大,平滑后的红色曲线也不好找
请问各位有什么方法去寻找吗?如有方法分享,不胜感激
如何得到一段曲线中所有波峰的部分。如下图所示
我想得到红圈圈出的部分,基本上都是局部波峰的位置左右,我寻思通过平滑曲线变成红色线条那样,然后求取导数找穿越位置就能找到局部波峰的位置,但是由于数据波动比较大,平滑后的红色曲线也不好找
【以下回答由 GPT 生成】
我可以给你一个基于峰值检测的方法来找到曲线中的所有波峰。以下是一个使用Python实现的步骤:
import numpy as np
import scipy.signal as signal
import matplotlib.pyplot as plt
准备数据: 你需要将你的曲线数据存储在一个Numpy数组中。
平滑曲线:
使用信号处理库(scipy.signal
)中的savgol_filter
函数对曲线进行平滑处理。这个函数使用了Savitzky-Golay滤波器,可以有效地去除噪音。你可以尝试不同的参数值来获得最佳效果。
smoothed_curve = signal.savgol_filter(curve_data, window_length, polynomial_order)
argrelextrema
函数找到平滑后曲线中的所有极大值(峰值)。argrelextrema
函数返回峰值的索引值。peak_indices = signal.argrelextrema(smoothed_curve, np.greater)[0]
plt.plot(curve_data)
plt.plot(peak_indices, curve_data[peak_indices], 'ro')
plt.show()
这是一个简单的实现,可以帮助你找到曲线中的波峰。这个方法的效果取决于曲线的特性和平滑参数的选择。你可以根据具体情况进行调整。
请注意,如果你的曲线具有多个波峰并且它们之间存在一些导数小于零的“波谷”,你可能需要考虑将argrelextrema
函数的order
参数设置为更高的值,以避免将波峰和波谷混淆。
希望这个方法对你有所帮助!如果你有任何其他问题,请随时提问。
【相关推荐】