GNU Radio 3.6.4.1 C++ API
gr_fxpt_nco.h
Go to the documentation of this file.
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2002,2004 Free Software Foundation, Inc.
4  *
5  * This file is part of GNU Radio
6  *
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  *
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING. If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22 #ifndef INCLUDED_GR_FXPT_NCO_H
23 #define INCLUDED_GR_FXPT_NCO_H
24 
25 #include <gr_core_api.h>
26 #include <gr_fxpt.h>
27 #include <gr_complex.h>
28 
29 /*!
30  * \brief Numerically Controlled Oscillator (NCO)
31  * \ingroup misc
32  */
34  gr_uint32 d_phase;
35  gr_int32 d_phase_inc;
36 
37 public:
38  gr_fxpt_nco () : d_phase (0), d_phase_inc (0) {}
39 
41 
42  // radians
43  void set_phase (float angle) {
44  d_phase = gr_fxpt::float_to_fixed (angle);
45  }
46 
47  void adjust_phase (float delta_phase) {
48  d_phase += gr_fxpt::float_to_fixed (delta_phase);
49  }
50 
51  // angle_rate is in radians / step
52  void set_freq (float angle_rate){
53  d_phase_inc = gr_fxpt::float_to_fixed (angle_rate);
54  }
55 
56  // angle_rate is a delta in radians / step
57  void adjust_freq (float delta_angle_rate)
58  {
59  d_phase_inc += gr_fxpt::float_to_fixed (delta_angle_rate);
60  }
61 
62  // increment current phase angle
63 
64  void step ()
65  {
66  d_phase += d_phase_inc;
67  }
68 
69  void step (int n)
70  {
71  d_phase += d_phase_inc * n;
72  }
73 
74  // units are radians / step
75  float get_phase () const { return gr_fxpt::fixed_to_float (d_phase); }
76  float get_freq () const { return gr_fxpt::fixed_to_float (d_phase_inc); }
77 
78  // compute sin and cos for current phase angle
79  void sincos (float *sinx, float *cosx) const
80  {
81  *sinx = gr_fxpt::sin (d_phase);
82  *cosx = gr_fxpt::cos (d_phase);
83  }
84 
85  // compute cos and sin for a block of phase angles
86  void sincos (gr_complex *output, int noutput_items, double ampl=1.0)
87  {
88  for (int i = 0; i < noutput_items; i++){
89  output[i] = gr_complex(gr_fxpt::cos (d_phase) * ampl, gr_fxpt::sin (d_phase) * ampl);
90  step ();
91  }
92  }
93 
94  // compute sin for a block of phase angles
95  void sin (float *output, int noutput_items, double ampl=1.0)
96  {
97  for (int i = 0; i < noutput_items; i++){
98  output[i] = (float)(gr_fxpt::sin (d_phase) * ampl);
99  step ();
100  }
101  }
102 
103  // compute cos for a block of phase angles
104  void cos (float *output, int noutput_items, double ampl=1.0)
105  {
106  for (int i = 0; i < noutput_items; i++){
107  output[i] = (float)(gr_fxpt::cos (d_phase) * ampl);
108  step ();
109  }
110  }
111 
112  // compute sin for a block of phase angles
113  void sin (short *output, int noutput_items, double ampl=1.0)
114  {
115  for (int i = 0; i < noutput_items; i++){
116  output[i] = (short)(gr_fxpt::sin (d_phase) * ampl);
117  step ();
118  }
119  }
120 
121  // compute cos for a block of phase angles
122  void cos (short *output, int noutput_items, double ampl=1.0)
123  {
124  for (int i = 0; i < noutput_items; i++){
125  output[i] = (short)(gr_fxpt::cos (d_phase) * ampl);
126  step ();
127  }
128  }
129 
130  // compute sin for a block of phase angles
131  void sin (int *output, int noutput_items, double ampl=1.0)
132  {
133  for (int i = 0; i < noutput_items; i++){
134  output[i] = (int)(gr_fxpt::sin (d_phase) * ampl);
135  step ();
136  }
137  }
138 
139  // compute cos for a block of phase angles
140  void cos (int *output, int noutput_items, double ampl=1.0)
141  {
142  for (int i = 0; i < noutput_items; i++){
143  output[i] = (int)(gr_fxpt::cos (d_phase) * ampl);
144  step ();
145  }
146  }
147 
148  // compute cos or sin for current phase angle
149  float cos () const { return gr_fxpt::cos (d_phase); }
150  float sin () const { return gr_fxpt::sin (d_phase); }
151 };
152 
153 #endif /* INCLUDED_GR_FXPT_NCO_H */