From 3c210da2654c9ad933b49fb9025b900cee53f0b6 Mon Sep 17 00:00:00 2001 From: jens Date: Sun, 3 Jul 2022 12:13:21 +0200 Subject: [PATCH] Receiver::processBaseband: cleaned up variables, fixed dfe_off --- Source/Receiver.cpp | 92 ++++++++++++++++++++------------------------- Source/Receiver.hpp | 2 +- 2 files changed, 41 insertions(+), 53 deletions(-) diff --git a/Source/Receiver.cpp b/Source/Receiver.cpp index 1ed20ee..15f9998 100644 --- a/Source/Receiver.cpp +++ b/Source/Receiver.cpp @@ -210,8 +210,6 @@ void Receiver::init() m_dfe_off2.init(EQ_DFE_K); m_dfe_on2.init(EQ_DFE_K); - m_dfe_e_cpx.real = m_dfe_e_cpx.imag = 0.f; - cmaReset(); dfeReset(); @@ -345,6 +343,9 @@ void Receiver::timerCallback() { m_statusListeners.call(&ReceiverStatusListener::receiverStatusChanged, this); } + + printf("CMA\n"); + cout << m_cma2.getWeights() << endl; } 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); - static cpx_t IQ_hard_last; + static ComplexScalar IQ_hard_last; size_t n; - static cpx_t IQ_mf = {0,0}; cpx_t IQ_agc = {0,0}; - cpx_t IQ_cpr = {0,0}; - 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_agc; radio_float_t e_cma; radio_float_t e_dfe_on; radio_float_t e_dfe_off; - radio_float_t e_agc; - sym_err_t sym_err; radio_float_t Vd; radio_float_t vPfdCpr; - symbol_t sym; map_t sym_cma; - static map_t sym_dfe_off; - m_buf_symerr.clear(); + static map_t sym_dfe_off_last; + m_buf_symerr.clear(); if (!m_ReceiverEnable) return; @@ -510,55 +500,53 @@ void Receiver::processBaseband(CVec const &iq, size_t len) // Carrier Derotator // @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); // Carrier Phase Recovery if (m_params.cprState == cpr_state_acquisition) { // 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 // @1 x symbolrate // ----------------------------------------------------- - ComplexScalar __IQ_cma; - ComplexScalar __IQ_dfeOn; + ComplexScalar IQ_cma = ComplexScalar(0,0); + 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) { - __IQ_cma = m_cma2.process(toComplexScalar(IQ_eq_in)); - IQ_cma = toCpx(__IQ_cma); + IQ_cma = m_cma2.process(IQ_eq_in); IQ_eq = IQ_cma; } if (m_params.eq_mode == eq_mode_dfe) { - __IQ_dfeOn = m_dfe_on2.process(toComplexScalar(IQ_eq_in), toComplexScalar(IQ_hard_last)); - IQ_dfeOn = toCpx(__IQ_dfeOn); + IQ_dfeOn = m_dfe_on2.process(IQ_eq_in, IQ_hard_last); IQ_eq = IQ_dfeOn; } - IQ_soft = IQ_eq; + ComplexScalar IQ_soft = IQ_eq; // ----------------------------------------------------- // Peak-Amplitude Tracker // @1 x symbolrate // ----------------------------------------------------- - m_tracker.process(toComplexScalar(IQ_soft)); + m_tracker.process(IQ_soft); // ----------------------------------------------------- // Map sympol // @1 x symbolrate // ----------------------------------------------------- - sym = SymMapDemap(m_pSymMapper, IQ_soft); - sym_err = SymMapGetError(m_pSymMapper, IQ_soft, sym); - IQ_hard = sym_err.hard_sym; + symbol_t sym = SymMapDemap(m_pSymMapper, toCpx(IQ_soft)); + sym_err_t sym_err = SymMapGetError(m_pSymMapper, toCpx(IQ_soft), sym); + ComplexScalar IQ_hard = toComplexScalar(sym_err.hard_sym); // Carrier Phase Recovery if (m_params.cprState == cpr_state_track) @@ -581,51 +569,51 @@ void Receiver::processBaseband(CVec const &iq, size_t len) // Equalizer Training // @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.cmaType == cma_type_cma) { // 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) { // 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) { // 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) { // 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 - ComplexScalar __IQ_dfeOff = m_dfe_off2.process(toComplexScalar(IQ_eq_in), toComplexScalar(sym_dfe_off.rect)); - IQ_dfeOff = toCpx(__IQ_dfeOff); + ComplexScalar dfe_off_iq_soft = m_dfe_off2.process(IQ_eq_in, toComplexScalar(sym_dfe_off_last.rect)); - sym_dfe_off = SymMapGetSymbolInfo(m_pSymMapper, SymMapDemap(m_pSymMapper, IQ_soft)); - // DFE: Calculate current error - ComplexScalar __dfe_e_cpx = toComplexScalar(sym_dfe_off.rect) - __IQ_dfeOff; - m_dfe_e_cpx = toCpx(__dfe_e_cpx); + symbol_t def_off_sym = SymMapDemap(m_pSymMapper, toCpx(dfe_off_iq_soft)); + 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 // 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 - e_dfe_on = CpxMagS(CpxSubS(IQ_hard, IQ_dfeOn)); + e_dfe_on = abs(IQ_hard - IQ_dfeOn); + // ----------------------------------------------------- // Update IQ_H @@ -648,8 +636,8 @@ void Receiver::processBaseband(CVec const &iq, size_t len) #ifndef DISABLE_UNUSED_STATISTICS 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_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); @@ -657,11 +645,11 @@ void Receiver::processBaseband(CVec const &iq, size_t len) SlidingVarProcess(&m_statistics.MagDecision, sym_err.hard_mag); SlidingVarProcess(&m_statistics.PhiDecision, sym_err.hard_phi); #endif - SlidingVarProcess(&m_statistics.I_EQ, IQ_eq.real); - SlidingVarProcess(&m_statistics.Q_EQ, IQ_eq.imag); + SlidingVarProcess(&m_statistics.I_EQ, IQ_eq.real()); + SlidingVarProcess(&m_statistics.Q_EQ, IQ_eq.imag()); 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.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_cpr, LeadLagGetState(&m_loop_filter_cpr)); SlidingVarProcess(&m_statistics.noise_cma, e_cma); diff --git a/Source/Receiver.hpp b/Source/Receiver.hpp index 03269cb..2686036 100644 --- a/Source/Receiver.hpp +++ b/Source/Receiver.hpp @@ -385,7 +385,7 @@ private: Equalizer::Dfe m_dfe_on2; Equalizer::Dfe m_dfe_off2; - cpx_t m_dfe_e_cpx; + ComplexScalar m_dfe_off_e; // Blind EQ Equalizer::Cma m_cma2;