From 5a92b9af7606ca5f0c83563ccba29b4235b57ac5 Mon Sep 17 00:00:00 2001 From: jens Date: Fri, 8 Jul 2022 14:39:06 +0200 Subject: [PATCH] Refactored --- Source/Makefile | 1 + Source/Receiver.cpp | 8 ++-- Source/Receiver.hpp | 63 +------------------------------ Source/TimingGeneratorGardner.cpp | 51 +++++++++++++++++++++++++ Source/TimingGeneratorGardner.hpp | 40 ++++++++++++++++++++ 5 files changed, 97 insertions(+), 66 deletions(-) create mode 100644 Source/TimingGeneratorGardner.cpp create mode 100644 Source/TimingGeneratorGardner.hpp diff --git a/Source/Makefile b/Source/Makefile index c3bff40..9c6b484 100644 --- a/Source/Makefile +++ b/Source/Makefile @@ -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 diff --git a/Source/Receiver.cpp b/Source/Receiver.cpp index e76e0ad..795de08 100644 --- a/Source/Receiver.cpp +++ b/Source/Receiver.cpp @@ -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 diff --git a/Source/Receiver.hpp b/Source/Receiver.hpp index 775db2d..789ebd1 100644 --- a/Source/Receiver.hpp +++ b/Source/Receiver.hpp @@ -11,6 +11,7 @@ #include #include "LogComponent.h" #include "FrameReceiver.hpp" +#include "TimingGeneratorGardner.hpp" #include #include @@ -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: diff --git a/Source/TimingGeneratorGardner.cpp b/Source/TimingGeneratorGardner.cpp new file mode 100644 index 0000000..05ed0b3 --- /dev/null +++ b/Source/TimingGeneratorGardner.cpp @@ -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 diff --git a/Source/TimingGeneratorGardner.hpp b/Source/TimingGeneratorGardner.hpp new file mode 100644 index 0000000..04ee71c --- /dev/null +++ b/Source/TimingGeneratorGardner.hpp @@ -0,0 +1,40 @@ +#ifndef TIMINGGENERATORGARDNER_HPP +#define TIMINGGENERATORGARDNER_HPP + +#pragma once + +#include +#include +#include + +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 \ No newline at end of file