Statistics
| Branch: | Tag: | Revision:

root / gnuradio-core / src / lib / general / gr_cpfsk_bc.cc @ f1878bbd

History | View | Annotate | Download (2.1 kB)

1 ccea950c jcorgan
/* -*- c++ -*- */
2 ccea950c jcorgan
/*
3 0a9b999b Eric Blossom
 * Copyright 2008,2010 Free Software Foundation, Inc.
4 ccea950c jcorgan
 * 
5 ccea950c jcorgan
 * GNU Radio is free software; you can redistribute it and/or modify
6 ccea950c jcorgan
 * it under the terms of the GNU General Public License as published by
7 ccea950c jcorgan
 * the Free Software Foundation; either version 3, or (at your option)
8 ccea950c jcorgan
 * any later version.
9 ccea950c jcorgan
 * 
10 ccea950c jcorgan
 * GNU Radio is distributed in the hope that it will be useful,
11 ccea950c jcorgan
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ccea950c jcorgan
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ccea950c jcorgan
 * GNU General Public License for more details.
14 ccea950c jcorgan
 * 
15 ccea950c jcorgan
 * You should have received a copy of the GNU General Public License
16 ccea950c jcorgan
 * along with GNU Radio; see the file COPYING.  If not, write to
17 ccea950c jcorgan
 * the Free Software Foundation, Inc., 51 Franklin Street,
18 ccea950c jcorgan
 * Boston, MA 02110-1301, USA.
19 ccea950c jcorgan
 */
20 ccea950c jcorgan
21 ccea950c jcorgan
#ifdef HAVE_CONFIG_H
22 ccea950c jcorgan
#include "config.h"
23 ccea950c jcorgan
#endif
24 ccea950c jcorgan
25 ccea950c jcorgan
#include <gr_cpfsk_bc.h>
26 ccea950c jcorgan
#include <gr_io_signature.h>
27 ccea950c jcorgan
#include <gr_expj.h>
28 ccea950c jcorgan
29 ccea950c jcorgan
#define M_TWOPI (2*M_PI)
30 ccea950c jcorgan
31 ccea950c jcorgan
gr_cpfsk_bc_sptr 
32 ccea950c jcorgan
gr_make_cpfsk_bc(float k, float ampl, int samples_per_sym)
33 ccea950c jcorgan
{
34 0a9b999b Eric Blossom
  return gnuradio::get_initial_sptr(new gr_cpfsk_bc(k, ampl, samples_per_sym));
35 ccea950c jcorgan
}
36 ccea950c jcorgan
37 ccea950c jcorgan
gr_cpfsk_bc::gr_cpfsk_bc(float k, float ampl, int samples_per_sym)
38 ccea950c jcorgan
  : gr_sync_interpolator("cpfsk_bc",
39 ccea950c jcorgan
                         gr_make_io_signature(1, 1, sizeof(char)),
40 ccea950c jcorgan
                         gr_make_io_signature(1, 1, sizeof(gr_complex)),
41 ccea950c jcorgan
                         samples_per_sym)
42 ccea950c jcorgan
{
43 ccea950c jcorgan
  d_samples_per_sym = samples_per_sym;
44 ccea950c jcorgan
  d_freq = k*M_PI/samples_per_sym;
45 ccea950c jcorgan
  d_ampl = ampl;
46 ccea950c jcorgan
  d_phase = 0.0;
47 ccea950c jcorgan
}
48 ccea950c jcorgan
49 ccea950c jcorgan
gr_cpfsk_bc::~gr_cpfsk_bc()
50 ccea950c jcorgan
{
51 ccea950c jcorgan
}
52 ccea950c jcorgan
53 ccea950c jcorgan
int 
54 ccea950c jcorgan
gr_cpfsk_bc::work(int noutput_items,
55 ccea950c jcorgan
                      gr_vector_const_void_star &input_items,
56 ccea950c jcorgan
                      gr_vector_void_star &output_items)
57 ccea950c jcorgan
{
58 ccea950c jcorgan
  const char *in = (const char *)input_items[0];
59 ccea950c jcorgan
  gr_complex *out = (gr_complex *)output_items[0];
60 ccea950c jcorgan
61 ccea950c jcorgan
  for (int i = 0; i < noutput_items/d_samples_per_sym; i++) {
62 ccea950c jcorgan
    for (int j = 0; j < d_samples_per_sym; j++) {
63 ccea950c jcorgan
      if (in[i] == 1)
64 ccea950c jcorgan
        d_phase += d_freq;
65 ccea950c jcorgan
      else
66 ccea950c jcorgan
        d_phase -= d_freq;
67 ccea950c jcorgan
      
68 ccea950c jcorgan
      while (d_phase > M_TWOPI)
69 ccea950c jcorgan
        d_phase -= M_TWOPI;
70 ccea950c jcorgan
      while (d_phase < -M_TWOPI)
71 ccea950c jcorgan
        d_phase += M_TWOPI;
72 ccea950c jcorgan
      
73 ccea950c jcorgan
      *out++ = gr_expj(d_phase)*d_ampl;
74 ccea950c jcorgan
    }
75 ccea950c jcorgan
  }
76 ccea950c jcorgan
77 ccea950c jcorgan
  return noutput_items;
78 ccea950c jcorgan
}