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
00030
00031 class gr_simple_correlator;
00032 typedef boost::shared_ptr<gr_simple_correlator> gr_simple_correlator_sptr;
00033
00034 gr_simple_correlator_sptr gr_make_simple_correlator (int payload_bytesize);
00035
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 long long int d_shift_reg[OVERSAMPLE];
00051 int d_bblen;
00052 unsigned char *d_bitbuf;
00053 int d_bbi;
00054
00055 static const int AVG_PERIOD = 512;
00056 int d_avbi;
00057 float d_avgbuf[AVG_PERIOD];
00058 float d_avg;
00059 float d_accum;
00060
00061 #ifdef DEBUG_SIMPLE_CORRELATOR
00062 FILE *d_debug_fp;
00063 #endif
00064
00065 friend gr_simple_correlator_sptr gr_make_simple_correlator (int payload_bytesize);
00066 gr_simple_correlator (int payload_bytesize);
00067
00068
00069 inline int slice (float x)
00070 {
00071 return x >= d_avg ? 1 : 0;
00072 }
00073
00074 void update_avg(float x);
00075
00076 void enter_locked ();
00077 void enter_under_threshold ();
00078 void enter_looking ();
00079
00080 static int add_index (int a, int b)
00081 {
00082 int t = a + b;
00083 if (t >= OVERSAMPLE)
00084 t -= OVERSAMPLE;
00085 assert (t >= 0 && t < OVERSAMPLE);
00086 return t;
00087 }
00088
00089 static int sub_index (int a, int b)
00090 {
00091 int t = a - b;
00092 if (t < 0)
00093 t += OVERSAMPLE;
00094 assert (t >= 0 && t < OVERSAMPLE);
00095 return t;
00096 }
00097
00098
00099 public:
00100 ~gr_simple_correlator ();
00101
00102 int general_work (int noutput_items,
00103 gr_vector_int &ninput_items,
00104 gr_vector_const_void_star &input_items,
00105 gr_vector_void_star &output_items);
00106 };
00107
00108
00109 #endif