查找峰值和相应的时间戳

时间:2019-03-08 00:08:45

标签: python scipy signal-processing

我正在尝试使用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])

到目前为止,我必须使用:

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”标记,到目前为止效果很好。 但是,当我尝试获取每个峰的值时,如果执行peaksproperties,则peaks返回一个不知道其派生方式的索引,并且属性只是空字典。

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

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

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

任何指针将不胜感激!

1 个答案:

答案 0 :(得分:1)

理想地,在使用find_peaks之前,您将信号分为时间(time_np)和信号(amp_np)阵列。使用wavfile.read(wav_file_path)可以轻松完成此操作,并返回fs_rate和signal。

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

对于返回的峰值阵列中的每个放大器,您都可以在np_array中找到索引,其中该索引处的值为该最大放大器。该索引应为您提供找到峰值时间戳的索引。

请注意,您可能需要对返回的峰设定阈值,以仅返回最高的峰。如果这样截断了太多的峰,您可以迭代并忽略距离上一个峰x距离近的峰(不要将一个山标为多个峰)。