summaryrefslogtreecommitdiff
path: root/gr-analog/lib
diff options
context:
space:
mode:
Diffstat (limited to 'gr-analog/lib')
-rw-r--r--gr-analog/lib/CMakeLists.txt3
-rw-r--r--gr-analog/lib/pll_carriertracking_cc_impl.cc228
-rw-r--r--gr-analog/lib/pll_carriertracking_cc_impl.h76
-rw-r--r--gr-analog/lib/pll_freqdet_cf_impl.cc198
-rw-r--r--gr-analog/lib/pll_freqdet_cf_impl.h70
-rw-r--r--gr-analog/lib/pll_refout_cc_impl.cc201
-rw-r--r--gr-analog/lib/pll_refout_cc_impl.h69
7 files changed, 845 insertions, 0 deletions
diff --git a/gr-analog/lib/CMakeLists.txt b/gr-analog/lib/CMakeLists.txt
index a151fbf76..20a86621e 100644
--- a/gr-analog/lib/CMakeLists.txt
+++ b/gr-analog/lib/CMakeLists.txt
@@ -117,6 +117,9 @@ list(APPEND analog_sources
fmdet_cf_impl.cc
frequency_modulator_fc_impl.cc
phase_modulator_fc_impl.cc
+ pll_carriertracking_cc_impl.cc
+ pll_freqdet_cf_impl.cc
+ pll_refout_cc_impl.cc
)
list(APPEND analog_libs
diff --git a/gr-analog/lib/pll_carriertracking_cc_impl.cc b/gr-analog/lib/pll_carriertracking_cc_impl.cc
new file mode 100644
index 000000000..c53e0f433
--- /dev/null
+++ b/gr-analog/lib/pll_carriertracking_cc_impl.cc
@@ -0,0 +1,228 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,2010-2012 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 "pll_carriertracking_cc_impl.h"
+#include <gr_io_signature.h>
+#include <gr_sincos.h>
+#include <math.h>
+#include <gr_math.h>
+
+namespace gr {
+ namespace analog {
+
+#ifndef M_TWOPI
+#define M_TWOPI (2.0f*M_PI)
+#endif
+
+ pll_carriertracking_cc::sptr
+ pll_carriertracking_cc::make(float loop_bw, float max_freq, float min_freq)
+ {
+ return gnuradio::get_initial_sptr
+ (new pll_carriertracking_cc_impl(loop_bw, max_freq, min_freq));
+ }
+
+ pll_carriertracking_cc_impl::pll_carriertracking_cc_impl(float loop_bw,
+ float max_freq,
+ float min_freq)
+ : gr_sync_block("pll_carriertracking_cc",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ gri_control_loop(loop_bw, max_freq, min_freq),
+ d_locksig(0), d_lock_threshold(0), d_squelch_enable(false)
+ {
+ }
+
+ pll_carriertracking_cc_impl::~pll_carriertracking_cc_impl()
+ {
+ }
+
+ float
+ pll_carriertracking_cc_impl::mod_2pi(float in)
+ {
+ if(in>M_PI)
+ return in-M_TWOPI;
+ else if(in<-M_PI)
+ return in+M_TWOPI;
+ else
+ return in;
+ }
+
+ float
+ pll_carriertracking_cc_impl::phase_detector(gr_complex sample, float ref_phase)
+ {
+ float sample_phase;
+ // sample_phase = atan2(sample.imag(),sample.real());
+ sample_phase = gr_fast_atan2f(sample.imag(),sample.real());
+ return mod_2pi(sample_phase-ref_phase);
+ }
+
+ bool
+ pll_carriertracking_cc_impl::lock_detector(void)
+ {
+ return (fabsf(d_locksig) > d_lock_threshold);
+ }
+
+ bool
+ pll_carriertracking_cc_impl::squelch_enable(bool set_squelch)
+ {
+ return d_squelch_enable = set_squelch;
+ }
+
+ float
+ pll_carriertracking_cc_impl::set_lock_threshold(float threshold)
+ {
+ return d_lock_threshold = threshold;
+ }
+
+ int
+ pll_carriertracking_cc_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const gr_complex *iptr = (gr_complex*)input_items[0];
+ gr_complex *optr = (gr_complex*)output_items[0];
+
+ float error;
+ float t_imag, t_real;
+
+ for(int i = 0; i < noutput_items; i++) {
+ gr_sincosf(d_phase, &t_imag, &t_real);
+ optr[i] = iptr[i] * gr_complex(t_real, -t_imag);
+
+ error = phase_detector(iptr[i], d_phase);
+
+ advance_loop(error);
+ phase_wrap();
+ frequency_limit();
+
+ d_locksig = d_locksig * (1.0 - d_alpha) + \
+ d_alpha*(iptr[i].real() * t_real + iptr[i].imag() * t_imag);
+
+ if((d_squelch_enable) && !lock_detector())
+ optr[i] = 0;
+ }
+ return noutput_items;
+ }
+
+ void
+ pll_carriertracking_cc_impl::set_loop_bandwidth(float bw)
+ {
+ gri_control_loop::set_loop_bandwidth(bw);
+ }
+
+ void
+ pll_carriertracking_cc_impl::set_damping_factor(float df)
+ {
+ gri_control_loop::set_damping_factor(df);
+ }
+
+ void
+ pll_carriertracking_cc_impl::set_alpha(float alpha)
+ {
+ gri_control_loop::set_alpha(alpha);
+ }
+
+ void
+ pll_carriertracking_cc_impl::set_beta(float beta)
+ {
+ gri_control_loop::set_beta(beta);
+ }
+
+ void
+ pll_carriertracking_cc_impl::set_frequency(float freq)
+ {
+ gri_control_loop::set_frequency(freq);
+ }
+
+ void
+ pll_carriertracking_cc_impl::set_phase(float phase)
+ {
+ gri_control_loop::set_phase(phase);
+ }
+
+ void
+ pll_carriertracking_cc_impl::set_min_freq(float freq)
+ {
+ gri_control_loop::set_min_freq(freq);
+ }
+
+ void
+ pll_carriertracking_cc_impl::set_max_freq(float freq)
+ {
+ gri_control_loop::set_max_freq(freq);
+ }
+
+
+ float
+ pll_carriertracking_cc_impl::get_loop_bandwidth() const
+ {
+ return gri_control_loop::get_loop_bandwidth();
+ }
+
+ float
+ pll_carriertracking_cc_impl::get_damping_factor() const
+ {
+ return gri_control_loop::get_damping_factor();
+ }
+
+ float
+ pll_carriertracking_cc_impl::get_alpha() const
+ {
+ return gri_control_loop::get_alpha();
+ }
+
+ float
+ pll_carriertracking_cc_impl::get_beta() const
+ {
+ return gri_control_loop::get_beta();
+ }
+
+ float
+ pll_carriertracking_cc_impl::get_frequency() const
+ {
+ return gri_control_loop::get_frequency();
+ }
+
+ float
+ pll_carriertracking_cc_impl::get_phase() const
+ {
+ return gri_control_loop::get_phase();
+ }
+
+ float
+ pll_carriertracking_cc_impl::get_min_freq() const
+ {
+ return gri_control_loop::get_min_freq();
+ }
+
+ float
+ pll_carriertracking_cc_impl::get_max_freq() const
+ {
+ return gri_control_loop::get_max_freq();
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/pll_carriertracking_cc_impl.h b/gr-analog/lib/pll_carriertracking_cc_impl.h
new file mode 100644
index 000000000..d67223db8
--- /dev/null
+++ b/gr-analog/lib/pll_carriertracking_cc_impl.h
@@ -0,0 +1,76 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2006,2011,2012 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_ANALOG_PLL_CARRIERTRACKING_CC_IMPL_H
+#define INCLUDED_ANALOG_PLL_CARRIERTRACKING_CC_IMPL_H
+
+#include <analog/pll_carriertracking_cc.h>
+#include <gri_control_loop.h>
+
+namespace gr {
+ namespace analog {
+
+ class pll_carriertracking_cc_impl
+ : public pll_carriertracking_cc, public gri_control_loop
+ {
+ private:
+ float d_locksig,d_lock_threshold;
+ bool d_squelch_enable;
+
+ float mod_2pi(float in);
+ float phase_detector(gr_complex sample,float ref_phase);
+
+ public:
+ pll_carriertracking_cc_impl(float loop_bw, float max_freq, float min_freq);
+ ~pll_carriertracking_cc_impl();
+
+ bool lock_detector(void);
+ bool squelch_enable(bool);
+ float set_lock_threshold(float);
+
+ void set_loop_bandwidth(float bw);
+ void set_damping_factor(float df);
+ void set_alpha(float alpha);
+ void set_beta(float beta);
+ void set_frequency(float freq);
+ void set_phase(float phase);
+ void set_min_freq(float freq);
+ void set_max_freq(float freq);
+
+ float get_loop_bandwidth() const;
+ float get_damping_factor() const;
+ float get_alpha() const;
+ float get_beta() const;
+ float get_frequency() const;
+ float get_phase() const;
+ float get_min_freq() const;
+ float get_max_freq() const;
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* INCLUDED_ANALOG_PLL_CARRIERTRACKING_CC_IMPL_H */
diff --git a/gr-analog/lib/pll_freqdet_cf_impl.cc b/gr-analog/lib/pll_freqdet_cf_impl.cc
new file mode 100644
index 000000000..27e8d02aa
--- /dev/null
+++ b/gr-analog/lib/pll_freqdet_cf_impl.cc
@@ -0,0 +1,198 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010,2011 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 "pll_freqdet_cf_impl.h"
+#include <gr_io_signature.h>
+#include <math.h>
+#include <gr_math.h>
+
+namespace gr {
+ namespace analog {
+
+#ifndef M_TWOPI
+#define M_TWOPI (2.0f*M_PI)
+#endif
+
+ pll_freqdet_cf::sptr
+ pll_freqdet_cf::make(float loop_bw, float max_freq, float min_freq)
+ {
+ return gnuradio::get_initial_sptr
+ (new pll_freqdet_cf_impl(loop_bw, max_freq, min_freq));
+ }
+
+ pll_freqdet_cf_impl::pll_freqdet_cf_impl(float loop_bw, float max_freq, float min_freq)
+ : gr_sync_block("pll_freqdet_cf",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(float))),
+ gri_control_loop(loop_bw, max_freq, min_freq)
+ {
+ }
+
+ pll_freqdet_cf_impl::~pll_freqdet_cf_impl()
+ {
+ }
+
+ float
+ pll_freqdet_cf_impl::mod_2pi(float in)
+ {
+ if(in > M_PI)
+ return in - M_TWOPI;
+ else if(in < -M_PI)
+ return in + M_TWOPI;
+ else
+ return in;
+ }
+
+ float
+ pll_freqdet_cf_impl::phase_detector(gr_complex sample, float ref_phase)
+ {
+ float sample_phase;
+ sample_phase = gr_fast_atan2f(sample.imag(), sample.real());
+ return mod_2pi(sample_phase - ref_phase);
+ }
+
+ int
+ pll_freqdet_cf_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const gr_complex *iptr = (gr_complex*)input_items[0];
+ float *optr = (float*)output_items[0];
+
+ float error;
+ int size = noutput_items;
+
+ while(size-- > 0) {
+ *optr++ = d_freq;
+
+ error = phase_detector(*iptr++, d_phase);
+
+ advance_loop(error);
+ phase_wrap();
+ frequency_limit();
+ }
+ return noutput_items;
+ }
+
+ void
+ pll_freqdet_cf_impl::set_loop_bandwidth(float bw)
+ {
+ gri_control_loop::set_loop_bandwidth(bw);
+ }
+
+ void
+ pll_freqdet_cf_impl::set_damping_factor(float df)
+ {
+ gri_control_loop::set_damping_factor(df);
+ }
+
+ void
+ pll_freqdet_cf_impl::set_alpha(float alpha)
+ {
+ gri_control_loop::set_alpha(alpha);
+ }
+
+ void
+ pll_freqdet_cf_impl::set_beta(float beta)
+ {
+ gri_control_loop::set_beta(beta);
+ }
+
+ void
+ pll_freqdet_cf_impl::set_frequency(float freq)
+ {
+ gri_control_loop::set_frequency(freq);
+ }
+
+ void
+ pll_freqdet_cf_impl::set_phase(float phase)
+ {
+ gri_control_loop::set_phase(phase);
+ }
+
+ void
+ pll_freqdet_cf_impl::set_min_freq(float freq)
+ {
+ gri_control_loop::set_min_freq(freq);
+ }
+
+ void
+ pll_freqdet_cf_impl::set_max_freq(float freq)
+ {
+ gri_control_loop::set_max_freq(freq);
+ }
+
+
+ float
+ pll_freqdet_cf_impl::get_loop_bandwidth() const
+ {
+ return gri_control_loop::get_loop_bandwidth();
+ }
+
+ float
+ pll_freqdet_cf_impl::get_damping_factor() const
+ {
+ return gri_control_loop::get_damping_factor();
+ }
+
+ float
+ pll_freqdet_cf_impl::get_alpha() const
+ {
+ return gri_control_loop::get_alpha();
+ }
+
+ float
+ pll_freqdet_cf_impl::get_beta() const
+ {
+ return gri_control_loop::get_beta();
+ }
+
+ float
+ pll_freqdet_cf_impl::get_frequency() const
+ {
+ return gri_control_loop::get_frequency();
+ }
+
+ float
+ pll_freqdet_cf_impl::get_phase() const
+ {
+ return gri_control_loop::get_phase();
+ }
+
+ float
+ pll_freqdet_cf_impl::get_min_freq() const
+ {
+ return gri_control_loop::get_min_freq();
+ }
+
+ float
+ pll_freqdet_cf_impl::get_max_freq() const
+ {
+ return gri_control_loop::get_max_freq();
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/pll_freqdet_cf_impl.h b/gr-analog/lib/pll_freqdet_cf_impl.h
new file mode 100644
index 000000000..7acf53ebb
--- /dev/null
+++ b/gr-analog/lib/pll_freqdet_cf_impl.h
@@ -0,0 +1,70 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2011,2012 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_ANALOG_PLL_FREQDET_CF_IMPL_H
+#define INCLUDED_ANALOG_PLL_FREQDET_CF_IMPL_H
+
+#include <analog/pll_freqdet_cf.h>
+#include <gri_control_loop.h>
+
+namespace gr {
+ namespace analog {
+
+ class pll_freqdet_cf_impl :
+ public pll_freqdet_cf, public gri_control_loop
+ {
+ private:
+ float phase_detector(gr_complex sample,float ref_phase);
+
+ public:
+ pll_freqdet_cf_impl(float loop_bw, float max_freq, float min_freq);
+ ~pll_freqdet_cf_impl();
+
+ float mod_2pi(float in);
+
+ void set_loop_bandwidth(float bw);
+ void set_damping_factor(float df);
+ void set_alpha(float alpha);
+ void set_beta(float beta);
+ void set_frequency(float freq);
+ void set_phase(float phase);
+ void set_min_freq(float freq);
+ void set_max_freq(float freq);
+
+ float get_loop_bandwidth() const;
+ float get_damping_factor() const;
+ float get_alpha() const;
+ float get_beta() const;
+ float get_frequency() const;
+ float get_phase() const;
+ float get_min_freq() const;
+ float get_max_freq() const;
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* INCLUDED_ANALOG_PLL_FREQDET_CF_IMPL_H */
diff --git a/gr-analog/lib/pll_refout_cc_impl.cc b/gr-analog/lib/pll_refout_cc_impl.cc
new file mode 100644
index 000000000..b94e3660a
--- /dev/null
+++ b/gr-analog/lib/pll_refout_cc_impl.cc
@@ -0,0 +1,201 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2010-2012 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 "pll_refout_cc_impl.h"
+#include <gr_io_signature.h>
+#include <gr_sincos.h>
+#include <math.h>
+#include <gr_math.h>
+
+namespace gr {
+ namespace analog {
+
+#ifndef M_TWOPI
+#define M_TWOPI (2.0f*M_PI)
+#endif
+
+ pll_refout_cc::sptr
+ pll_refout_cc::make(float loop_bw, float max_freq, float min_freq)
+ {
+ return gnuradio::get_initial_sptr
+ (new pll_refout_cc_impl(loop_bw, max_freq, min_freq));
+ }
+
+ pll_refout_cc_impl::pll_refout_cc_impl(float loop_bw, float max_freq, float min_freq)
+ : gr_sync_block("pll_refout_cc",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ gri_control_loop(loop_bw, max_freq, min_freq)
+ {
+ }
+
+ pll_refout_cc_impl::~pll_refout_cc_impl()
+ {
+ }
+
+ float
+ pll_refout_cc_impl::mod_2pi(float in)
+ {
+ if(in > M_PI)
+ return in - M_TWOPI;
+ else if(in < -M_PI)
+ return in+ M_TWOPI;
+ else
+ return in;
+ }
+
+ float
+ pll_refout_cc_impl::phase_detector(gr_complex sample,float ref_phase)
+ {
+ float sample_phase;
+ sample_phase = gr_fast_atan2f(sample.imag(),sample.real());
+ return mod_2pi(sample_phase-ref_phase);
+ }
+
+ int
+ pll_refout_cc_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const gr_complex *iptr = (gr_complex*)input_items[0];
+ gr_complex *optr = (gr_complex*)output_items[0];
+
+ float error;
+ float t_imag, t_real;
+ int size = noutput_items;
+
+ while(size-- > 0) {
+ gr_sincosf(d_phase,&t_imag,&t_real);
+ *optr++ = gr_complex(t_real,t_imag);
+
+ error = phase_detector(*iptr++,d_phase);
+
+ advance_loop(error);
+ phase_wrap();
+ frequency_limit();
+ }
+ return noutput_items;
+ }
+
+ void
+ pll_refout_cc_impl::set_loop_bandwidth(float bw)
+ {
+ gri_control_loop::set_loop_bandwidth(bw);
+ }
+
+ void
+ pll_refout_cc_impl::set_damping_factor(float df)
+ {
+ gri_control_loop::set_damping_factor(df);
+ }
+
+ void
+ pll_refout_cc_impl::set_alpha(float alpha)
+ {
+ gri_control_loop::set_alpha(alpha);
+ }
+
+ void
+ pll_refout_cc_impl::set_beta(float beta)
+ {
+ gri_control_loop::set_beta(beta);
+ }
+
+ void
+ pll_refout_cc_impl::set_frequency(float freq)
+ {
+ gri_control_loop::set_frequency(freq);
+ }
+
+ void
+ pll_refout_cc_impl::set_phase(float phase)
+ {
+ gri_control_loop::set_phase(phase);
+ }
+
+ void
+ pll_refout_cc_impl::set_min_freq(float freq)
+ {
+ gri_control_loop::set_min_freq(freq);
+ }
+
+ void
+ pll_refout_cc_impl::set_max_freq(float freq)
+ {
+ gri_control_loop::set_max_freq(freq);
+ }
+
+
+ float
+ pll_refout_cc_impl::get_loop_bandwidth() const
+ {
+ return gri_control_loop::get_loop_bandwidth();
+ }
+
+ float
+ pll_refout_cc_impl::get_damping_factor() const
+ {
+ return gri_control_loop::get_damping_factor();
+ }
+
+ float
+ pll_refout_cc_impl::get_alpha() const
+ {
+ return gri_control_loop::get_alpha();
+ }
+
+ float
+ pll_refout_cc_impl::get_beta() const
+ {
+ return gri_control_loop::get_beta();
+ }
+
+ float
+ pll_refout_cc_impl::get_frequency() const
+ {
+ return gri_control_loop::get_frequency();
+ }
+
+ float
+ pll_refout_cc_impl::get_phase() const
+ {
+ return gri_control_loop::get_phase();
+ }
+
+ float
+ pll_refout_cc_impl::get_min_freq() const
+ {
+ return gri_control_loop::get_min_freq();
+ }
+
+ float
+ pll_refout_cc_impl::get_max_freq() const
+ {
+ return gri_control_loop::get_max_freq();
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/pll_refout_cc_impl.h b/gr-analog/lib/pll_refout_cc_impl.h
new file mode 100644
index 000000000..9e8ae286b
--- /dev/null
+++ b/gr-analog/lib/pll_refout_cc_impl.h
@@ -0,0 +1,69 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2011,2012 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_ANALOG_PLL_REFOUT_CC_IMPL_H
+#define INCLUDED_ANALOG_PLL_REFOUT_CC_IMPL_H
+
+#include <analog/pll_refout_cc.h>
+#include <gri_control_loop.h>
+
+namespace gr {
+ namespace analog {
+
+ class pll_refout_cc_impl
+ : public pll_refout_cc, public gri_control_loop
+ {
+ private:
+ float mod_2pi (float in);
+ float phase_detector(gr_complex sample, float ref_phase);
+
+ public:
+ pll_refout_cc_impl(float loop_bw, float max_freq, float min_freq);
+ ~pll_refout_cc_impl();
+
+ void set_loop_bandwidth(float bw);
+ void set_damping_factor(float df);
+ void set_alpha(float alpha);
+ void set_beta(float beta);
+ void set_frequency(float freq);
+ void set_phase(float phase);
+ void set_min_freq(float freq);
+ void set_max_freq(float freq);
+
+ float get_loop_bandwidth() const;
+ float get_damping_factor() const;
+ float get_alpha() const;
+ float get_beta() const;
+ float get_frequency() const;
+ float get_phase() const;
+ float get_min_freq() const;
+ float get_max_freq() const;
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* INCLUDED_ANALOG_PLL_REFOUT_CC_IMPL_H */