# 泵异响模型瞬时故障逻辑优化 > 日期:2026-03-13 --- ## 一、现状 当前检测链路:8秒音频 → AutoEncoder重建误差 → 60秒聚合取均值 → 投票窗口(5中3) → 告警聚合 → 推送。 异常检测**只有重建误差一个指标**。AnomalyClassifier 虽然能提取 RMS、能量波动、频谱质心、周期性等10维特征,但只在异常确认后用于分类(判断是轴承/气蚀/松动等),从未参与检测触发。 快速通道代码已有(`run_pickup_monitor.py:913-965`)但被注释,且存在严格连续、无推送路径等问题。 --- ## 二、问题 1. **单次高幅度异响漏检**:单文件极端误差被周期内6-7个正常文件均值拉平,投票窗口无法触发 2. **间断性异响漏检**:非连续异常在投票窗口中永远凑不够3次 3. **特征能力浪费**:已有的 RMS/能量/频谱/周期性特征只做事后分类,不做检测 4. **快速通道不可用**:代码注释 + 严格连续 + pending无消费 5. **停机前证据丢失**:过渡期抑制丢弃异常记录,无停机前音频归档,无法事后分析 6. **无PLC场景无关联能力**:EnergyBaseline 能检测启停但没有回调,无法触发归档和关联 --- ## 三、方案 ### 3.1 瞬时异常检测 + 特征增强 - 将 AnomalyClassifier 的特征提取前移到每文件处理阶段,维护每设备特征滑动基线(最近30个文件) - 特征突变检测:RMS突变、能量波动突变、频谱质心跳变、周期性冲击出现,任一满足即标记特征异常 - 双重确认:重建误差 > 5倍阈值 + 特征异常 → 瞬时告警;误差2-5倍 + 特征异常 → 加速快速通道 - 启用快速通道:注释代码改为滑动窗口(最近5文件中3个超2倍阈值),补全推送路径 - AlertAggregator 增加告警类型路由:瞬时告警直接推送、快速预警30秒短窗口、投票告警走现有5分钟窗口 ### 3.2 异响-停机关联分析 - 所有通道检测到异常时记入环形缓冲(含过渡期被抑制的,保留证据不丢弃) - PumpStateMonitor 和 EnergyBaseline 增加状态变化回调,统一进入停机处理 - 停机时回溯120秒异常记录,有异常标记"故障停机",归档停机前音频 + 写入元数据 --- ## 四、排期 统一下周(3/16 - 3/20)完成开发和测试。 | 日期 | 任务 | 产出 | |------|------|------| | 周一 3/16 | 特征提取前移 + 特征滑动基线 + 突变检测逻辑 | `_process_new_file()` 新增特征检测 | | 周二 3/17 | 快速通道改造(滑动窗口 + 推送路径) + 瞬时告警通道 | 快速通道可用,瞬时告警可用 | | 周三 3/18 | AlertAggregator 告警类型路由 + 双重确认矩阵 | 三通道告警路径打通 | | 周四 3/19 | 异常事件缓冲 + 停机回调 + 关联分析 + 音频归档 | 停机关联完整可用 | | 周五 3/20 | 集成测试 + 参数调优 + 上线观察 | 全流程验证通过 | --- ## 五、测试方案 ### 5.1 单元测试(开发过程中同步进行) | 测试项 | 方法 | 预期 | |--------|------|------| | 特征突变检测 | 构造正常特征序列,插入一个RMS突增3倍的样本 | `_check_feature_anomaly()` 返回 True | | 滑动窗口快速通道 | 喂入5个误差值,其中3个超2倍阈值(不连续) | 触发快速预警 | | 瞬时告警双重确认 | 构造误差5倍 + 特征异常 / 仅误差5倍 / 仅特征异常 | 仅双重满足时触发 | | 异常事件记录 | 过渡期内触发异常 | 事件记录到缓冲且 suppressed=True | | 停机关联 | 记录异常事件后触发停机回调 | 返回"故障停机" + 证据链 | | 正常停机 | 无异常事件时触发停机回调 | 返回"正常停机" | ### 5.2 模拟音频测试(周五) 准备三类测试音频: 1. **单次冲击音频**:在正常背景音中插入一段高能量脉冲(模拟瞬时故障) 2. **间断异常音频**:每隔2-3个正常文件放一个异常文件(模拟间歇性问题) 3. **正常音频序列**:确保新逻辑不会对正常音频产生误报 测试步骤: - 将测试音频放入监控目录,观察日志输出 - 验证瞬时告警是否在8秒内触发(单文件级别) - 验证快速通道是否在24秒内触发(3文件级别) - 验证正常音频不触发新通道 - 手动模拟停机(停止放入音频 / 放入低能量音频),验证关联分析和音频归档 ### 5.3 线上灰度验证(周五-下周) - 新通道先设为 **仅记录不推送**(`enabled: true` + 日志输出但不走推送) - 观察1-2天日志,统计触发次数和场景 - 确认误报率可接受后再开启推送