Statistics
| Branch: | Tag: | Revision:

root / gnuradio-core / src / lib / general / gr_simple_correlator.h @ d65ae424

History | View | Annotate | Download (2.9 kB)

1 5d69a524 jcorgan
/* -*- c++ -*- */
2 5d69a524 jcorgan
/*
3 5d69a524 jcorgan
 * Copyright 2004 Free Software Foundation, Inc.
4 5d69a524 jcorgan
 * 
5 5d69a524 jcorgan
 * This file is part of GNU Radio
6 5d69a524 jcorgan
 * 
7 5d69a524 jcorgan
 * GNU Radio is free software; you can redistribute it and/or modify
8 5d69a524 jcorgan
 * it under the terms of the GNU General Public License as published by
9 937b719d eb
 * the Free Software Foundation; either version 3, or (at your option)
10 5d69a524 jcorgan
 * any later version.
11 5d69a524 jcorgan
 * 
12 5d69a524 jcorgan
 * GNU Radio is distributed in the hope that it will be useful,
13 5d69a524 jcorgan
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 5d69a524 jcorgan
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 5d69a524 jcorgan
 * GNU General Public License for more details.
16 5d69a524 jcorgan
 * 
17 5d69a524 jcorgan
 * You should have received a copy of the GNU General Public License
18 5d69a524 jcorgan
 * along with GNU Radio; see the file COPYING.  If not, write to
19 86f5c924 eb
 * the Free Software Foundation, Inc., 51 Franklin Street,
20 86f5c924 eb
 * Boston, MA 02110-1301, USA.
21 5d69a524 jcorgan
 */
22 5d69a524 jcorgan
23 5d69a524 jcorgan
#ifndef INCLUDED_GR_SIMPLE_CORRELATOR_H
24 5d69a524 jcorgan
#define INCLUDED_GR_SIMPLE_CORRELATOR_H
25 5d69a524 jcorgan
26 5d69a524 jcorgan
#include <gr_block.h>
27 5d69a524 jcorgan
#include <assert.h>
28 5d69a524 jcorgan
29 5d69a524 jcorgan
//#define        DEBUG_SIMPLE_CORRELATOR
30 5d69a524 jcorgan
31 5d69a524 jcorgan
class gr_simple_correlator;
32 5d69a524 jcorgan
typedef boost::shared_ptr<gr_simple_correlator> gr_simple_correlator_sptr;
33 5d69a524 jcorgan
34 5d69a524 jcorgan
gr_simple_correlator_sptr gr_make_simple_correlator (int payload_bytesize);
35 5d69a524 jcorgan
36 5d69a524 jcorgan
/*!
37 5d69a524 jcorgan
 * \brief inverse of gr_simple_framer (more or less)
38 5a4b9ba9 eb
 * \ingroup sync_blk
39 5d69a524 jcorgan
 */
40 5d69a524 jcorgan
class gr_simple_correlator : public gr_block
41 5d69a524 jcorgan
{
42 5d69a524 jcorgan
  static const int OVERSAMPLE = 8;
43 5d69a524 jcorgan
  enum state_t { ST_LOOKING, ST_UNDER_THRESHOLD, ST_LOCKED };
44 5d69a524 jcorgan
  
45 5d69a524 jcorgan
  int                   d_payload_bytesize;
46 5d69a524 jcorgan
  state_t         d_state;
47 5d69a524 jcorgan
  unsigned int         d_osi;                                // over sample index [0,OVERSAMPLE-1]
48 5d69a524 jcorgan
  unsigned int         d_transition_osi;                // first index where Hamming dist < thresh
49 5d69a524 jcorgan
  unsigned int         d_center_osi;                        // center of bit
50 5d69a524 jcorgan
  unsigned long long int d_shift_reg[OVERSAMPLE];
51 5d69a524 jcorgan
  int                 d_bblen;                        // length of bitbuf
52 5d69a524 jcorgan
  unsigned char        *d_bitbuf;                        // demodulated bits
53 5d69a524 jcorgan
  int                 d_bbi;                                // bitbuf index
54 5d69a524 jcorgan
55 5d69a524 jcorgan
  static const int AVG_PERIOD = 512;                // must be power of 2 (for freq offset correction)
56 5d69a524 jcorgan
  int        d_avbi;
57 5d69a524 jcorgan
  float        d_avgbuf[AVG_PERIOD];
58 5d69a524 jcorgan
  float d_avg;
59 5d69a524 jcorgan
  float d_accum;
60 5d69a524 jcorgan
61 5d69a524 jcorgan
#ifdef DEBUG_SIMPLE_CORRELATOR
62 5d69a524 jcorgan
  FILE                *d_debug_fp;                        // binary log file
63 5d69a524 jcorgan
#endif
64 5d69a524 jcorgan
65 5d69a524 jcorgan
  friend gr_simple_correlator_sptr gr_make_simple_correlator (int payload_bytesize);
66 5d69a524 jcorgan
  gr_simple_correlator (int payload_bytesize);
67 5d69a524 jcorgan
68 5d69a524 jcorgan
69 5d69a524 jcorgan
  inline int slice (float x)
70 5d69a524 jcorgan
  {
71 5d69a524 jcorgan
    return x >= d_avg ? 1 : 0;
72 5d69a524 jcorgan
  }
73 5d69a524 jcorgan
74 5d69a524 jcorgan
  void update_avg(float x);
75 5d69a524 jcorgan
76 5d69a524 jcorgan
  void enter_locked ();
77 5d69a524 jcorgan
  void enter_under_threshold ();
78 5d69a524 jcorgan
  void enter_looking ();
79 5d69a524 jcorgan
  
80 5d69a524 jcorgan
  static int add_index (int a, int b)
81 5d69a524 jcorgan
  {
82 5d69a524 jcorgan
    int t = a + b;
83 5d69a524 jcorgan
    if (t >= OVERSAMPLE)
84 5d69a524 jcorgan
      t -= OVERSAMPLE;
85 5d69a524 jcorgan
    assert (t >= 0 && t < OVERSAMPLE);
86 5d69a524 jcorgan
    return t;
87 5d69a524 jcorgan
  }
88 5d69a524 jcorgan
89 5d69a524 jcorgan
  static int sub_index (int a, int b)
90 5d69a524 jcorgan
  {
91 5d69a524 jcorgan
    int t = a - b;
92 5d69a524 jcorgan
    if (t < 0)
93 5d69a524 jcorgan
      t += OVERSAMPLE;
94 5d69a524 jcorgan
    assert (t >= 0 && t < OVERSAMPLE);
95 5d69a524 jcorgan
    return t;
96 5d69a524 jcorgan
  }
97 5d69a524 jcorgan
98 5d69a524 jcorgan
  
99 5d69a524 jcorgan
 public:
100 5d69a524 jcorgan
  ~gr_simple_correlator ();
101 5d69a524 jcorgan
102 5d69a524 jcorgan
  int general_work (int noutput_items,
103 5d69a524 jcorgan
                    gr_vector_int &ninput_items,
104 5d69a524 jcorgan
                    gr_vector_const_void_star &input_items,
105 5d69a524 jcorgan
                    gr_vector_void_star &output_items);
106 5d69a524 jcorgan
};
107 5d69a524 jcorgan
108 5d69a524 jcorgan
109 5d69a524 jcorgan
#endif /* INCLUDED_GR_SIMPLE_CORRELATOR_H */