- 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
This commit is contained in:
2019-01-09 10:32:32 +00:00
parent 3f42be1d5d
commit d7f5f09cb8
2 changed files with 21 additions and 10 deletions
+20 -10
View File
@@ -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;
+1
View File
@@ -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;