查找峰值和相应的时间戳

finding peak values and corresponding timestamps

我正在尝试使用 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' 标记,到目前为止这很好。 但是,当我尝试获取每个峰值的值时,如果我执行 peakspropertiespeaks returns 一个我不知道它是如何得出的索引,和属性只是一个空字典。

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

理想情况下,我想 peaks[0]properties['height'] 返回信号值。

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

任何指点将不胜感激!!

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

Scipy.signal 的 find_peaks 应该 return find_peaks 找到的峰值的振幅。

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

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

我会做的一个例子如下

时间 = np.array(rawdat.time_s[100000:5000000]) current = np.array(rawdat.current_nA[100000:5000000])*-1 ## 需要因为 find_peaks 只找到峰值并且数据正在查看最小值所以数据被*-1[反转=10=]

我会用 峰,属性 = find_peaks(当前,突出=(0.2),宽度=5,rel_height=0.5)。 ##This 仅选择振幅为 0.2 或更大的峰值。

然后使用

results_half = peak_widths(x, peaks, rel_height=0.5) 获得峰的峰宽,例如半峰全宽 (半高宽)。这用于确定不同高度处峰的峰不对称性 (AS)。这是通过 AS = (PF-P50)/(P50-PS) 完成的,其中 PF 是峰值完成时间(在感兴趣的百分比峰值,例如 FWHM =50%),PS 是对应的峰值开始时间,P50为峰值时间。