传感器实时信号阈值触发后掩蔽时间实现逻辑正确性咨询
关于传感器信号掩蔽时间逻辑的实现建议
嘿,我来帮你梳理一下这个掩蔽时间的实现问题~你的核心需求是信号跨越阈值后,在一段掩蔽时间内停止阈值检测,避免误判脉冲沿,但当前的IF语句逻辑其实并不是真正的掩蔽时间实现,我来给你拆解问题并给出改进思路:
先说说当前代码的问题
你现在的判断条件a_vertical> onThreshold && key-lastKey >0.2,本质是限制两次触发的最小间隔为0.2秒,这属于“防抖”逻辑,而不是“掩蔽时间”。防抖是为了避免短时间内重复触发同一个事件,但你的需求是:触发阈值后,接下来的0.2秒内完全不进行阈值检测——哪怕信号在这段时间内跨越阈值(比如正脉冲的下降沿),也不会触发任何判断,这才是掩蔽时间的核心。
正确的掩蔽时间实现思路
我们需要引入状态变量来标记当前是否处于掩蔽期,再配合时间记录来控制掩蔽时长,具体步骤如下:
- 定义布尔变量标记是否处于掩蔽期(
isInMasking) - 定义变量记录进入掩蔽期的起始时间(
maskingStartKey) - 每次循环先检查掩蔽状态:若处于掩蔽期,判断是否已过时长,超时则恢复检测;未超时则直接跳过阈值判断
- 若不在掩蔽期,再执行阈值检测,触发后立即进入掩蔽期并记录时间
修正后的代码示例(正脉冲检测)
static QTime time(QTime::currentTime()); double key = time.elapsed()/1000.0; // 单位:秒 static bool isInMasking = false; static double maskingStartKey = 0.0; const double maskingDuration = 0.2; // 掩蔽时长0.2秒 // 先处理掩蔽期逻辑 if (isInMasking) { if (key - maskingStartKey > maskingDuration) { // 掩蔽时间结束,恢复检测 isInMasking = false; } else { // 处于掩蔽期,跳过阈值检测 ui->rdo_btn_vertical->setStyleSheet(StyleSheetOff1); return; // 直接跳过后续逻辑,避免误判 } } // 不在掩蔽期,进行阈值检测 if (a_vertical > onThreshold) { ui->rdo_btn_vertical->show(); ui->rdo_btn_vertical->setStyleSheet(StyleSheetOn1); // 触发后进入掩蔽期,记录起始时间 isInMasking = true; maskingStartKey = key; } else { ui->rdo_btn_vertical->setStyleSheet(StyleSheetOff1); }
负脉冲检测的适配逻辑
负脉冲的实现逻辑和正脉冲完全一致,只需要调整阈值判断条件:
- 把
a_vertical > onThreshold改成a_vertical < offThreshold(假设offThreshold是负脉冲的触发阈值) - 对应的UI样式和动作可以根据需求同步调整
额外小建议
- 如果信号采样频率很高,可以考虑用Qt定时器来控制掩蔽期,替代每次循环的时间判断,代码逻辑会更简洁
- 建议把掩蔽时长
maskingDuration定义为可配置的常量,方便后续根据实际场景调整参数
内容的提问来源于stack exchange,提问作者user12800116
相关产品推荐
相关产品推荐

