From f63b0fe96c4a9ae7506f2565613b06ea71011568 Mon Sep 17 00:00:00 2001 From: f4exb Date: Sun, 5 May 2019 09:43:15 +0200 Subject: [PATCH] Frequency tracker: added alpha factor of EMA control --- plugins/channelrx/freqtracker/freqtracker.cpp | 76 ++++++++++++------- .../channelrx/freqtracker/freqtrackergui.cpp | 15 +++- .../channelrx/freqtracker/freqtrackergui.h | 1 + .../channelrx/freqtracker/freqtrackergui.ui | 47 ++++++++++++ .../freqtracker/freqtrackersettings.cpp | 5 ++ .../freqtracker/freqtrackersettings.h | 1 + sdrbase/resources/webapi/doc/html2/index.html | 6 +- .../doc/swagger/include/FreqTracker.yaml | 3 + .../api/swagger/include/FreqTracker.yaml | 4 + swagger/sdrangel/code/html2/index.html | 6 +- .../qt5/client/SWGFreqTrackerSettings.cpp | 21 +++++ .../code/qt5/client/SWGFreqTrackerSettings.h | 6 ++ 12 files changed, 159 insertions(+), 32 deletions(-) diff --git a/plugins/channelrx/freqtracker/freqtracker.cpp b/plugins/channelrx/freqtracker/freqtracker.cpp index a92893056..d8c2cebfe 100644 --- a/plugins/channelrx/freqtracker/freqtracker.cpp +++ b/plugins/channelrx/freqtracker/freqtracker.cpp @@ -253,9 +253,11 @@ bool FreqTracker::handleMessage(const Message& cmd) { DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd; - qDebug() << "FreqTracker::handleMessage: MsgChannelizerNotification:" - << " inputSampleRate: " << notif.getSampleRate() - << " inputFrequencyOffset: " << notif.getFrequencyOffset(); + if (!m_settings.m_tracking) { + qDebug() << "FreqTracker::handleMessage: MsgChannelizerNotification:" + << " inputSampleRate: " << notif.getSampleRate() + << " inputFrequencyOffset: " << notif.getFrequencyOffset(); + } applyChannelSettings(notif.getSampleRate(), notif.getFrequencyOffset()); setInterpolator(); @@ -278,9 +280,11 @@ bool FreqTracker::handleMessage(const Message& cmd) void FreqTracker::applyChannelSettings(int inputSampleRate, int inputFrequencyOffset, bool force) { - qDebug() << "FreqTracker::applyChannelSettings:" - << " inputSampleRate: " << inputSampleRate - << " inputFrequencyOffset: " << inputFrequencyOffset; + if (!m_settings.m_tracking) { + qDebug() << "FreqTracker::applyChannelSettings:" + << " inputSampleRate: " << inputSampleRate + << " inputFrequencyOffset: " << inputFrequencyOffset; + } if ((m_inputFrequencyOffset != inputFrequencyOffset) || (m_inputSampleRate != inputSampleRate) || force) @@ -298,24 +302,28 @@ void FreqTracker::applyChannelSettings(int inputSampleRate, int inputFrequencyOf void FreqTracker::applySettings(const FreqTrackerSettings& settings, bool force) { - qDebug() << "FreqTracker::applySettings:" - << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset - << " m_rfBandwidth: " << settings.m_rfBandwidth - << " m_log2Decim: " << settings.m_log2Decim - << " m_squelch: " << settings.m_squelch - << " m_rgbColor: " << settings.m_rgbColor - << " m_title: " << settings.m_title - << " m_tracking: " << settings.m_tracking - << " m_trackerType: " << settings.m_trackerType - << " m_pllPskOrder: " << settings.m_pllPskOrder - << " m_rrc: " << settings.m_rrc - << " m_rrcRolloff: " << settings.m_rrcRolloff - << " m_useReverseAPI: " << settings.m_useReverseAPI - << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress - << " m_reverseAPIPort: " << settings.m_reverseAPIPort - << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex - << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex - << " force: " << force; + if (!settings.m_tracking) + { + qDebug() << "FreqTracker::applySettings:" + << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset + << " m_rfBandwidth: " << settings.m_rfBandwidth + << " m_log2Decim: " << settings.m_log2Decim + << " m_squelch: " << settings.m_squelch + << " m_rgbColor: " << settings.m_rgbColor + << " m_title: " << settings.m_title + << " m_alphaEMA: " << settings.m_alphaEMA + << " m_tracking: " << settings.m_tracking + << " m_trackerType: " << settings.m_trackerType + << " m_pllPskOrder: " << settings.m_pllPskOrder + << " m_rrc: " << settings.m_rrc + << " m_rrcRolloff: " << settings.m_rrcRolloff + << " m_useReverseAPI: " << settings.m_useReverseAPI + << " m_reverseAPIAddress: " << settings.m_reverseAPIAddress + << " m_reverseAPIPort: " << settings.m_reverseAPIPort + << " m_reverseAPIDeviceIndex: " << settings.m_reverseAPIDeviceIndex + << " m_reverseAPIChannelIndex: " << settings.m_reverseAPIChannelIndex + << " force: " << force; + } QList reverseAPIKeys; bool updateChannelizer = false; @@ -351,6 +359,9 @@ void FreqTracker::applySettings(const FreqTrackerSettings& settings, bool force) if ((m_settings.m_title != settings.m_title) || force) { reverseAPIKeys.append("title"); } + if ((m_settings.m_alphaEMA != settings.m_alphaEMA) || force) { + reverseAPIKeys.append("alphaEMA"); + } if ((m_settings.m_tracking != settings.m_tracking) || force) { @@ -440,9 +451,11 @@ void FreqTracker::configureChannelizer() m_fll.setSampleRate(m_channelSampleRate); } - qDebug() << "FreqTracker::configureChannelizer:" - << " sampleRate: " << m_channelSampleRate - << " inputFrequencyOffset: " << m_settings.m_inputFrequencyOffset; + if (!m_settings.m_tracking) { + qDebug() << "FreqTracker::configureChannelizer:" + << " sampleRate: " << m_channelSampleRate + << " inputFrequencyOffset: " << m_settings.m_inputFrequencyOffset; + } m_channelizer->configure(m_channelizer->getInputMessageQueue(), m_channelSampleRate, @@ -536,6 +549,10 @@ int FreqTracker::webapiSettingsPutPatch( if (channelSettingsKeys.contains("title")) { settings.m_title = *response.getFreqTrackerSettings()->getTitle(); } + if (channelSettingsKeys.contains("alphaEMA")) { + float alphaEMA = response.getFreqTrackerSettings()->getAlphaEma(); + settings.m_alphaEMA = alphaEMA < 0.01 ? 0.01 : alphaEMA > 1.0 ? 1.0 : alphaEMA; + } if (channelSettingsKeys.contains("tracking")) { settings.m_tracking = response.getFreqTrackerSettings()->getTracking() ? 1 : 0; } @@ -707,7 +724,7 @@ void FreqTracker::networkManagerFinished(QNetworkReply *reply) void FreqTracker::tick() { if (getSquelchOpen()) { - m_avgDeltaFreq = 0.1*getFrequency() + 0.9*m_avgDeltaFreq; + m_avgDeltaFreq = m_settings.m_alphaEMA*getFrequency() + (1.0 - m_settings.m_alphaEMA)*m_avgDeltaFreq; } if (m_tickCount < 19) @@ -718,7 +735,8 @@ void FreqTracker::tick() { if ((m_settings.m_tracking) && getSquelchOpen()) { - int decayAmount = m_channelSampleRate < 100 ? 1 : m_channelSampleRate / 100; + uint32_t decayDivider = 1000.0 * m_settings.m_alphaEMA; + int decayAmount = m_channelSampleRate < decayDivider ? 1 : m_channelSampleRate / decayDivider; if (m_lastCorrAbs < decayAmount) { diff --git a/plugins/channelrx/freqtracker/freqtrackergui.cpp b/plugins/channelrx/freqtracker/freqtrackergui.cpp index 4afbd4278..ab1fdb874 100644 --- a/plugins/channelrx/freqtracker/freqtrackergui.cpp +++ b/plugins/channelrx/freqtracker/freqtrackergui.cpp @@ -107,7 +107,9 @@ bool FreqTrackerGUI::handleMessage(const Message& message) } else if (FreqTracker::MsgSampleRateNotification::match(message)) { - qDebug("FreqTrackerGUI::handleMessage: FreqTracker::MsgSampleRateNotification"); + if (!m_settings.m_tracking) { + qDebug("FreqTrackerGUI::handleMessage: FreqTracker::MsgSampleRateNotification"); + } const FreqTracker::MsgSampleRateNotification& cfg = (FreqTracker::MsgSampleRateNotification&) message; m_channelSampleRate = cfg.getSampleRate(); ui->channelSampleRateText->setText(tr("%1k").arg(QString::number(m_channelSampleRate / 1000.0f, 'g', 5))); @@ -185,6 +187,14 @@ void FreqTrackerGUI::on_tracking_toggled(bool checked) applySettings(); } +void FreqTrackerGUI::on_alphaEMA_valueChanged(int value) +{ + m_settings.m_alphaEMA = value / 100.0; + QString alphaEMAStr = QString::number(m_settings.m_alphaEMA, 'f', 2); + ui->alphaEMAText->setText(alphaEMAStr); + applySettings(); +} + void FreqTrackerGUI::on_trackerType_currentIndexChanged(int index) { m_settings.m_trackerType = (FreqTrackerSettings::TrackerType) index; @@ -347,6 +357,9 @@ void FreqTrackerGUI::displaySettings() ui->squelchText->setText(QString("%1 dB").arg(m_settings.m_squelch)); ui->tracking->setChecked(m_settings.m_tracking); ui->trackerType->setCurrentIndex((int) m_settings.m_trackerType); + QString alphaEMAStr = QString::number(m_settings.m_alphaEMA, 'f', 2); + ui->alphaEMAText->setText(alphaEMAStr); + ui->alphaEMA->setValue(m_settings.m_alphaEMA*100.0); int i = 0; for(; ((m_settings.m_pllPskOrder>>i) & 1) == 0; i++); diff --git a/plugins/channelrx/freqtracker/freqtrackergui.h b/plugins/channelrx/freqtracker/freqtrackergui.h index 6b5e03049..234f5af6a 100644 --- a/plugins/channelrx/freqtracker/freqtrackergui.h +++ b/plugins/channelrx/freqtracker/freqtrackergui.h @@ -88,6 +88,7 @@ private slots: void on_log2Decim_currentIndexChanged(int index); void on_rfBW_valueChanged(int value); void on_tracking_toggled(bool checked); + void on_alphaEMA_valueChanged(int value); void on_trackerType_currentIndexChanged(int index); void on_pllPskOrder_currentIndexChanged(int index); void on_rrc_toggled(bool checked); diff --git a/plugins/channelrx/freqtracker/freqtrackergui.ui b/plugins/channelrx/freqtracker/freqtrackergui.ui index 9489120c1..41db87463 100644 --- a/plugins/channelrx/freqtracker/freqtrackergui.ui +++ b/plugins/channelrx/freqtracker/freqtrackergui.ui @@ -377,6 +377,53 @@ + + + + + 24 + 24 + + + + + 24 + 24 + + + + Alpha factor for delta frequency exponential moving average + + + 1 + + + 100 + + + 1 + + + + + + + + 32 + 0 + + + + Alpha factor for delta frequency exponential moving average + + + 0.1 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + diff --git a/plugins/channelrx/freqtracker/freqtrackersettings.cpp b/plugins/channelrx/freqtracker/freqtrackersettings.cpp index 928861a29..00c89abae 100644 --- a/plugins/channelrx/freqtracker/freqtrackersettings.cpp +++ b/plugins/channelrx/freqtracker/freqtrackersettings.cpp @@ -36,6 +36,7 @@ void FreqTrackerSettings::resetToDefaults() m_squelch = -40.0; m_rgbColor = QColor(200, 244, 66).rgb(); m_title = "Frequency Tracker"; + m_alphaEMA = 0.1; m_tracking = false; m_trackerType = TrackerFLL; m_pllPskOrder = 2; // BPSK @@ -61,6 +62,7 @@ QByteArray FreqTrackerSettings::serialize() const } s.writeU32(7, m_rgbColor); + s.writeFloat(8, m_alphaEMA); s.writeString(9, m_title); s.writeBool(10, m_tracking); s.writeS32(12, (int) m_trackerType); @@ -92,6 +94,7 @@ bool FreqTrackerSettings::deserialize(const QByteArray& data) qint32 tmp; uint32_t utmp; QString strtmp; + float ftmp; d.readS32(1, &m_inputFrequencyOffset, 0); d.readS32(2, &tmp, 4); @@ -108,6 +111,8 @@ bool FreqTrackerSettings::deserialize(const QByteArray& data) } d.readU32(7, &m_rgbColor, QColor(200, 244, 66).rgb()); + d.readFloat(8, &ftmp, 0.1); + m_alphaEMA = ftmp < 0.01 ? 0.01 : ftmp > 1.0 ? 1.0 : ftmp; d.readString(9, &m_title, "Frequency Tracker"); d.readBool(10, &m_tracking, false); d.readS32(12, &tmp, 0); diff --git a/plugins/channelrx/freqtracker/freqtrackersettings.h b/plugins/channelrx/freqtracker/freqtrackersettings.h index dbcb398c4..e4127945a 100644 --- a/plugins/channelrx/freqtracker/freqtrackersettings.h +++ b/plugins/channelrx/freqtracker/freqtrackersettings.h @@ -41,6 +41,7 @@ struct FreqTrackerSettings quint32 m_rgbColor; QString m_title; Serializable *m_channelMarker; + float m_alphaEMA; //!< alpha factor for delta frequency EMA bool m_tracking; TrackerType m_trackerType; uint32_t m_pllPskOrder; diff --git a/sdrbase/resources/webapi/doc/html2/index.html b/sdrbase/resources/webapi/doc/html2/index.html index 703d3da78..3ca7998f9 100644 --- a/sdrbase/resources/webapi/doc/html2/index.html +++ b/sdrbase/resources/webapi/doc/html2/index.html @@ -2782,6 +2782,10 @@ margin-bottom: 20px; "title" : { "type" : "string" }, + "alphaEMA" : { + "type" : "integer", + "description" : "Alpha factor for delta frequency EMA in %" + }, "tracking" : { "type" : "integer", "description" : "Tracking 1 for enabled 0 for disabled" @@ -24915,7 +24919,7 @@ except ApiException as e:
- Generated 2019-05-03T21:05:56.826+02:00 + Generated 2019-05-05T01:27:03.875+02:00
diff --git a/sdrbase/resources/webapi/doc/swagger/include/FreqTracker.yaml b/sdrbase/resources/webapi/doc/swagger/include/FreqTracker.yaml index 2808ee28a..1545a2c00 100644 --- a/sdrbase/resources/webapi/doc/swagger/include/FreqTracker.yaml +++ b/sdrbase/resources/webapi/doc/swagger/include/FreqTracker.yaml @@ -19,6 +19,9 @@ FreqTrackerSettings: type: integer title: type: string + alphaEMA: + description: Alpha factor for delta frequency EMA in % + type: integer tracking: description: Tracking 1 for enabled 0 for disabled type: integer diff --git a/swagger/sdrangel/api/swagger/include/FreqTracker.yaml b/swagger/sdrangel/api/swagger/include/FreqTracker.yaml index 2808ee28a..c67e17a6e 100644 --- a/swagger/sdrangel/api/swagger/include/FreqTracker.yaml +++ b/swagger/sdrangel/api/swagger/include/FreqTracker.yaml @@ -19,6 +19,10 @@ FreqTrackerSettings: type: integer title: type: string + alphaEMA: + description: Alpha factor for delta frequency EMA + type: number + format: float tracking: description: Tracking 1 for enabled 0 for disabled type: integer diff --git a/swagger/sdrangel/code/html2/index.html b/swagger/sdrangel/code/html2/index.html index 703d3da78..3ca7998f9 100644 --- a/swagger/sdrangel/code/html2/index.html +++ b/swagger/sdrangel/code/html2/index.html @@ -2782,6 +2782,10 @@ margin-bottom: 20px; "title" : { "type" : "string" }, + "alphaEMA" : { + "type" : "integer", + "description" : "Alpha factor for delta frequency EMA in %" + }, "tracking" : { "type" : "integer", "description" : "Tracking 1 for enabled 0 for disabled" @@ -24915,7 +24919,7 @@ except ApiException as e:
- Generated 2019-05-03T21:05:56.826+02:00 + Generated 2019-05-05T01:27:03.875+02:00
diff --git a/swagger/sdrangel/code/qt5/client/SWGFreqTrackerSettings.cpp b/swagger/sdrangel/code/qt5/client/SWGFreqTrackerSettings.cpp index 137188fe5..41cbd2546 100644 --- a/swagger/sdrangel/code/qt5/client/SWGFreqTrackerSettings.cpp +++ b/swagger/sdrangel/code/qt5/client/SWGFreqTrackerSettings.cpp @@ -40,6 +40,8 @@ SWGFreqTrackerSettings::SWGFreqTrackerSettings() { m_rgb_color_isSet = false; title = nullptr; m_title_isSet = false; + alpha_ema = 0; + m_alpha_ema_isSet = false; tracking = 0; m_tracking_isSet = false; tracker_type = 0; @@ -80,6 +82,8 @@ SWGFreqTrackerSettings::init() { m_rgb_color_isSet = false; title = new QString(""); m_title_isSet = false; + alpha_ema = 0; + m_alpha_ema_isSet = false; tracking = 0; m_tracking_isSet = false; tracker_type = 0; @@ -118,6 +122,7 @@ SWGFreqTrackerSettings::cleanup() { + if(reverse_api_address != nullptr) { delete reverse_api_address; } @@ -149,6 +154,8 @@ SWGFreqTrackerSettings::fromJsonObject(QJsonObject &pJson) { ::SWGSDRangel::setValue(&title, pJson["title"], "QString", "QString"); + ::SWGSDRangel::setValue(&alpha_ema, pJson["alphaEMA"], "qint32", ""); + ::SWGSDRangel::setValue(&tracking, pJson["tracking"], "qint32", ""); ::SWGSDRangel::setValue(&tracker_type, pJson["trackerType"], "qint32", ""); @@ -203,6 +210,9 @@ SWGFreqTrackerSettings::asJsonObject() { if(title != nullptr && *title != QString("")){ toJsonValue(QString("title"), title, obj, QString("QString")); } + if(m_alpha_ema_isSet){ + obj->insert("alphaEMA", QJsonValue(alpha_ema)); + } if(m_tracking_isSet){ obj->insert("tracking", QJsonValue(tracking)); } @@ -297,6 +307,16 @@ SWGFreqTrackerSettings::setTitle(QString* title) { this->m_title_isSet = true; } +qint32 +SWGFreqTrackerSettings::getAlphaEma() { + return alpha_ema; +} +void +SWGFreqTrackerSettings::setAlphaEma(qint32 alpha_ema) { + this->alpha_ema = alpha_ema; + this->m_alpha_ema_isSet = true; +} + qint32 SWGFreqTrackerSettings::getTracking() { return tracking; @@ -408,6 +428,7 @@ SWGFreqTrackerSettings::isSet(){ if(m_squelch_isSet){ isObjectUpdated = true; break;} if(m_rgb_color_isSet){ isObjectUpdated = true; break;} if(title != nullptr && *title != QString("")){ isObjectUpdated = true; break;} + if(m_alpha_ema_isSet){ isObjectUpdated = true; break;} if(m_tracking_isSet){ isObjectUpdated = true; break;} if(m_tracker_type_isSet){ isObjectUpdated = true; break;} if(m_pll_psk_order_isSet){ isObjectUpdated = true; break;} diff --git a/swagger/sdrangel/code/qt5/client/SWGFreqTrackerSettings.h b/swagger/sdrangel/code/qt5/client/SWGFreqTrackerSettings.h index f0892c89c..bf4fe56e2 100644 --- a/swagger/sdrangel/code/qt5/client/SWGFreqTrackerSettings.h +++ b/swagger/sdrangel/code/qt5/client/SWGFreqTrackerSettings.h @@ -60,6 +60,9 @@ public: QString* getTitle(); void setTitle(QString* title); + qint32 getAlphaEma(); + void setAlphaEma(qint32 alpha_ema); + qint32 getTracking(); void setTracking(qint32 tracking); @@ -112,6 +115,9 @@ private: QString* title; bool m_title_isSet; + qint32 alpha_ema; + bool m_alpha_ema_isSet; + qint32 tracking; bool m_tracking_isSet;