python - 查找峰值和相应的时间戳
问题描述
我正在尝试使用 scipy 来识别我的信号的峰值并尝试获取这些峰值的相应时间戳。使用scipy.signal.find_peaks
(https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.find_peaks.html)
我有一个带有data
(Numpy ndarray)的大型数据文件,其中包含采样率为 200 的所有信号值,以及times
每个信号的所有相应样本数。
要获得数据片段,
# len(data[0]) is 1028721
data[0] = array([0.00333048, 0.00333095, 0.00333494, ..., 0.0062428 , 0.00624095,
0.00624318])
# len(times) is 1028721
times = array([0.000000e+00, 5.000000e-03, 1.000000e-02, ..., 5.143590e+03,
5.143595e+03, 5.143600e+03])
到目前为止,我必须使用以下方法获得峰值(主要来自 scipy 示例):
import matplotlib.pyplot as plt
from scipy.signal import find_peaks, peak_prominences
peaks, properties = find_peaks(data[0], height=None, distance = 200)
plt.plot(data[0])
plt.plot(peaks, data[0][peaks], "x")
如果我绘制上面的图,我会在峰值点上得到一堆“x”标记,到目前为止这很好。但是,当我尝试获取每个峰值的值时,如果我执行peaks
or properties
,则peaks
返回一个我不知道它是如何派生的索引,并且 properties 只是一个空字典。
我想知道是否可以在实际获取每个峰值的信号值方面获得一些帮助。我知道这只是我上面显示的代码片段,但我想知道是否可以在使用find_peaks
更好的方面获得帮助。
理想情况下,我正在考虑喜欢peaks[0]
或properties['height']
返回信号值。
然后,我想知道如何将这些峰值点映射到原始times
ndarray 以获得相应的时间戳。
任何指针将不胜感激!
解决方案
理想情况下,在使用 find_peaks 之前,您将信号分解为时间 (time_np) 和信号 (amp_np) 数组。这很容易通过 wavfile.read(wav_file_path) 返回 fs_rate 和信号来完成。
Scipy.signal 的 find_peaks 应该返回 find_peaks 找到的峰值的幅度。
对于返回的 peaks 数组中的每个放大器,您可以在 np_array 中找到索引,其中该索引处的值就是这个最大放大器。该索引应该为您提供查找峰值时间戳的索引。
请注意,您可能需要对返回的峰设置阈值以仅返回最高的峰。如果这切断了太多的峰,您可以遍历并忽略与前一个峰接近 x 距离的峰(不要将一个山标记为多个峰)。
推荐阅读
- kotlin - Kotlin 中的生命周期 kotlinx.coroutines.coroutineScope 是什么?
- reactjs - 除非我强制调整其大小,否则 React-grid-layout 无法使用新元素正确更新
- c# - System.Text.Json 默认将 double 类型的值 1.0 序列化为 int 类型的值 1
- javascript - 如何防止挂起的网络请求阻止进一步的网络请求?
- java - 是否支持具有相同接收器和源主题的 Kafka Stream 连接?
- c# - 用于复合实体映射的 AutoMapper Profile
- codeigniter - 如何在视图中回显 $lang->line ('') 而不是 $this->lang->line ('')
- json - 可以使用 flutter_hydrad 进行启动屏幕和身份验证吗?扑
- javascript - Javascript Promise 和控制台日志?
- python - 如何在 VS 代码输出选项卡中使用 \r 转义序列?