00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef INCLUDED_GR_SIMPLE_CORRELATOR_H
00024 #define INCLUDED_GR_SIMPLE_CORRELATOR_H
00025
00026 #include <gr_block.h>
00027 #include <assert.h>
00028
00029 class gr_simple_correlator;
00030 typedef boost::shared_ptr<gr_simple_correlator> gr_simple_correlator_sptr;
00031
00032 gr_simple_correlator_sptr gr_make_simple_correlator (int payload_bytesize);
00033
00040 class gr_simple_correlator : public gr_block
00041 {
00042 static const int OVERSAMPLE = 8;
00043 enum state_t { ST_LOOKING, ST_UNDER_THRESHOLD, ST_LOCKED };
00044
00045 int d_payload_bytesize;
00046 state_t d_state;
00047 unsigned int d_osi;
00048 unsigned int d_transition_osi;
00049 unsigned int d_center_osi;
00050 unsigned int d_shift_reg[OVERSAMPLE];
00051 int d_bblen;
00052 unsigned char *d_bitbuf;
00053 int d_bbi;
00054
00055 friend gr_simple_correlator_sptr gr_make_simple_correlator (int payload_bytesize);
00056 gr_simple_correlator (int payload_bytesize);
00057
00058 void enter_locked ();
00059 void enter_under_threshold ();
00060 void enter_looking ();
00061
00062 static int add_index (int a, int b)
00063 {
00064 int t = a + b;
00065 if (t >= OVERSAMPLE)
00066 t -= OVERSAMPLE;
00067 assert (t >= 0 && t < OVERSAMPLE);
00068 return t;
00069 }
00070
00071 static int sub_index (int a, int b)
00072 {
00073 int t = a - b;
00074 if (t < 0)
00075 t += OVERSAMPLE;
00076 assert (t >= 0 && t < OVERSAMPLE);
00077 return t;
00078 }
00079
00080
00081 public:
00082 ~gr_simple_correlator ();
00083
00084 int general_work (int noutput_items,
00085 gr_vector_int &ninput_items,
00086 gr_vector_const_void_star &input_items,
00087 gr_vector_void_star &output_items);
00088 };
00089
00090
00091 #endif