- 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:
+20
-10
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user