You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传感器实时信号阈值触发后掩蔽时间实现逻辑正确性咨询

关于传感器信号掩蔽时间逻辑的实现建议

嘿,我来帮你梳理一下这个掩蔽时间的实现问题~你的核心需求是信号跨越阈值后,在一段掩蔽时间内停止阈值检测,避免误判脉冲沿,但当前的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:02:56