- moved Interpolator out of big loop into tight processing loop

git-svn-id: http://moon:8086/svn/software/trunk/projects/mpsk_rx_gui@1000 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
2022-06-16 15:50:47 +00:00
parent ec0ffd4ee1
commit ea6a2279cb
2 changed files with 261 additions and 230 deletions
+58 -3
View File
@@ -271,6 +271,63 @@ 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;
bool is_time;
radio_float_t m_omega;
public:
TimingGeneratorGardner()
: Interpolation::TimingGenerator()
, filter(nullptr)
, coeff(nullptr)
{
STRGardnerInit(&m_SymbolTimingRevovery);
is_time = true;
}
virtual ~TimingGeneratorGardner() = default;
void reset()
{
LeadLagSetState(filter, 0);
}
void loopFilterSetup(lead_lag_filter_t *pFilter, lead_lag_coeff_t *pCoeff)
{
filter = pFilter;
coeff = pCoeff;
}
void setOmega(radio_float_t omega)
{
LeadLagInit(filter, omega);
m_omega = omega;
}
void 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);
}
is_time = not is_time;
update(m_omega);
}
};
class Receiver : public ReceiverInterface, public IDeFormatter, public Timer
{
public:
@@ -322,9 +379,7 @@ private:
lead_lag_filter_t m_loop_filter_cpr;
// Gardner Symbol Timing Recovery
str_t m_SymbolTimingRevovery;
timing_corrector_t m_timing_corrector;
radio_float_t m_Vc;
TimingGeneratorGardner m_timingGenerator;
// AGC
// Blind