[Top][All Lists]
[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r3639 - gnuradio/branches/developers/eb/digital-wip/gnuradio-core/src/lib/general,
eb <=