diff options
author | jcorgan | 2007-03-14 22:49:45 +0000 |
---|---|---|
committer | jcorgan | 2007-03-14 22:49:45 +0000 |
commit | 75f9f9c4373fe6ec5e88045151614c3ff3ad983e (patch) | |
tree | 0e1dc13579c4db5705d84057de27f15ebb0a6575 | |
parent | 6bbda4eb07df7091f5e8d2cadc4635bab9f616db (diff) | |
download | gnuradio-75f9f9c4373fe6ec5e88045151614c3ff3ad983e.tar.gz gnuradio-75f9f9c4373fe6ec5e88045151614c3ff3ad983e.tar.bz2 gnuradio-75f9f9c4373fe6ec5e88045151614c3ff3ad983e.zip |
Merged r4750:4755 from jcorgan/frac into trunk. Adds gr_fractional_interpolator_ff and _cc. Passes distcheck.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@4756 221aa14e-8319-0410-a670-987f0aec2ac5
-rw-r--r-- | gnuradio-core/src/lib/filter/Makefile.am | 10 | ||||
-rw-r--r-- | gnuradio-core/src/lib/filter/filter.i | 6 | ||||
-rw-r--r-- | gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.cc | 93 | ||||
-rw-r--r-- | gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.h | 67 | ||||
-rw-r--r-- | gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.i | 37 | ||||
-rw-r--r-- | gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.cc (renamed from gnuradio-core/src/lib/filter/gr_fractional_interpolator.cc) | 34 | ||||
-rw-r--r-- | gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.h (renamed from gnuradio-core/src/lib/filter/gr_fractional_interpolator.h) | 31 | ||||
-rw-r--r-- | gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.i | 37 | ||||
-rw-r--r-- | gnuradio-core/src/python/gnuradio/gr/Makefile.am | 1 | ||||
-rwxr-xr-x | gnuradio-core/src/python/gnuradio/gr/qa_fractional_interpolator.py | 39 |
10 files changed, 319 insertions, 36 deletions
diff --git a/gnuradio-core/src/lib/filter/Makefile.am b/gnuradio-core/src/lib/filter/Makefile.am index 32be27044..b22f37c12 100644 --- a/gnuradio-core/src/lib/filter/Makefile.am +++ b/gnuradio-core/src/lib/filter/Makefile.am @@ -1,5 +1,5 @@ # -# Copyright 2001,2002,2004,2005,2006 Free Software Foundation, Inc. +# Copyright 2001,2002,2004,2005,2006,2007 Free Software Foundation, Inc. # # This file is part of GNU Radio # @@ -170,7 +170,8 @@ libfilter_la_common_SOURCES = \ gr_fft_filter_fff.cc \ gr_goertzel_fc.cc \ gr_filter_delay_fc.cc \ - gr_fractional_interpolator.cc \ + gr_fractional_interpolator_ff.cc \ + gr_fractional_interpolator_cc.cc \ gr_hilbert_fc.cc \ gr_iir_filter_ffd.cc \ gr_sincos.c \ @@ -229,7 +230,8 @@ grinclude_HEADERS = \ gr_fft_filter_fff.h \ gr_filter_delay_fc.h \ gr_fir_sysconfig_x86.h \ - gr_fractional_interpolator.h \ + gr_fractional_interpolator_ff.h \ + gr_fractional_interpolator_cc.h \ gr_goertzel_fc.h \ gr_hilbert_fc.h \ gr_iir_filter_ffd.h \ @@ -291,6 +293,8 @@ swiginclude_HEADERS = \ gr_fft_filter_ccc.i \ gr_fft_filter_fff.i \ gr_filter_delay_fc.i \ + gr_fractional_interpolator_ff.i \ + gr_fractional_interpolator_cc.i \ gr_goertzel_fc.i \ gr_hilbert_fc.i \ gr_iir_filter_ffd.i \ diff --git a/gnuradio-core/src/lib/filter/filter.i b/gnuradio-core/src/lib/filter/filter.i index 6d16ae872..c7a06b455 100644 --- a/gnuradio-core/src/lib/filter/filter.i +++ b/gnuradio-core/src/lib/filter/filter.i @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2004,2005,2006 Free Software Foundation, Inc. + * Copyright 2004,2005,2006,2007 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -28,6 +28,8 @@ #include <gr_filter_delay_fc.h> #include <gr_fft_filter_ccc.h> #include <gr_fft_filter_fff.h> +#include <gr_fractional_interpolator_ff.h> +#include <gr_fractional_interpolator_cc.h> #include <gr_goertzel_fc.h> #include <gr_cma_equalizer_cc.h> %} @@ -39,6 +41,8 @@ %include "gr_filter_delay_fc.i" %include "gr_fft_filter_ccc.i" %include "gr_fft_filter_fff.i" +%include "gr_fractional_interpolator_ff.i" +%include "gr_fractional_interpolator_cc.i" %include "gr_goertzel_fc.i" %include "gr_cma_equalizer_cc.i" diff --git a/gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.cc b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.cc new file mode 100644 index 000000000..312626a1d --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.cc @@ -0,0 +1,93 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,2007 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 2, 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 <gr_io_signature.h> +#include <gr_fractional_interpolator_cc.h> +#include <gri_mmse_fir_interpolator_cc.h> +#include <stdexcept> + +// Public constructor +gr_fractional_interpolator_cc_sptr gr_make_fractional_interpolator_cc(float phase_shift, float interp_ratio) +{ + return gr_fractional_interpolator_cc_sptr(new gr_fractional_interpolator_cc(phase_shift, interp_ratio)); +} + +gr_fractional_interpolator_cc::gr_fractional_interpolator_cc(float phase_shift, float interp_ratio) + : gr_block ("fractional_interpolator_cc", + gr_make_io_signature (1, 1, sizeof (float)), + gr_make_io_signature (1, 1, sizeof (float))), + d_mu (phase_shift), d_mu_inc (interp_ratio), d_interp(new gri_mmse_fir_interpolator_cc()) +{ + if (interp_ratio <= 0) + throw std::out_of_range ("interpolation ratio must be > 0"); + if (phase_shift < 0 || phase_shift > 1) + throw std::out_of_range ("phase shift ratio must be > 0 and < 1"); + + set_relative_rate (1.0 / interp_ratio); +} + +gr_fractional_interpolator_cc::~gr_fractional_interpolator_cc() +{ + delete d_interp; +} + +void +gr_fractional_interpolator_cc::forecast(int noutput_items, gr_vector_int &ninput_items_required) +{ + unsigned ninputs = ninput_items_required.size(); + for (unsigned i=0; i < ninputs; i++) + + ninput_items_required[i] = + (int) ceil((noutput_items * d_mu_inc) + d_interp->ntaps()); +} + +int +gr_fractional_interpolator_cc::general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + const gr_complex *in = (const gr_complex *) input_items[0]; + gr_complex *out = (gr_complex *) output_items[0]; + + int ii = 0; // input index + int oo = 0; // output index + + while (oo < noutput_items) { + + out[oo++] = d_interp->interpolate(&in[ii], d_mu); + + double s = d_mu + d_mu_inc; + double f = floor (s); + int incr = (int) f; + d_mu = s - f; + ii += incr; + } + + consume_each (ii); + + return noutput_items; +} diff --git a/gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.h b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.h new file mode 100644 index 000000000..a17866123 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.h @@ -0,0 +1,67 @@ +/* -*- c++ -*- */ +/* + * Copyright 2004,2007 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 2, 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_FRACTIONAL_INTERPOLATOR_CC_H +#define INCLUDED_GR_FRACTIONAL_INTERPOLATOR_CC_H + +#include <gr_block.h> + +class gri_mmse_fir_interpolator_cc; + +class gr_fractional_interpolator_cc; +typedef boost::shared_ptr<gr_fractional_interpolator_cc> gr_fractional_interpolator_cc_sptr; + +// public constructor +gr_fractional_interpolator_cc_sptr gr_make_fractional_interpolator_cc (float phase_shift, float interp_ratio); + +/*! + * \brief Interpolating mmse filter with gr_complex input, gr_complex output + * \ingroup filter + */ +class gr_fractional_interpolator_cc : public gr_block +{ +public: + ~gr_fractional_interpolator_cc (); + void forecast(int noutput_items, gr_vector_int &ninput_items_required); + int general_work (int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + + float mu() const { return d_mu;} + float interp_ratio() const { return d_mu_inc;} + void set_mu (float mu) { d_mu = mu; } + void set_interp_ratio (float interp_ratio) { d_mu_inc = interp_ratio; } + +protected: + gr_fractional_interpolator_cc (float phase_shift, float interp_ratio); + +private: + float d_mu; + float d_mu_inc; + gri_mmse_fir_interpolator_cc *d_interp; + + friend gr_fractional_interpolator_cc_sptr + gr_make_fractional_interpolator_cc (float phase_shift, float interp_ratio); +}; + +#endif diff --git a/gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.i b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.i new file mode 100644 index 000000000..fd51ec720 --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_cc.i @@ -0,0 +1,37 @@ +/* -*- c++ -*- */ +/* + * Copyright 2007 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 2, 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. + */ + +GR_SWIG_BLOCK_MAGIC(gr,fractional_interpolator_cc); + +gr_fractional_interpolator_cc_sptr gr_make_fractional_interpolator_cc (float phase_shift, float interp_ratio); + +class gr_fractional_interpolator_cc : public gr_block +{ +private: + gr_fractional_interpolator_cc (float phase_shift, float interp_ratio); + +public: + float mu() const; + float interp_ratio() const; + void set_mu (float mu); + void set_interp_ratio (float interp_ratio); +}; diff --git a/gnuradio-core/src/lib/filter/gr_fractional_interpolator.cc b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.cc index cee337ca8..3254b1fa6 100644 --- a/gnuradio-core/src/lib/filter/gr_fractional_interpolator.cc +++ b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.cc @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2004 Free Software Foundation, Inc. + * Copyright 2004,2007 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -25,21 +25,21 @@ #endif #include <gr_io_signature.h> -#include <gr_fractional_interpolator.h> +#include <gr_fractional_interpolator_ff.h> #include <gri_mmse_fir_interpolator.h> #include <stdexcept> // Public constructor -gr_fractional_interpolator_sptr gr_make_fractional_interpolator(float phase_shift, float interp_ratio) +gr_fractional_interpolator_ff_sptr gr_make_fractional_interpolator_ff(float phase_shift, float interp_ratio) { - return gr_fractional_interpolator_sptr(new gr_fractional_interpolator(phase_shift, interp_ratio)); + return gr_fractional_interpolator_ff_sptr(new gr_fractional_interpolator_ff(phase_shift, interp_ratio)); } -gr_fractional_interpolator::gr_fractional_interpolator(float phase_shift, float interp_ratio) - : gr_block ("fractional_interpolator", +gr_fractional_interpolator_ff::gr_fractional_interpolator_ff(float phase_shift, float interp_ratio) + : gr_block ("fractional_interpolator_ff", gr_make_io_signature (1, 1, sizeof (float)), gr_make_io_signature (1, 1, sizeof (float))), - d_mu (phase_shift), d_mu_inc (interp_ratio), d_interp() + d_mu (phase_shift), d_mu_inc (interp_ratio), d_interp(new gri_mmse_fir_interpolator()) { if (interp_ratio <= 0) throw std::out_of_range ("interpolation ratio must be > 0"); @@ -49,13 +49,13 @@ gr_fractional_interpolator::gr_fractional_interpolator(float phase_shift, float set_relative_rate (1.0 / interp_ratio); } -gr_fractional_interpolator::~gr_fractional_interpolator() +gr_fractional_interpolator_ff::~gr_fractional_interpolator_ff() { - delete d_interp; + delete d_interp; } void -gr_fractional_interpolator::forecast(int noutput_items, gr_vector_int &ninput_items_required) +gr_fractional_interpolator_ff::forecast(int noutput_items, gr_vector_int &ninput_items_required) { unsigned ninputs = ninput_items_required.size(); for (unsigned i=0; i < ninputs; i++) @@ -65,10 +65,10 @@ gr_fractional_interpolator::forecast(int noutput_items, gr_vector_int &ninput_it } int -gr_fractional_interpolator::general_work(int noutput_items, - gr_vector_int &ninput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) +gr_fractional_interpolator_ff::general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) { const float *in = (const float *) input_items[0]; float *out = (float *) output_items[0]; @@ -76,14 +76,10 @@ gr_fractional_interpolator::general_work(int noutput_items, int ii = 0; // input index int oo = 0; // output index - while (oo < noutput_items){ - - // produce output sample + while (oo < noutput_items) { out[oo++] = d_interp->interpolate(&in[ii], d_mu); - // printf( "%4d %9.6f\n", ii, d_mu); - double s = d_mu + d_mu_inc; double f = floor (s); int incr = (int) f; diff --git a/gnuradio-core/src/lib/filter/gr_fractional_interpolator.h b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.h index 108694e56..7f144cd19 100644 --- a/gnuradio-core/src/lib/filter/gr_fractional_interpolator.h +++ b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.h @@ -1,6 +1,6 @@ /* -*- c++ -*- */ /* - * Copyright 2004 Free Software Foundation, Inc. + * Copyright 2004,2007 Free Software Foundation, Inc. * * This file is part of GNU Radio * @@ -20,43 +20,48 @@ * Boston, MA 02110-1301, USA. */ -#ifndef INCLUDED_GR_FRACTIONAL_INTERPOLATOR_H -#define INCLUDED_GR_FRACTIONAL_INTERPOLATOR_H +#ifndef INCLUDED_GR_FRACTIONAL_INTERPOLATOR_FF_H +#define INCLUDED_GR_FRACTIONAL_INTERPOLATOR_FF_H #include <gr_block.h> class gri_mmse_fir_interpolator; -class gr_fractional_interpolator; -typedef boost::shared_ptr<gr_fractional_interpolator> gr_fractional_interpolator_sptr; +class gr_fractional_interpolator_ff; +typedef boost::shared_ptr<gr_fractional_interpolator_ff> gr_fractional_interpolator_ff_sptr; // public constructor -gr_fractional_interpolator_sptr gr_make_fractional_interpolator (float phase_shift, float interp_ratio); +gr_fractional_interpolator_ff_sptr gr_make_fractional_interpolator_ff (float phase_shift, float interp_ratio); /*! * \brief Interpolating mmse filter with float input, float output * \ingroup filter */ -class gr_fractional_interpolator : public gr_block +class gr_fractional_interpolator_ff : public gr_block { - public: - ~gr_fractional_interpolator (); +public: + ~gr_fractional_interpolator_ff (); void forecast(int noutput_items, gr_vector_int &ninput_items_required); int general_work (int noutput_items, gr_vector_int &ninput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); + float mu() const { return d_mu;} + float interp_ratio() const { return d_mu_inc;} + void set_mu (float mu) { d_mu = mu; } + void set_interp_ratio (float interp_ratio) { d_mu_inc = interp_ratio; } + protected: - gr_fractional_interpolator (float phase_shift, float interp_ratio); + gr_fractional_interpolator_ff (float phase_shift, float interp_ratio); - private: +private: float d_mu; float d_mu_inc; gri_mmse_fir_interpolator *d_interp; - friend gr_fractional_interpolator_sptr - gr_make_fractional_interpolator (float phase_shift, float interp_ratio); + friend gr_fractional_interpolator_ff_sptr + gr_make_fractional_interpolator_ff (float phase_shift, float interp_ratio); }; #endif diff --git a/gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.i b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.i new file mode 100644 index 000000000..6f26b05bd --- /dev/null +++ b/gnuradio-core/src/lib/filter/gr_fractional_interpolator_ff.i @@ -0,0 +1,37 @@ +/* -*- c++ -*- */ +/* + * Copyright 2007 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 2, 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. + */ + +GR_SWIG_BLOCK_MAGIC(gr,fractional_interpolator_ff); + +gr_fractional_interpolator_ff_sptr gr_make_fractional_interpolator_ff (float phase_shift, float interp_ratio); + +class gr_fractional_interpolator_ff : public gr_block +{ +private: + gr_fractional_interpolator_ff (float phase_shift, float interp_ratio); + +public: + float mu() const; + float interp_ratio() const; + void set_mu (float mu); + void set_interp_ratio (float interp_ratio); +}; diff --git a/gnuradio-core/src/python/gnuradio/gr/Makefile.am b/gnuradio-core/src/python/gnuradio/gr/Makefile.am index 339fb81dd..3969a28fd 100644 --- a/gnuradio-core/src/python/gnuradio/gr/Makefile.am +++ b/gnuradio-core/src/python/gnuradio/gr/Makefile.am @@ -60,6 +60,7 @@ noinst_PYTHON = \ qa_fft_filter.py \ qa_filter_delay_fc.py \ qa_flow_graph.py \ + qa_fractional_interpolator.py \ qa_frequency_modulator.py \ qa_fsk_stuff.py \ qa_goertzel.py \ diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_fractional_interpolator.py b/gnuradio-core/src/python/gnuradio/gr/qa_fractional_interpolator.py new file mode 100755 index 000000000..afeebb55b --- /dev/null +++ b/gnuradio-core/src/python/gnuradio/gr/qa_fractional_interpolator.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python +# +# Copyright 2007 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 2, 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. +# + +from gnuradio import gr, gr_unittest + +class test_fractional_resampler (gr_unittest.TestCase): + + def setUp(self): + self.fg = gr.flow_graph() + + def tearDown(self): + self.fg = None + + def test_000_make(self): + op = gr.fractional_interpolator_ff(0.0, 1.0) + op2 = gr.fractional_interpolator_cc(0.0, 1.0) + +if __name__ == '__main__': + gr_unittest.main() + |