From d7f5f09cb863d42d244b017baef04f6bf4c502f9 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Wed, 9 Jan 2019 10:32:32 +0000 Subject: [PATCH] - use time constant for DC calculation - use time constant for Min/Max calculation - added AGC git-svn-id: http://moon:8086/svn/software/trunk/projects/GnuRadio@394 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- gr-jay/lib/garage_impl.cc | 30 ++++++++++++++++++++---------- gr-jay/lib/garage_impl.h | 1 + 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/gr-jay/lib/garage_impl.cc b/gr-jay/lib/garage_impl.cc index 7232ef0..4396e55 100644 --- a/gr-jay/lib/garage_impl.cc +++ b/gr-jay/lib/garage_impl.cc @@ -56,6 +56,7 @@ garage_impl::garage_impl(int sampleRate, int samplesPerSym, float kLoopFilter, f , m_vmax(0) , m_v_sig(0) , m_dc_corr(0) +, m_agc_gain(1.0f) , m_lag_accu(0) , m_id_accu(0) , m_id_bit(0) @@ -118,14 +119,19 @@ int garage_impl::general_work (int noutput_items, gr_vector_int &ninput_items, g // Do <+signal processing+> int countReload = m_samplesPerSym-1; - float alpha_thr = 0.002f; - float hyst_thr = 0.1f; + const float alpha_thr = 0.01f; + const float alpha_dc = 0.002f; + const float hyst_thr = 0.1f; + const float agc_mu = 0.01f; + const float agc_target = 0.5f; + const float agc_gain_max = 10.0f; + const float k_lead = 1.0e-1f; + const float k_lag = 1.0e-4f; + const float rho_leak = 0.9999; + + float err = 0; float k_leadLag = m_kLoopFilter; float loopThreshold = m_kThreshold; - float k_lead = 1.0e-1f; - float k_lag = 1.0e-4f; - float rho_leak = 0.9999; - float err = 0; float alpha_sig = 0.5f/m_samplesPerSym; @@ -134,22 +140,26 @@ int garage_impl::general_work (int noutput_items, gr_vector_int &ninput_items, g { // Get next interpolated sample float i_f = m_i - (float)i_i; - float y = (1.f-i_f)*in[i_i] + i_f*in[i_i+1] - m_dc_corr; + float y = m_agc_gain * ((1.f-i_f)*in[i_i] + i_f*in[i_i+1] - m_dc_corr); // Calculate threshold m_vmin *= rho; m_vmax *= rho; if (y < m_vmin) { - m_vmin = y; + m_vmin = (1-alpha_thr)*m_vmin + alpha_thr*y; } else if (y > m_vmax) { - m_vmax = y; + m_vmax = (1-alpha_thr)*m_vmax + alpha_thr*y; } + // AGC + float agc_err = m_vmax - agc_target; + m_agc_gain = std::max(0.0f, std::min(agc_gain_max, m_agc_gain - agc_mu*agc_err)); + // Calculate DC offset correction - m_dc_corr += alpha_thr*(m_vmax + m_vmin); + m_dc_corr = (1-alpha_dc)*m_dc_corr + alpha_dc*(m_vmax + m_vmin); // Signal detection float yd = std::abs(y)-m_vmax; diff --git a/gr-jay/lib/garage_impl.h b/gr-jay/lib/garage_impl.h index cde8dcb..9fe1cc9 100644 --- a/gr-jay/lib/garage_impl.h +++ b/gr-jay/lib/garage_impl.h @@ -42,6 +42,7 @@ class garage_impl : public garage float m_vmax; float m_v_sig; float m_dc_corr; + float m_agc_gain; float m_lag_accu; float m_id_accu; int m_id_bit;