Refactored

This commit is contained in:
2022-07-08 14:39:06 +02:00
parent 1b9a4caefb
commit 5a92b9af76
5 changed files with 97 additions and 66 deletions
+1
View File
@@ -6,6 +6,7 @@ NAME := Source
CXX_SRCS := GraphComponent.cpp
CXX_SRCS += LogComponent.cpp
CXX_SRCS += Receiver.cpp
CXX_SRCS += TimingGeneratorGardner.cpp
CXX_SRCS += FrameReceiver.cpp
CXX_SRCS += Transmitter.cpp
CXX_SRCS += ControlComponent.cpp
+4 -4
View File
@@ -638,14 +638,14 @@ void Receiver::processBaseband(CVec const &iq, size_t len)
// Statistics
#ifndef DISABLE_UNUSED_STATISTICS
SlidingVarProcess(&m_statistics.I_MF, IQ_mf.real);
SlidingVarProcess(&m_statistics.Q_MF, IQ_mf.imag);
SlidingVarProcess(&m_statistics.I_MF, IQ_mf.real());
SlidingVarProcess(&m_statistics.Q_MF, IQ_mf.imag());
SlidingVarProcess(&m_statistics.I_CPR, IQ_cpr.real());
SlidingVarProcess(&m_statistics.Q_CPR, IQ_cpr.imag());
SlidingVarProcess(&m_statistics.I_AGC, IQ_agc.real);
SlidingVarProcess(&m_statistics.Q_AGC, IQ_agc.imag);
SlidingVarProcess(&m_statistics.I_decision, IQ_hard.real);
SlidingVarProcess(&m_statistics.Q_decision, IQ_hard.imag);
SlidingVarProcess(&m_statistics.I_decision, IQ_hard.real());
SlidingVarProcess(&m_statistics.Q_decision, IQ_hard.imag());
SlidingVarProcess(&m_statistics.MagDecision, sym_err.hard_mag);
SlidingVarProcess(&m_statistics.PhiDecision, sym_err.hard_phi);
#endif
+1 -62
View File
@@ -11,6 +11,7 @@
#include <JuceHeader.h>
#include "LogComponent.h"
#include "FrameReceiver.hpp"
#include "TimingGeneratorGardner.hpp"
#include <cpp/radio/Vector.hpp>
#include <cpp/radio/FirComplex.hpp>
@@ -274,68 +275,6 @@ public:
virtual void receiverDataChanged(Receiver *pObj) = 0;
};
// Symbol timing recovery
class TimingGeneratorGardner : public Interpolation::TimingGenerator
{
// Loop-Filter
lead_lag_filter_t *filter;
lead_lag_coeff_t *coeff;
// Gardner Symbol Timing Recovery
str_t m_SymbolTimingRevovery;
sl_var_t sl_var;
bool is_time;
radio_float_t m_omega;
public:
TimingGeneratorGardner()
: Interpolation::TimingGenerator()
, filter(nullptr)
, coeff(nullptr)
, is_time(true)
{
STRGardnerInit(&m_SymbolTimingRevovery);
SlidingVarInit(&sl_var, 12000, 12000);
}
virtual ~TimingGeneratorGardner() = default;
void reset()
{
LeadLagInit(filter, 0.00);
}
void loopFilterSetup(lead_lag_filter_t *pFilter, lead_lag_coeff_t *pCoeff)
{
filter = pFilter;
coeff = pCoeff;
}
bool process(ComplexScalar const &iq)
{
// @2 x symbolrate
// Symbol timing recovery
radio_float_t vd = STRGardnerProcess(&m_SymbolTimingRevovery, toCpx(iq));
if (is_time)
{
// @1 x symbolrate
m_omega = LeadLagProcess(filter, coeff, vd);
SlidingVarProcess(&sl_var, getMu());
}
is_time = not is_time;
update(m_omega);
return not is_time;
}
radio_float_t getMuVar()
{
return SlidingVarGet(&sl_var);
}
};
class Receiver : public ReceiverInterface, public Timer
{
public:
+51
View File
@@ -0,0 +1,51 @@
#include "TimingGeneratorGardner.hpp"
namespace Radio
{
TimingGeneratorGardner::TimingGeneratorGardner()
: Interpolation::TimingGenerator()
, filter(nullptr)
, coeff(nullptr)
, is_time(true)
{
STRGardnerInit(&m_SymbolTimingRevovery);
SlidingVarInit(&sl_var, 12000, 12000);
}
void TimingGeneratorGardner::reset()
{
LeadLagInit(filter, 0.00);
}
void TimingGeneratorGardner::loopFilterSetup(lead_lag_filter_t *pFilter, lead_lag_coeff_t *pCoeff)
{
filter = pFilter;
coeff = pCoeff;
}
bool TimingGeneratorGardner::process(ComplexScalar const &iq)
{
// @2 x symbolrate
// Symbol timing recovery
radio_float_t vd = STRGardnerProcess(&m_SymbolTimingRevovery, toCpx(iq));
if (is_time)
{
// @1 x symbolrate
m_omega = LeadLagProcess(filter, coeff, vd);
SlidingVarProcess(&sl_var, getMu());
}
is_time = not is_time;
update(m_omega);
return not is_time;
}
radio_float_t TimingGeneratorGardner::getMuVar()
{
return SlidingVarGet(&sl_var);
}
} // Radio
+40
View File
@@ -0,0 +1,40 @@
#ifndef TIMINGGENERATORGARDNER_HPP
#define TIMINGGENERATORGARDNER_HPP
#pragma once
#include <cpp/radio/interpolation/TimingGenerator.hpp>
#include <radio/synchronization.h>
#include <radio/statistics.h>
namespace Radio
{
// Symbol timing recovery
class TimingGeneratorGardner : public Interpolation::TimingGenerator
{
public:
TimingGeneratorGardner();
virtual ~TimingGeneratorGardner() = default;
void reset();
void loopFilterSetup(lead_lag_filter_t *pFilter, lead_lag_coeff_t *pCoeff);
bool process(ComplexScalar const &iq);
radio_float_t getMuVar();
private:
// Loop-Filter
lead_lag_filter_t *filter;
lead_lag_coeff_t *coeff;
// Gardner Symbol Timing Recovery
str_t m_SymbolTimingRevovery;
sl_var_t sl_var;
bool is_time;
radio_float_t m_omega;
};
} // Radio
#endif // TIMINGGENERATORGARDNER_HPP