[Top][All Lists]
[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r3494 - in gnuradio/branches/developers/jcorgan/pager/gr-pager/src: lib python,
jcorgan <=