检查双重阈值

时间:2020-07-13 08:55:50

标签: c++ qt

我有一个基本问题,需要实施一种算法来检测实时信号的阈值。

例如如果收到如下所示的信号,则需要检查信号是否在固定的时间段(例如3秒)内超过两个阈值。

enter image description here

我的问题是,在固定时间内检查两个阈值的IF语句将是什么?

我所拥有的:

我可以检查一个阈值,如下所示:

if(signal > onThreshold)
   {    
       ui->rdo_btn_vertical->setStyleSheet(StyleSheetOn1); // change appearance of a radio button 
       QSound::play(":/res/beep1.wav"); // make a beep sound as well    
   }
   else
   {
       ui->rdo_btn_vertical->setStyleSheet(StyleSheetOff1);
   }

1 个答案:

答案 0 :(得分:2)

首先,我们创建一个辅助程序,以检测向上的交叉口:

<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>

现在创建一个class DetectUpwardsCrossing : public QObject { public: DetectUpwardsCrossing(double threshold, QObject *parent = nullptr) : QObject(parent), threshold(threshold), current(qSNaN()) {} signals: void crossing(); public slots: void onSignal(double value) { if (qIsNaN(current)) { current = value; return; } if (current == value) { return; } bool before = current <= threshold; current = value; bool after = current >= threshold; if (before && after) { emit crossing(); } } private: double threshold, current; }; 的实例,将您的传入信号值连接到DetectUpwardsCrossing并将其onSignal信号连接到以下方法:

crossing

最后一块是间隔3秒的void onCrossing() { QSound::play(":/res/beep1.wav"); // make a beep sound if (crossingTimer->isActive()) { // The timer is still running, so we are within the 3s period ui->rdo_btn_vertical->setStyleSheet(StyleSheetOn1); // change appearance of a radio button } crossingTimer->restart(); } void crossingTimerExpire() { ui->rdo_btn_vertical->setStyleSheet(StyleSheetOff1); crossingTimer->stop(); } ,其QTimer *crossingTimer信号被连接到timeout

使用类似这样的计时器,可以确保在突然不再接收信号的情况下显示屏关闭。