summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorf4exb <f4exb06@gmail.com>2015-05-09 16:44:26 +0200
committerf4exb <f4exb06@gmail.com>2015-05-09 16:44:26 +0200
commit7ea41283e815a824add3ff22964849c239313013 (patch)
treed56d9f60bad299662fdcffa950b0b830eed4e9a8
parentf07934cc80ccd9c6d005c84bbf49ab1fc4f51e61 (diff)
Added basic variable decimation
-rw-r--r--plugins/samplesource/rtlsdr/rtlsdrgui.cpp9
-rw-r--r--plugins/samplesource/rtlsdr/rtlsdrgui.h1
-rw-r--r--plugins/samplesource/rtlsdr/rtlsdrgui.ui53
-rw-r--r--plugins/samplesource/rtlsdr/rtlsdrinput.cpp22
-rw-r--r--plugins/samplesource/rtlsdr/rtlsdrinput.h1
-rw-r--r--plugins/samplesource/rtlsdr/rtlsdrthread.cpp46
-rw-r--r--plugins/samplesource/rtlsdr/rtlsdrthread.h3
7 files changed, 131 insertions, 4 deletions
diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp
index 5fd10cf60..b19455be4 100644
--- a/plugins/samplesource/rtlsdr/rtlsdrgui.cpp
+++ b/plugins/samplesource/rtlsdr/rtlsdrgui.cpp
@@ -129,6 +129,15 @@ void RTLSDRGui::on_centerFrequency_changed(quint64 value)
sendSettings();
}
+void RTLSDRGui::on_decim_valueChanged(int value)
+{
+ if ((value <0) || (value > 4))
+ return;
+ ui->decimText->setText(tr("%1").arg(1<<value));
+ m_settings.m_log2Decim = value;
+ sendSettings();
+}
+
void RTLSDRGui::on_ppm_valueChanged(int value)
{
if((value > 99) || (value < -99))
diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.h b/plugins/samplesource/rtlsdr/rtlsdrgui.h
index 5fe3ee225..7aa150443 100644
--- a/plugins/samplesource/rtlsdr/rtlsdrgui.h
+++ b/plugins/samplesource/rtlsdr/rtlsdrgui.h
@@ -44,6 +44,7 @@ private:
private slots:
void on_centerFrequency_changed(quint64 value);
+ void on_decim_valueChanged(int value);
void on_ppm_valueChanged(int value);
void on_gain_valueChanged(int value);
void on_samplerate_valueChanged(int value);
diff --git a/plugins/samplesource/rtlsdr/rtlsdrgui.ui b/plugins/samplesource/rtlsdr/rtlsdrgui.ui
index 182db9797..505d52685 100644
--- a/plugins/samplesource/rtlsdr/rtlsdrgui.ui
+++ b/plugins/samplesource/rtlsdr/rtlsdrgui.ui
@@ -262,6 +262,59 @@
</layout>
</item>
<item>
+ <widget class="Line" name="line_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QGridLayout" name="gridLayout_4" columnstretch="0,0,0">
+ <property name="spacing">
+ <number>3</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_decim">
+ <property name="text">
+ <string>Dec.</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSlider" name="decim">
+ <property name="maximum">
+ <number>4</number>
+ </property>
+ <property name="pageStep">
+ <number>4</number>
+ </property>
+ <property name="value">
+ <number>4</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="decimText">
+ <property name="minimumSize">
+ <size>
+ <width>40</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>16</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp
index a1d6f1a71..aeb7a948c 100644
--- a/plugins/samplesource/rtlsdr/rtlsdrinput.cpp
+++ b/plugins/samplesource/rtlsdr/rtlsdrinput.cpp
@@ -36,6 +36,7 @@ void RTLSDRInput::Settings::resetToDefaults()
m_gain = 0;
m_samplerate = 1024000;
m_loPpmCorrection = 0;
+ m_log2Decim = 4;
}
QByteArray RTLSDRInput::Settings::serialize() const
@@ -44,6 +45,7 @@ QByteArray RTLSDRInput::Settings::serialize() const
s.writeS32(1, m_gain);
s.writeS32(2, m_samplerate);
s.writeS32(3, m_loPpmCorrection);
+ s.writeU32(4, m_log2Decim);
return s.final();
}
@@ -60,6 +62,7 @@ bool RTLSDRInput::Settings::deserialize(const QByteArray& data)
d.readS32(1, &m_gain, 0);
//d.readS32(2, &m_samplerate, 0);
d.readS32(3, &m_loPpmCorrection, 0);
+ d.readU32(4, &m_log2Decim, 4);
return true;
} else {
resetToDefaults();
@@ -186,16 +189,26 @@ const QString& RTLSDRInput::getDeviceDescription() const
int RTLSDRInput::getSampleRate() const
{
int rate = m_settings.m_samplerate;
+ return (rate / (1<<m_settings.m_log2Decim));
+ /*
if (rate < 800000)
return (rate / 4);
if ((rate == 1152000) || (rate == 2048000))
return (rate / 8);
return (rate / 16);
+ */
}
quint64 RTLSDRInput::getCenterFrequency() const
{
- return m_generalSettings.m_centerFrequency;
+ if (m_settings.m_log2Decim == 0) // Little wooby-doop if no decimation
+ {
+ return m_generalSettings.m_centerFrequency + (m_settings.m_samplerate / 4);
+ }
+ else
+ {
+ return m_generalSettings.m_centerFrequency;
+ }
}
bool RTLSDRInput::handleMessage(Message* message)
@@ -245,6 +258,13 @@ bool RTLSDRInput::applySettings(const GeneralSettings& generalSettings, const Se
}
}
+ if((m_settings.m_log2Decim != settings.m_log2Decim) || force) {
+ if(m_dev != NULL) {
+ m_settings.m_log2Decim = settings.m_log2Decim;
+ m_rtlSDRThread->setLog2Decimation(settings.m_log2Decim);
+ }
+ }
+
m_generalSettings.m_centerFrequency = generalSettings.m_centerFrequency;
if(m_dev != NULL) {
if(rtlsdr_set_center_freq( m_dev, m_generalSettings.m_centerFrequency
diff --git a/plugins/samplesource/rtlsdr/rtlsdrinput.h b/plugins/samplesource/rtlsdr/rtlsdrinput.h
index f3fdbc64e..1e5d84619 100644
--- a/plugins/samplesource/rtlsdr/rtlsdrinput.h
+++ b/plugins/samplesource/rtlsdr/rtlsdrinput.h
@@ -30,6 +30,7 @@ public:
qint32 m_gain;
qint32 m_samplerate;
qint32 m_loPpmCorrection;
+ quint32 m_log2Decim;
Settings();
void resetToDefaults();
diff --git a/plugins/samplesource/rtlsdr/rtlsdrthread.cpp b/plugins/samplesource/rtlsdr/rtlsdrthread.cpp
index 039abe6e4..3aefedc41 100644
--- a/plugins/samplesource/rtlsdr/rtlsdrthread.cpp
+++ b/plugins/samplesource/rtlsdr/rtlsdrthread.cpp
@@ -28,7 +28,8 @@ RTLSDRThread::RTLSDRThread(rtlsdr_dev_t* dev, SampleFifo* sampleFifo, QObject* p
m_dev(dev),
m_convertBuffer(BLOCKSIZE),
m_sampleFifo(sampleFifo),
- m_samplerate(288000)
+ m_samplerate(288000),
+ m_log2Decim(4)
{
}
@@ -57,6 +58,11 @@ void RTLSDRThread::setSamplerate(int samplerate)
m_samplerate = samplerate;
}
+void RTLSDRThread::setLog2Decimation(unsigned int log2_decim)
+{
+ m_log2Decim = log2_decim;
+}
+
void RTLSDRThread::run()
{
int res;
@@ -74,6 +80,18 @@ void RTLSDRThread::run()
m_running = false;
}
+void RTLSDRThread::decimate1(SampleVector::iterator* it, const quint8* buf, qint32 len)
+{
+ qint16 xreal, yimag;
+ for (int pos = 0; pos < len; pos += 2) {
+ xreal = buf[pos+0];
+ yimag = buf[pos+1];
+ Sample s( xreal << 3, yimag << 3 );
+ **it = s;
+ (*it)++;
+ }
+}
+
void RTLSDRThread::decimate2(SampleVector::iterator* it, const quint8* buf, qint32 len)
{
qint16 xreal, yimag;
@@ -146,18 +164,40 @@ void RTLSDRThread::decimate16(SampleVector::iterator* it, const quint8* buf, qin
-// Decimate everything by 16x, except 288kHz by 4x
-// and 1152kHz, 2048kHz by 8x
+// Decimate according to specified log2 (ex: log2=4 => decim=16)
void RTLSDRThread::callback(const quint8* buf, qint32 len)
{
SampleVector::iterator it = m_convertBuffer.begin();
+ switch (m_log2Decim)
+ {
+ case 0:
+ decimate1(&it, buf, len);
+ break;
+ case 1:
+ decimate2(&it, buf, len);
+ break;
+ case 2:
+ decimate4(&it, buf, len);
+ break;
+ case 3:
+ decimate8(&it, buf, len);
+ break;
+ case 4:
+ decimate16(&it, buf, len);
+ break;
+ default:
+ break;
+ }
+
+ /*
if (m_samplerate < 800000)
decimate4(&it, buf, len);
else if ((m_samplerate == 1152000)||(m_samplerate == 2048000))
decimate8(&it, buf, len);
else
decimate16(&it, buf, len);
+ */
m_sampleFifo->write(m_convertBuffer.begin(), it);
diff --git a/plugins/samplesource/rtlsdr/rtlsdrthread.h b/plugins/samplesource/rtlsdr/rtlsdrthread.h
index 48e5aeabd..fb5abc134 100644
--- a/plugins/samplesource/rtlsdr/rtlsdrthread.h
+++ b/plugins/samplesource/rtlsdr/rtlsdrthread.h
@@ -35,6 +35,7 @@ public:
void startWork();
void stopWork();
void setSamplerate(int samplerate);
+ void setLog2Decimation(unsigned int log2_decim);
private:
QMutex m_startWaitMutex;
@@ -46,11 +47,13 @@ private:
SampleFifo* m_sampleFifo;
int m_samplerate;
+ unsigned int m_log2Decim;
IntHalfbandFilter m_decimator2;
IntHalfbandFilter m_decimator4;
void run();
+ void decimate1(SampleVector::iterator* it, const quint8* buf, qint32 len);
void decimate2(SampleVector::iterator* it, const quint8* buf, qint32 len);
void decimate4(SampleVector::iterator* it, const quint8* buf, qint32 len);
void decimate8(SampleVector::iterator* it, const quint8* buf, qint32 len);