mirror of
https://github.com/f4exb/sdrangel.git
synced 2025-06-25 05:25:27 -04:00
SDRdaemon plugin: implement DC offset and IQ imbalance corrections
This commit is contained in:
parent
05a4a7cb4e
commit
f04b6c4dc1
@ -27,7 +27,6 @@ include_directories(
|
|||||||
${CMAKE_CURRENT_BINARY_DIR}
|
${CMAKE_CURRENT_BINARY_DIR}
|
||||||
${CMAKE_SOURCE_DIR}/include
|
${CMAKE_SOURCE_DIR}/include
|
||||||
${CMAKE_SOURCE_DIR}/include-gpl
|
${CMAKE_SOURCE_DIR}/include-gpl
|
||||||
${LIBRTLSDR_INCLUDE_DIR}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
#include(${QT_USE_FILE})
|
#include(${QT_USE_FILE})
|
||||||
@ -50,7 +49,6 @@ target_include_directories(inputsdrdaemon PUBLIC
|
|||||||
|
|
||||||
target_link_libraries(inputsdrdaemon
|
target_link_libraries(inputsdrdaemon
|
||||||
${QT_LIBRARIES}
|
${QT_LIBRARIES}
|
||||||
${LIBUSB_LIBRARIES}
|
|
||||||
${LZ4_LIBRARIES}
|
${LZ4_LIBRARIES}
|
||||||
sdrbase
|
sdrbase
|
||||||
)
|
)
|
||||||
|
@ -39,7 +39,9 @@ SDRdaemonGui::SDRdaemonGui(PluginAPI* pluginAPI, QWidget* parent) :
|
|||||||
m_sampleRate(0),
|
m_sampleRate(0),
|
||||||
m_centerFrequency(0),
|
m_centerFrequency(0),
|
||||||
m_samplesCount(0),
|
m_samplesCount(0),
|
||||||
m_tickCount(0)
|
m_tickCount(0),
|
||||||
|
m_dcBlock(false),
|
||||||
|
m_iqCorrection(false)
|
||||||
{
|
{
|
||||||
m_startingTimeStamp.tv_sec = 0;
|
m_startingTimeStamp.tv_sec = 0;
|
||||||
m_startingTimeStamp.tv_usec = 0;
|
m_startingTimeStamp.tv_usec = 0;
|
||||||
@ -173,7 +175,7 @@ void SDRdaemonGui::handleSourceMessages()
|
|||||||
|
|
||||||
while ((message = m_sampleSource->getOutputMessageQueueToGUI()->pop()) != 0)
|
while ((message = m_sampleSource->getOutputMessageQueueToGUI()->pop()) != 0)
|
||||||
{
|
{
|
||||||
qDebug("SDRdaemonGui::handleSourceMessages: message: %s", message->getIdentifier());
|
//qDebug("SDRdaemonGui::handleSourceMessages: message: %s", message->getIdentifier());
|
||||||
|
|
||||||
if (handleMessage(*message))
|
if (handleMessage(*message))
|
||||||
{
|
{
|
||||||
@ -184,6 +186,8 @@ void SDRdaemonGui::handleSourceMessages()
|
|||||||
|
|
||||||
void SDRdaemonGui::displaySettings()
|
void SDRdaemonGui::displaySettings()
|
||||||
{
|
{
|
||||||
|
ui->dcOffset->setChecked(m_dcBlock);
|
||||||
|
ui->iqImbalance->setChecked(m_iqCorrection);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -198,6 +202,26 @@ void SDRdaemonGui::on_applyButton_clicked(bool checked)
|
|||||||
configureUDPLink();
|
configureUDPLink();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SDRdaemonGui::on_dcOffset_toggled(bool checked)
|
||||||
|
{
|
||||||
|
if (m_dcBlock != checked)
|
||||||
|
{
|
||||||
|
m_dcBlock = checked;
|
||||||
|
SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr* message = SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr::create(m_dcBlock, m_iqCorrection);
|
||||||
|
m_sampleSource->getInputMessageQueue()->push(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SDRdaemonGui::on_iqImbalance_toggled(bool checked)
|
||||||
|
{
|
||||||
|
if (m_iqCorrection != checked)
|
||||||
|
{
|
||||||
|
m_iqCorrection = checked;
|
||||||
|
SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr* message = SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr::create(m_dcBlock, m_iqCorrection);
|
||||||
|
m_sampleSource->getInputMessageQueue()->push(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SDRdaemonGui::configureUDPLink()
|
void SDRdaemonGui::configureUDPLink()
|
||||||
{
|
{
|
||||||
bool ok;
|
bool ok;
|
||||||
@ -232,28 +256,8 @@ void SDRdaemonGui::updateWithStreamTime()
|
|||||||
{
|
{
|
||||||
quint64 startingTimeStampMsec = (m_startingTimeStamp.tv_sec * 1000) + (m_startingTimeStamp.tv_usec / 1000);
|
quint64 startingTimeStampMsec = (m_startingTimeStamp.tv_sec * 1000) + (m_startingTimeStamp.tv_usec / 1000);
|
||||||
QDateTime dt = QDateTime::fromMSecsSinceEpoch(startingTimeStampMsec);
|
QDateTime dt = QDateTime::fromMSecsSinceEpoch(startingTimeStampMsec);
|
||||||
QString s_date = dt.toString("yyyyMMdd hh.mm.ss.zzz");
|
QString s_date = dt.toString("yyyy-MM-dd hh:mm:ss.zzz");
|
||||||
ui->absTimeText->setText(s_date);
|
ui->absTimeText->setText(s_date);
|
||||||
/*
|
|
||||||
int t_sec = 0;
|
|
||||||
int t_msec = 0;
|
|
||||||
|
|
||||||
if (m_sampleRate > 0){
|
|
||||||
t_msec = ((m_samplesCount * 1000) / m_sampleRate) % 1000;
|
|
||||||
t_sec = m_samplesCount / m_sampleRate;
|
|
||||||
}
|
|
||||||
|
|
||||||
QTime t(0, 0, 0, 0);
|
|
||||||
t = t.addSecs(t_sec);
|
|
||||||
t = t.addMSecs(t_msec);
|
|
||||||
QString s_time = t.toString("hh:mm:ss.zzz");
|
|
||||||
|
|
||||||
quint64 startingTimeStampMsec = m_startingTimeStamp * 1000;
|
|
||||||
QDateTime dt = QDateTime::fromMSecsSinceEpoch(startingTimeStampMsec);
|
|
||||||
dt = dt.addSecs(t_sec);
|
|
||||||
dt = dt.addMSecs(t_msec);
|
|
||||||
QString s_date = dt.toString("yyyyMMdd hh.mm.ss.zzz");
|
|
||||||
ui->absTimeText->setText(s_date);*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SDRdaemonGui::tick()
|
void SDRdaemonGui::tick()
|
||||||
|
@ -60,6 +60,9 @@ private:
|
|||||||
int m_samplesCount;
|
int m_samplesCount;
|
||||||
std::size_t m_tickCount;
|
std::size_t m_tickCount;
|
||||||
|
|
||||||
|
bool m_dcBlock;
|
||||||
|
bool m_iqCorrection;
|
||||||
|
|
||||||
void displaySettings();
|
void displaySettings();
|
||||||
void displayTime();
|
void displayTime();
|
||||||
void configureUDPLink();
|
void configureUDPLink();
|
||||||
@ -70,6 +73,8 @@ private:
|
|||||||
private slots:
|
private slots:
|
||||||
void handleSourceMessages();
|
void handleSourceMessages();
|
||||||
void on_applyButton_clicked(bool checked);
|
void on_applyButton_clicked(bool checked);
|
||||||
|
void on_dcOffset_toggled(bool checked);
|
||||||
|
void on_iqImbalance_toggled(bool checked);
|
||||||
void tick();
|
void tick();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -103,6 +103,119 @@
|
|||||||
</item>
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="line_freq_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="rateTimeLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Rate: </string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="sampleRateText">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>50</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>8</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Record sample rate</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>0k</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<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="Line" name="absTimeLine">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="absTimeText">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Record absolute time</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>20150101 00:00:00.000</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="line_rateTime">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="gridLayout_corr">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="corrLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Auto corr</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="ButtonSwitch" name="dcOffset">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>DC Offset auto correction</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>DC Offset</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="ButtonSwitch" name="iqImbalance">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>IQ Imbalance auto correction</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>IQ Imbalance</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="Line" name="line_freq">
|
<widget class="Line" name="line_freq">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
@ -175,75 +288,7 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" name="rateTimeLayout">
|
<widget class="Line" name="line_address">
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="text">
|
|
||||||
<string>Rate: </string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="sampleRateText">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>50</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>8</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Record sample rate</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>0k</string>
|
|
||||||
</property>
|
|
||||||
<property name="alignment">
|
|
||||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<spacer name="horizontalSpacer">
|
|
||||||
<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="Line" name="absTimeLine">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="absTimeText">
|
|
||||||
<property name="enabled">
|
|
||||||
<bool>false</bool>
|
|
||||||
</property>
|
|
||||||
<property name="toolTip">
|
|
||||||
<string>Record absolute time</string>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>20150101 00:00:00.000</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="Line" name="line_file">
|
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
@ -261,6 +306,11 @@
|
|||||||
<header>gui/valuedial.h</header>
|
<header>gui/valuedial.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>ButtonSwitch</class>
|
||||||
|
<extends>QToolButton</extends>
|
||||||
|
<header>gui/buttonswitch.h</header>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../../../sdrbase/resources/res.qrc"/>
|
<include location="../../../sdrbase/resources/res.qrc"/>
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include "sdrdaemonudphandler.h"
|
#include "sdrdaemonudphandler.h"
|
||||||
|
|
||||||
MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonUDPLink, Message)
|
MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonUDPLink, Message)
|
||||||
|
MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonAutoCorr, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonWork, Message)
|
MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonWork, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonStreamTiming, Message)
|
MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgConfigureSDRdaemonStreamTiming, Message)
|
||||||
MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgReportSDRdaemonAcquisition, Message)
|
MESSAGE_CLASS_DEFINITION(SDRdaemonInput::MsgReportSDRdaemonAcquisition, Message)
|
||||||
@ -100,6 +101,15 @@ bool SDRdaemonInput::handleMessage(const Message& message)
|
|||||||
{
|
{
|
||||||
if (MsgConfigureSDRdaemonUDPLink::match(message))
|
if (MsgConfigureSDRdaemonUDPLink::match(message))
|
||||||
{
|
{
|
||||||
|
// TODO: change UDP settings
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (MsgConfigureSDRdaemonAutoCorr::match(message))
|
||||||
|
{
|
||||||
|
MsgConfigureSDRdaemonAutoCorr& conf = (MsgConfigureSDRdaemonAutoCorr&) message;
|
||||||
|
bool dcBlock = conf.getDCBlock();
|
||||||
|
bool iqImbalance = conf.getIQImbalance();
|
||||||
|
DSPEngine::instance()->configureCorrections(dcBlock, iqImbalance);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (MsgConfigureSDRdaemonWork::match(message))
|
else if (MsgConfigureSDRdaemonWork::match(message))
|
||||||
|
@ -51,6 +51,28 @@ public:
|
|||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class MsgConfigureSDRdaemonAutoCorr : public Message {
|
||||||
|
MESSAGE_CLASS_DECLARATION
|
||||||
|
public:
|
||||||
|
bool getDCBlock() const { return m_dcBlock; }
|
||||||
|
bool getIQImbalance() const { return m_iqCorrection; }
|
||||||
|
|
||||||
|
static MsgConfigureSDRdaemonAutoCorr* create(bool dcBlock, bool iqImbalance)
|
||||||
|
{
|
||||||
|
return new MsgConfigureSDRdaemonAutoCorr(dcBlock, iqImbalance);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool m_dcBlock;
|
||||||
|
bool m_iqCorrection;
|
||||||
|
|
||||||
|
MsgConfigureSDRdaemonAutoCorr(bool dcBlock, bool iqImbalance) :
|
||||||
|
Message(),
|
||||||
|
m_dcBlock(dcBlock),
|
||||||
|
m_iqCorrection(iqImbalance)
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
class MsgConfigureSDRdaemonWork : public Message {
|
class MsgConfigureSDRdaemonWork : public Message {
|
||||||
MESSAGE_CLASS_DECLARATION
|
MESSAGE_CLASS_DECLARATION
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user