kopia lustrzana https://github.com/f4exb/sdrangel
				
				
				
			Frequency tracker: added alpha factor of EMA control
							rodzic
							
								
									4c278eef8d
								
							
						
					
					
						commit
						f63b0fe96c
					
				|  | @ -253,9 +253,11 @@ bool FreqTracker::handleMessage(const Message& cmd) | |||
| 	{ | ||||
| 		DownChannelizer::MsgChannelizerNotification& notif = (DownChannelizer::MsgChannelizerNotification&) cmd; | ||||
| 
 | ||||
|         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) | ||||
| { | ||||
|     if (!m_settings.m_tracking) { | ||||
|         qDebug() << "FreqTracker::applyChannelSettings:" | ||||
|                 << " inputSampleRate: " << inputSampleRate | ||||
|                 << " inputFrequencyOffset: " << inputFrequencyOffset; | ||||
|     } | ||||
| 
 | ||||
|     if ((m_inputFrequencyOffset != inputFrequencyOffset) || | ||||
|         (m_inputSampleRate != inputSampleRate) || force) | ||||
|  | @ -297,6 +301,8 @@ void FreqTracker::applyChannelSettings(int inputSampleRate, int inputFrequencyOf | |||
| } | ||||
| 
 | ||||
| void FreqTracker::applySettings(const FreqTrackerSettings& settings, bool force) | ||||
| { | ||||
|     if (!settings.m_tracking) | ||||
|     { | ||||
|         qDebug() << "FreqTracker::applySettings:" | ||||
|                 << " m_inputFrequencyOffset: " << settings.m_inputFrequencyOffset | ||||
|  | @ -305,6 +311,7 @@ void FreqTracker::applySettings(const FreqTrackerSettings& settings, bool force) | |||
|                 << " 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 | ||||
|  | @ -316,6 +323,7 @@ void FreqTracker::applySettings(const FreqTrackerSettings& settings, bool force) | |||
|                 << " 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); | ||||
|     } | ||||
| 
 | ||||
|     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) | ||||
|             { | ||||
|  |  | |||
|  | @ -107,7 +107,9 @@ bool FreqTrackerGUI::handleMessage(const Message& message) | |||
|     } | ||||
|     else if (FreqTracker::MsgSampleRateNotification::match(message)) | ||||
|     { | ||||
|         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++); | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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"> | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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> | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
|  |  | |||
|  | @ -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> | ||||
|  |  | |||
|  | @ -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;} | ||||
|  |  | |||
|  | @ -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; | ||||
| 
 | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 f4exb
						f4exb