mirror of
https://github.com/f4exb/sdrangel.git
synced 2026-06-01 21:54:55 -04:00
FCD: implemented decimation
This commit is contained in:
@@ -209,6 +209,7 @@ void FCDProPlusGui::displaySettings()
|
||||
ui->transverter->setDeltaFrequencyActive(m_settings.m_transverterMode);
|
||||
updateFrequencyLimits();
|
||||
ui->centerFrequency->setValue(m_settings.m_centerFrequency / 1000);
|
||||
ui->decim->setCurrentIndex(m_settings.m_log2Decim);
|
||||
ui->dcOffset->setChecked(m_settings.m_dcBlock);
|
||||
ui->iqImbalance->setChecked(m_settings.m_iqImbalance);
|
||||
ui->checkBoxG->setChecked(m_settings.m_lnaGain);
|
||||
@@ -234,6 +235,16 @@ void FCDProPlusGui::on_centerFrequency_changed(quint64 value)
|
||||
sendSettings();
|
||||
}
|
||||
|
||||
void FCDProPlusGui::on_decim_currentIndexChanged(int index)
|
||||
{
|
||||
if ((index < 0) || (index > 6)) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_settings.m_log2Decim = index;
|
||||
sendSettings();
|
||||
}
|
||||
|
||||
void FCDProPlusGui::on_dcOffset_toggled(bool checked)
|
||||
{
|
||||
m_settings.m_dcBlock = checked;
|
||||
|
||||
@@ -75,6 +75,7 @@ private:
|
||||
private slots:
|
||||
void handleInputMessages();
|
||||
void on_centerFrequency_changed(quint64 value);
|
||||
void on_decim_currentIndexChanged(int index);
|
||||
void on_dcOffset_toggled(bool checked);
|
||||
void on_iqImbalance_toggled(bool checked);
|
||||
void on_checkBoxG_stateChanged(int state);
|
||||
|
||||
@@ -224,7 +224,7 @@
|
||||
<string>Automatic DC offset removal</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>DC offset</string>
|
||||
<string>DC</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@@ -234,10 +234,62 @@
|
||||
<string>Automatic IQ imbalance correction</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>IQ imbalance</string>
|
||||
<string>IQ</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="labelDecim">
|
||||
<property name="text">
|
||||
<string>Dec</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="decim">
|
||||
<property name="toolTip">
|
||||
<string>Decimation factor</string>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>1</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>2</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>4</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>8</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>16</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="TransverterButton" name="transverter">
|
||||
<property name="maximumSize">
|
||||
|
||||
@@ -237,7 +237,7 @@ const QString& FCDProPlusInput::getDeviceDescription() const
|
||||
|
||||
int FCDProPlusInput::getSampleRate() const
|
||||
{
|
||||
return fcd_traits<ProPlus>::sampleRate;
|
||||
return fcd_traits<ProPlus>::sampleRate/(1<<m_settings.m_log2Decim);
|
||||
}
|
||||
|
||||
quint64 FCDProPlusInput::getCenterFrequency() const
|
||||
@@ -355,6 +355,18 @@ void FCDProPlusInput::applySettings(const FCDProPlusSettings& settings, bool for
|
||||
m_settings.m_centerFrequency = settings.m_centerFrequency;
|
||||
}
|
||||
|
||||
if ((m_settings.m_log2Decim != settings.m_log2Decim) || force)
|
||||
{
|
||||
reverseAPIKeys.append("log2Decim");
|
||||
forwardChange = true;
|
||||
|
||||
if (m_FCDThread != 0)
|
||||
{
|
||||
m_FCDThread->setLog2Decimation(settings.m_log2Decim);
|
||||
qDebug() << "FCDProPlusInput::applySettings: set decimation to " << (1<<settings.m_log2Decim);
|
||||
}
|
||||
}
|
||||
|
||||
if ((m_settings.m_lnaGain != settings.m_lnaGain) || force)
|
||||
{
|
||||
reverseAPIKeys.append("lnaGain");
|
||||
@@ -444,7 +456,7 @@ void FCDProPlusInput::applySettings(const FCDProPlusSettings& settings, bool for
|
||||
|
||||
if (forwardChange)
|
||||
{
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(fcd_traits<ProPlus>::sampleRate, m_settings.m_centerFrequency);
|
||||
DSPSignalNotification *notif = new DSPSignalNotification(fcd_traits<ProPlus>::sampleRate/(1<<settings.m_log2Decim), m_settings.m_centerFrequency);
|
||||
m_fileSink->handleMessage(*notif); // forward to file sink
|
||||
m_deviceAPI->getDeviceEngineInputMessageQueue()->push(notif);
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ void FCDProPlusSettings::resetToDefaults()
|
||||
m_rfFilterIndex = 0;
|
||||
m_ifFilterIndex = 0;
|
||||
m_LOppmTenths = 0;
|
||||
m_log2Decim = 0;
|
||||
m_dcBlock = false;
|
||||
m_iqImbalance = false;
|
||||
m_transverterMode = false;
|
||||
@@ -54,16 +55,17 @@ QByteArray FCDProPlusSettings::serialize() const
|
||||
s.writeBool(3, m_mixGain);
|
||||
s.writeS32(4, m_ifFilterIndex);
|
||||
s.writeS32(5, m_rfFilterIndex);
|
||||
s.writeBool(6, m_dcBlock);
|
||||
s.writeBool(7, m_iqImbalance);
|
||||
s.writeS32(8, m_LOppmTenths);
|
||||
s.writeU32(9, m_ifGain);
|
||||
s.writeBool(10, m_transverterMode);
|
||||
s.writeS64(11, m_transverterDeltaFrequency);
|
||||
s.writeBool(12, m_useReverseAPI);
|
||||
s.writeString(13, m_reverseAPIAddress);
|
||||
s.writeU32(14, m_reverseAPIPort);
|
||||
s.writeU32(15, m_reverseAPIDeviceIndex);
|
||||
s.writeU32(6, m_log2Decim);
|
||||
s.writeBool(7, m_dcBlock);
|
||||
s.writeBool(8, m_iqImbalance);
|
||||
s.writeS32(9, m_LOppmTenths);
|
||||
s.writeU32(10, m_ifGain);
|
||||
s.writeBool(11, m_transverterMode);
|
||||
s.writeS64(12, m_transverterDeltaFrequency);
|
||||
s.writeBool(13, m_useReverseAPI);
|
||||
s.writeString(14, m_reverseAPIAddress);
|
||||
s.writeU32(15, m_reverseAPIPort);
|
||||
s.writeU32(16, m_reverseAPIDeviceIndex);
|
||||
|
||||
return s.final();
|
||||
}
|
||||
@@ -87,15 +89,16 @@ bool FCDProPlusSettings::deserialize(const QByteArray& data)
|
||||
d.readBool(3, &m_mixGain, true);
|
||||
d.readS32(4, &m_ifFilterIndex, 0);
|
||||
d.readS32(5, &m_rfFilterIndex, 0);
|
||||
d.readBool(6, &m_dcBlock, false);
|
||||
d.readBool(7, &m_iqImbalance, false);
|
||||
d.readS32(8, &m_LOppmTenths, 0);
|
||||
d.readU32(9, &m_ifGain, 0);
|
||||
d.readBool(10, &m_transverterMode, false);
|
||||
d.readS64(11, &m_transverterDeltaFrequency, 0);
|
||||
d.readBool(12, &m_useReverseAPI, false);
|
||||
d.readString(13, &m_reverseAPIAddress, "127.0.0.1");
|
||||
d.readU32(14, &uintval, 0);
|
||||
d.readU32(6, &m_log2Decim, 0);
|
||||
d.readBool(7, &m_dcBlock, false);
|
||||
d.readBool(8, &m_iqImbalance, false);
|
||||
d.readS32(9, &m_LOppmTenths, 0);
|
||||
d.readU32(10, &m_ifGain, 0);
|
||||
d.readBool(11, &m_transverterMode, false);
|
||||
d.readS64(12, &m_transverterDeltaFrequency, 0);
|
||||
d.readBool(13, &m_useReverseAPI, false);
|
||||
d.readString(14, &m_reverseAPIAddress, "127.0.0.1");
|
||||
d.readU32(15, &uintval, 0);
|
||||
|
||||
if ((uintval > 1023) && (uintval < 65535)) {
|
||||
m_reverseAPIPort = uintval;
|
||||
@@ -103,7 +106,7 @@ bool FCDProPlusSettings::deserialize(const QByteArray& data)
|
||||
m_reverseAPIPort = 8888;
|
||||
}
|
||||
|
||||
d.readU32(15, &uintval, 0);
|
||||
d.readU32(16, &uintval, 0);
|
||||
m_reverseAPIDeviceIndex = uintval > 99 ? 99 : uintval;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ struct FCDProPlusSettings {
|
||||
qint32 m_ifFilterIndex;
|
||||
qint32 m_rfFilterIndex;
|
||||
qint32 m_LOppmTenths;
|
||||
quint32 m_log2Decim;
|
||||
bool m_dcBlock;
|
||||
bool m_iqImbalance;
|
||||
bool m_transverterMode;
|
||||
|
||||
@@ -59,6 +59,11 @@ void FCDProPlusThread::stopWork()
|
||||
wait();
|
||||
}
|
||||
|
||||
void FCDProPlusThread::setLog2Decimation(unsigned int log2_decim)
|
||||
{
|
||||
m_log2Decim = log2_decim;
|
||||
}
|
||||
|
||||
void FCDProPlusThread::run()
|
||||
{
|
||||
m_running = true;
|
||||
@@ -78,6 +83,27 @@ void FCDProPlusThread::work(unsigned int n_items)
|
||||
{
|
||||
uint32_t nbRead = m_fcdFIFO->read((unsigned char *) m_buf, n_items); // number of samples
|
||||
SampleVector::iterator it = m_convertBuffer.begin();
|
||||
m_decimators.decimate1(&it, m_buf, 2*nbRead);
|
||||
|
||||
switch (m_log2Decim)
|
||||
{
|
||||
case 0:
|
||||
m_decimators.decimate1(&it, m_buf, 2*nbRead);
|
||||
break;
|
||||
case 1:
|
||||
m_decimators.decimate2_cen(&it, m_buf, 2*nbRead);
|
||||
break;
|
||||
case 2:
|
||||
m_decimators.decimate4_cen(&it, m_buf, 2*nbRead);
|
||||
break;
|
||||
case 3:
|
||||
m_decimators.decimate8_cen(&it, m_buf, 2*nbRead);
|
||||
break;
|
||||
case 4:
|
||||
m_decimators.decimate16_cen(&it, m_buf, 2*nbRead);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
m_sampleFifo->write(m_convertBuffer.begin(), it);
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ public:
|
||||
|
||||
void startWork();
|
||||
void stopWork();
|
||||
void setLog2Decimation(unsigned int log2_decim);
|
||||
|
||||
private:
|
||||
AudioFifo* m_fcdFIFO;
|
||||
@@ -44,6 +45,7 @@ private:
|
||||
QMutex m_startWaitMutex;
|
||||
QWaitCondition m_startWaiter;
|
||||
bool m_running;
|
||||
unsigned int m_log2Decim;
|
||||
|
||||
qint16 m_buf[fcd_traits<ProPlus>::convBufSize*2]; // stereo (I, Q)
|
||||
SampleVector m_convertBuffer;
|
||||
|
||||
Reference in New Issue
Block a user