如何去除时变信号中的异常尖峰?
针对单调递减信号的尖峰去除方案
结合你提到的信号特性(初始上升后单调递减、尖峰有正负沿但无固定规律),以下是几个轻量且精准的解决方案,无需依赖机器学习或易失真的滤波工具:
方案1:基于单调特性的分段插值修正
- 步骤1:定位初始上升的峰值点
遍历信号,找到第一个满足「后续连续3-5个点均呈递减趋势」的位置,该点即为真实信号的峰值点(初始上升段的终点),这段原始上升信号直接保留,无需处理。 - 步骤2:递减段的尖峰检测与修正
从峰值点开始向后遍历:- 记录当前的「有效基准点」(初始为峰值点);
- 若当前点 > 有效基准点,判定为尖峰正沿,继续往后遍历,直到找到第一个点 < 有效基准点的位置,这段区间即为完整的尖峰;
- 用有效基准点和尖峰结束后的第一个点做线性插值,替换整个尖峰区间的数值,同时更新有效基准点为尖峰结束后的点,保证后续信号始终单调递减。
- 优势:完全贴合信号固有特性,不会破坏真实信号的边缘趋势,无需依赖尖峰间距或频率特征。
方案2:一阶差分结合阈值的尖峰识别
- 步骤1:计算一阶差分
生成差分序列:diff = signal[1:] - signal[:-1] - 步骤2:基于差分特征标记尖峰
真实递减段的差分应为小幅负值,而尖峰的特征是:先出现一个大幅正差分(正沿),紧接着出现一个绝对值远大于正常水平的负差分(负沿)。- 统计正常递减段的差分绝对值的均值,将其3-5倍设为阈值(
pos_thresh对应正差分上限,neg_thresh对应负差分下限); - 遍历差分序列,当检测到「正差分 > pos_thresh」后紧跟「负差分 < neg_thresh」时,标记这两个差分对应的原始信号区间为尖峰。
- 统计正常递减段的差分绝对值的均值,将其3-5倍设为阈值(
- 步骤3:修正尖峰
用尖峰起始前的有效点和尖峰结束后的点做线性插值填充,保证整体单调递减。
方案3:滑动窗口单调性校验
- 设定一个小型滑动窗口(窗口大小3-5,根据采样率调整),从峰值点开始滑动:
- 检查窗口内的点是否符合单调递减趋势;
- 若窗口内出现非递减点(即存在尖峰片段),保留窗口内的最小值,或直接用窗口起始的有效基准点替换异常点;
- 滑动窗口时,始终以上一个窗口的有效终点作为下一个窗口的基准,确保全局趋势的单调性。
关键注意事项
- 峰值点的定位是核心,可通过统计后续点的递减连续性避免误判(比如连续5个点递减则确定为峰值);
- 阈值设定尽量基于正常信号段的统计值,避免手动调参的盲目性;
- 所有方案均无需复杂模型,计算效率高,且能最大程度保留真实信号的边缘特征。
内容的提问来源于stack exchange,提问作者user2551700
相关产品推荐
相关产品推荐

