Frequency tracker: added alpha factor of EMA control

pull/340/head
f4exb 2019-05-05 09:43:15 +02:00
rodzic 4c278eef8d
commit f63b0fe96c
12 zmienionych plików z 159 dodań i 32 usunięć

Wyświetl plik

@ -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<QString> 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)
{

Wyświetl plik

@ -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++);

Wyświetl plik

@ -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);

Wyświetl plik

@ -377,6 +377,53 @@
</property>
</widget>
</item>
<item>
<widget class="QDial" name="alphaEMA">
<property name="minimumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="toolTip">
<string>Alpha factor for delta frequency exponential moving average</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="alphaEMAText">
<property name="minimumSize">
<size>
<width>32</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Alpha factor for delta frequency exponential moving average</string>
</property>
<property name="text">
<string>0.1</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="trackerType">
<property name="minimumSize">

Wyświetl plik

@ -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);

Wyświetl plik

@ -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;

Wyświetl plik

@ -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:
</div>
<div id="generator">
<div class="content">
Generated 2019-05-03T21:05:56.826+02:00
Generated 2019-05-05T01:27:03.875+02:00
</div>
</div>
</div>

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -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:
</div>
<div id="generator">
<div class="content">
Generated 2019-05-03T21:05:56.826+02:00
Generated 2019-05-05T01:27:03.875+02:00
</div>
</div>
</div>

Wyświetl plik

@ -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;}

Wyświetl plik

@ -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;