如何使用SciPy查找最大峰值的对应索引及ums单位位置?
scipy.signal实现信号最大峰值定位(返回微秒单位位置)
核心实现步骤:
- 调用
scipy.signal.find_peaks完成峰值初检,可通过阈值、峰值间距等参数过滤噪声带来的伪峰 - 从所有检出峰值中筛选幅值最大的目标峰值
- 结合采样率/已有时间轴,将峰值对应的采样点索引换算为微秒(ums)单位的位置值
直接可用的实现代码:
import numpy as np from scipy.signal import find_peaks def get_max_peak_pos_ums(signal, fs, height_thresh=None, min_peak_sample_gap=None): """ 获取信号最大峰值的微秒级位置 参数: signal: 一维原始信号数组 fs: 信号采样率,单位Hz,用于时间换算 height_thresh: 可选,峰值最小幅值阈值,过滤低幅噪声峰 min_peak_sample_gap: 可选,相邻峰值的最小采样点间隔,过滤旁瓣伪峰 返回:(最大峰值微秒位置, 最大峰值对应采样点索引),无有效峰值时返回None """ detect_params = {} if height_thresh is not None: detect_params["height"] = height_thresh if min_peak_sample_gap is not None: detect_params["distance"] = min_peak_sample_gap peak_idx_list, _ = find_peaks(signal, **detect_params) if len(peak_idx_list) == 0: return None # 取幅值最大的峰值 peak_values = signal[peak_idx_list] max_peak_idx = peak_idx_list[np.argmax(peak_values)] # 索引转微秒:单采样点时长为1/fs 秒,乘1e6转微秒 max_peak_pos_ums = (max_peak_idx / fs) * 10**6 return max_peak_pos_ums, max_peak_idx
使用说明:
- 如果你已经提前生成了单位为微秒的时间轴数组
time_arr_ums,不需要走采样率换算,直接取time_arr_ums[max_peak_idx]就是对应位置,结果更准确 - 检测参数结合实际波形调整即可:底噪高就把
height_thresh设为噪声峰值的1.2倍以上,有明显旁瓣就把min_peak_sample_gap设为主瓣宽度对应的采样点数,避免误检 - 如果采集存在固定触发延迟,在最终返回的位置值上叠加对应的延迟微秒数即可完成校准
内容的提问来源于stack exchange,提问作者wosker4yan
相关产品推荐
相关产品推荐

