1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2026-08-14 15:33:34 -04:00

Frequency tracker: added squelch gate control

This commit is contained in:
f4exb
2019-05-05 13:19:00 +02:00
parent f63b0fe96c
commit cdf8a63294
13 changed files with 152 additions and 22 deletions
+29 -6
View File
@@ -59,6 +59,7 @@ FreqTracker::FreqTracker(DeviceSourceAPI *deviceAPI) :
m_channelSampleRate(48000),
m_running(false),
m_squelchOpen(false),
m_squelchGate(0),
m_magsqSum(0.0f),
m_magsqPeak(0.0f),
m_magsqCount(0),
@@ -182,19 +183,35 @@ void FreqTracker::processOneSample(Complex &ci)
if (m_magsq < m_squelchLevel)
{
if (m_squelchCount > 0) {
m_squelchCount--;
if (m_squelchGate > 0)
{
if (m_squelchCount > 0) {
m_squelchCount--;
}
m_squelchOpen = m_squelchCount >= m_squelchGate;
}
else
{
m_squelchOpen = false;
}
}
else
{
if (m_squelchCount < m_channelSampleRate / 10) {
m_squelchCount++;
if (m_squelchGate > 0)
{
if (m_squelchCount < 2*m_squelchGate) {
m_squelchCount++;
}
m_squelchOpen = m_squelchCount >= m_squelchGate;
}
else
{
m_squelchOpen = true;
}
}
m_squelchOpen = (m_squelchCount >= m_channelSampleRate / 20);
if (m_squelchOpen)
{
if (m_settings.m_trackerType == FreqTrackerSettings::TrackerFLL)
@@ -412,6 +429,11 @@ void FreqTracker::applySettings(const FreqTrackerSettings& settings, bool force)
reverseAPIKeys.append("rrcRolloff");
updateInterpolator = true;
}
if ((m_settings.m_squelchGate != settings.m_squelchGate) || force)
{
reverseAPIKeys.append("squelchGate");
updateInterpolator = true;
}
if (settings.m_useReverseAPI)
{
@@ -439,6 +461,7 @@ void FreqTracker::setInterpolator()
m_interpolatorDistanceRemain = 0;
m_interpolatorDistance = (Real) m_inputSampleRate / (Real) m_channelSampleRate;
m_rrcFilter->create_rrc_filter(m_settings.m_rfBandwidth / m_channelSampleRate, m_settings.m_rrcRolloff / 100.0);
m_squelchGate = (m_channelSampleRate / 100) * m_settings.m_squelchGate; // gate is given in 10s of ms at channel sample rate
m_settingsMutex.unlock();
}
@@ -214,6 +214,7 @@ private:
Real m_squelchLevel;
uint32_t m_squelchCount;
bool m_squelchOpen;
uint32_t m_squelchGate; //!< Squelch gate in samples
double m_magsq;
double m_magsqSum;
double m_magsqPeak;
@@ -232,6 +232,13 @@ void FreqTrackerGUI::on_squelch_valueChanged(int value)
applySettings();
}
void FreqTrackerGUI::on_squelchGate_valueChanged(int value)
{
ui->squelchGateText->setText(QString("%1").arg(value * 10.0f, 0, 'f', 0));
m_settings.m_squelchGate = value;
applySettings();
}
void FreqTrackerGUI::onWidgetRolled(QWidget* widget, bool rollDown)
{
(void) widget;
@@ -369,6 +376,8 @@ void FreqTrackerGUI::displaySettings()
ui->rrcRolloff->setValue(m_settings.m_rrcRolloff);
QString rolloffStr = QString::number(m_settings.m_rrcRolloff/100.0, 'f', 2);
ui->rrcRolloffText->setText(rolloffStr);
ui->squelchGateText->setText(QString("%1").arg(m_settings.m_squelchGate * 10.0f, 0, 'f', 0));
ui->squelchGate->setValue(m_settings.m_squelchGate);
blockApplySettings(false);
}
@@ -94,6 +94,7 @@ private slots:
void on_rrc_toggled(bool checked);
void on_rrcRolloff_valueChanged(int value);
void on_squelch_valueChanged(int value);
void on_squelchGate_valueChanged(int value);
void onWidgetRolled(QWidget* widget, bool rollDown);
void onMenuDialogCalled(const QPoint& p);
void handleInputMessages();
@@ -624,6 +624,53 @@
</property>
</widget>
</item>
<item>
<widget class="QDial" name="squelchGate">
<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>Squelch gate (ms)</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>99</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="squelchGateText">
<property name="minimumSize">
<size>
<width>25</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string>Squelch gate (ms)</string>
</property>
<property name="text">
<string>000</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@@ -42,6 +42,7 @@ void FreqTrackerSettings::resetToDefaults()
m_pllPskOrder = 2; // BPSK
m_rrc = false;
m_rrcRolloff = 35;
m_squelchGate = 5; // 50 ms
m_useReverseAPI = false;
m_reverseAPIAddress = "127.0.0.1";
m_reverseAPIPort = 8888;
@@ -74,6 +75,7 @@ QByteArray FreqTrackerSettings::serialize() const
s.writeU32(18, m_reverseAPIPort);
s.writeU32(19, m_reverseAPIDeviceIndex);
s.writeU32(20, m_reverseAPIChannelIndex);
s.writeS32(21, m_squelchGate);
return s.final();
}
@@ -136,6 +138,8 @@ bool FreqTrackerSettings::deserialize(const QByteArray& data)
m_reverseAPIDeviceIndex = utmp > 99 ? 99 : utmp;
d.readU32(20, &utmp, 0);
m_reverseAPIChannelIndex = utmp > 99 ? 99 : utmp;
d.readS32(21, &tmp, 5);
m_squelchGate = tmp < 0 ? 0 : tmp > 99 ? 99 : tmp;
return true;
}
@@ -47,6 +47,7 @@ struct FreqTrackerSettings
uint32_t m_pllPskOrder;
bool m_rrc;
uint32_t m_rrcRolloff; //!< in 100ths
int m_squelchGate; //!< in 10s of ms
bool m_useReverseAPI;
QString m_reverseAPIAddress;
uint16_t m_reverseAPIPort;