我正在尝试使用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])
到目前为止,我必须使用:
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
或properties
,则peaks
返回一个不知道其派生方式的索引,并且属性只是空字典。
我想知道在实际获得每个峰值的信号值方面是否可以获得帮助。我知道这只是上面显示的代码的一部分,但是我想知道我是否可以在更好地利用find_peaks
方面获得帮助。
理想情况下,我正在考虑像peaks[0]
或properties['height']
一样向我返回信号值。
然后,我想知道如何将这些峰值映射到原始times
ndarray以获得相应的时间戳。
任何指针将不胜感激!
答案 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距离近的峰(不要将一个山标为多个峰)。