峰值检测的陷阱:为什么你的find_peaks结果总是不准确?
信号处理中,峰值检测是一个看似简单却暗藏玄机的任务。许多初学者在使用scipy.signal.find_peaks时,往往会遇到结果不符合预期的情况——要么漏掉了真正的峰值,要么检测出大量虚假峰值。这背后往往隐藏着对参数理解的偏差、对信号特性的忽视,以及缺乏系统性的预处理思维。
1. 参数陷阱:threshold与distance的隐藏逻辑
find_peaks的核心在于参数设置,而threshold和distance是最常用却也最容易被误解的两个参数。
threshold参数并非简单的绝对值阈值,而是指峰值与其相邻样本的垂直距离。这意味着:
# 错误示范:误将height参数当作threshold使用
peaks, _ = find_peaks(x, threshold=0.5) # 这实际上比较的是峰值与相邻点的差值
# 正确做法:明确区分height和threshold
peaks, props = find_peaks(x, height=0.5, threshold=0.1) # 同时控制绝对高度和相对高度
distance参数的行为则更为微妙。它并非简单的"最小间隔",而是采用了一种迭代式过滤算法:
- 首先检测所有候选峰值
- 从最低的峰值开始移除
- 确保剩余峰值间距离≥设定值
- 重复直到所有峰值满足条件
这种机制导致了一个常见误区:开发者期望保留"重要峰值",结果却保留了不符合业务逻辑的峰值。例如在ECG分析中:
# 可能产生意外结果的用法
peaks = find_peaks(ecg, distance=100)[0] # 可能保留不重要的波


4920

被折叠的 条评论
为什么被折叠?



