проверка на двойной порог - PullRequest
0 голосов
/ 13 июля 2020

У меня основной c вопрос по реализации алгоритма определения порога для сигнала в реальном времени.

Например. Если у меня есть сигнал, показанный ниже, мне нужно проверить, пересекает ли сигнал два порога за фиксированный период времени, скажем, за 3 секунды.

введите описание изображения здесь

Мой вопрос: какие операторы 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 Ответ

2 голосов
/ 13 июля 2020

Сначала мы создаем помощник, который обнаруживает пересечения вверх:

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 к следующий метод:

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 с интервалом в 3 секунды, чей сигнал timeout подключается к crossingTimerExpire.

Используя с таким таймером, вы можете гарантировать, что дисплей "выключится", если вы внезапно перестанете получать сигналы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...