commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r3485 - in gnuradio/branches/developers/jcorgan/pager/


From: jcorgan
Subject: [Commit-gnuradio] r3485 - in gnuradio/branches/developers/jcorgan/pager/gr-pager/src: lib python
Date: Mon, 4 Sep 2006 15:02:16 -0600 (MDT)

Author: jcorgan
Date: 2006-09-04 15:02:16 -0600 (Mon, 04 Sep 2006)
New Revision: 3485

Modified:
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager.i
   
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager_slicer_ff.cc
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager_slicer_ff.h
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/python/flex_demod.py
Log:
Improved slicer with separate attack, decay constants.


Modified: gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager.i
===================================================================
--- gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager.i 
2006-09-04 17:17:12 UTC (rev 3484)
+++ gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager.i 
2006-09-04 21:02:16 UTC (rev 3485)
@@ -33,7 +33,7 @@
 
 GR_SWIG_BLOCK_MAGIC(pager,slicer_ff);
 
-pager_slicer_ff_sptr pager_make_slicer_ff(float alpha);
+pager_slicer_ff_sptr pager_make_slicer_ff(float alpha, float beta);
 
 class pager_slicer_ff : public gr_sync_block
 {

Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager_slicer_ff.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager_slicer_ff.cc  
    2006-09-04 17:17:12 UTC (rev 3484)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager_slicer_ff.cc  
    2006-09-04 21:02:16 UTC (rev 3485)
@@ -26,46 +26,67 @@
 #include <pager_slicer_ff.h>
 #include <gr_io_signature.h>
 
-pager_slicer_ff_sptr pager_make_slicer_ff(float alpha)
+pager_slicer_ff_sptr pager_make_slicer_ff(float alpha, float beta)
 {
-    return pager_slicer_ff_sptr(new pager_slicer_ff(alpha));
+    return pager_slicer_ff_sptr(new pager_slicer_ff(alpha, beta));
 }
 
-pager_slicer_ff::pager_slicer_ff(float alpha) :
+pager_slicer_ff::pager_slicer_ff(float alpha, float beta) :
     gr_sync_block ("slicer_ff",
                    gr_make_io_signature (1, 1, sizeof(float)),
                    gr_make_io_signature (1, 1, sizeof(float)))
 {
     d_alpha = alpha;
-    d_max = 0.5;
+    d_beta = beta;
+    d_max = 0.0;
+    d_hi = 0.0;
     d_avg = 0.0;
-    d_min = -0.5;
+    d_lo = 0.0;
+    d_min = 0.0;
 }
 
+// Tracks average, minimum, and peak, then converts input into one of:
+//
+// [-1.0, -0.333, 0.333, 1.0]
 float pager_slicer_ff::slice(float sample)
 {
     float result = 0.0;
-    d_avg = d_avg*(1-d_alpha)+sample*d_alpha;
 
-    if (sample > (d_max-d_avg)*2.0/3.0) {        // In max region
-        result = 1.0;
-        d_max = d_max*(1-d_alpha)+sample*d_alpha;
-    } else if (sample > d_avg) {
-        result = 1.0/3.0;
-    } else if (sample < (d_min-d_avg)*2.0/3.0) { // In min region
-        result = -1.0;
-        d_min = d_min*(1-d_alpha)+sample*d_alpha;
-    } else {
-        result = -1.0/3.0;
+    // Update DC level and remove
+    d_avg = d_avg*(1.0-d_alpha)+sample*d_alpha;
+    sample -= d_avg;
+
+    if (sample > 0) {
+        if (sample > d_hi) {                // In max region
+            d_max = d_max*(1.0-d_alpha) + sample*d_alpha;
+            result = 1.0;
+        }
+        else {
+            d_max -= (d_max-d_avg)*d_beta;  // decay otherwise
+            result = 1.0/3.0;
+        }
     }
+    else {
+        if (sample < d_lo) {                // In min region
+            d_min = d_min*(1.0-d_alpha) + sample*d_alpha;
+            result = -1.0;
+        }
+        else {
+            d_min -= (d_min-d_avg)*d_beta;  // decay otherwise
+            result = -1.0/3.0;
+        }
+    }
 
-    //fprintf(stderr, "%f %f %f %f %f\n", d_min, d_avg, d_max, sample, result);
+    d_hi = d_max*2.0/3.0;
+    d_lo = d_min*2.0/3.0;
+
+    //fprintf(stderr, "%f %f %f %f %f %f\n", d_min, d_lo, d_hi, d_max, sample, 
result);
     return result;
 }
 
 int pager_slicer_ff::work(int noutput_items,
-                           gr_vector_const_void_star &input_items,
-                                  gr_vector_void_star &output_items)
+                          gr_vector_const_void_star &input_items,
+                                 gr_vector_void_star &output_items)
 {
     float *iptr = (float *) input_items[0];
     float *optr = (float *) output_items[0];

Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager_slicer_ff.h
===================================================================
--- 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager_slicer_ff.h   
    2006-09-04 17:17:12 UTC (rev 3484)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pager_slicer_ff.h   
    2006-09-04 21:02:16 UTC (rev 3485)
@@ -27,7 +27,7 @@
 class pager_slicer_ff;
 typedef boost::shared_ptr<pager_slicer_ff> pager_slicer_ff_sptr;
 
-pager_slicer_ff_sptr pager_make_slicer_ff(float alpha);
+pager_slicer_ff_sptr pager_make_slicer_ff(float alpha, float beta);
 
 /*!
  * \brief slicer description
@@ -36,20 +36,23 @@
 class pager_slicer_ff : public gr_sync_block
 {
 private:
-    friend pager_slicer_ff_sptr pager_make_slicer_ff(float alpha);
-    pager_slicer_ff(float alpha);
+    friend pager_slicer_ff_sptr pager_make_slicer_ff(float alpha, float beta);
+    pager_slicer_ff(float alpha, float beta);
 
     float slice(float sample);
 
-    float d_alpha;      // Exponential constant
+    float d_alpha;      // Attack constant
+    float d_beta;       // Decay constant
     float d_max;        // Maximum value for symbol comparison
+    float d_hi;         // High side decision boundary
     float d_avg;        // Average value for DC offset subtraction
+    float d_lo;         // Low side decision boundary
     float d_min;        // Minimum value for symbol comparison
 
 public:
-  int work (int noutput_items,
-            gr_vector_const_void_star &input_items, 
-            gr_vector_void_star &output_items);
+    int work (int noutput_items,
+              gr_vector_const_void_star &input_items, 
+              gr_vector_void_star &output_items);
 };
 
 #endif /* INCLUDED_PAGER_SLICER_FF_H */

Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/python/flex_demod.py
===================================================================
--- 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/python/flex_demod.py    
    2006-09-04 17:17:12 UTC (rev 3484)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/python/flex_demod.py    
    2006-09-04 21:02:16 UTC (rev 3485)
@@ -19,7 +19,8 @@
 # Boston, MA 02111-1307, USA.
 # 
 
-from gnuradio import gr, optfir, pager
+from gnuradio import gr, optfir
+import pager
 from math import pi
 
 class flex_demod(gr.hier_block):
@@ -47,7 +48,7 @@
 
         taps = optfir.low_pass(1.0, channel_rate, 3200, 6400, 0.1, 60)
         LPF = gr.fir_filter_fff(1, taps)
-       SLICER = pager.slicer_ff(.0005)
+       SLICER = pager.slicer_ff(.001, .00001) # Attack, decay
        
         fg.connect(QUAD, LPF, SLICER)
 





reply via email to

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