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 | |
parent | b33eb2258771d34113949628159b52d39074fa83 (diff) | |
parent | d4e3aa83de313e6eb9f6c4e186d8f7a3b4bfcc64 (diff) |
Merge branch 'master' into next
24 files changed, 656 insertions, 1202 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_ */ diff --git a/gr-blocks/lib/CMakeLists.txt b/gr-blocks/lib/CMakeLists.txt index 50c842398e..ae3523945e 100644 --- a/gr-blocks/lib/CMakeLists.txt +++ b/gr-blocks/lib/CMakeLists.txt @@ -147,7 +147,6 @@ list(APPEND gr_blocks_sources control_loop.cc count_bits.cc file_sink_base.cc - fxpt.cc wavfile.cc add_ff_impl.cc annotator_1to1_impl.cc @@ -157,6 +156,7 @@ list(APPEND gr_blocks_sources burst_tagger_impl.cc char_to_float_impl.cc char_to_short_impl.cc + check_lfsr_32k_s_impl.cc complex_to_interleaved_short_impl.cc complex_to_float_impl.cc complex_to_real_impl.cc @@ -189,6 +189,7 @@ list(APPEND gr_blocks_sources interleaved_short_to_complex_impl.cc keep_m_in_n_impl.cc keep_one_in_n_impl.cc + lfsr_32k_source_s_impl.cc message_debug_impl.cc message_sink_impl.cc message_source_impl.cc @@ -302,9 +303,6 @@ if(ENABLE_TESTING) ${CMAKE_CURRENT_SOURCE_DIR}/qa_gr_hier_block2_derived.cc ${CMAKE_CURRENT_SOURCE_DIR}/qa_blocks.cc ${CMAKE_CURRENT_SOURCE_DIR}/qa_block_tags.cc - ${CMAKE_CURRENT_SOURCE_DIR}/qa_fxpt.cc - ${CMAKE_CURRENT_SOURCE_DIR}/qa_fxpt_nco.cc - ${CMAKE_CURRENT_SOURCE_DIR}/qa_fxpt_vco.cc ${CMAKE_CURRENT_SOURCE_DIR}/qa_rotator.cc ) diff --git a/gr-blocks/lib/check_lfsr_32k_s_impl.cc b/gr-blocks/lib/check_lfsr_32k_s_impl.cc new file mode 100644 index 0000000000..b8e88003a2 --- /dev/null +++ b/gr-blocks/lib/check_lfsr_32k_s_impl.cc @@ -0,0 +1,179 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,2010,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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "check_lfsr_32k_s_impl.h" +#include <gr_io_signature.h> +#include <stdlib.h> +#include <stdio.h> + +namespace gr { + namespace blocks { + + check_lfsr_32k_s::sptr + check_lfsr_32k_s::make() + { + return gnuradio::get_initial_sptr + (new check_lfsr_32k_s_impl()); + } + + check_lfsr_32k_s_impl::check_lfsr_32k_s_impl() + : gr_sync_block("gr_check_lfsr_32k", + gr_make_io_signature(1, 1, sizeof(short)), + gr_make_io_signature(0, 0, 0)), + d_state(SEARCHING), d_history(0), d_ntotal(0), d_nright(0), + d_runlength(0), d_index(0) + { + lfsr_32k lfsr; + + for(int i = 0; i < BUFSIZE; i++) + d_buffer[i] = lfsr.next_short(); + + enter_SEARCHING(); + } + + check_lfsr_32k_s_impl::~check_lfsr_32k_s_impl() + { + } + + int + check_lfsr_32k_s_impl::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) + { + unsigned short *in = (unsigned short*)input_items[0]; + + for(int i = 0; i < noutput_items; i++) { + unsigned short x = in[i]; + unsigned short expected; + + switch(d_state) { + case MATCH0: + if(x == d_buffer[0]) + enter_MATCH1(); + break; + + case MATCH1: + if(x == d_buffer[1]) + enter_MATCH2(); + else + enter_MATCH0(); + break; + + case MATCH2: + if(x == d_buffer[2]) + enter_LOCKED(); + else + enter_MATCH0(); + break; + + case LOCKED: + expected = d_buffer[d_index]; + d_index = d_index + 1; + if(d_index >= BUFSIZE) + d_index = 0; + + if(x == expected) + right(); + else { + wrong(); + log_error(expected, x); + if(wrong_three_times()) + enter_SEARCHING(); + } + break; + + default: + abort(); + } + + d_ntotal++; + } + + return noutput_items; + } + + void + check_lfsr_32k_s_impl::enter_SEARCHING() + { + d_state = SEARCHING; + wrong(); // reset history + wrong(); + wrong(); + + d_runlength = 0; + d_index = 0; // reset LFSR to beginning + + if(0) + fprintf(stdout, "gr_check_lfsr_32k: enter_SEARCHING at offset %8ld (0x%08lx)\n", + d_ntotal, d_ntotal); + + enter_MATCH0(); + } + + void + check_lfsr_32k_s_impl::enter_MATCH0() + { + d_state = MATCH0; + } + + void + check_lfsr_32k_s_impl::enter_MATCH1() + { + d_state = MATCH1; + } + + void + check_lfsr_32k_s_impl::enter_MATCH2() + { + d_state = MATCH2; + } + + void + check_lfsr_32k_s_impl::enter_LOCKED() + { + d_state = LOCKED; + right(); // setup history + right(); + right(); + + d_index = 3; // already matched first 3 items + + if(0) + fprintf(stdout, "gr_check_lfsr_32k: enter_LOCKED at offset %8ld (0x%08lx)\n", + d_ntotal, d_ntotal); + } + + void + check_lfsr_32k_s_impl::log_error(unsigned short expected, unsigned short actual) + { + if(0) + fprintf(stdout, + "gr_check_lfsr_32k: expected %5d (0x%04x) got %5d (0x%04x) offset %8ld (0x%08lx)\n", + expected, expected, actual, actual, d_ntotal, d_ntotal); + } + + } /* namespace blocks */ +} /* namespace gr */ diff --git a/gr-blocks/lib/check_lfsr_32k_s_impl.h b/gr-blocks/lib/check_lfsr_32k_s_impl.h new file mode 100644 index 0000000000..f6d3c8daa2 --- /dev/null +++ b/gr-blocks/lib/check_lfsr_32k_s_impl.h @@ -0,0 +1,94 @@ +/* -*- 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_IMPL_H +#define INCLUDED_GR_CHECK_LFSR_32K_S_IMPL_H + +#include <blocks/check_lfsr_32k_s.h> +#include <blocks/lfsr_32k.h> + +namespace gr { + namespace blocks { + + class check_lfsr_32k_s_impl : public check_lfsr_32k_s + { + private: + enum state { + SEARCHING, // searching for synchronization + MATCH0, + MATCH1, + MATCH2, + LOCKED // is locked + }; + + state d_state; + unsigned int d_history; // bitmask of decisions + + long d_ntotal; // total number of shorts + long d_nright; // # of correct shorts + long d_runlength; // # of correct shorts in a row + + static const int BUFSIZE = 2048 - 1; // ensure pattern isn't packet aligned + int d_index; + unsigned short d_buffer[BUFSIZE]; + + void enter_SEARCHING(); + void enter_MATCH0(); + void enter_MATCH1(); + void enter_MATCH2(); + void enter_LOCKED(); + + void right() + { + d_history = (d_history << 1) | 0x1; + d_nright++; + d_runlength++; + } + + void wrong() + { + d_history = (d_history << 1) | 0x0; + d_runlength = 0; + } + + bool right_three_times() { return (d_history & 0x7) == 0x7; } + bool wrong_three_times() { return (d_history & 0x7) == 0x0; } + + void log_error(unsigned short expected, unsigned short actual); + + public: + check_lfsr_32k_s_impl(); + ~check_lfsr_32k_s_impl(); + + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + + long ntotal() const { return d_ntotal; } + long nright() const { return d_nright; } + long runlength() const { return d_runlength; } + }; + + } /* namespace blocks */ +} /* namespace gr */ + +#endif /* INCLUDED_GR_CHECK_LFSR_32K_S_IMPL_H */ diff --git a/gr-blocks/lib/lfsr_32k_source_s_impl.cc b/gr-blocks/lib/lfsr_32k_source_s_impl.cc new file mode 100644 index 0000000000..738e732b49 --- /dev/null +++ b/gr-blocks/lib/lfsr_32k_source_s_impl.cc @@ -0,0 +1,79 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,2010,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. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include "lfsr_32k_source_s_impl.h" +#include <gr_io_signature.h> +#include <stdexcept> + +namespace gr { + namespace blocks { + + lfsr_32k_source_s::sptr + lfsr_32k_source_s::make() + { + return gnuradio::get_initial_sptr + (new lfsr_32k_source_s_impl()); + } + + lfsr_32k_source_s_impl::lfsr_32k_source_s_impl() + : gr_sync_block("lfsr_32k_source_s", + gr_make_io_signature(0, 0, 0), + gr_make_io_signature(1, 1, sizeof(short))), + d_index(0) + { + lfsr_32k lfsr; + + for(int i = 0; i < BUFSIZE; i++) + d_buffer[i] = lfsr.next_short(); + } + + lfsr_32k_source_s_impl::~lfsr_32k_source_s_impl() + { + } + + int + lfsr_32k_source_s_impl::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) + { + short *out = (short*)output_items[0]; + short *buf = d_buffer; + int index = d_index; + + for(int i = 0; i < noutput_items; i++) { + out[i] = buf[index]; + // index = (index + 1) & (BUFSIZE - 1); + index = index + 1; + if(index >= BUFSIZE) + index = 0; + } + + d_index = index; + return noutput_items; + } + + } /* namespace blocks */ +} /* namespace gr */ diff --git a/gr-blocks/lib/fxpt.cc b/gr-blocks/lib/lfsr_32k_source_s_impl.h index 4566f7c595..b8c684e8d6 100644 --- a/gr-blocks/lib/fxpt.cc +++ b/gr-blocks/lib/lfsr_32k_source_s_impl.h @@ -20,21 +20,33 @@ * Boston, MA 02110-1301, USA. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif +#ifndef INCLUDED_GR_LFSR_32K_SOURCE_S_IMPL_H +#define INCLUDED_GR_LFSR_32K_SOURCE_S_IMPL_H -#include <blocks/fxpt.h> +#include <blocks/lfsr_32k_source_s.h> +#include <blocks/lfsr_32k.h> +#include <gr_sync_block.h> namespace gr { namespace blocks { - const float fxpt::s_sine_table[1 << NBITS][2] = { - #include "sine_table.h" - }; + class lfsr_32k_source_s_impl : public lfsr_32k_source_s + { + private: + static const int BUFSIZE = 2048 - 1; // ensure pattern isn't packet aligned + int d_index; + short d_buffer[BUFSIZE]; + + public: + lfsr_32k_source_s_impl(); + ~lfsr_32k_source_s_impl(); - const float fxpt::PI = 3.14159265358979323846; - const float fxpt::TWO_TO_THE_31 = 2147483648.0; + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; } /* namespace blocks */ } /* namespace gr */ + +#endif /* INCLUDED_GR_LFSR_32K_SOURCE_S_IMPL_H */ diff --git a/gr-blocks/lib/qa_blocks.cc b/gr-blocks/lib/qa_blocks.cc index ebf5d3c349..409b5d5762 100644 --- a/gr-blocks/lib/qa_blocks.cc +++ b/gr-blocks/lib/qa_blocks.cc @@ -27,9 +27,6 @@ #include <qa_blocks.h> #include <qa_block_tags.h> -#include <qa_fxpt.h> -#include <qa_fxpt_nco.h> -#include <qa_fxpt_vco.h> #include <qa_rotator.h> CppUnit::TestSuite * @@ -38,9 +35,6 @@ qa_gr_blocks::suite() CppUnit::TestSuite *s = new CppUnit::TestSuite("gr-blocks"); s->addTest(qa_block_tags::suite()); - s->addTest(qa_fxpt::suite()); - s->addTest(qa_fxpt_nco::suite()); - s->addTest(qa_fxpt_vco::suite()); s->addTest(qa_rotator::suite()); return s; diff --git a/gr-blocks/lib/qa_fxpt.cc b/gr-blocks/lib/qa_fxpt.cc deleted file mode 100644 index 9ce26b240b..0000000000 --- a/gr-blocks/lib/qa_fxpt.cc +++ /dev/null @@ -1,104 +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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <qa_fxpt.h> -#include <blocks/fxpt.h> -#include <cppunit/TestAssert.h> -#include <iostream> -#include <stdio.h> -#include <unistd.h> -#include <math.h> - -static const float SIN_COS_TOLERANCE = 1e-5; - -using namespace gr::blocks; - -void -qa_fxpt::t0() -{ - CPPUNIT_ASSERT_DOUBLES_EQUAL(M_PI/2, fxpt::fixed_to_float(0x40000000), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, fxpt::fixed_to_float(0x00000000), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL(-M_PI, fxpt::fixed_to_float(0x80000000), SIN_COS_TOLERANCE); - - if(0) { - /* - * These are disabled because of some precision issues. - * - * Different compilers seem to have different opinions on whether - * the calulations are done single or double (or extended) - * precision. Any of the answers are fine for our real purpose, but - * sometimes the answer is off by a few bits at the bottom. - * Hence, the disabled check. - */ - CPPUNIT_ASSERT_EQUAL((int32_t) 0x40000000, fxpt::float_to_fixed(M_PI/2)); - CPPUNIT_ASSERT_EQUAL((int32_t) 0, fxpt::float_to_fixed(0)); - CPPUNIT_ASSERT_EQUAL((int32_t) 0x80000000, fxpt::float_to_fixed(-M_PI)); - } -} - -void -qa_fxpt::t1() -{ - CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, fxpt::sin (0x00000000), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.707106781, fxpt::sin (0x20000000), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL( 1, fxpt::sin (0x40000000), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL( 0.707106781, fxpt::sin (0x60000000), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, fxpt::sin (0x7fffffff), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, fxpt::sin (0x80000000), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL( 0, fxpt::sin (0x80000001), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL(-1, fxpt::sin (-0x40000000), SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL(-0.707106781, fxpt::sin (-0x20000000), SIN_COS_TOLERANCE); - - for(float p = -M_PI; p < M_PI; p += 2 * M_PI / 3600) { - float expected = sin(p); - float actual = fxpt::sin(fxpt::float_to_fixed(p)); - CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, SIN_COS_TOLERANCE); - } -} - -void -qa_fxpt::t2() -{ - for(float p = -M_PI; p < M_PI; p += 2 * M_PI / 3600) { - float expected = cos(p); - float actual = fxpt::cos(fxpt::float_to_fixed(p)); - CPPUNIT_ASSERT_DOUBLES_EQUAL(expected, actual, SIN_COS_TOLERANCE); - } -} - -void -qa_fxpt::t3() -{ - for(float p = -M_PI; p < M_PI; p += 2 * M_PI / 3600) { - float expected_sin = sin(p); - float expected_cos = cos(p); - float actual_sin; - float actual_cos; - fxpt::sincos(fxpt::float_to_fixed(p), &actual_sin, &actual_cos); - CPPUNIT_ASSERT_DOUBLES_EQUAL(expected_sin, actual_sin, SIN_COS_TOLERANCE); - CPPUNIT_ASSERT_DOUBLES_EQUAL(expected_cos, actual_cos, SIN_COS_TOLERANCE); - } -} diff --git a/gr-blocks/lib/qa_fxpt.h b/gr-blocks/lib/qa_fxpt.h deleted file mode 100644 index 7a9e2a86ed..0000000000 --- a/gr-blocks/lib/qa_fxpt.h +++ /dev/null @@ -1,47 +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_QA_GR_FXPT_H -#define INCLUDED_QA_GR_FXPT_H - -#include <cppunit/extensions/HelperMacros.h> -#include <cppunit/TestCase.h> - -class qa_fxpt : public CppUnit::TestCase -{ - CPPUNIT_TEST_SUITE(qa_fxpt); - CPPUNIT_TEST(t0); - CPPUNIT_TEST(t1); - CPPUNIT_TEST(t2); - CPPUNIT_TEST(t3); - CPPUNIT_TEST_SUITE_END(); - - private: - void t0(); - void t1(); - void t2(); - void t3(); -}; - -#endif /* INCLUDED_QA_GR_FXPT_H */ - - diff --git a/gr-blocks/lib/qa_fxpt_nco.cc b/gr-blocks/lib/qa_fxpt_nco.cc deleted file mode 100644 index 63c0a92902..0000000000 --- a/gr-blocks/lib/qa_fxpt_nco.cc +++ /dev/null @@ -1,122 +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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <qa_fxpt_nco.h> -#include <blocks/fxpt_nco.h> -#include <blocks/nco.h> -#include <cppunit/TestAssert.h> -#include <iostream> -#include <stdio.h> -#include <unistd.h> -#include <math.h> - -using namespace gr::blocks; - -static const float SIN_COS_TOLERANCE = 1e-5; - -//static const float SIN_COS_FREQ = 5003; -static const float SIN_COS_FREQ = 4096; - -static const int SIN_COS_BLOCK_SIZE = 100000; - -static double max_d(double a, double b) -{ - return fabs(a) > fabs(b) ? a : b; -} - -void -qa_fxpt_nco::t0() -{ - nco<float,float> ref_nco; - fxpt_nco new_nco; - double max_error = 0, max_phase_error = 0; - - ref_nco.set_freq((float)(2 * M_PI / SIN_COS_FREQ)); - new_nco.set_freq((float)(2 * M_PI / SIN_COS_FREQ)); - - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_nco.get_freq(), new_nco.get_freq(), SIN_COS_TOLERANCE); - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - float ref_sin = ref_nco.sin(); - float new_sin = new_nco.sin(); - //printf ("i = %6d\n", i); - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_sin, new_sin, SIN_COS_TOLERANCE); - - max_error = max_d(max_error, ref_sin-new_sin); - - float ref_cos = ref_nco.cos(); - float new_cos = new_nco.cos(); - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_cos, new_cos, SIN_COS_TOLERANCE); - - max_error = max_d(max_error, ref_cos-new_cos); - - ref_nco.step(); - new_nco.step(); - - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_nco.get_phase(), new_nco.get_phase(), SIN_COS_TOLERANCE); - - max_phase_error = max_d(max_phase_error, ref_nco.get_phase()-new_nco.get_phase()); - } - // printf("Fxpt max error %.9f, max phase error %.9f\n", max_error, max_phase_error); -} - -void -qa_fxpt_nco::t1() -{ - nco<float,float> ref_nco; - fxpt_nco new_nco; - gr_complex ref_block[SIN_COS_BLOCK_SIZE]; - gr_complex new_block[SIN_COS_BLOCK_SIZE]; - double max_error = 0; - - ref_nco.set_freq((float)(2 * M_PI / SIN_COS_FREQ)); - new_nco.set_freq((float)(2 * M_PI / SIN_COS_FREQ)); - - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_nco.get_freq(), new_nco.get_freq(), SIN_COS_TOLERANCE); - - ref_nco.sincos((gr_complex*)ref_block, SIN_COS_BLOCK_SIZE); - new_nco.sincos((gr_complex*)new_block, SIN_COS_BLOCK_SIZE); - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_block[i].real(), new_block[i].real(), SIN_COS_TOLERANCE); - max_error = max_d(max_error, ref_block[i].real()-new_block[i].real()); - - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_block[i].imag(), new_block[i].imag(), SIN_COS_TOLERANCE); - max_error = max_d(max_error, ref_block[i].imag()-new_block[i].imag()); - } - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_nco.get_phase(), new_nco.get_phase(), SIN_COS_TOLERANCE); - // printf("Fxpt max error %.9f, max phase error %.9f\n", max_error, max_phase_error); -} - -void -qa_fxpt_nco::t2() -{ -} - -void -qa_fxpt_nco::t3() -{ -} diff --git a/gr-blocks/lib/qa_fxpt_nco.h b/gr-blocks/lib/qa_fxpt_nco.h deleted file mode 100644 index ac4e5d2ade..0000000000 --- a/gr-blocks/lib/qa_fxpt_nco.h +++ /dev/null @@ -1,47 +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_QA_GR_FXPT_NCO_H -#define INCLUDED_QA_GR_FXPT_NCO_H - -#include <cppunit/extensions/HelperMacros.h> -#include <cppunit/TestCase.h> - -class qa_fxpt_nco : public CppUnit::TestCase -{ - CPPUNIT_TEST_SUITE(qa_fxpt_nco); - CPPUNIT_TEST(t0); - CPPUNIT_TEST(t1); - CPPUNIT_TEST(t2); - CPPUNIT_TEST(t3); - CPPUNIT_TEST_SUITE_END(); - - private: - void t0(); - void t1(); - void t2(); - void t3(); -}; - -#endif /* INCLUDED_QA_GR_FXPT_NCO_H */ - - diff --git a/gr-blocks/lib/qa_fxpt_vco.cc b/gr-blocks/lib/qa_fxpt_vco.cc deleted file mode 100644 index 2efce0506b..0000000000 --- a/gr-blocks/lib/qa_fxpt_vco.cc +++ /dev/null @@ -1,112 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 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. - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <qa_fxpt_vco.h> -#include <blocks/fxpt_vco.h> -#include <blocks/vco.h> -#include <cppunit/TestAssert.h> -#include <iostream> -#include <stdio.h> -#include <unistd.h> -#include <math.h> - -using namespace gr::blocks; - -static const float SIN_COS_TOLERANCE = 1e-5; - -static const float SIN_COS_K = 0.42; -static const float SIN_COS_AMPL = 0.8; - -static const int SIN_COS_BLOCK_SIZE = 100000; - -static double max_d(double a, double b) -{ - return fabs(a) > fabs(b) ? a : b; -} - -void -qa_fxpt_vco::t0() -{ - vco<float,float> ref_vco; - fxpt_vco new_vco; - double max_error = 0, max_phase_error = 0; - float input[SIN_COS_BLOCK_SIZE]; - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - input[i] = sin(double(i)); - } - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - float ref_cos = ref_vco.cos(); - float new_cos = new_vco.cos(); - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_cos, new_cos, SIN_COS_TOLERANCE); - - max_error = max_d(max_error, ref_cos-new_cos); - - ref_vco.adjust_phase(input[i]); - new_vco.adjust_phase(input[i]); - - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_vco.get_phase(), new_vco.get_phase(), SIN_COS_TOLERANCE); - - max_phase_error = max_d(max_phase_error, ref_vco.get_phase()-new_vco.get_phase()); - } - // printf("Fxpt max error %.9f, max phase error %.9f\n", max_error, max_phase_error); -} - -void -qa_fxpt_vco::t1() -{ - vco<float,float> ref_vco; - fxpt_vco new_vco; - float ref_block[SIN_COS_BLOCK_SIZE]; - float new_block[SIN_COS_BLOCK_SIZE]; - float input[SIN_COS_BLOCK_SIZE]; - double max_error = 0; - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - input[i] = sin(double(i)); - } - - ref_vco.cos(ref_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); - new_vco.cos(new_block, input, SIN_COS_BLOCK_SIZE, SIN_COS_K, SIN_COS_AMPL); - - for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) { - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_block[i], new_block[i], SIN_COS_TOLERANCE); - max_error = max_d(max_error, ref_block[i]-new_block[i]); - } - CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_vco.get_phase(), new_vco.get_phase(), SIN_COS_TOLERANCE); - // printf("Fxpt max error %.9f, max phase error %.9f\n", max_error, ref_vco.get_phase()-new_vco.get_phase()); -} - -void -qa_fxpt_vco::t2() -{ -} - -void -qa_fxpt_vco::t3() -{ -} diff --git a/gr-blocks/lib/qa_fxpt_vco.h b/gr-blocks/lib/qa_fxpt_vco.h deleted file mode 100644 index 72693f32e2..0000000000 --- a/gr-blocks/lib/qa_fxpt_vco.h +++ /dev/null @@ -1,47 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 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_QA_GR_FXPT_VCO_H -#define INCLUDED_QA_GR_FXPT_VCO_H - -#include <cppunit/extensions/HelperMacros.h> -#include <cppunit/TestCase.h> - -class qa_fxpt_vco : public CppUnit::TestCase -{ - CPPUNIT_TEST_SUITE(qa_fxpt_vco); - CPPUNIT_TEST(t0); - CPPUNIT_TEST(t1); - CPPUNIT_TEST(t2); - CPPUNIT_TEST(t3); - CPPUNIT_TEST_SUITE_END(); - -private: - void t0(); - void t1(); - void t2(); - void t3(); -}; - -#endif /* INCLUDED_QA_GR_FXPT_VCO_H */ - - diff --git a/gr-blocks/lib/vco_f_impl.h b/gr-blocks/lib/vco_f_impl.h index cecf72441f..37435b7736 100644 --- a/gr-blocks/lib/vco_f_impl.h +++ b/gr-blocks/lib/vco_f_impl.h @@ -24,7 +24,7 @@ #define INCLUDED_GR_VCO_F_IMPL_H #include <blocks/vco_f.h> -#include <blocks/fxpt_vco.h> +#include <gr_fxpt_vco.h> namespace gr { namespace blocks { @@ -36,7 +36,7 @@ namespace gr { double d_sensitivity; double d_amplitude; double d_k; - fxpt_vco d_vco; + gr_fxpt_vco d_vco; public: vco_f_impl(double sampling_rate, double sensitivity, double amplitude); diff --git a/gr-blocks/swig/blocks_swig.i b/gr-blocks/swig/blocks_swig.i index ad0b7b0717..9be2281b11 100644 --- a/gr-blocks/swig/blocks_swig.i +++ b/gr-blocks/swig/blocks_swig.i @@ -64,6 +64,7 @@ #include "blocks/burst_tagger.h" #include "blocks/char_to_float.h" #include "blocks/char_to_short.h" +#include "blocks/check_lfsr_32k_s.h" #include "blocks/complex_to_interleaved_short.h" #include "blocks/complex_to_float.h" #include "blocks/complex_to_real.h" @@ -103,6 +104,7 @@ #include "blocks/interleaved_short_to_complex.h" #include "blocks/keep_m_in_n.h" #include "blocks/keep_one_in_n.h" +#include "blocks/lfsr_32k_source_s.h" #include "blocks/max_ff.h" #include "blocks/max_ii.h" #include "blocks/max_ss.h" @@ -258,6 +260,7 @@ %include "blocks/bin_statistics_f.h" %include "blocks/burst_tagger.h" %include "blocks/char_to_short.h" +%include "blocks/check_lfsr_32k_s.h" %include "blocks/complex_to_interleaved_short.h" %include "blocks/complex_to_float.h" %include "blocks/complex_to_real.h" @@ -297,6 +300,7 @@ %include "blocks/interleaved_short_to_complex.h" %include "blocks/keep_m_in_n.h" %include "blocks/keep_one_in_n.h" +%include "blocks/lfsr_32k_source_s.h" %include "blocks/max_ff.h" %include "blocks/max_ii.h" %include "blocks/max_ss.h" @@ -451,6 +455,7 @@ GR_SWIG_BLOCK_MAGIC2(blocks, bin_statistics_f); GR_SWIG_BLOCK_MAGIC2(blocks, burst_tagger); GR_SWIG_BLOCK_MAGIC2(blocks, char_to_float); GR_SWIG_BLOCK_MAGIC2(blocks, char_to_short); +GR_SWIG_BLOCK_MAGIC2(blocks, check_lfsr_32k_s); GR_SWIG_BLOCK_MAGIC2(blocks, complex_to_interleaved_short); GR_SWIG_BLOCK_MAGIC2(blocks, complex_to_float); GR_SWIG_BLOCK_MAGIC2(blocks, complex_to_real); @@ -488,6 +493,7 @@ GR_SWIG_BLOCK_MAGIC2(blocks, interleave); GR_SWIG_BLOCK_MAGIC2(blocks, interleaved_short_to_complex); GR_SWIG_BLOCK_MAGIC2(blocks, keep_m_in_n); GR_SWIG_BLOCK_MAGIC2(blocks, keep_one_in_n); +GR_SWIG_BLOCK_MAGIC2(blocks, lfsr_32k_source_s); GR_SWIG_BLOCK_MAGIC2(blocks, max_ff); GR_SWIG_BLOCK_MAGIC2(blocks, max_ii); GR_SWIG_BLOCK_MAGIC2(blocks, max_ss); |