首页 > 解决方案 > 查找峰值和相应的时间戳

问题描述

我正在尝试使用 scipy 来识别我的信号的峰值并尝试获取这些峰值的相应时间戳。使用scipy.signal.find_peakshttps://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”标记,到目前为止这很好。但是,当我尝试获取每个峰值的值时,如果我执行peaksor properties,则peaks返回一个我不知道它是如何派生的索引,并且 properties 只是一个空字典。

我想知道是否可以在实际获取每个峰值的信号值方面获得一些帮助。我知道这只是我上面显示的代码片段,但我想知道是否可以在使用find_peaks更好的方面获得帮助。

理想情况下,我正在考虑喜欢peaks[0]properties['height']返回信号值。

然后,我想知道如何将这些峰值点映射到原始timesndarray 以获得相应的时间戳。

任何指针将不胜感激!

标签: pythonscipysignal-processing

解决方案


理想情况下,在使用 find_peaks 之前,您将信号分解为时间 (time_np) 和信号 (amp_np) 数组。这很容易通过 wavfile.read(wav_file_path) 返回 fs_rate 和信号来完成。

Scipy.signal 的 find_peaks 应该返回 find_peaks 找到的峰值的幅度。

对于返回的 peaks 数组中的每个放大器,您可以在 np_array 中找到索引,其中该索引处的值就是这个最大放大器。该索引应该为您提供查找峰值时间戳的索引。

请注意,您可能需要对返回的峰设置阈值以仅返回最高的峰。如果这切断了太多的峰,您可以遍历并忽略与前一个峰接近 x 距离的峰(不要将一个山标记为多个峰)。


推荐阅读