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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user