我有一个基本问题,需要实施一种算法来检测实时信号的阈值。
例如如果收到如下所示的信号,则需要检查信号是否在固定的时间段(例如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);
}
答案 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
。
使用类似这样的计时器,可以确保在突然不再接收信号的情况下显示屏关闭。