commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r3639 - gnuradio/branches/developers/eb/digital-wip/gn


From: eb
Subject: [Commit-gnuradio] r3639 - gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general
Date: Mon, 25 Sep 2006 15:07:32 -0600 (MDT)

Author: eb
Date: 2006-09-25 15:07:31 -0600 (Mon, 25 Sep 2006)
New Revision: 3639

Modified:
   
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general/gr_feedforward_agc_cc.cc
   
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general/gr_feedforward_agc_cc.h
Log:
Now derives gain from max envelope across window


Modified: 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general/gr_feedforward_agc_cc.cc
===================================================================
--- 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general/gr_feedforward_agc_cc.cc
  2006-09-25 20:17:55 UTC (rev 3638)
+++ 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general/gr_feedforward_agc_cc.cc
  2006-09-25 21:07:31 UTC (rev 3639)
@@ -38,13 +38,11 @@
   : gr_sync_block ("gr_feedforward_agc_cc",
                   gr_make_io_signature (1, 1, sizeof (gr_complex)),
                   gr_make_io_signature (1, 1, sizeof (gr_complex))),
-    d_nsamples(nsamples), d_reference(reference),
-    d_sum_squares(0)
+    d_nsamples(nsamples), d_reference(reference)
 {
   if (nsamples < 1)
     throw std::invalid_argument("gr_feedforward_agc_cc: nsamples must be >= 
1");
   
-  d_1_over_nsamples = 1.0 / nsamples;
   set_history(nsamples);
 }
 
@@ -58,6 +56,19 @@
   return x.real() * x.real() + x.imag() * x.imag();
 }
 
+// approximate sqrt(x^2 + y^2)
+inline static float
+envelope(gr_complex x)
+{
+  float r_abs = std::fabs(x.real());
+  float i_abs = std::fabs(x.imag());
+
+  if (r_abs > i_abs)
+    return r_abs + 0.4 * i_abs;
+  else
+    return i_abs + 0.4 * r_abs;
+}
+
 int
 gr_feedforward_agc_cc::work(int noutput_items,
                            gr_vector_const_void_star &input_items,
@@ -69,16 +80,12 @@
   float gain;
   
   for (int i = 0; i < noutput_items; i++){
-    if (d_sum_squares < 1e-24) // call it zero
-      gain = d_reference / sqrt(1e-24 * d_1_over_nsamples);
-    else
-      gain = d_reference / sqrt(d_sum_squares * d_1_over_nsamples);
-
+    //float max_env = 1e-12;   // avoid divide by zero
+    float max_env = 1e-3;      // avoid divide by zero
+    for (int j = 0; j < nsamples; j++)
+      max_env = std::max(max_env, envelope(in[i+j]));
+    gain = d_reference / max_env;
     out[i] = gain * in[i];
-
-    // now end-adjust our sum of squares
-    d_sum_squares -= mag_squared(in[i]);         // subtract off current value
-    d_sum_squares += mag_squared(in[i+nsamples]); // add in new one
   }
   return noutput_items;
 }

Modified: 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general/gr_feedforward_agc_cc.h
===================================================================
--- 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general/gr_feedforward_agc_cc.h
   2006-09-25 20:17:55 UTC (rev 3638)
+++ 
gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general/gr_feedforward_agc_cc.h
   2006-09-25 21:07:31 UTC (rev 3639)
@@ -32,7 +32,7 @@
 gr_make_feedforward_agc_cc(int nsamples, float reference = 1.0);
 
 /*!
- * \brief Non-causal AGC which computes required gain based on RMS over 
nsamples
+ * \brief Non-causal AGC which computes required gain based on max absolute 
value over nsamples
  */
 class gr_feedforward_agc_cc : public gr_sync_block
 {
@@ -41,8 +41,6 @@
   
   int          d_nsamples;
   float                d_reference;
-  float                d_sum_squares;
-  float                d_1_over_nsamples;
 
   gr_feedforward_agc_cc(int nsamples, float reference);
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]