commit-gnuradio
[Top][All Lists]
Advanced

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

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


From: jcorgan
Subject: [Commit-gnuradio] r3494 - in gnuradio/branches/developers/jcorgan/pager/gr-pager/src: lib python
Date: Wed, 6 Sep 2006 21:48:57 -0600 (MDT)

Author: jcorgan
Date: 2006-09-06 21:48:57 -0600 (Wed, 06 Sep 2006)
New Revision: 3494

Modified:
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr.i
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.cc
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.h
   gnuradio/branches/developers/jcorgan/pager/gr-pager/src/python/flex_demod.py
Log:
Work in progress FLEX syncronization block using "center of goodness"
algorithm.


Modified: gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr.i
===================================================================
--- gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr.i   
2006-09-06 13:21:41 UTC (rev 3493)
+++ gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr.i   
2006-09-07 03:48:57 UTC (rev 3494)
@@ -48,12 +48,12 @@
 
 GR_SWIG_BLOCK_MAGIC(pgr,flex_sync);
 
-pgr_flex_sync_sptr pgr_make_flex_sync();
+pgr_flex_sync_sptr pgr_make_flex_sync(int rate);
 
 class pgr_flex_sync : public gr_block
 {
 private:
-    pgr_flex_sync();
+    pgr_flex_sync(int rate);
 
 public:
 };

Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.cc
===================================================================
--- 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.cc    
    2006-09-06 13:21:41 UTC (rev 3493)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.cc    
    2006-09-07 03:48:57 UTC (rev 3494)
@@ -26,31 +26,118 @@
 #include <pgr_flex_sync.h>
 #include <gr_io_signature.h>
 
-pgr_flex_sync_sptr pgr_make_flex_sync()
+pgr_flex_sync_sptr pgr_make_flex_sync(int rate)
 {
-    return pgr_flex_sync_sptr(new pgr_flex_sync());
+    return pgr_flex_sync_sptr(new pgr_flex_sync(rate));
 }
 
-pgr_flex_sync::pgr_flex_sync() :
+// FLEX sync block takes input from symbol stream with alphabet [0, 1, 2, 3]
+// at specified channel rate and and outputs 32-bit FLEX code words 
+// at 50 or 100 code words per second (based on detected mode in sync
+// word).
+
+pgr_flex_sync::pgr_flex_sync(int rate) :
     gr_block ("flex_sync",
-                   gr_make_io_signature (1, 1, sizeof(unsigned char)),
-                   gr_make_io_signature (1, 1, sizeof(gr_int32)))
+              gr_make_io_signature (1, 1, sizeof(unsigned char)),
+              gr_make_io_signature (1, 1, sizeof(gr_int32))),
+    d_shifters(rate/1600) // Maximum samples per baud
 {
+    d_rate = rate;
+    d_index = 0;
+    d_baudrate = 1600;
+    d_levels = 2;
+    d_spb = rate/d_baudrate;
+    d_state = ST_IDLE;
 }
 
