Receiver::processBaseband: cleaned up variables, fixed dfe_off

This commit is contained in:
2022-07-03 12:13:21 +02:00
parent d64e491d54
commit 3c210da265
2 changed files with 41 additions and 53 deletions
+40 -52
View File
@@ -210,8 +210,6 @@ void Receiver::init()
m_dfe_off2.init(EQ_DFE_K); m_dfe_off2.init(EQ_DFE_K);
m_dfe_on2.init(EQ_DFE_K); m_dfe_on2.init(EQ_DFE_K);
m_dfe_e_cpx.real = m_dfe_e_cpx.imag = 0.f;
cmaReset(); cmaReset();
dfeReset(); dfeReset();
@@ -345,6 +343,9 @@ void Receiver::timerCallback()
{ {
m_statusListeners.call(&ReceiverStatusListener::receiverStatusChanged, this); m_statusListeners.call(&ReceiverStatusListener::receiverStatusChanged, this);
} }
printf("CMA\n");
cout << m_cma2.getWeights() << endl;
} }
void Receiver::processPassband(RVec const &rf, size_t len) void Receiver::processPassband(RVec const &rf, size_t len)
@@ -414,33 +415,22 @@ void Receiver::processBaseband(CVec const &iq, size_t len)
{ {
const ScopedLock sl (m_lock); const ScopedLock sl (m_lock);
static cpx_t IQ_hard_last; static ComplexScalar IQ_hard_last;
size_t n; size_t n;
static cpx_t IQ_mf = {0,0};
cpx_t IQ_agc = {0,0}; cpx_t IQ_agc = {0,0};
cpx_t IQ_cpr = {0,0}; radio_float_t e_agc;
cpx_t IQ_cma = {0,0};
cpx_t IQ_dfeOn = {0,0};
cpx_t IQ_dfeOff = {0,0};
cpx_t IQ_eq_in = {0,0};
cpx_t IQ_eq = {0,0};
cpx_t IQ_soft = {0,0};
cpx_t IQ_hard = {0,0};
radio_float_t e_cma; radio_float_t e_cma;
radio_float_t e_dfe_on; radio_float_t e_dfe_on;
radio_float_t e_dfe_off; radio_float_t e_dfe_off;
radio_float_t e_agc;
sym_err_t sym_err;
radio_float_t Vd; radio_float_t Vd;
radio_float_t vPfdCpr; radio_float_t vPfdCpr;
symbol_t sym;
map_t sym_cma; map_t sym_cma;
static map_t sym_dfe_off; static map_t sym_dfe_off_last;
m_buf_symerr.clear();
m_buf_symerr.clear();
if (!m_ReceiverEnable) if (!m_ReceiverEnable)
return; return;
@@ -510,55 +500,53 @@ void Receiver::processBaseband(CVec const &iq, size_t len)
// Carrier Derotator // Carrier Derotator
// @1 x symbolrate // @1 x symbolrate
// ----------------------------------------------------- // -----------------------------------------------------
IQ_cpr = toCpx(m_nco_cpr.mixComplexS(iq_mf, ComplexScalar(1,1))); ComplexScalar IQ_cpr = m_nco_cpr.mixComplexS(iq_mf, ComplexScalar(1,1));
m_nco_cpr.process(m_dOmega_vco, m_params.CPR_phase); m_nco_cpr.process(m_dOmega_vco, m_params.CPR_phase);
// Carrier Phase Recovery // Carrier Phase Recovery
if (m_params.cprState == cpr_state_acquisition) if (m_params.cprState == cpr_state_acquisition)
{ {
// Costas loop // Costas loop
vPfdCpr = PhaseErrQPSK(IQ_cpr); vPfdCpr = PhaseErrQPSK(toCpx(IQ_cpr));
} }
IQ_eq_in = IQ_cpr; ComplexScalar IQ_eq_in = IQ_cpr;
// ----------------------------------------------------- // -----------------------------------------------------
// Equalizer Process samples // Equalizer Process samples
// @1 x symbolrate // @1 x symbolrate
// ----------------------------------------------------- // -----------------------------------------------------
ComplexScalar __IQ_cma; ComplexScalar IQ_cma = ComplexScalar(0,0);
ComplexScalar __IQ_dfeOn; ComplexScalar IQ_dfeOn = ComplexScalar(0,0);
IQ_eq = IQ_eq_in; ComplexScalar IQ_eq = IQ_eq_in;
if (m_params.eq_mode == eq_mode_cma) if (m_params.eq_mode == eq_mode_cma)
{ {
__IQ_cma = m_cma2.process(toComplexScalar(IQ_eq_in)); IQ_cma = m_cma2.process(IQ_eq_in);
IQ_cma = toCpx(__IQ_cma);
IQ_eq = IQ_cma; IQ_eq = IQ_cma;
} }
if (m_params.eq_mode == eq_mode_dfe) if (m_params.eq_mode == eq_mode_dfe)
{ {
__IQ_dfeOn = m_dfe_on2.process(toComplexScalar(IQ_eq_in), toComplexScalar(IQ_hard_last)); IQ_dfeOn = m_dfe_on2.process(IQ_eq_in, IQ_hard_last);
IQ_dfeOn = toCpx(__IQ_dfeOn);
IQ_eq = IQ_dfeOn; IQ_eq = IQ_dfeOn;
} }
IQ_soft = IQ_eq; ComplexScalar IQ_soft = IQ_eq;
// ----------------------------------------------------- // -----------------------------------------------------
// Peak-Amplitude Tracker // Peak-Amplitude Tracker
// @1 x symbolrate // @1 x symbolrate
// ----------------------------------------------------- // -----------------------------------------------------
m_tracker.process(toComplexScalar(IQ_soft)); m_tracker.process(IQ_soft);
// ----------------------------------------------------- // -----------------------------------------------------
// Map sympol // Map sympol
// @1 x symbolrate // @1 x symbolrate
// ----------------------------------------------------- // -----------------------------------------------------
sym = SymMapDemap(m_pSymMapper, IQ_soft); symbol_t sym = SymMapDemap(m_pSymMapper, toCpx(IQ_soft));
sym_err = SymMapGetError(m_pSymMapper, IQ_soft, sym); sym_err_t sym_err = SymMapGetError(m_pSymMapper, toCpx(IQ_soft), sym);
IQ_hard = sym_err.hard_sym; ComplexScalar IQ_hard = toComplexScalar(sym_err.hard_sym);
// Carrier Phase Recovery // Carrier Phase Recovery
if (m_params.cprState == cpr_state_track) if (m_params.cprState == cpr_state_track)
@@ -581,51 +569,51 @@ void Receiver::processBaseband(CVec const &iq, size_t len)
// Equalizer Training // Equalizer Training
// @1 x symbolrate // @1 x symbolrate
// ----------------------------------------------------- // -----------------------------------------------------
sym_cma = SymMapGetSymbolInfo(m_pSymMapper, SymMapDemap(m_pSymMapper, IQ_cma)); sym_cma = SymMapGetSymbolInfo(m_pSymMapper, SymMapDemap(m_pSymMapper, toCpx(IQ_cma)));
if (m_params.cmaMode == cma_mode_training_enabled) if (m_params.cmaMode == cma_mode_training_enabled)
{ {
if (m_params.cmaType == cma_type_cma) if (m_params.cmaType == cma_type_cma)
{ {
// CMA: Train // CMA: Train
m_cma2.trainGodard(__IQ_cma, CpxMagS(sym_cma.rect), m_pSymMapper->R2_cma, m_params.eqMuCma); m_cma2.trainGodard(IQ_cma, CpxMagS(sym_cma.rect), m_pSymMapper->R2_cma, m_params.eqMuCma);
} }
if (m_params.cmaType == cma_type_mma) if (m_params.cmaType == cma_type_mma)
{ {
// MMA: Train // MMA: Train
m_cma2.trainMma(__IQ_cma, toComplexScalar(m_pSymMapper->R_mma), m_params.eqMuCma); m_cma2.trainMma(IQ_cma, toComplexScalar(m_pSymMapper->R_mma), m_params.eqMuCma);
} }
if (m_params.cmaType == cma_type_smma) if (m_params.cmaType == cma_type_smma)
{ {
// S-MMA: Train // S-MMA: Train
m_cma2.trainSmma(__IQ_cma, CpxMagS(sym_cma.rect), toComplexScalar(m_pSymMapper->R_smma), m_params.eqMuCma); m_cma2.trainSmma(IQ_cma, CpxMagS(sym_cma.rect), toComplexScalar(m_pSymMapper->R_smma), m_params.eqMuCma);
} }
} }
if (m_params.dfeMode == dfe_mode_training_enabled) if (m_params.dfeMode == dfe_mode_training_enabled)
{ {
// DFE: LMS Update coefficients // DFE: LMS Update coefficients
m_dfe_off2.train(toComplexScalar(m_dfe_e_cpx), m_params.eqMuDfe); m_dfe_off2.train(m_dfe_off_e, m_params.eqMuDfe);
// DFE: Calc offline response // DFE: Calc offline response
ComplexScalar __IQ_dfeOff = m_dfe_off2.process(toComplexScalar(IQ_eq_in), toComplexScalar(sym_dfe_off.rect)); ComplexScalar dfe_off_iq_soft = m_dfe_off2.process(IQ_eq_in, toComplexScalar(sym_dfe_off_last.rect));
IQ_dfeOff = toCpx(__IQ_dfeOff);
sym_dfe_off = SymMapGetSymbolInfo(m_pSymMapper, SymMapDemap(m_pSymMapper, IQ_soft));
// DFE: Calculate current error // DFE: Calculate current error
ComplexScalar __dfe_e_cpx = toComplexScalar(sym_dfe_off.rect) - __IQ_dfeOff; symbol_t def_off_sym = SymMapDemap(m_pSymMapper, toCpx(dfe_off_iq_soft));
m_dfe_e_cpx = toCpx(__dfe_e_cpx); map_t sym_dfe_off = SymMapGetSymbolInfo(m_pSymMapper, def_off_sym);
m_dfe_off_e = toComplexScalar(sym_dfe_off.rect) - dfe_off_iq_soft;
// DFE-Offline
e_dfe_off = abs(m_dfe_off_e);
} }
// Calculate current error // Calculate current error
// CMA // CMA
e_cma = CpxMagS(CpxSubS(sym_cma.rect, IQ_cma)); e_cma = abs(toComplexScalar(sym_cma.rect) - IQ_cma);
// DFE-Offline
e_dfe_off = CpxMagS(m_dfe_e_cpx);
// DFE-Online // DFE-Online
e_dfe_on = CpxMagS(CpxSubS(IQ_hard, IQ_dfeOn)); e_dfe_on = abs(IQ_hard - IQ_dfeOn);
// ----------------------------------------------------- // -----------------------------------------------------
// Update IQ_H // Update IQ_H
@@ -648,8 +636,8 @@ void Receiver::processBaseband(CVec const &iq, size_t len)
#ifndef DISABLE_UNUSED_STATISTICS #ifndef DISABLE_UNUSED_STATISTICS
SlidingVarProcess(&m_statistics.I_MF, IQ_mf.real); SlidingVarProcess(&m_statistics.I_MF, IQ_mf.real);
SlidingVarProcess(&m_statistics.Q_MF, IQ_mf.imag); SlidingVarProcess(&m_statistics.Q_MF, IQ_mf.imag);
SlidingVarProcess(&m_statistics.I_CPR, IQ_cpr.real); SlidingVarProcess(&m_statistics.I_CPR, IQ_cpr.real());
SlidingVarProcess(&m_statistics.Q_CPR, IQ_cpr.imag); SlidingVarProcess(&m_statistics.Q_CPR, IQ_cpr.imag());
SlidingVarProcess(&m_statistics.I_AGC, IQ_agc.real); SlidingVarProcess(&m_statistics.I_AGC, IQ_agc.real);
SlidingVarProcess(&m_statistics.Q_AGC, IQ_agc.imag); SlidingVarProcess(&m_statistics.Q_AGC, IQ_agc.imag);
SlidingVarProcess(&m_statistics.I_decision, IQ_hard.real); SlidingVarProcess(&m_statistics.I_decision, IQ_hard.real);
@@ -657,11 +645,11 @@ void Receiver::processBaseband(CVec const &iq, size_t len)
SlidingVarProcess(&m_statistics.MagDecision, sym_err.hard_mag); SlidingVarProcess(&m_statistics.MagDecision, sym_err.hard_mag);
SlidingVarProcess(&m_statistics.PhiDecision, sym_err.hard_phi); SlidingVarProcess(&m_statistics.PhiDecision, sym_err.hard_phi);
#endif #endif
SlidingVarProcess(&m_statistics.I_EQ, IQ_eq.real); SlidingVarProcess(&m_statistics.I_EQ, IQ_eq.real());
SlidingVarProcess(&m_statistics.Q_EQ, IQ_eq.imag); SlidingVarProcess(&m_statistics.Q_EQ, IQ_eq.imag());
SlidingVarProcess(&m_statistics.sym_err_mag, sym_err.err_mag); SlidingVarProcess(&m_statistics.sym_err_mag, sym_err.err_mag);
SlidingVarProcess(&m_statistics.sym_err_phi, sym_err.err_phi*(radio_float_t)(1.0/PI)); SlidingVarProcess(&m_statistics.sym_err_phi, sym_err.err_phi*(radio_float_t)(1.0/PI));
SlidingVarProcess(&m_statistics.noise, CpxMagS(CpxSubS(IQ_hard, IQ_soft))); SlidingVarProcess(&m_statistics.noise, abs(IQ_hard - IQ_soft));
SlidingVarProcess(&m_statistics.noise_str, LeadLagGetState(&m_loop_filter_str)); SlidingVarProcess(&m_statistics.noise_str, LeadLagGetState(&m_loop_filter_str));
SlidingVarProcess(&m_statistics.noise_cpr, LeadLagGetState(&m_loop_filter_cpr)); SlidingVarProcess(&m_statistics.noise_cpr, LeadLagGetState(&m_loop_filter_cpr));
SlidingVarProcess(&m_statistics.noise_cma, e_cma); SlidingVarProcess(&m_statistics.noise_cma, e_cma);
+1 -1
View File
@@ -385,7 +385,7 @@ private:
Equalizer::Dfe m_dfe_on2; Equalizer::Dfe m_dfe_on2;
Equalizer::Dfe m_dfe_off2; Equalizer::Dfe m_dfe_off2;
cpx_t m_dfe_e_cpx; ComplexScalar m_dfe_off_e;
// Blind EQ // Blind EQ
Equalizer::Cma m_cma2; Equalizer::Cma m_cma2;