Skip to content

Commit

Permalink
Implement corrections up to order 1
Browse files Browse the repository at this point in the history
  • Loading branch information
BatchDrake committed May 6, 2023
1 parent e78f0cd commit aa89355
Show file tree
Hide file tree
Showing 5 changed files with 569 additions and 140 deletions.
27 changes: 25 additions & 2 deletions ChirpCorrector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,14 +43,29 @@ ChirpCorrector::ChirpCorrector()
void
ChirpCorrector::refreshCorrector()
{
if (m_doNewFreq) {
SUDOUBLE sampRate = SCAST(SUDOUBLE, m_analyzer->getSampleRate());
// TODO: Do an atomic xchg
SUDOUBLE newResetOmega = -SCAST(
SUDOUBLE,
SU_NORM2ANG_FREQ(SU_ABS2NORM_FREQ(sampRate, m_desiredResetFreq)));

m_currOmega += newResetOmega - m_resetOmega;

m_resetOmega = newResetOmega;
m_doNewFreq = false;
}

if (m_doReset) {
m_currOmega = 0;
m_currOmega = m_resetOmega;
m_doReset = false;
}

if (m_doNewRate) {
SUDOUBLE chirpRatePerSample;
SUDOUBLE sampRate = SCAST(SUDOUBLE, m_analyzer->getSampleRate());

// TODO: Rely on an atomic xchg
m_chirpRate = m_desiredRate;

chirpRatePerSample = m_chirpRate / sampRate;
Expand Down Expand Up @@ -94,8 +109,9 @@ ChirpCorrector::ensureCorrector()
{
if (m_analyzer != nullptr) {
if (m_enabled && !m_installed) {
m_doNewFreq = true;
m_doNewRate = true;
m_doReset = true;
m_doReset = true;
m_analyzer->registerBaseBandFilter(
onChirpCorrectorBaseBandData,
this,
Expand Down Expand Up @@ -123,6 +139,13 @@ ChirpCorrector::setEnabled(bool enabled)
ensureCorrector();
}

void
ChirpCorrector::setResetFrequency(SUDOUBLE freq)
{
m_desiredResetFreq = freq;
m_doNewFreq = true;
}

void
ChirpCorrector::setChirpRate(SUDOUBLE rate)
{
Expand Down
10 changes: 7 additions & 3 deletions ChirpCorrector.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,17 @@ namespace SigDigger {
class ChirpCorrector
{
Suscan::Analyzer *m_analyzer = nullptr;
SUDOUBLE m_chirpRate = 0;
SUDOUBLE m_resetOmega = 0;
SUDOUBLE m_chirpRate = 0;
SUDOUBLE m_deltaOmega = 0;
SUDOUBLE m_currOmega = 0;
SUSCOUNT m_sampCount = 0;
SUDOUBLE m_currOmega = 0;
SUSCOUNT m_sampCount = 0;

bool m_doNewFreq = 0;
bool m_doNewRate = false;
bool m_doReset = false;

SUDOUBLE m_desiredResetFreq = 0;
SUDOUBLE m_desiredRate = 0;
bool m_enabled = false;
bool m_installed = false;
Expand All @@ -64,6 +67,7 @@ namespace SigDigger {

void setAnalyzer(Suscan::Analyzer *);
void setEnabled(bool);
void setResetFrequency(SUDOUBLE freq);
void setChirpRate(SUDOUBLE rate);
void reset();
};
Expand Down
229 changes: 226 additions & 3 deletions DopplerTool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
#include <UIMediator.h>
#include <MainSpectrum.h>
#include <QMessageBox>
#include "ChirpCorrector.h"

#define DOPPLERTOOL_SPEED_OF_LIGHT 299792458. // [m/s]

using namespace SigDigger;

Expand All @@ -34,7 +37,8 @@ void
DopplerToolConfig::deserialize(Suscan::Object const &conf)
{
LOAD(collapsed);
LOAD(speed);
LOAD(velocity);
LOAD(accel);
LOAD(bias);
LOAD(enabled);
}
Expand All @@ -47,7 +51,8 @@ DopplerToolConfig::serialize()
obj.setClass("DopplerToolConfig");

STORE(collapsed);
STORE(speed);
STORE(velocity);
STORE(accel);
STORE(bias);
STORE(enabled);

Expand All @@ -64,6 +69,7 @@ DopplerTool::DopplerTool(
{
ui->setupUi(this);

m_corrector = new ChirpCorrector();
assertConfig();

m_spectrum = mediator->getMainSpectrum();
Expand All @@ -75,19 +81,174 @@ DopplerTool::DopplerTool(

DopplerTool::~DopplerTool()
{
delete m_corrector;
delete ui;
}

void
DopplerTool::connectAll()
DopplerTool::setFromVelocity(qreal velocity)
{
SUFREQ freq = m_mediator->getCurrentCenterFreq();

// From the Doppler-Fizeau shift equation:
//
// c
// Δf = - --- Δv
// f
//

m_panelConfig->velocity = velocity;
m_currResetFreq = -DOPPLERTOOL_SPEED_OF_LIGHT / freq * velocity;

m_corrector->setResetFrequency(m_currResetFreq);
}

void
DopplerTool::setFromShift(qreal shift)
{
SUFREQ freq = m_mediator->getCurrentCenterFreq();

m_panelConfig->velocity = -freq / DOPPLERTOOL_SPEED_OF_LIGHT * shift;
m_currResetFreq = shift;

m_corrector->setResetFrequency(m_currResetFreq);
}

void
DopplerTool::setFromAccel(qreal accel)
{
SUFREQ freq = m_mediator->getCurrentCenterFreq();

// From the Doppler-Fizeau shift equation:
//
// c dΔf c dΔv c
// Δf = - --- Δv => ----- = - --- ----- = - --- a
// f dt f dt f
//

m_panelConfig->accel = accel;
m_currRate = -DOPPLERTOOL_SPEED_OF_LIGHT / freq * accel;
m_correctedRate = m_currRate + m_panelConfig->bias;

m_corrector->setChirpRate(m_correctedRate);
}

void
DopplerTool::setFromRate(qreal rate)
{
SUFREQ freq = m_mediator->getCurrentCenterFreq();

// See setFromAccel for details

m_panelConfig->accel = -freq / DOPPLERTOOL_SPEED_OF_LIGHT * rate;
m_currRate = rate;
m_correctedRate = rate + m_panelConfig->bias;

m_corrector->setChirpRate(m_correctedRate);
}

void
DopplerTool::connectAll()
{
connect(
m_mediator,
SIGNAL(frequencyChanged(qint64,qint64)),
this,
SLOT(onFrequencyChanged()));

connect(
ui->velSpinBox,
SIGNAL(valueChanged(double)),
this,
SLOT(onVelChanged()));

connect(
ui->accelSpinBox,
SIGNAL(valueChanged(double)),
this,
SLOT(onAccelChanged()));

connect(
ui->freqSpinBox,
SIGNAL(valueChanged(double)),
this,
SLOT(onShiftChanged()));

connect(
ui->freqRateSpinBox,
SIGNAL(valueChanged(double)),
this,
SLOT(onRateChanged()));

connect(
ui->rateBiasSpinBox,
SIGNAL(valueChanged(double)),
this,
SLOT(onBiasChanged()));

connect(
ui->resetButton,
SIGNAL(clicked(bool)),
this,
SLOT(onReset()));

connect(
ui->enableButton,
SIGNAL(toggled(bool)),
this,
SLOT(onToggleEnabled()));
}

void
DopplerTool::refreshUi()
{
bool prev = enterChangeState();

ui->velSpinBox->setValue(m_panelConfig->velocity);
ui->accelSpinBox->setValue(m_panelConfig->accel);

ui->freqSpinBox->setValue(m_currResetFreq);
ui->freqRateSpinBox->setValue(m_currRate);
ui->rateBiasSpinBox->setValue(m_panelConfig->bias);

ui->enableButton->setChecked(m_panelConfig->enabled);

leaveChangeState(prev);
}

void
DopplerTool::applySpectrumState()
{
setFromVelocity(m_panelConfig->velocity);
setFromAccel(m_panelConfig->accel);
refreshUi();
}

bool
DopplerTool::enterChangeState()
{
bool blocked;

blocked =
ui->freqSpinBox->blockSignals(true)
&& ui->freqRateSpinBox->blockSignals(true)
&& ui->rateBiasSpinBox->blockSignals(true)
&& ui->velSpinBox->blockSignals(true)
&& ui->accelSpinBox->blockSignals(true)
&& ui->enableButton->blockSignals(true);

return blocked;
}

void
DopplerTool::leaveChangeState(bool state)
{
ui->freqSpinBox->blockSignals(state);
ui->accelSpinBox->blockSignals(state);
ui->velSpinBox->blockSignals(state);
ui->freqRateSpinBox->blockSignals(state);
ui->rateBiasSpinBox->blockSignals(state);
ui->enableButton->blockSignals(state);
}

// Configuration methods
Expand All @@ -101,6 +262,12 @@ void
DopplerTool::applyConfig()
{
setProperty("collapsed", m_panelConfig->collapsed);

setFromVelocity(m_panelConfig->velocity);
setFromAccel(m_panelConfig->accel);

m_corrector->setEnabled(m_panelConfig->enabled);

refreshUi();
}

Expand All @@ -127,6 +294,8 @@ DopplerTool::setState(int, Suscan::Analyzer *analyzer)
if (analyzer != nullptr)
applySpectrumState();

m_corrector->setAnalyzer(m_analyzer);

refreshUi();
}

Expand Down Expand Up @@ -156,3 +325,57 @@ DopplerTool::setProfile(Suscan::Source::Config &)


////////////////////////////// Slots //////////////////////////////////////////
void
DopplerTool::onVelChanged()
{
setFromVelocity(ui->velSpinBox->value());
refreshUi();
}

void
DopplerTool::onAccelChanged()
{
setFromAccel(ui->accelSpinBox->value());
refreshUi();
}

void
DopplerTool::onShiftChanged()
{
setFromShift(ui->freqSpinBox->value());
refreshUi();
}

void
DopplerTool::onRateChanged()
{
setFromRate(ui->freqRateSpinBox->value());
refreshUi();
}

void
DopplerTool::onBiasChanged()
{
m_panelConfig->bias = ui->rateBiasSpinBox->value();
setFromAccel(m_panelConfig->accel);
refreshUi();
}

void
DopplerTool::onReset()
{
m_corrector->reset();
}

void
DopplerTool::onToggleEnabled()
{
m_panelConfig->enabled = ui->enableButton->isChecked();
m_corrector->setEnabled(m_panelConfig->enabled);
}

void
DopplerTool::onFrequencyChanged()
{
applySpectrumState();
}
Loading

0 comments on commit aa89355

Please sign in to comment.