+pgr_flex_sync::~pgr_flex_sync()
+{
+}
+
+void pgr_flex_sync::forecast(int noutput_items, gr_vector_int &inputs_required)
+{
+    // samples per bit X 32 bits * number of outputs needed
+    int items = noutput_items*sizeof(gr_int32)*8*d_spb;
+    for (unsigned int i = 0; i < inputs_required.size(); i++)
+        inputs_required[i] = items;
+}
+
+bool pgr_flex_sync::test_sync()
+{
+    // Perform sync mode matching here with hamming distance from each
+    // possible sync code
+
+    // Temporarily, just check if the value matches what all the sync codes
+    // have in common (center 32 bits are constant)
+    gr_int64 val = d_shifters[d_index] & 0x0000FFFFFFFF0000ULL;
+    if (val == 0x0000A6C6AAAA0000ULL)
+        return true;
+
+    return false;
+}
+
+static inline int cog(int start, int end, int mod)
+{
+    // modulo average
+    if (start < end)
+        return (end + start)/2;
+    else
+        return ((end + start)/2 + mod/2) % mod;
+}
+
 int pgr_flex_sync::general_work(int noutput_items,
-                        gr_vector_int &ninput_items,
-                        gr_vector_const_void_star &input_items,
-                               gr_vector_void_star &output_items)
+    gr_vector_int &ninput_items,
+    gr_vector_const_void_star &input_items,
+       gr_vector_void_star &output_items)
 {
     const unsigned char *in = (const unsigned char *)input_items[0];
     gr_int32 *out = (gr_int32 *) output_items[0];
 
-    int i = 0;
-    while (i < noutput_items) {
-        out[i++] = (gr_int32)(*in++);
+    int consumed = 0, produced = 0;
+    int ninputs = ninput_items[0];
+
+    while (consumed++ < ninputs && produced < noutput_items) {
+        d_shifters[d_index] = (d_shifters[d_index] << 1) | (*in++ < 2);
+
+        switch (d_state) {
+            case ST_IDLE:
+                if (test_sync()) {
+                    d_start = d_index;
+                    d_state = ST_SYNCING;
+                }
+                break;
+
+            case ST_SYNCING:
+                if (!test_sync()) {
+                    d_end = d_index;
+                    d_center = cog(d_start, d_end, d_spb);
+                    d_state = ST_SYNCED;
+                    printf("SOG=%2i EOG=%2i COG=%2i\n", d_start, d_end, 
d_center);
+                }
+                break;
+
+            case ST_SYNCED:
+                if (d_index == d_center) {
+                    // Accumulate bits here
+                    // d_shifters[d_center] has good stuff in it
+                }
+
+                d_state = ST_IDLE; // TEMPORARY
+                break;
+
+            default:
+                assert(0);
+                break;
+        }
+
+        if (++d_index >= d_spb)
+            d_index = 0;
     }
 
-    consume_each(noutput_items);
-    return noutput_items;
+    // For now pretend we output everything we could
+    produced = noutput_items;
+
+    // Inform scheduler what we did;
+    consume_each(in - (unsigned char *)input_items[0]);
+    return produced;
 }

Modified: 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.h
===================================================================
--- gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.h 
2006-09-06 13:21:41 UTC (rev 3493)
+++ gnuradio/branches/developers/jcorgan/pager/gr-pager/src/lib/pgr_flex_sync.h 
2006-09-07 03:48:57 UTC (rev 3494)
@@ -26,24 +26,44 @@
 
 class pgr_flex_sync;
 typedef boost::shared_ptr<pgr_flex_sync> pgr_flex_sync_sptr;
+typedef std::vector<gr_int64> gr_int64_vector;
 
-pgr_flex_sync_sptr pgr_make_flex_sync();
+pgr_flex_sync_sptr pgr_make_flex_sync(int rate);
 
 /*!
  * \brief flex sync description
  * \ingroup block
  */
+
 class pgr_flex_sync : public gr_block
 {
 private:
-    friend pgr_flex_sync_sptr pgr_make_flex_sync();
-    pgr_flex_sync();
+    friend pgr_flex_sync_sptr pgr_make_flex_sync(int rate);
+    pgr_flex_sync(int rate);
+    bool test_sync();
 
+    enum state_t { ST_IDLE, ST_SYNCING, ST_SYNCED };
+
+    int d_rate;     // Incoming sample rate
+    int d_index;    // Index into current baud
+    int d_baudrate; // Current decoding baud rate
+    int d_levels;   // Current decoding levels
+    int d_spb;      // Current samples per baud
+    int d_start;    // Start of good sync 
+    int d_end;      // End of good sync
+    int d_center;   // Center of bit
+    state_t d_state;     
+    gr_int64_vector d_shifters;
+
 public:
+    void forecast(int noutput_items, gr_vector_int &inputs_required);
+
     int general_work(int noutput_items,
                      gr_vector_int &ninput_items,
                      gr_vector_const_void_star &input_items, 
                      gr_vector_void_star &output_items);
+
+   ~pgr_flex_sync(); // Needed?
 };
 
 #endif /* INCLUDED_PGR_FLEX_SYNC_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-06 13:21:41 UTC (rev 3493)
+++ 
gnuradio/branches/developers/jcorgan/pager/gr-pager/src/python/flex_demod.py    
    2006-09-07 03:48:57 UTC (rev 3494)
@@ -50,7 +50,7 @@
         taps = optfir.low_pass(1.0, channel_rate, 3200, 6400, 0.1, 60)
         LPF = gr.fir_filter_fff(1, taps)
        SLICER = pgr.slicer_fb(.001, .00001) # Attack, decay
-       SYNC = pgr.flex_sync()
+       SYNC = pgr.flex_sync(channel_rate)
        
         fg.connect(QUAD, LPF, SLICER, SYNC)
 





reply via email to

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