diff options
author | Tom Rondeau <trondeau@vt.edu> | 2013-03-18 12:41:51 -0400 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2013-03-18 12:41:51 -0400 |
commit | 5f839d93c97a2ac86001dbabdfc3941cf23410a1 (patch) | |
tree | ed1f73db4a1d78f8f1f96b74400c52b0441971d0 /gr-blocks/include | |
parent | b33eb2258771d34113949628159b52d39074fa83 (diff) | |
parent | d4e3aa83de313e6eb9f6c4e186d8f7a3b4bfcc64 (diff) |
Merge branch 'master' into next
Diffstat (limited to 'gr-blocks/include')
-rw-r--r-- | gr-blocks/include/blocks/CMakeLists.txt | 8 | ||||
-rw-r--r-- | gr-blocks/include/blocks/check_lfsr_32k_s.h | 56 | ||||
-rw-r--r-- | gr-blocks/include/blocks/fxpt.h | 112 | ||||
-rw-r--r-- | gr-blocks/include/blocks/fxpt_nco.h | 168 | ||||
-rw-r--r-- | gr-blocks/include/blocks/fxpt_vco.h | 94 | ||||
-rw-r--r-- | gr-blocks/include/blocks/lfsr_15_1_0.h | 69 | ||||
-rw-r--r-- | gr-blocks/include/blocks/lfsr_32k.h | 90 | ||||
-rw-r--r-- | gr-blocks/include/blocks/lfsr_32k_source_s.h | 55 | ||||
-rw-r--r-- | gr-blocks/include/blocks/nco.h | 210 | ||||
-rw-r--r-- | gr-blocks/include/blocks/vco.h | 113 |
10 files changed, 273 insertions, 702 deletions
diff --git a/gr-blocks/include/blocks/CMakeLists.txt b/gr-blocks/include/blocks/CMakeLists.txt index e551468463..a88eaeeb26 100644 --- a/gr-blocks/include/blocks/CMakeLists.txt +++ b/gr-blocks/include/blocks/CMakeLists.txt @@ -105,13 +105,10 @@ install(FILES control_loop.h count_bits.h file_sink_base.h - fxpt.h - fxpt_nco.h - fxpt_vco.h + lfsr_15_1_0.h + lfsr_32k.h log2_const.h rotator.h - nco.h - vco.h wavfile.h add_ff.h annotator_1to1.h @@ -121,6 +118,7 @@ install(FILES burst_tagger.h char_to_float.h char_to_short.h + check_lfsr_32k_s.h complex_to_interleaved_short.h complex_to_float.h complex_to_imag.h diff --git a/gr-blocks/include/blocks/check_lfsr_32k_s.h b/gr-blocks/include/blocks/check_lfsr_32k_s.h new file mode 100644 index 0000000000..4eba436e80 --- /dev/null +++ b/gr-blocks/include/blocks/check_lfsr_32k_s.h @@ -0,0 +1,56 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,2013 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_GR_CHECK_LFSR_32K_S_H +#define INCLUDED_GR_CHECK_LFSR_32K_S_H + +#include <blocks/api.h> +#include <gr_sync_block.h> + +namespace gr { + namespace blocks { + + /*! + * \brief sink that checks if its input stream consists of a lfsr_32k sequence. + * \ingroup sink_blk + * + * This sink is typically used along with + * gr::blocks::lfsr_32k_source_s to test the USRP using its + * digital loopback mode. + */ + class BLOCKS_API check_lfsr_32k_s : virtual public gr_sync_block + { + public: + // gr::blocks::check_lfsr_32k_s::sptr + typedef boost::shared_ptr<check_lfsr_32k_s> sptr; + + static sptr make(); + + virtual long ntotal () const = 0; + virtual long nright () const = 0; + virtual long runlength () const = 0; + }; + + } /* namespace blocks */ +} /* namespace gr */ + +#endif /* INCLUDED_GR_CHECK_LFSR_32K_S_H */ diff --git a/gr-blocks/include/blocks/fxpt.h b/gr-blocks/include/blocks/fxpt.h deleted file mode 100644 index 37938eb14a..0000000000 --- a/gr-blocks/include/blocks/fxpt.h +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2004,2013 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_GR_FXPT_H -#define INCLUDED_GR_FXPT_H - -#include <blocks/api.h> -#include <stdint.h> -#include <cmath> - -namespace gr { - namespace blocks { - - /*! - * \brief fixed point sine and cosine and friends. - * \ingroup misc - * - * fixed pt radians - * --------- -------- - * -2**31 -pi - * 0 0 - * 2**31-1 pi - epsilon - * - */ - class BLOCKS_API fxpt - { - private: - static const int WORDBITS = 32; - static const int NBITS = 10; - static const float s_sine_table[1 << NBITS][2]; - static const float PI; - static const float TWO_TO_THE_31; - - public: - - static int32_t - float_to_fixed(float x) - { - // Fold x into -PI to PI. - int d = (int)floor(x/2/PI+0.5); - x -= d*2*PI; - // And convert to an integer. - return (int32_t)((float)x * TWO_TO_THE_31 / PI); - } - - static float - fixed_to_float(int32_t x) - { - return x * (PI / TWO_TO_THE_31); - } - - /*! - * \brief Given a fixed point angle x, return float sine (x) - */ - static float - sin(int32_t x) - { - uint32_t ux = x; - int index = ux >> (WORDBITS - NBITS); - return s_sine_table[index][0] * (ux >> 1) + s_sine_table[index][1]; - } - - /* - * \brief Given a fixed point angle x, return float cosine (x) - */ - static float - cos(int32_t x) - { - uint32_t ux = x + 0x40000000; - int index = ux >> (WORDBITS - NBITS); - return s_sine_table[index][0] * (ux >> 1) + s_sine_table[index][1]; - } - - /* - * \brief Given a fixedpoint angle x, return float cos(x) and sin (x) - */ - static void - sincos(int32_t x, float *s, float *c) - { - uint32_t ux = x; - int sin_index = ux >> (WORDBITS - NBITS); - *s = s_sine_table[sin_index][0] * (ux >> 1) + s_sine_table[sin_index][1]; - - ux = x + 0x40000000; - int cos_index = ux >> (WORDBITS - NBITS); - *c = s_sine_table[cos_index][0] * (ux >> 1) + s_sine_table[cos_index][1]; - } - }; - - } /* namespace blocks */ -} /* namespace gr */ - -#endif /* INCLUDED_GR_FXPT_H */ diff --git a/gr-blocks/include/blocks/fxpt_nco.h b/gr-blocks/include/blocks/fxpt_nco.h deleted file mode 100644 index 7db20fbb3a..0000000000 --- a/gr-blocks/include/blocks/fxpt_nco.h +++ /dev/null @@ -1,168 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2002,2004,2013 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_GR_FXPT_NCO_H -#define INCLUDED_GR_FXPT_NCO_H - -#include <blocks/api.h> -#include <blocks/fxpt.h> -#include <gr_complex.h> - -namespace gr { - namespace blocks { - - /*! - * \brief Numerically Controlled Oscillator (NCO) - * \ingroup misc - * - * Calculate sine and cosine based on the current phase. This - * class has multiple ways to calculate sin/cos and when - * requensting a range will increment the phase based on a - * frequency, which can be set using set_freq. Similar interfaces - * to the fxpt_vco can also be used to set or adjust the current - * phase. - */ - class fxpt_nco - { - private: - uint32_t d_phase; - int32_t d_phase_inc; - - public: - fxpt_nco() : d_phase(0), d_phase_inc(0) {} - - ~fxpt_nco() {} - - //! Set the current phase \p angle in radians - void set_phase(float angle) { - d_phase = fxpt::float_to_fixed(angle); - } - - //! Update the current phase in radians by \p delta_phase - void adjust_phase(float delta_phase) { - d_phase += fxpt::float_to_fixed(delta_phase); - } - - //! angle_rate is in radians / step - void set_freq(float angle_rate) { - d_phase_inc = fxpt::float_to_fixed(angle_rate); - } - - //! angle_rate is a delta in radians / step - void adjust_freq(float delta_angle_rate) { - d_phase_inc += fxpt::float_to_fixed(delta_angle_rate); - } - - //! increment current phase angle - void step() { - d_phase += d_phase_inc; - } - - //! increment current phase angle n times - void step(int n) { - d_phase += d_phase_inc * n; - } - - //! units are radians / step - float get_phase() const { return fxpt::fixed_to_float(d_phase); } - float get_freq() const { return fxpt::fixed_to_float(d_phase_inc); } - - //! compute sin and cos for current phase angle - void sincos(float *sinx, float *cosx) const - { - *sinx = fxpt::sin(d_phase); - *cosx = fxpt::cos(d_phase); - } - - //! compute cos and sin for a block of phase angles - void sincos(gr_complex *output, int noutput_items, double ampl=1.0) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = gr_complex(fxpt::cos(d_phase) * ampl, - fxpt::sin(d_phase) * ampl); - step(); - } - } - - //! compute sin for a block of phase angles - void sin(float *output, int noutput_items, double ampl=1.0) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (float)(fxpt::sin(d_phase) * ampl); - step(); - } - } - - //! compute cos for a block of phase angles - void cos(float *output, int noutput_items, double ampl=1.0) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (float)(fxpt::cos(d_phase) * ampl); - step(); - } - } - - //! compute sin for a block of phase angles - void sin(short *output, int noutput_items, double ampl=1.0) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (short)(fxpt::sin(d_phase) * ampl); - step(); - } - } - - //! compute cos for a block of phase angles - void cos(short *output, int noutput_items, double ampl=1.0) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (short)(fxpt::cos(d_phase) * ampl); - step(); - } - } - - //! compute sin for a block of phase angles - void sin(int *output, int noutput_items, double ampl=1.0) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (int)(fxpt::sin(d_phase) * ampl); - step(); - } - } - - //! compute cos for a block of phase angles - void cos(int *output, int noutput_items, double ampl=1.0) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (int)(fxpt::cos(d_phase) * ampl); - step(); - } - } - - //! compute cos or sin for current phase angle - float cos() const { return fxpt::cos(d_phase); } - float sin() const { return fxpt::sin(d_phase); } - }; - - } /* namespace blocks */ -} /* namespace gr */ - -#endif /* INCLUDED_GR_FXPT_NCO_H */ diff --git a/gr-blocks/include/blocks/fxpt_vco.h b/gr-blocks/include/blocks/fxpt_vco.h deleted file mode 100644 index c313a494fb..0000000000 --- a/gr-blocks/include/blocks/fxpt_vco.h +++ /dev/null @@ -1,94 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2002,2004,2005,2013 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef INCLUDED_GR_FXPT_VCO_H -#define INCLUDED_GR_FXPT_VCO_H - -#include <blocks/api.h> -#include <blocks/fxpt.h> -#include <gr_complex.h> - -namespace gr { - namespace blocks { - - /*! - * \brief Voltage Controlled Oscillator (VCO) - * \ingroup misc - * - * Simple calculations of sine and cosine. Set the phase using - * set_phase or adjust it by some delta using adjust_phase. Sine - * and cosine can be retrieved together with sincos(sinx, cosx) - * where sinx and cosx are the returned values at the current - * phase. They can be retrieved individually using either sin() or - * cos(). - */ - class BLOCKS_API fxpt_vco - { - private: - int32_t d_phase; - - public: - fxpt_vco() : d_phase(0) {} - - ~fxpt_vco() {} - - //! Set the current phase \p angle in radians - void set_phase(float angle) { - d_phase = fxpt::float_to_fixed(angle); - } - - //! Update the current phase in radians by \p delta_phase - void adjust_phase(float delta_phase) { - d_phase += fxpt::float_to_fixed(delta_phase); - } - - //! Get the current phase in radians - float get_phase() const { - return fxpt::fixed_to_float(d_phase); - } - - //! compute sin and cos for current phase angle - void sincos(float *sinx, float *cosx) const - { - *sinx = fxpt::sin(d_phase); - *cosx = fxpt::cos(d_phase); - } - - //! compute a block at a time - void cos(float *output, const float *input, int noutput_items, - float k, float ampl = 1.0) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (float)(fxpt::cos(d_phase) * ampl); - adjust_phase(input[i] * k); - } - } - - //! compute cos or sin for current phase angle - float cos() const { return fxpt::cos(d_phase); } - float sin() const { return fxpt::sin(d_phase); } - }; - - } /* namespace blocks */ -} /* namespace gr */ - -#endif /* INCLUDED_GR_FXPT_VCO_H */ diff --git a/gr-blocks/include/blocks/lfsr_15_1_0.h b/gr-blocks/include/blocks/lfsr_15_1_0.h new file mode 100644 index 0000000000..a79ed62eb8 --- /dev/null +++ b/gr-blocks/include/blocks/lfsr_15_1_0.h @@ -0,0 +1,69 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_GRI_LFSR_15_1_0_H +#define INCLUDED_GRI_LFSR_15_1_0_H + +#include <blocks/api.h> + +namespace gr { + namespace blocks { + + /*! + * \brief Linear Feedback Shift Register using primitive polynomial x^15 + x + 1 + * \ingroup misc + * + * Generates a maximal length pseudo-random sequence of length + * 2^15 - 1 bits. + */ + class BLOCKS_API lfsr_15_1_0 + { + private: + unsigned long d_sr; // shift register + + public: + lfsr_15_1_0() { reset(); } + + void reset() { d_sr = 0x7fff; } + + int next_bit() + { + d_sr = ((((d_sr >> 1) ^ d_sr) & 0x1) << 14) | (d_sr >> 1); + return d_sr & 0x1; + } + + int next_byte () + { + int v = 0; + for(int i = 0; i < 8; i++) { + v >>= 1; + if(next_bit ()) + v |= 0x80; + } + return v; + } + }; + + } /* namespace blocks */ +} /* namespace gr */ + +#endif /* INCLUDED_GRI_LFSR_15_1_0_H */ diff --git a/gr-blocks/include/blocks/lfsr_32k.h b/gr-blocks/include/blocks/lfsr_32k.h new file mode 100644 index 0000000000..7e70f6512b --- /dev/null +++ b/gr-blocks/include/blocks/lfsr_32k.h @@ -0,0 +1,90 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,2013 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_GRI_LFSR_32k_H +#define INCLUDED_GRI_LFSR_32k_H + +#include <blocks/api.h> +#include <blocks/lfsr_15_1_0.h> + +namespace gr { + namespace blocks { + + /*! + * \brief generate pseudo-random sequence of length 32768 bits. + * \ingroup misc + * + * This is based on gri_lfsr_15_1_0 with an extra 0 added at the + * end of the sequence. + */ + class BLOCKS_API lfsr_32k + { + private: + lfsr_15_1_0 d_lfsr; + unsigned int d_count; + + public: + lfsr_32k() { reset (); } + + void reset() + { + d_lfsr.reset(); + d_count = 0; + } + + int next_bit() + { + if(d_count == 32767) { + d_count = 0; + return 0; + } + d_count++; + return d_lfsr.next_bit(); + } + + int next_byte() + { + int v = 0; + for(int i = 0; i < 8; i++) { + v >>= 1; + if(next_bit ()) + v |= 0x80; + } + return v; + } + + int next_short() + { + int v = 0; + for(int i = 0; i < 16; i++) { + v >>= 1; + if(next_bit ()) + v |= 0x8000; + } + return v; + } + }; + + } /* namespace blocks */ +} /* namespace gr */ + +#endif /* INCLUDED_GRI_LFSR_32k_H */ diff --git a/gr-blocks/include/blocks/lfsr_32k_source_s.h b/gr-blocks/include/blocks/lfsr_32k_source_s.h new file mode 100644 index 0000000000..c24cc31b29 --- /dev/null +++ b/gr-blocks/include/blocks/lfsr_32k_source_s.h @@ -0,0 +1,55 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,2013 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * GNU Radio is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * GNU Radio is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Radio; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_GR_LFSR_32K_SOURCE_S_H +#define INCLUDED_GR_LFSR_32K_SOURCE_S_H + +#include <blocks/api.h> +#include <blocks/lfsr_32k.h> +#include <gr_sync_block.h> + +namespace gr { + namespace blocks { + + /*! + * \brief LFSR pseudo-random source with period of 2^15 bits (2^11 shorts) + * \ingroup source_blk + * + * This source is typically used along with gr::blocks::check_lfsr_32k_s to + * test the USRP using its digital loopback mode. + */ + class BLOCKS_API lfsr_32k_source_s : virtual public gr_sync_block + { + public: + // gr::blocks::lfsr_32k_source_s::sptr + typedef boost::shared_ptr<lfsr_32k_source_s> sptr; + + /*! + * \brief Make a LFSR 32k source block. + */ + static sptr make(); + }; + + } /* namespace blocks */ +} /* namespace gr */ + +#endif /* INCLUDED_GR_LFSR_32K_SOURCE_S_H */ diff --git a/gr-blocks/include/blocks/nco.h b/gr-blocks/include/blocks/nco.h deleted file mode 100644 index e6658a3572..0000000000 --- a/gr-blocks/include/blocks/nco.h +++ /dev/null @@ -1,210 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2002,2013 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef _GR_NCO_H_ -#define _GR_NCO_H_ - -#include <vector> -#include <gr_sincos.h> -#include <cmath> -#include <gr_complex.h> - -namespace gr { - namespace blocks { - - /*! - * \brief base class template for Numerically Controlled Oscillator (NCO) - * \ingroup misc - * - * Calculate sine and cosine based on the current phase. This - * class has multiple ways to calculate sin/cos and when - * requensting a range will increment the phase based on a - * frequency, which can be set using set_freq. Similar interfaces - * to the fxpt_vco can also be used to set or adjust the current - * phase. - * - * \sa fxpt_nco.h for fixed-point implementation. - */ - template<class o_type, class i_type> - class nco - { - public: - nco() : phase(0), phase_inc(0) {} - - virtual ~nco() {} - - //! Set the current phase \p angle in radians - void set_phase(double angle) { - phase = angle; - } - - //! Update the current phase in radians by \p delta_phase - void adjust_phase(double delta_phase) { - phase += delta_phase; - } - - //! angle_rate is in radians / step - void set_freq(double angle_rate) { - phase_inc = angle_rate; - } - - //! angle_rate is a delta in radians / step - void adjust_freq(double delta_angle_rate) { - phase_inc += delta_angle_rate; - } - - //! increment current phase angle - void step() - { - phase += phase_inc; - if(fabs (phase) > M_PI) { - - while(phase > M_PI) - phase -= 2*M_PI; - - while(phase < -M_PI) - phase += 2*M_PI; - } - } - - //! increment current phase angle n times - void step(int n) - { - phase += phase_inc * n; - if(fabs (phase) > M_PI) { - - while(phase > M_PI) - phase -= 2*M_PI; - - while(phase < -M_PI) - phase += 2*M_PI; - } - } - - //! units are radians / step - double get_phase() const { return phase; } - double get_freq() const { return phase_inc; } - - //! compute sin and cos for current phase angle - void sincos(float *sinx, float *cosx) const; - - //! compute cos or sin for current phase angle - float cos() const { return std::cos (phase); } - float sin() const { return std::sin (phase); } - - //! compute a block at a time - void sin(float *output, int noutput_items, double ampl = 1.0); - void cos(float *output, int noutput_items, double ampl = 1.0); - void sincos(gr_complex *output, int noutput_items, double ampl = 1.0); - void sin(short *output, int noutput_items, double ampl = 1.0); - void cos(short *output, int noutput_items, double ampl = 1.0); - void sin(int *output, int noutput_items, double ampl = 1.0); - void cos(int *output, int noutput_items, double ampl = 1.0); - - protected: - double phase; - double phase_inc; - }; - - template<class o_type, class i_type> - void - nco<o_type,i_type>::sincos(float *sinx, float *cosx) const - { - gr_sincosf(phase, sinx, cosx); - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::sin(float *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (float)(sin() * ampl); - step(); - } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::cos(float *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++){ - output[i] = (float)(cos() * ampl); - step(); - } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::sin(short *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (short)(sin() * ampl); - step(); - } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::cos(short *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (short)(cos() * ampl); - step(); - } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::sin(int *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (int)(sin() * ampl); - step(); - } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::cos(int *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = (int)(cos() * ampl); - step(); - } - } - - template<class o_type, class i_type> - void - nco<o_type,i_type>::sincos(gr_complex *output, int noutput_items, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - float cosx, sinx; - sincos(&sinx, &cosx); - output[i] = gr_complex(cosx * ampl, sinx * ampl); - step(); - } - } - - } /* namespace blocks */ -} /* namespace gr */ - -#endif /* _NCO_H_ */ diff --git a/gr-blocks/include/blocks/vco.h b/gr-blocks/include/blocks/vco.h deleted file mode 100644 index 4417d588ae..0000000000 --- a/gr-blocks/include/blocks/vco.h +++ /dev/null @@ -1,113 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2005,2013 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3, or (at your option) - * any later version. - * - * GNU Radio is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#ifndef _GR_VCO_H_ -#define _GR_VCO_H_ - -#include <vector> -#include <gr_sincos.h> -#include <cmath> -#include <gr_complex.h> - -namespace gr { - namespace blocks { - - /*! - * \brief base class template for Voltage Controlled Oscillator (VCO) - * \ingroup misc - * - * Simple calculations of sine and cosine. Set the phase using - * set_phase or adjust it by some delta using adjust_phase. Sine - * and cosine can be retrieved together with sincos(sinx, cosx) - * where sinx and cosx are the returned values at the current - * phase. They can be retrieved individually using either sin() or - * cos(). - * - * \sa fxpt_nco.h for fixed-point implementation. - */ - - template<class o_type, class i_type> - class vco - { - public: - vco() : d_phase(0) {} - - virtual ~vco() {} - - //! Set the current phase \p angle in radians - void set_phase(double angle) { - d_phase = angle; - } - - //! Update the current phase in radians by \p delta_phase - void adjust_phase(double delta_phase) { - d_phase += delta_phase; - if(fabs(d_phase) > M_PI) { - - while(d_phase > M_PI) - d_phase -= 2*M_PI; - - while(d_phase < -M_PI) - d_phase += 2*M_PI; - } - } - - //! Get the current phase in radians - double get_phase() const { return d_phase; } - - //! compute sin and cos for current phase angle - void sincos(float *sinx, float *cosx) const; - - //! compute cos or sin for current phase angle - float cos() const { return std::cos(d_phase); } - float sin() const { return std::sin(d_phase); } - - //! compute a block at a time - void cos(float *output, const float *input, int noutput_items, - double k, double ampl = 1.0); - - protected: - double d_phase; - }; - - template<class o_type, class i_type> - void - vco<o_type,i_type>::sincos(float *sinx, float *cosx) const - { - gr_sincosf(d_phase, sinx, cosx); - } - - template<class o_type, class i_type> - void - vco<o_type,i_type>::cos(float *output, const float *input, int noutput_items, - double k, double ampl) - { - for(int i = 0; i < noutput_items; i++) { - output[i] = cos() * ampl; - adjust_phase(input[i] * k); - } - } - - } /* namespace blocks */ -} /* namespace gr */ - -#endif /* _VCO_H_ */ |