summaryrefslogtreecommitdiff
path: root/gr-analog/lib
diff options
context:
space:
mode:
authorTom Rondeau2012-10-31 16:28:53 -0400
committerTom Rondeau2012-10-31 16:28:53 -0400
commitac9430cd39bf12395952ca49b1966ec428fdadf3 (patch)
treec0458aace8a79df8a0595b837c709d5b982ce33f /gr-analog/lib
parentfa4f1c2fcec8536c9d71607a0a710878cb6010ff (diff)
parent21beb2a5dc1e589873b49836190c3caf354c86f7 (diff)
downloadgnuradio-ac9430cd39bf12395952ca49b1966ec428fdadf3.tar.gz
gnuradio-ac9430cd39bf12395952ca49b1966ec428fdadf3.tar.bz2
gnuradio-ac9430cd39bf12395952ca49b1966ec428fdadf3.zip
Merge branch 'analog'
Diffstat (limited to 'gr-analog/lib')
-rw-r--r--gr-analog/lib/CMakeLists.txt59
-rw-r--r--gr-analog/lib/agc2_cc_impl.cc70
-rw-r--r--gr-analog/lib/agc2_cc_impl.h59
-rw-r--r--gr-analog/lib/agc2_ff_impl.cc71
-rw-r--r--gr-analog/lib/agc2_ff_impl.h59
-rw-r--r--gr-analog/lib/agc_cc_impl.cc66
-rw-r--r--gr-analog/lib/agc_cc_impl.h56
-rw-r--r--gr-analog/lib/agc_ff_impl.cc64
-rw-r--r--gr-analog/lib/agc_ff_impl.h56
-rw-r--r--gr-analog/lib/cpfsk_bc_impl.cc86
-rw-r--r--gr-analog/lib/cpfsk_bc_impl.h54
-rw-r--r--gr-analog/lib/ctcss_squelch_ff_impl.cc130
-rw-r--r--gr-analog/lib/ctcss_squelch_ff_impl.h82
-rw-r--r--gr-analog/lib/dpll_bb_impl.cc98
-rw-r--r--gr-analog/lib/dpll_bb_impl.h58
-rw-r--r--gr-analog/lib/feedforward_agc_cc_impl.cc99
-rw-r--r--gr-analog/lib/feedforward_agc_cc_impl.h49
-rw-r--r--gr-analog/lib/fmdet_cf_impl.cc129
-rw-r--r--gr-analog/lib/fmdet_cf_impl.h62
-rw-r--r--gr-analog/lib/frequency_modulator_fc_impl.cc82
-rw-r--r--gr-analog/lib/frequency_modulator_fc_impl.h52
-rw-r--r--gr-analog/lib/noise_source_X_impl.cc.t116
-rw-r--r--gr-analog/lib/noise_source_X_impl.h.t58
-rw-r--r--gr-analog/lib/phase_modulator_fc_impl.cc73
-rw-r--r--gr-analog/lib/phase_modulator_fc_impl.h55
-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
-rw-r--r--gr-analog/lib/probe_avg_mag_sqrd_c_impl.cc91
-rw-r--r--gr-analog/lib/probe_avg_mag_sqrd_c_impl.h60
-rw-r--r--gr-analog/lib/probe_avg_mag_sqrd_cf_impl.cc93
-rw-r--r--gr-analog/lib/probe_avg_mag_sqrd_cf_impl.h60
-rw-r--r--gr-analog/lib/probe_avg_mag_sqrd_f_impl.cc92
-rw-r--r--gr-analog/lib/probe_avg_mag_sqrd_f_impl.h60
-rw-r--r--gr-analog/lib/pwr_squelch_cc_impl.cc73
-rw-r--r--gr-analog/lib/pwr_squelch_cc_impl.h78
-rw-r--r--gr-analog/lib/pwr_squelch_ff_impl.cc73
-rw-r--r--gr-analog/lib/pwr_squelch_ff_impl.h78
-rw-r--r--gr-analog/lib/qa_analog.cc41
-rw-r--r--gr-analog/lib/qa_analog.h38
-rw-r--r--gr-analog/lib/qa_rotator.cc81
-rw-r--r--gr-analog/lib/qa_rotator.h45
-rw-r--r--gr-analog/lib/qa_sincos.cc75
-rw-r--r--gr-analog/lib/qa_sincos.h47
-rw-r--r--gr-analog/lib/quadrature_demod_cf_impl.cc72
-rw-r--r--gr-analog/lib/quadrature_demod_cf_impl.h51
-rw-r--r--gr-analog/lib/rail_ff_impl.cc91
-rw-r--r--gr-analog/lib/rail_ff_impl.h57
-rw-r--r--gr-analog/lib/sig_source_X_impl.cc.t253
-rw-r--r--gr-analog/lib/sig_source_X_impl.h.t70
-rw-r--r--gr-analog/lib/simple_squelch_cc_impl.cc106
-rw-r--r--gr-analog/lib/simple_squelch_cc_impl.h59
-rw-r--r--gr-analog/lib/sincos.c86
-rw-r--r--gr-analog/lib/squelch_base_cc_impl.cc140
-rw-r--r--gr-analog/lib/squelch_base_cc_impl.h65
-rw-r--r--gr-analog/lib/squelch_base_ff_impl.cc140
-rw-r--r--gr-analog/lib/squelch_base_ff_impl.h65
-rw-r--r--gr-analog/lib/test_gr_analog.cc43
61 files changed, 5067 insertions, 1 deletions
diff --git a/gr-analog/lib/CMakeLists.txt b/gr-analog/lib/CMakeLists.txt
index f18c84274..5e7d131b0 100644
--- a/gr-analog/lib/CMakeLists.txt
+++ b/gr-analog/lib/CMakeLists.txt
@@ -27,6 +27,8 @@ include_directories(
${GR_FFT_INCLUDE_DIRS}
${GR_FILTER_INCLUDE_DIRS}
${CMAKE_CURRENT_BINARY_DIR}/../include
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}
)
include_directories(${Boost_INCLUDE_DIRS})
@@ -96,7 +98,8 @@ endmacro(expand_cc)
########################################################################
# Invoke macro to generate various sources
########################################################################
-#expand_cc(block bf bc sf sc if ic)
+expand_cc(noise_source_X_impl s i f c)
+expand_cc(sig_source_X_impl s i f c)
########################################################################
# Setup library
@@ -104,6 +107,30 @@ endmacro(expand_cc)
list(APPEND analog_sources
${generated_sources}
cpm.cc
+ squelch_base_cc_impl.cc
+ squelch_base_ff_impl.cc
+ agc_cc_impl.cc
+ agc_ff_impl.cc
+ agc2_cc_impl.cc
+ agc2_ff_impl.cc
+ cpfsk_bc_impl.cc
+ ctcss_squelch_ff_impl.cc
+ dpll_bb_impl.cc
+ feedforward_agc_cc_impl.cc
+ 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
+ probe_avg_mag_sqrd_c_impl.cc
+ probe_avg_mag_sqrd_cf_impl.cc
+ probe_avg_mag_sqrd_f_impl.cc
+ pwr_squelch_cc_impl.cc
+ pwr_squelch_ff_impl.cc
+ quadrature_demod_cf_impl.cc
+ rail_ff_impl.cc
+ simple_squelch_cc_impl.cc
)
list(APPEND analog_libs
@@ -117,3 +144,33 @@ add_library(gnuradio-analog SHARED ${analog_sources})
target_link_libraries(gnuradio-analog ${analog_libs})
GR_LIBRARY_FOO(gnuradio-analog RUNTIME_COMPONENT "analog_runtime" DEVEL_COMPONENT "analog_devel")
add_dependencies(gnuradio-analog analog_generated_includes analog_generated_swigs gnuradio-filter)
+
+
+########################################################################
+# QA C++ Code for gr-filter
+########################################################################
+if(ENABLE_TESTING)
+ include(GrTest)
+
+ include_directories(${CPPUNIT_INCLUDE_DIRS})
+ link_directories(${CPPUNIT_LIBRARY_DIRS})
+
+ list(APPEND test_gr_analog_sources
+ ${CMAKE_CURRENT_SOURCE_DIR}/test_gr_analog.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/qa_analog.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/qa_sincos.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/qa_rotator.cc
+ )
+
+ add_executable(test-gr-analog ${test_gr_analog_sources})
+
+ target_link_libraries(
+ test-gr-analog
+ gnuradio-core
+ gnuradio-analog
+ ${Boost_LIBRARIES}
+ ${CPPUNIT_LIBRARIES}
+ )
+
+ GR_ADD_TEST(test_gr_analog test-gr-analog)
+endif(ENABLE_TESTING)
diff --git a/gr-analog/lib/agc2_cc_impl.cc b/gr-analog/lib/agc2_cc_impl.cc
new file mode 100644
index 000000000..2ef18e5ab
--- /dev/null
+++ b/gr-analog/lib/agc2_cc_impl.cc
@@ -0,0 +1,70 @@
+/* -*- 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 "agc2_cc_impl.h"
+#include <gr_io_signature.h>
+
+namespace gr {
+ namespace analog {
+
+ agc2_cc::sptr
+ agc2_cc::make(float attack_rate, float decay_rate,
+ float reference,
+ float gain, float max_gain)
+ {
+ return gnuradio::get_initial_sptr
+ (new agc2_cc_impl(attack_rate, decay_rate,
+ reference, gain, max_gain));
+ }
+
+ agc2_cc_impl::agc2_cc_impl(float attack_rate, float decay_rate,
+ float reference,
+ float gain, float max_gain)
+ : gr_sync_block("agc2_cc",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ kernel::agc2_cc(attack_rate, decay_rate,
+ reference, gain, max_gain)
+ {
+ }
+
+ agc2_cc_impl::~agc2_cc_impl()
+ {
+ }
+
+ int
+ agc2_cc_impl::work(int noutput_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];
+ scaleN(out, in, noutput_items);
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/agc2_cc_impl.h b/gr-analog/lib/agc2_cc_impl.h
new file mode 100644
index 000000000..98afc668a
--- /dev/null
+++ b/gr-analog/lib/agc2_cc_impl.h
@@ -0,0 +1,59 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,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_AGC2_IMPL_CC_H
+#define INCLUDED_ANALOG_AGC2_IMPL_CC_H
+
+#include <analog/agc2_cc.h>
+
+namespace gr {
+ namespace analog {
+
+ class agc2_cc_impl : public agc2_cc, kernel::agc2_cc
+ {
+ public:
+ agc2_cc_impl(float attack_rate = 1e-1, float decay_rate = 1e-2,
+ float reference = 1.0,
+ float gain = 1.0, float max_gain = 0.0);
+ ~agc2_cc_impl();
+
+ float attack_rate() const { return kernel::agc2_cc::attack_rate(); }
+ float decay_rate() const { return kernel::agc2_cc::decay_rate(); }
+ float reference() const { return kernel::agc2_cc::reference(); }
+ float gain() const { return kernel::agc2_cc::gain(); }
+ float max_gain() const { return kernel::agc2_cc::max_gain(); }
+
+ void set_attack_rate(float rate) { kernel::agc2_cc::set_attack_rate(rate); }
+ void set_decay_rate(float rate) { kernel::agc2_cc::set_decay_rate(rate); }
+ void set_reference(float reference) { kernel::agc2_cc::set_reference(reference); }
+ void set_gain(float gain) { kernel::agc2_cc::set_gain(gain); }
+ void set_max_gain(float max_gain) { kernel::agc2_cc::set_max_gain(max_gain); }
+
+ 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_AGC2_CC_IMPL_H */
diff --git a/gr-analog/lib/agc2_ff_impl.cc b/gr-analog/lib/agc2_ff_impl.cc
new file mode 100644
index 000000000..e0cdd6c44
--- /dev/null
+++ b/gr-analog/lib/agc2_ff_impl.cc
@@ -0,0 +1,71 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,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 "agc2_ff_impl.h"
+#include <gr_io_signature.h>
+
+namespace gr {
+ namespace analog {
+
+ agc2_ff::sptr
+ agc2_ff::make(float attack_rate, float decay_rate,
+ float reference,
+ float gain, float max_gain)
+ {
+ return gnuradio::get_initial_sptr
+ (new agc2_ff_impl(attack_rate, decay_rate,
+ reference,
+ gain, max_gain));
+ }
+
+ agc2_ff_impl::~agc2_ff_impl()
+ {
+ }
+
+ agc2_ff_impl::agc2_ff_impl(float attack_rate, float decay_rate,
+ float reference,
+ float gain, float max_gain)
+ : gr_sync_block("agc2_ff",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(float)))
+ , kernel::agc2_ff(attack_rate, decay_rate,
+ reference, gain, max_gain)
+ {
+ }
+
+ int
+ agc2_ff_impl::work(int noutput_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];
+ scaleN(out, in, noutput_items);
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/agc2_ff_impl.h b/gr-analog/lib/agc2_ff_impl.h
new file mode 100644
index 000000000..df33c8e44
--- /dev/null
+++ b/gr-analog/lib/agc2_ff_impl.h
@@ -0,0 +1,59 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,2006,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_AGC2_FF_IMPL_H
+#define INCLUDED_ANALOG_AGC2_FF_IMPL_H
+
+#include <analog/agc2_ff.h>
+
+namespace gr {
+ namespace analog {
+
+ class agc2_ff_impl : public agc2_ff, kernel::agc2_ff
+ {
+ public:
+ agc2_ff_impl(float attack_rate = 1e-1, float decay_rate = 1e-2,
+ float reference = 1.0,
+ float gain = 1.0, float max_gain = 0.0);
+ ~agc2_ff_impl();
+
+ float attack_rate() const { return kernel::agc2_ff::attack_rate(); }
+ float decay_rate() const { return kernel::agc2_ff::decay_rate(); }
+ float reference() const { return kernel::agc2_ff::reference(); }
+ float gain() const { return kernel::agc2_ff::gain(); }
+ float max_gain() const { return kernel::agc2_ff::max_gain(); }
+
+ void set_attack_rate(float rate) { kernel::agc2_ff::set_attack_rate(rate); }
+ void set_decay_rate(float rate) { kernel::agc2_ff::set_decay_rate(rate); }
+ void set_reference(float reference) { kernel::agc2_ff::set_reference(reference); }
+ void set_gain(float gain) { kernel::agc2_ff::set_gain(gain); }
+ void set_max_gain(float max_gain) { kernel::agc2_ff::set_max_gain(max_gain); }
+
+ 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_AGC2_IMPL_FF_H */
diff --git a/gr-analog/lib/agc_cc_impl.cc b/gr-analog/lib/agc_cc_impl.cc
new file mode 100644
index 000000000..81e1f67f8
--- /dev/null
+++ b/gr-analog/lib/agc_cc_impl.cc
@@ -0,0 +1,66 @@
+/* -*- 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 "agc_cc_impl.h"
+#include <gr_io_signature.h>
+
+namespace gr {
+ namespace analog {
+
+ agc_cc::sptr
+ agc_cc::make(float rate, float reference,
+ float gain, float max_gain)
+ {
+ return gnuradio::get_initial_sptr
+ (new agc_cc_impl(rate, reference, gain, max_gain));
+ }
+
+ agc_cc_impl::agc_cc_impl(float rate, float reference,
+ float gain, float max_gain)
+ : gr_sync_block("agc_cc",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ kernel::agc_cc(rate, reference, gain, max_gain)
+ {
+ }
+
+ agc_cc_impl::~agc_cc_impl()
+ {
+ }
+
+ int
+ agc_cc_impl::work(int noutput_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];
+ scaleN(out, in, noutput_items);
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/agc_cc_impl.h b/gr-analog/lib/agc_cc_impl.h
new file mode 100644
index 000000000..822f46ef2
--- /dev/null
+++ b/gr-analog/lib/agc_cc_impl.h
@@ -0,0 +1,56 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,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_AGC_CC_IMPL_H
+#define INCLUDED_ANALOG_AGC_CC_IMPL_H
+
+#include <analog/agc_cc.h>
+
+namespace gr {
+ namespace analog {
+
+ class agc_cc_impl : public agc_cc, kernel::agc_cc
+ {
+ public:
+ agc_cc_impl(float rate = 1e-4, float reference = 1.0,
+ float gain = 1.0, float max_gain = 0.0);
+ ~agc_cc_impl();
+
+ float rate() const { return kernel::agc_cc::rate(); }
+ float reference() const { return kernel::agc_cc::reference(); }
+ float gain() const { return kernel::agc_cc::gain(); }
+ float max_gain() const { return kernel::agc_cc::max_gain(); }
+
+ void set_rate(float rate) { kernel::agc_cc::set_rate(rate); }
+ void set_reference(float reference) { kernel::agc_cc::set_reference(reference); }
+ void set_gain(float gain) { kernel::agc_cc::set_gain(gain); }
+ void set_max_gain(float max_gain) { kernel::agc_cc::set_max_gain(max_gain); }
+
+ 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_AGC_CC_IMPL_H */
diff --git a/gr-analog/lib/agc_ff_impl.cc b/gr-analog/lib/agc_ff_impl.cc
new file mode 100644
index 000000000..a80b90c12
--- /dev/null
+++ b/gr-analog/lib/agc_ff_impl.cc
@@ -0,0 +1,64 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,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 "agc_ff_impl.h"
+#include <gr_io_signature.h>
+
+namespace gr {
+ namespace analog {
+
+ agc_ff::sptr
+ agc_ff::make(float rate, float reference, float gain, float max_gain)
+ {
+ return gnuradio::get_initial_sptr
+ (new agc_ff_impl(rate, reference, gain, max_gain));
+ }
+
+ agc_ff_impl::agc_ff_impl(float rate, float reference, float gain, float max_gain)
+ : gr_sync_block("agc_ff",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(float))),
+ kernel::agc_ff(rate, reference, gain, max_gain)
+ {
+ }
+
+ agc_ff_impl::~agc_ff_impl()
+ {
+ }
+
+ int
+ agc_ff_impl::work(int noutput_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];
+ scaleN(out, in, noutput_items);
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/agc_ff_impl.h b/gr-analog/lib/agc_ff_impl.h
new file mode 100644
index 000000000..e309cca1b
--- /dev/null
+++ b/gr-analog/lib/agc_ff_impl.h
@@ -0,0 +1,56 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,2006,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_AGC_FF_IMPL_H
+#define INCLUDED_ANALOG_AGC_FF_IMPL_H
+
+#include <analog/agc_ff.h>
+
+namespace gr {
+ namespace analog {
+
+ class agc_ff_impl : public agc_ff, kernel::agc_ff
+ {
+ public:
+ agc_ff_impl(float rate = 1e-4, float reference = 1.0,
+ float gain = 1.0, float max_gain = 0.0);
+ ~agc_ff_impl();
+
+ float rate() const { return kernel::agc_ff::rate(); }
+ float reference() const { return kernel::agc_ff::reference(); }
+ float gain() const { return kernel::agc_ff::gain(); }
+ float max_gain() const { return kernel::agc_ff::max_gain(); }
+
+ void set_rate(float rate) { kernel::agc_ff::set_rate(rate); }
+ void set_reference(float reference) { kernel::agc_ff::set_reference(reference); }
+ void set_gain(float gain) { kernel::agc_ff::set_gain(gain); }
+ void set_max_gain(float max_gain) { kernel::agc_ff::set_max_gain(max_gain); }
+
+ 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_AGC_FF_IMPL_H */
diff --git a/gr-analog/lib/cpfsk_bc_impl.cc b/gr-analog/lib/cpfsk_bc_impl.cc
new file mode 100644
index 000000000..1b7f25f6c
--- /dev/null
+++ b/gr-analog/lib/cpfsk_bc_impl.cc
@@ -0,0 +1,86 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008,2010,2012 Free Software Foundation, Inc.
+ *
+ * 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 "cpfsk_bc_impl.h"
+#include <gr_io_signature.h>
+#include <gr_expj.h>
+
+namespace gr {
+ namespace analog {
+
+#define M_TWOPI (2*M_PI)
+
+ cpfsk_bc::sptr
+ cpfsk_bc::make(float k, float ampl, int samples_per_sym)
+ {
+ return gnuradio::get_initial_sptr
+ (new cpfsk_bc_impl(k, ampl, samples_per_sym));
+ }
+
+ cpfsk_bc_impl::cpfsk_bc_impl(float k, float ampl, int samples_per_sym)
+ : gr_sync_interpolator("cpfsk_bc",
+ gr_make_io_signature(1, 1, sizeof(char)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ samples_per_sym)
+ {
+ d_samples_per_sym = samples_per_sym;
+ d_freq = k*M_PI/samples_per_sym;
+ d_ampl = ampl;
+ d_phase = 0.0;
+ }
+
+ cpfsk_bc_impl::~cpfsk_bc_impl()
+ {
+ }
+
+ int
+ cpfsk_bc_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const char *in = (const char*)input_items[0];
+ gr_complex *out = (gr_complex*)output_items[0];
+
+ for(int i = 0; i < noutput_items/d_samples_per_sym; i++) {
+ for(int j = 0; j < d_samples_per_sym; j++) {
+ if(in[i] == 1)
+ d_phase += d_freq;
+ else
+ d_phase -= d_freq;
+
+ while(d_phase > M_TWOPI)
+ d_phase -= M_TWOPI;
+ while(d_phase < -M_TWOPI)
+ d_phase += M_TWOPI;
+
+ *out++ = gr_expj(d_phase)*d_ampl;
+ }
+ }
+
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
+
diff --git a/gr-analog/lib/cpfsk_bc_impl.h b/gr-analog/lib/cpfsk_bc_impl.h
new file mode 100644
index 000000000..9f6ec2c7f
--- /dev/null
+++ b/gr-analog/lib/cpfsk_bc_impl.h
@@ -0,0 +1,54 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008,2012 Free Software Foundation, Inc.
+ *
+ * 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_CPFSK_BC_IMPL_H
+#define INCLUDED_ANALOG_CPFSK_BC_IMPL_H
+
+#include <analog/cpfsk_bc.h>
+
+namespace gr {
+ namespace analog {
+
+ class cpfsk_bc_impl : public cpfsk_bc
+ {
+ private:
+ int d_samples_per_sym; // Samples per symbol, square pulse
+ float d_freq; // Modulation index*pi/samples_per_sym
+ float d_ampl; // Output amplitude
+ float d_phase; // Current phase
+
+ public:
+ cpfsk_bc_impl(float k, float ampl, int samples_per_sym);
+ ~cpfsk_bc_impl();
+
+ void set_amplitude(float amplitude) { d_ampl = amplitude; }
+ float amplitude() { return d_ampl; }
+ float freq() { return d_freq; }
+ float phase() { return d_phase; }
+
+ 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_CPFSK_BC_IMPL_H */
diff --git a/gr-analog/lib/ctcss_squelch_ff_impl.cc b/gr-analog/lib/ctcss_squelch_ff_impl.cc
new file mode 100644
index 000000000..db49b4f6e
--- /dev/null
+++ b/gr-analog/lib/ctcss_squelch_ff_impl.cc
@@ -0,0 +1,130 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,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 "ctcss_squelch_ff_impl.h"
+
+namespace gr {
+ namespace analog {
+
+ static float ctcss_tones[] = {
+ 67.0, 71.9, 74.4, 77.0, 79.7, 82.5, 85.4, 88.5, 91.5, 94.8,
+ 97.4, 100.0, 103.5, 107.2, 110.9, 114.8, 118.8, 123.0, 127.3, 131.8,
+ 136.5, 141.3, 146.2, 151.4, 156.7, 162.2, 167.9, 173.8, 179.9, 186.2,
+ 192.8, 203.5, 210.7, 218.1, 225.7, 233.6, 241.8, 250.3
+ };
+
+ static int max_tone_index = 37;
+
+ ctcss_squelch_ff::sptr
+ ctcss_squelch_ff::make(int rate, float freq, float level,
+ int len, int ramp, bool gate)
+ {
+ return gnuradio::get_initial_sptr(new ctcss_squelch_ff_impl
+ (rate, freq, level, len, ramp, gate));
+ }
+
+ int
+ ctcss_squelch_ff_impl::find_tone(float freq)
+ {
+ for(int i = 0; i <= max_tone_index; i++)
+ if(ctcss_tones[i] == freq) // FIXME: make almost equal
+ return i;
+ return -1;
+ }
+
+ ctcss_squelch_ff_impl::ctcss_squelch_ff_impl(int rate, float freq, float level,
+ int len, int ramp, bool gate)
+ : gr_block("ctcss_squelch_ff",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(float))),
+ squelch_base_ff_impl("ctcss_squelch_ff", ramp, gate)
+ {
+ d_freq = freq;
+ d_level = level;
+
+ // Default is 100 ms detection time
+ if(len == 0)
+ d_len = (int)(rate/10.0);
+ else
+ d_len = len;
+
+ int i = find_tone(freq);
+
+ // Non-standard tones or edge tones get 2% guard band, otherwise
+ // guards are set at adjacent ctcss tone frequencies
+ float f_l, f_r;
+ if(i == -1 || i == 0)
+ f_l = freq*0.98;
+ else
+ f_l = ctcss_tones[i-1];
+
+ if(i == -1 || i == max_tone_index)
+ f_r = freq*1.02;
+ else
+ f_r = ctcss_tones[i+1];
+
+ d_goertzel_l = fft::goertzel(rate, d_len, f_l);
+ d_goertzel_c = fft::goertzel(rate, d_len, freq);
+ d_goertzel_r = fft::goertzel(rate, d_len, f_r);
+
+ d_mute = true;
+ }
+
+ ctcss_squelch_ff_impl::~ctcss_squelch_ff_impl()
+ {
+ }
+
+ std::vector<float>
+ ctcss_squelch_ff_impl::squelch_range() const
+ {
+ std::vector<float> r(3);
+ r[0] = 0.0;
+ r[1] = 1.0;
+ r[2] = (r[1]-r[0])/100; // step size
+
+ return r;
+ }
+
+ void
+ ctcss_squelch_ff_impl::update_state(const float &in)
+ {
+ d_goertzel_l.input(in);
+ d_goertzel_c.input(in);
+ d_goertzel_r.input(in);
+
+ float d_out_l, d_out_c, d_out_r;
+ if(d_goertzel_c.ready()) {
+ d_out_l = abs(d_goertzel_l.output());
+ d_out_c = abs(d_goertzel_c.output());
+ d_out_r = abs(d_goertzel_r.output());
+
+ //printf("d_out_l=%f d_out_c=%f d_out_r=%f\n", d_out_l, d_out_c, d_out_r);
+ d_mute = (d_out_c < d_level || d_out_c < d_out_l || d_out_c < d_out_r);
+ }
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/ctcss_squelch_ff_impl.h b/gr-analog/lib/ctcss_squelch_ff_impl.h
new file mode 100644
index 000000000..0827fbafe
--- /dev/null
+++ b/gr-analog/lib/ctcss_squelch_ff_impl.h
@@ -0,0 +1,82 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,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_CTCSS_SQUELCH_FF_IMPL_H
+#define INCLUDED_ANALOG_CTCSS_SQUELCH_FF_IMPL_H
+
+#include <analog/ctcss_squelch_ff.h>
+#include "squelch_base_ff_impl.h"
+#include <fft/goertzel.h>
+
+namespace gr {
+ namespace analog {
+
+ class ctcss_squelch_ff_impl : public ctcss_squelch_ff, squelch_base_ff_impl
+ {
+ private:
+ float d_freq;
+ float d_level;
+ int d_len;
+ bool d_mute;
+
+ fft::goertzel d_goertzel_l;
+ fft::goertzel d_goertzel_c;
+ fft::goertzel d_goertzel_r;
+
+ int find_tone(float freq);
+
+ protected:
+ virtual void update_state(const float &in);
+ virtual bool mute() const { return d_mute; }
+
+ public:
+ ctcss_squelch_ff_impl(int rate, float freq, float level,
+ int len, int ramp, bool gate);
+ ~ctcss_squelch_ff_impl();
+
+ std::vector<float> squelch_range() const;
+ float level() const { return d_level; }
+ void set_level(float level) { d_level = level; }
+ int len() const { return d_len; }
+
+ int ramp() const { return squelch_base_ff_impl::ramp(); }
+ void set_ramp(int ramp) { squelch_base_ff_impl::set_ramp(ramp); }
+ bool gate() const { return squelch_base_ff_impl::gate(); }
+ void set_gate(bool gate) { squelch_base_ff_impl::set_gate(gate); }
+ bool unmuted() const { return squelch_base_ff_impl::unmuted(); }
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ return squelch_base_ff_impl::general_work(noutput_items,
+ ninput_items,
+ input_items,
+ output_items);
+ }
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* INCLUDED_ANALOG_CTCSS_SQUELCH_FF_IMPL_H */
diff --git a/gr-analog/lib/dpll_bb_impl.cc b/gr-analog/lib/dpll_bb_impl.cc
new file mode 100644
index 000000000..a199b66b4
--- /dev/null
+++ b/gr-analog/lib/dpll_bb_impl.cc
@@ -0,0 +1,98 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007,2009,2010 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 "dpll_bb_impl.h"
+#include <gr_io_signature.h>
+#include <cstdio>
+
+namespace gr {
+ namespace analog {
+
+ dpll_bb::sptr
+ dpll_bb::make(float period, float gain)
+ {
+ return gnuradio::get_initial_sptr
+ (new dpll_bb_impl(period, gain));
+ }
+
+ dpll_bb_impl::dpll_bb_impl(float period, float gain)
+ : gr_sync_block("dpll_bb",
+ gr_make_io_signature(1, 1, sizeof(char)),
+ gr_make_io_signature(1, 1, sizeof(char))),
+ d_restart(0), d_pulse_phase(0)
+ {
+ d_pulse_frequency = 1.0/period;
+ d_gain = gain;
+ d_decision_threshold = 1.0 - 0.5*d_pulse_frequency;
+#if 0
+ fprintf(stderr,"frequency = %f period = %f gain = %f threshold = %f\n",
+ d_pulse_frequency,
+ period,
+ d_gain,
+ d_decision_threshold);
+#endif
+ }
+
+ dpll_bb_impl::~dpll_bb_impl()
+ {
+ }
+
+ int
+ dpll_bb_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const char *iptr = (const char*)input_items[0];
+ char *optr = (char*)output_items[0];
+
+ for(int i = 0; i < noutput_items; i++) {
+ optr[i]= 0;
+ if(iptr[i] == 1) {
+ if(d_restart == 0) {
+ d_pulse_phase = 1;
+ }
+ else {
+ if(d_pulse_phase > 0.5)
+ d_pulse_phase += d_gain*(1.0-d_pulse_phase);
+ else
+ d_pulse_phase -= d_gain*d_pulse_phase;
+ }
+ d_restart = 3;
+ }
+ if(d_pulse_phase > d_decision_threshold) {
+ d_pulse_phase -= 1.0;
+ if(d_restart > 0) {
+ d_restart -= 1;
+ optr[i] = 1;
+ }
+ }
+ d_pulse_phase += d_pulse_frequency;
+ }
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/dpll_bb_impl.h b/gr-analog/lib/dpll_bb_impl.h
new file mode 100644
index 000000000..a1d8b7709
--- /dev/null
+++ b/gr-analog/lib/dpll_bb_impl.h
@@ -0,0 +1,58 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007,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_DPLL_BB_IMPL_H
+#define INCLUDED_ANALOG_DPLL_BB_IMPL_H
+
+#include <analog/dpll_bb.h>
+
+namespace gr {
+ namespace analog {
+
+ class dpll_bb_impl : public dpll_bb
+ {
+ private:
+ unsigned char d_restart;
+ float d_pulse_phase, d_pulse_frequency;
+ float d_gain, d_decision_threshold;
+
+ public:
+ dpll_bb_impl(float period, float gain);
+ ~dpll_bb_impl();
+
+ void set_gain(float gain) { d_gain = gain; }
+ void set_decision_threshold(float thresh) { d_decision_threshold = thresh; }
+
+ float gain() const { return d_gain; }
+ float freq() const { return d_pulse_frequency; }
+ float phase() const { return d_pulse_phase; }
+ float decision_threshold() const { return d_decision_threshold; }
+
+ 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_DPLL_BB_IMPL_H */
diff --git a/gr-analog/lib/feedforward_agc_cc_impl.cc b/gr-analog/lib/feedforward_agc_cc_impl.cc
new file mode 100644
index 000000000..4796fdfc5
--- /dev/null
+++ b/gr-analog/lib/feedforward_agc_cc_impl.cc
@@ -0,0 +1,99 @@
+/* -*- 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 "feedforward_agc_cc_impl.h"
+#include <gr_io_signature.h>
+#include <stdexcept>
+
+namespace gr {
+ namespace analog {
+
+ feedforward_agc_cc::sptr
+ feedforward_agc_cc::make(int nsamples, float reference)
+ {
+ return gnuradio::get_initial_sptr
+ (new feedforward_agc_cc_impl(nsamples, reference));
+ }
+
+ feedforward_agc_cc_impl::feedforward_agc_cc_impl(int nsamples, float reference)
+ : gr_sync_block("feedforward_agc_cc",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ d_nsamples(nsamples), d_reference(reference)
+ {
+ if(nsamples < 1)
+ throw std::invalid_argument("feedforward_agc_cc_impl: nsamples must be >= 1");
+
+ set_history(nsamples);
+ }
+
+ feedforward_agc_cc_impl::~feedforward_agc_cc_impl()
+ {
+ }
+
+ inline static float
+ mag_squared(gr_complex x)
+ {
+ return x.real() * x.real() + x.imag() * x.imag();
+ }
+
+ // approximate sqrt(x^2 + y^2)
+ inline static float
+ envelope(gr_complex x)
+ {
+ float r_abs = std::fabs(x.real());
+ float i_abs = std::fabs(x.imag());
+
+ if(r_abs > i_abs)
+ return r_abs + 0.4 * i_abs;
+ else
+ return i_abs + 0.4 * r_abs;
+ }
+
+ int
+ feedforward_agc_cc_impl::work(int noutput_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 nsamples = d_nsamples;
+ float gain;
+
+ for(int i = 0; i < noutput_items; i++) {
+ //float max_env = 1e-12; // avoid divide by zero
+ float max_env = 1e-4; // avoid divide by zero, indirectly set max gain
+ for(int j = 0; j < nsamples; j++) {
+ max_env = std::max(max_env, envelope(in[i+j]));
+ }
+ gain = d_reference / max_env;
+ out[i] = gain * in[i];
+ }
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/feedforward_agc_cc_impl.h b/gr-analog/lib/feedforward_agc_cc_impl.h
new file mode 100644
index 000000000..60c7acada
--- /dev/null
+++ b/gr-analog/lib/feedforward_agc_cc_impl.h
@@ -0,0 +1,49 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,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_FEEDFORWARD_AGC_CC_IMPL_H
+#define INCLUDED_ANALOG_FEEDFORWARD_AGC_CC_IMPL_H
+
+#include <analog/feedforward_agc_cc.h>
+
+namespace gr {
+ namespace analog {
+
+ class feedforward_agc_cc_impl : public feedforward_agc_cc
+ {
+ private:
+ int d_nsamples;
+ float d_reference;
+
+ public:
+ feedforward_agc_cc_impl(int nsamples, float reference);
+ ~feedforward_agc_cc_impl();
+
+ 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_FEEDFORWARD_AGC_CC_IMPL_H */
diff --git a/gr-analog/lib/fmdet_cf_impl.cc b/gr-analog/lib/fmdet_cf_impl.cc
new file mode 100644
index 000000000..d3a58966b
--- /dev/null
+++ b/gr-analog/lib/fmdet_cf_impl.cc
@@ -0,0 +1,129 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008,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 "fmdet_cf_impl.h"
+#include <gr_io_signature.h>
+#include <gr_math.h>
+
+namespace gr {
+ namespace analog {
+
+#define M_TWOPI (2*M_PI)
+
+ fmdet_cf::sptr
+ fmdet_cf::make(float samplerate, float freq_low,
+ float freq_high, float scl)
+ {
+ return gnuradio::get_initial_sptr
+ (new fmdet_cf_impl(samplerate, freq_low, freq_high, scl));
+ }
+
+ fmdet_cf_impl::fmdet_cf_impl(float samplerate, float freq_low,
+ float freq_high, float scl)
+ : gr_sync_block("fmdet_cf",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(float))),
+ d_S1(0.1), d_S2(0.1),
+ d_S3(0.1), d_S4(0.1)
+ {
+ const float h[] = { 0.003118678733, -0.012139843428, 0.027270898036,
+ -0.051318579352, 0.090406910552, -0.162926865366,
+ 0.361885392563, 0.000000000000, -0.361885392563,
+ 0.162926865366, -0.090406910552, 0.051318579352,
+ -0.027270898036, 0.012139843428, -0.003118678733};
+
+ //std::vector<float> taps(15);
+
+ d_freq = 0;
+ d_freqhi = freq_high;
+ d_freqlo = freq_low;
+ set_scale(scl);
+
+ //for(int i = 0; i < 15; i++) {
+ //taps[i] = h[i];
+ //}
+ // d_filter = gr_fir_util::create_gr_fir_ccf(taps);
+ }
+
+ fmdet_cf_impl::~fmdet_cf_impl()
+ {
+ }
+
+ void
+ fmdet_cf_impl::set_scale(float scl)
+ {
+ float delta = d_freqhi - d_freqlo;
+ d_scl = scl;
+ d_bias = 0.5*scl*(d_freqhi + d_freqlo) / delta;
+ }
+
+ void
+ fmdet_cf_impl::set_freq_range(float freq_low, float freq_high)
+ {
+ d_freqhi = freq_high;
+ d_freqlo = freq_low;
+ set_scale(d_scl);
+ }
+
+ int
+ fmdet_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];
+ //const gr_complex *scaleiptr = (gr_complex*)input_items[0];
+
+ int size = noutput_items;
+
+ gr_complex Sdot, S0;
+ gr_complex S1=d_S1, S2=d_S2, S3=d_S3, S4=d_S4;
+ float d_8 = 8.0;
+
+ while(size-- > 0) {
+ S0 = *iptr++;
+
+ Sdot = d_scl * (-S0+d_8*S1-d_8*S1+S4);
+
+ d_freq = (S2.real()*Sdot.imag()-S2.imag()*Sdot.real()) /
+ (S2.real()*S2.real()+S2.imag()*S2.imag());
+
+ S4 = S3;
+ S3 = S2;
+ S2 = S1;
+ S1 = S0;
+
+ *optr++ = d_freq-d_bias;
+ }
+ d_S1 = S1;
+ d_S2 = S2;
+ d_S3 = S3;
+ d_S4 = S4;
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/fmdet_cf_impl.h b/gr-analog/lib/fmdet_cf_impl.h
new file mode 100644
index 000000000..01fce09dd
--- /dev/null
+++ b/gr-analog/lib/fmdet_cf_impl.h
@@ -0,0 +1,62 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008, 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_FMDET_CF_IMPL_H
+#define INCLUDED_ANALOG_FMDET_CF_IMPL_H
+
+#include <analog/fmdet_cf.h>
+//#include <filter/fir_filter.h>
+#include <gr_sync_block.h>
+
+namespace gr {
+ namespace analog {
+
+ class fmdet_cf_impl : public fmdet_cf
+ {
+ private:
+ gr_complex d_S1, d_S2, d_S3, d_S4;
+ float d_freq, d_freqlo, d_freqhi, d_scl, d_bias;
+ //kernel::fir_filter_ccf* d_filter;
+
+ public:
+ fmdet_cf_impl(float samplerate, float freq_low,
+ float freq_high, float scl);
+ ~fmdet_cf_impl();
+
+ void set_scale(float scl);
+ void set_freq_range(float freq_low, float freq_high);
+
+ float freq() const { return d_freq; }
+ float freq_high() const { return d_freqhi; }
+ float freq_low() const { return d_freqlo; }
+ float scale() const { return d_scl; }
+ float bias() const { return d_bias; }
+
+ 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_FMDET_CF_IMPL_H */
diff --git a/gr-analog/lib/frequency_modulator_fc_impl.cc b/gr-analog/lib/frequency_modulator_fc_impl.cc
new file mode 100644
index 000000000..2da7ee15f
--- /dev/null
+++ b/gr-analog/lib/frequency_modulator_fc_impl.cc
@@ -0,0 +1,82 @@
+/* -*- 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 "frequency_modulator_fc_impl.h"
+#include <gr_io_signature.h>
+#include <gr_fxpt.h>
+#include <math.h>
+#include <boost/math/special_functions/trunc.hpp>
+
+namespace gr {
+ namespace analog {
+
+ frequency_modulator_fc::sptr
+ frequency_modulator_fc::make(double sensitivity)
+ {
+ return gnuradio::get_initial_sptr
+ (new frequency_modulator_fc_impl(sensitivity));
+ }
+
+ frequency_modulator_fc_impl::frequency_modulator_fc_impl(double sensitivity)
+ : gr_sync_block("frequency_modulator_fc",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ d_sensitivity(sensitivity), d_phase(0)
+ {
+ }
+
+ frequency_modulator_fc_impl::~frequency_modulator_fc_impl()
+ {
+ }
+
+ int
+ frequency_modulator_fc_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const float *in = (const float*)input_items[0];
+ gr_complex *out = (gr_complex*)output_items[0];
+
+ for(int i = 0; i < noutput_items; i++) {
+ d_phase = d_phase + d_sensitivity * in[i];
+
+ while(d_phase > (float)(M_PI))
+ d_phase -= (float)(2.0 * M_PI);
+ while(d_phase < (float)(-M_PI))
+ d_phase += (float)(2.0 * M_PI);
+
+ float oi, oq;
+
+ gr_int32 angle = gr_fxpt::float_to_fixed (d_phase);
+ gr_fxpt::sincos(angle, &oq, &oi);
+ out[i] = gr_complex(oi, oq);
+ }
+
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/frequency_modulator_fc_impl.h b/gr-analog/lib/frequency_modulator_fc_impl.h
new file mode 100644
index 000000000..36512f516
--- /dev/null
+++ b/gr-analog/lib/frequency_modulator_fc_impl.h
@@ -0,0 +1,52 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,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_FREQUENCY_MODULATOR_FC_IMPL_H
+#define INCLUDED_ANALOG_FREQUENCY_MODULATOR_FC_IMPL_H
+
+#include <analog/frequency_modulator_fc.h>
+
+namespace gr {
+ namespace analog {
+
+ class frequency_modulator_fc_impl : public frequency_modulator_fc
+ {
+ private:
+ float d_sensitivity;
+ float d_phase;
+
+ public:
+ frequency_modulator_fc_impl(double sensitivity);
+ ~frequency_modulator_fc_impl();
+
+ void set_sensitivity(float sens) { d_sensitivity = sens; }
+ float sensitivity() const { return d_sensitivity; }
+
+ 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_FREQUENCY_MODULATOR_FC_IMPL_H */
diff --git a/gr-analog/lib/noise_source_X_impl.cc.t b/gr-analog/lib/noise_source_X_impl.cc.t
new file mode 100644
index 000000000..35dda9c5d
--- /dev/null
+++ b/gr-analog/lib/noise_source_X_impl.cc.t
@@ -0,0 +1,116 @@
+/* -*- 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.
+ */
+
+/* @WARNING@ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "@IMPL_NAME@.h"
+#include <gr_io_signature.h>
+#include <stdexcept>
+
+namespace gr {
+ namespace analog {
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(noise_type_t type, float ampl, long seed)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(type, ampl, seed));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(noise_type_t type, float ampl, long seed)
+ : gr_sync_block("@BASE_NAME@",
+ gr_make_io_signature(0, 0, 0),
+ gr_make_io_signature(1, 1, sizeof(@TYPE@))),
+ d_type(type),
+ d_ampl(ampl),
+ d_rng(seed)
+ {
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ int
+ @IMPL_NAME@::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ @TYPE@ *out = (@TYPE@*)output_items[0];
+
+ switch(d_type) {
+#if @IS_COMPLEX@ // complex?
+
+ case GR_UNIFORM:
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = gr_complex(d_ampl * ((d_rng.ran1() * 2.0) - 1.0),
+ d_ampl * ((d_rng.ran1() * 2.0) - 1.0));
+ }
+ break;
+
+ case GR_GAUSSIAN:
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = d_ampl * d_rng.rayleigh_complex();
+ }
+ break;
+
+#else // nope...
+
+ case GR_UNIFORM:
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = (@TYPE@)(d_ampl * ((d_rng.ran1() * 2.0) - 1.0));
+ }
+ break;
+
+ case GR_GAUSSIAN:
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = (@TYPE@)(d_ampl * d_rng.gasdev());
+ }
+ break;
+
+ case GR_LAPLACIAN:
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = (@TYPE@)(d_ampl * d_rng.laplacian());
+ }
+ break;
+
+ case GR_IMPULSE: // FIXME changeable impulse settings
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = (@TYPE@)(d_ampl * d_rng.impulse(9));
+ }
+ break;
+#endif
+
+ default:
+ throw std::runtime_error("invalid type");
+ }
+
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
+
diff --git a/gr-analog/lib/noise_source_X_impl.h.t b/gr-analog/lib/noise_source_X_impl.h.t
new file mode 100644
index 000000000..8bcc1dfde
--- /dev/null
+++ b/gr-analog/lib/noise_source_X_impl.h.t
@@ -0,0 +1,58 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,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.
+ */
+
+/* @WARNING@ */
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <analog/@BASE_NAME@.h>
+#include <gr_random.h>
+
+namespace gr {
+ namespace analog {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ noise_type_t d_type;
+ float d_ampl;
+ gr_random d_rng;
+
+ public:
+ @IMPL_NAME@(noise_type_t type, float ampl, long seed = 0);
+ ~@IMPL_NAME@();
+
+ void set_type(noise_type_t type) { d_type = type; }
+ void set_amplitude(float ampl) { d_ampl = ampl; }
+
+ noise_type_t type() const { return d_type; }
+ float amplitude() const { return d_ampl; }
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace filter */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-analog/lib/phase_modulator_fc_impl.cc b/gr-analog/lib/phase_modulator_fc_impl.cc
new file mode 100644
index 000000000..9e9e73f8c
--- /dev/null
+++ b/gr-analog/lib/phase_modulator_fc_impl.cc
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,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 "phase_modulator_fc_impl.h"
+#include <gr_io_signature.h>
+#include <gr_sincos.h>
+#include <math.h>
+
+namespace gr {
+ namespace analog {
+
+ phase_modulator_fc::sptr
+ phase_modulator_fc::make(double sensitivity)
+ {
+ return gnuradio::get_initial_sptr
+ (new phase_modulator_fc_impl(sensitivity));
+ }
+
+ phase_modulator_fc_impl::phase_modulator_fc_impl(double sensitivity)
+ : gr_sync_block("phase_modulator_fc",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ d_sensitivity(sensitivity), d_phase(0)
+ {
+ }
+
+ phase_modulator_fc_impl::~phase_modulator_fc_impl()
+ {
+ }
+
+ int
+ phase_modulator_fc_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const float *in = (const float*)input_items[0];
+ gr_complex *out = (gr_complex*)output_items[0];
+
+ for(int i = 0; i < noutput_items; i++) {
+ d_phase = d_sensitivity * in[i];
+ float oi, oq;
+ gr_sincosf(d_phase, &oq, &oi);
+ out[i] = gr_complex(oi, oq);
+ }
+
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/phase_modulator_fc_impl.h b/gr-analog/lib/phase_modulator_fc_impl.h
new file mode 100644
index 000000000..ac10bc891
--- /dev/null
+++ b/gr-analog/lib/phase_modulator_fc_impl.h
@@ -0,0 +1,55 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,2006,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_PHASE_MODULATOR_FC_IMPL_H
+#define INCLUDED_ANALOG_PHASE_MODULATOR_FC_IMPL_H
+
+#include <analog/phase_modulator_fc.h>
+
+namespace gr {
+ namespace analog {
+
+ class phase_modulator_fc_impl : public phase_modulator_fc
+ {
+ private:
+ double d_sensitivity;
+ double d_phase;
+
+ public:
+ phase_modulator_fc_impl(double sensitivity);
+ ~phase_modulator_fc_impl();
+
+ double sensitivity() const { return d_sensitivity; }
+ double phase() const { return d_phase; }
+
+ void set_sensitivity(double s) { d_sensitivity = s; }
+ void set_phase(double p) { d_phase = p; }
+
+ 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_PHASE_MODULATOR_FC_IMPL_H */
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 */
diff --git a/gr-analog/lib/probe_avg_mag_sqrd_c_impl.cc b/gr-analog/lib/probe_avg_mag_sqrd_c_impl.cc
new file mode 100644
index 000000000..291809bb2
--- /dev/null
+++ b/gr-analog/lib/probe_avg_mag_sqrd_c_impl.cc
@@ -0,0 +1,91 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,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 "probe_avg_mag_sqrd_c_impl.h"
+#include <gr_io_signature.h>
+#include <cmath>
+
+namespace gr {
+ namespace analog {
+
+ probe_avg_mag_sqrd_c::sptr
+ probe_avg_mag_sqrd_c::make(double threshold_db, double alpha)
+ {
+ return gnuradio::get_initial_sptr
+ (new probe_avg_mag_sqrd_c_impl(threshold_db, alpha));
+ }
+
+ probe_avg_mag_sqrd_c_impl::probe_avg_mag_sqrd_c_impl(double threshold_db, double alpha)
+ : gr_sync_block("probe_avg_mag_sqrd_c",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(0, 0, 0)),
+ d_unmuted(false), d_level(0), d_iir(alpha)
+ {
+ set_threshold(threshold_db);
+ }
+
+ probe_avg_mag_sqrd_c_impl::~probe_avg_mag_sqrd_c_impl()
+ {
+ }
+
+ int
+ probe_avg_mag_sqrd_c_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const gr_complex *in = (const gr_complex*)input_items[0];
+
+ for(int i = 0; i < noutput_items; i++) {
+ double mag_sqrd = in[i].real()*in[i].real() + in[i].imag()*in[i].imag();
+ d_iir.filter(mag_sqrd); // computed for side effect: prev_output()
+ }
+
+ d_unmuted = d_iir.prev_output() >= d_threshold;
+ d_level = d_iir.prev_output();
+ return noutput_items;
+ }
+
+ double
+ probe_avg_mag_sqrd_c_impl::threshold() const
+ {
+ return 10 * std::log10(d_threshold);
+ }
+
+ void
+ probe_avg_mag_sqrd_c_impl::set_threshold(double decibels)
+ {
+ // convert to absolute threshold (mag squared)
+ d_threshold = std::pow(10.0, decibels/10);
+ }
+
+ void
+ probe_avg_mag_sqrd_c_impl::set_alpha(double alpha)
+ {
+ d_iir.set_taps(alpha);
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/probe_avg_mag_sqrd_c_impl.h b/gr-analog/lib/probe_avg_mag_sqrd_c_impl.h
new file mode 100644
index 000000000..0a2685357
--- /dev/null
+++ b/gr-analog/lib/probe_avg_mag_sqrd_c_impl.h
@@ -0,0 +1,60 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,2006,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_PROBE_AVG_MAG_SQRD_C_IMPL_H
+#define INCLUDED_ANALOG_PROBE_AVG_MAG_SQRD_C_IMPL_H
+
+#include <analog/probe_avg_mag_sqrd_c.h>
+#include <filter/single_pole_iir.h>
+
+namespace gr {
+ namespace analog {
+
+ class probe_avg_mag_sqrd_c_impl : public probe_avg_mag_sqrd_c
+ {
+ private:
+ double d_threshold;
+ bool d_unmuted;
+ double d_level;
+ filter::single_pole_iir<double,double,double> d_iir;
+
+ public:
+ probe_avg_mag_sqrd_c_impl(double threshold_db, double alpha = 0.0001);
+ ~probe_avg_mag_sqrd_c_impl();
+
+ bool unmuted() const { return d_unmuted; }
+ double level() const { return d_level; }
+
+ double threshold() const;
+
+ void set_alpha(double alpha);
+ void set_threshold(double decibels);
+
+ 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_PROBE_AVG_MAG_SQRD_C_IMPL_H */
diff --git a/gr-analog/lib/probe_avg_mag_sqrd_cf_impl.cc b/gr-analog/lib/probe_avg_mag_sqrd_cf_impl.cc
new file mode 100644
index 000000000..ceaf5dbf0
--- /dev/null
+++ b/gr-analog/lib/probe_avg_mag_sqrd_cf_impl.cc
@@ -0,0 +1,93 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,2007,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 "probe_avg_mag_sqrd_cf_impl.h"
+#include <gr_io_signature.h>
+#include <cmath>
+
+namespace gr {
+ namespace analog {
+
+ probe_avg_mag_sqrd_cf::sptr
+ probe_avg_mag_sqrd_cf::make(double threshold_db, double alpha)
+ {
+ return gnuradio::get_initial_sptr
+ (new probe_avg_mag_sqrd_cf_impl(threshold_db, alpha));
+ }
+
+ probe_avg_mag_sqrd_cf_impl::probe_avg_mag_sqrd_cf_impl(double threshold_db, double alpha)
+ : gr_sync_block("probe_avg_mag_sqrd_cf",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(float))),
+ d_unmuted(false), d_level(0), d_iir(alpha)
+ {
+ set_threshold(threshold_db);
+ }
+
+ probe_avg_mag_sqrd_cf_impl::~probe_avg_mag_sqrd_cf_impl()
+ {
+ }
+
+ int
+ probe_avg_mag_sqrd_cf_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const gr_complex *in = (const gr_complex*)input_items[0];
+ float *out = (float*)output_items[0];
+
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = d_iir.prev_output();
+ double mag_sqrd = in[i].real()*in[i].real() + in[i].imag()*in[i].imag();
+ d_iir.filter(mag_sqrd); // computed for side effect: prev_output()
+ }
+
+ d_unmuted = d_iir.prev_output() >= d_threshold;
+ d_level = d_iir.prev_output();
+ return noutput_items;
+ }
+
+ double
+ probe_avg_mag_sqrd_cf_impl::threshold() const
+ {
+ return 10 * std::log10(d_threshold);
+ }
+
+ void
+ probe_avg_mag_sqrd_cf_impl::set_threshold(double decibels)
+ {
+ // convert to absolute threshold (mag squared)
+ d_threshold = std::pow(10.0, decibels/10);
+ }
+
+ void
+ probe_avg_mag_sqrd_cf_impl::set_alpha(double alpha)
+ {
+ d_iir.set_taps(alpha);
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/probe_avg_mag_sqrd_cf_impl.h b/gr-analog/lib/probe_avg_mag_sqrd_cf_impl.h
new file mode 100644
index 000000000..9cd8f8d4c
--- /dev/null
+++ b/gr-analog/lib/probe_avg_mag_sqrd_cf_impl.h
@@ -0,0 +1,60 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,2006,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_PROBE_AVG_MAG_SQRD_CF_IMPL_H
+#define INCLUDED_ANALOG_PROBE_AVG_MAG_SQRD_CF_IMPL_H
+
+#include <analog/probe_avg_mag_sqrd_cf.h>
+#include <filter/single_pole_iir.h>
+
+namespace gr {
+ namespace analog {
+
+ class probe_avg_mag_sqrd_cf_impl : public probe_avg_mag_sqrd_cf
+ {
+ private:
+ double d_threshold;
+ bool d_unmuted;
+ double d_level;
+ filter::single_pole_iir<double,double,double> d_iir;
+
+ public:
+ probe_avg_mag_sqrd_cf_impl(double threshold_db, double alpha);
+ ~probe_avg_mag_sqrd_cf_impl();
+
+ bool unmuted() const { return d_unmuted; }
+ double level() const { return d_level; }
+
+ double threshold() const;
+
+ void set_alpha(double alpha);
+ void set_threshold(double decibels);
+
+ 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_PROBE_AVG_MAG_SQRD_CF_IMPL_H */
diff --git a/gr-analog/lib/probe_avg_mag_sqrd_f_impl.cc b/gr-analog/lib/probe_avg_mag_sqrd_f_impl.cc
new file mode 100644
index 000000000..4ac7ef06b
--- /dev/null
+++ b/gr-analog/lib/probe_avg_mag_sqrd_f_impl.cc
@@ -0,0 +1,92 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,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 "probe_avg_mag_sqrd_f_impl.h"
+#include <gr_io_signature.h>
+#include <cmath>
+
+namespace gr {
+ namespace analog {
+
+ probe_avg_mag_sqrd_f::sptr
+ probe_avg_mag_sqrd_f::make(double threshold_db, double alpha)
+ {
+ return gnuradio::get_initial_sptr
+ (new probe_avg_mag_sqrd_f_impl(threshold_db, alpha));
+ }
+
+ probe_avg_mag_sqrd_f_impl::probe_avg_mag_sqrd_f_impl(double threshold_db, double alpha)
+ : gr_sync_block("probe_avg_mag_sqrd_f",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(0, 0, 0)),
+ d_unmuted(false), d_level(0), d_iir(alpha)
+ {
+ set_threshold(threshold_db);
+ }
+
+ probe_avg_mag_sqrd_f_impl::~probe_avg_mag_sqrd_f_impl()
+ {
+ }
+
+ int
+ probe_avg_mag_sqrd_f_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const float *in = (const float*)input_items[0];
+
+ for(int i = 0; i < noutput_items; i++) {
+ double mag_sqrd = in[i]*in[i];
+ d_iir.filter(mag_sqrd); // computed for side effect: prev_output()
+ }
+
+ d_unmuted = d_iir.prev_output() >= d_threshold;
+ d_level = d_iir.prev_output();
+ return noutput_items;
+ }
+
+ double
+ probe_avg_mag_sqrd_f_impl::threshold() const
+ {
+ return 10 * std::log10(d_threshold);
+ }
+
+ void
+ probe_avg_mag_sqrd_f_impl::set_threshold(double decibels)
+ {
+ // convert to absolute threshold (mag sqrd)
+ d_threshold = std::pow(10.0, decibels/10);
+ }
+
+ void
+ probe_avg_mag_sqrd_f_impl::set_alpha(double alpha)
+ {
+ d_iir.set_taps(alpha);
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
+
diff --git a/gr-analog/lib/probe_avg_mag_sqrd_f_impl.h b/gr-analog/lib/probe_avg_mag_sqrd_f_impl.h
new file mode 100644
index 000000000..ba879763c
--- /dev/null
+++ b/gr-analog/lib/probe_avg_mag_sqrd_f_impl.h
@@ -0,0 +1,60 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,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_PROBE_AVG_MAG_SQRD_F_IMPL_H
+#define INCLUDED_ANALOG_PROBE_AVG_MAG_SQRD_F_IMPL_H
+
+#include <analog/probe_avg_mag_sqrd_f.h>
+#include <filter/single_pole_iir.h>
+
+namespace gr {
+ namespace analog {
+
+ class probe_avg_mag_sqrd_f_impl : public probe_avg_mag_sqrd_f
+ {
+ private:
+ double d_threshold;
+ bool d_unmuted;
+ double d_level;
+ filter::single_pole_iir<double,double,double> d_iir;
+
+ public:
+ probe_avg_mag_sqrd_f_impl(double threshold_db, double alpha);
+ ~probe_avg_mag_sqrd_f_impl();
+
+ bool unmuted() const { return d_unmuted; }
+ double level() const { return d_level; }
+
+ double threshold() const;
+
+ void set_alpha(double alpha);
+ void set_threshold(double decibels);
+
+ 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_PROBE_AVG_MAG_SQRD_F_IMPL_H */
diff --git a/gr-analog/lib/pwr_squelch_cc_impl.cc b/gr-analog/lib/pwr_squelch_cc_impl.cc
new file mode 100644
index 000000000..1bfba6846
--- /dev/null
+++ b/gr-analog/lib/pwr_squelch_cc_impl.cc
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,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 "pwr_squelch_cc_impl.h"
+
+namespace gr {
+ namespace analog {
+
+ pwr_squelch_cc::sptr
+ pwr_squelch_cc::make(double threshold, double alpha,
+ int ramp, bool gate)
+ {
+ return gnuradio::get_initial_sptr
+ (new pwr_squelch_cc_impl(threshold, alpha, ramp, gate));
+ }
+
+ pwr_squelch_cc_impl::pwr_squelch_cc_impl(double threshold, double alpha,
+ int ramp, bool gate)
+ : gr_block("pwr_squelch_cc",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ squelch_base_cc_impl("pwr_squelch_cc", ramp, gate),
+ d_iir(alpha)
+ {
+ set_threshold(threshold);
+ }
+
+ pwr_squelch_cc_impl::~pwr_squelch_cc_impl()
+ {
+ }
+
+ std::vector<float>
+ pwr_squelch_cc_impl::squelch_range() const
+ {
+ std::vector<float> r(3);
+ r[0] = -50.0; // min FIXME
+ r[1] = +50.0; // max FIXME
+ r[2] = (r[1] - r[0]) / 100; // step size
+
+ return r;
+ }
+
+ void
+ pwr_squelch_cc_impl::update_state(const gr_complex &in)
+ {
+ d_pwr = d_iir.filter(in.real()*in.real()+in.imag()*in.imag());
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/pwr_squelch_cc_impl.h b/gr-analog/lib/pwr_squelch_cc_impl.h
new file mode 100644
index 000000000..72df0f3d2
--- /dev/null
+++ b/gr-analog/lib/pwr_squelch_cc_impl.h
@@ -0,0 +1,78 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,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_PWR_SQUELCH_CC_IMPL_H
+#define INCLUDED_ANALOG_PWR_SQUELCH_CC_IMPL_H
+
+#include <analog/pwr_squelch_cc.h>
+#include "squelch_base_cc_impl.h"
+#include <filter/single_pole_iir.h>
+#include <cmath>
+
+namespace gr {
+ namespace analog {
+
+ class ANALOG_API pwr_squelch_cc_impl :
+ public pwr_squelch_cc, squelch_base_cc_impl
+ {
+ private:
+ double d_threshold;
+ double d_pwr;
+ filter::single_pole_iir<double,double,double> d_iir;
+
+ protected:
+ virtual void update_state(const gr_complex &in);
+ virtual bool mute() const { return d_pwr < d_threshold; }
+
+ public:
+ pwr_squelch_cc_impl(double db, double alpha=0.0001,
+ int ramp=0, bool gate=false);
+ ~pwr_squelch_cc_impl();
+
+ std::vector<float> squelch_range() const;
+
+ double threshold() const { return 10*log10(d_threshold); }
+ void set_threshold(double db) { d_threshold = std::pow(10.0, db/10); }
+ void set_alpha(double alpha) { d_iir.set_taps(alpha); }
+
+ int ramp() const { return squelch_base_cc_impl::ramp(); }
+ void set_ramp(int ramp) { squelch_base_cc_impl::set_ramp(ramp); }
+ bool gate() const { return squelch_base_cc_impl::gate(); }
+ void set_gate(bool gate) { squelch_base_cc_impl::set_gate(gate); }
+ bool unmuted() const { return squelch_base_cc_impl::unmuted(); }
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ return squelch_base_cc_impl::general_work(noutput_items,
+ ninput_items,
+ input_items,
+ output_items);
+ }
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* INCLUDED_ANALOG_PWR_SQUELCH_CC_IMPL_H */
diff --git a/gr-analog/lib/pwr_squelch_ff_impl.cc b/gr-analog/lib/pwr_squelch_ff_impl.cc
new file mode 100644
index 000000000..c6bb6af90
--- /dev/null
+++ b/gr-analog/lib/pwr_squelch_ff_impl.cc
@@ -0,0 +1,73 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,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 "pwr_squelch_ff_impl.h"
+
+namespace gr {
+ namespace analog {
+
+ pwr_squelch_ff::sptr
+ pwr_squelch_ff::make(double threshold, double alpha,
+ int ramp, bool gate)
+ {
+ return gnuradio::get_initial_sptr
+ (new pwr_squelch_ff_impl(threshold, alpha, ramp, gate));
+ }
+
+ pwr_squelch_ff_impl::pwr_squelch_ff_impl(double threshold, double alpha,
+ int ramp, bool gate)
+ : gr_block("pwr_squelch_ff",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(float))),
+ squelch_base_ff_impl("pwr_squelch_ff", ramp, gate),
+ d_iir(alpha)
+ {
+ set_threshold(threshold);
+ }
+
+ pwr_squelch_ff_impl::~pwr_squelch_ff_impl()
+ {
+ }
+
+ std::vector<float>
+ pwr_squelch_ff_impl::squelch_range() const
+ {
+ std::vector<float> r(3);
+ r[0] = -50.0; // min FIXME
+ r[1] = +50.0; // max FIXME
+ r[2] = (r[1] - r[0]) / 100; // step size
+
+ return r;
+ }
+
+ void
+ pwr_squelch_ff_impl::update_state(const float &in)
+ {
+ d_pwr = d_iir.filter(in*in);
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/pwr_squelch_ff_impl.h b/gr-analog/lib/pwr_squelch_ff_impl.h
new file mode 100644
index 000000000..96d959b4d
--- /dev/null
+++ b/gr-analog/lib/pwr_squelch_ff_impl.h
@@ -0,0 +1,78 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,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_PWR_SQUELCH_FF_IMPL_H
+#define INCLUDED_ANALOG_PWR_SQUELCH_FF_IMPL_H
+
+#include <analog/pwr_squelch_ff.h>
+#include "squelch_base_ff_impl.h"
+#include <filter/single_pole_iir.h>
+#include <cmath>
+
+namespace gr {
+ namespace analog {
+
+ class ANALOG_API pwr_squelch_ff_impl :
+ public pwr_squelch_ff, squelch_base_ff_impl
+ {
+ private:
+ double d_threshold;
+ double d_pwr;
+ filter::single_pole_iir<double,double,double> d_iir;
+
+ protected:
+ virtual void update_state(const float &in);
+ virtual bool mute() const { return d_pwr < d_threshold; }
+
+ public:
+ pwr_squelch_ff_impl(double db, double alpha=0.0001,
+ int ramp=0, bool gate=false);
+ ~pwr_squelch_ff_impl();
+
+ std::vector<float> squelch_range() const;
+
+ double threshold() const { return 10*log10(d_threshold); }
+ void set_threshold(double db) { d_threshold = std::pow(10.0, db/10); }
+ void set_alpha(double alpha) { d_iir.set_taps(alpha); }
+
+ int ramp() const { return squelch_base_ff_impl::ramp(); }
+ void set_ramp(int ramp) { squelch_base_ff_impl::set_ramp(ramp); }
+ bool gate() const { return squelch_base_ff_impl::gate(); }
+ void set_gate(bool gate) { squelch_base_ff_impl::set_gate(gate); }
+ bool unmuted() const { return squelch_base_ff_impl::unmuted(); }
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ return squelch_base_ff_impl::general_work(noutput_items,
+ ninput_items,
+ input_items,
+ output_items);
+ }
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* INCLUDED_ANALOG_PWR_SQUELCH_FF_IMPL_H */
diff --git a/gr-analog/lib/qa_analog.cc b/gr-analog/lib/qa_analog.cc
new file mode 100644
index 000000000..c3d51863b
--- /dev/null
+++ b/gr-analog/lib/qa_analog.cc
@@ -0,0 +1,41 @@
+/*
+ * Copyright 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.
+ */
+
+/*
+ * This class gathers together all the test cases for the gr-analog
+ * directory into a single test suite. As you create new test cases,
+ * add them here.
+ */
+
+#include <qa_analog.h>
+#include <qa_sincos.h>
+#include <qa_rotator.h>
+
+CppUnit::TestSuite *
+qa_gr_analog::suite()
+{
+ CppUnit::TestSuite *s = new CppUnit::TestSuite("gr-analog");
+
+ s->addTest(gr::analog::qa_sincos::suite());
+ s->addTest(gr::analog::qa_rotator::suite());
+
+ return s;
+}
diff --git a/gr-analog/lib/qa_analog.h b/gr-analog/lib/qa_analog.h
new file mode 100644
index 000000000..458861cc9
--- /dev/null
+++ b/gr-analog/lib/qa_analog.h
@@ -0,0 +1,38 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 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 _QA_GR_ANALOG_H_
+#define _QA_GR_ANALOG_H_
+
+#include <gruel/attributes.h>
+#include <cppunit/TestSuite.h>
+
+//! collect all the tests for the gr-analog directory
+
+class __GR_ATTR_EXPORT qa_gr_analog {
+ public:
+ //! return suite of tests for all of gr-analog directory
+ static CppUnit::TestSuite *suite();
+};
+
+
+#endif /* _QA_GR_ANALOG_H_ */
diff --git a/gr-analog/lib/qa_rotator.cc b/gr-analog/lib/qa_rotator.cc
new file mode 100644
index 000000000..b722f32c4
--- /dev/null
+++ b/gr-analog/lib/qa_rotator.cc
@@ -0,0 +1,81 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2002,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 <gruel/attributes.h>
+#include <cppunit/TestAssert.h>
+#include <qa_rotator.h>
+#include <analog/rotator.h>
+#include <stdio.h>
+#include <cmath>
+#include <gr_expj.h>
+
+namespace gr {
+ namespace analog {
+
+ // error vector magnitude
+ __GR_ATTR_UNUSED static float
+ error_vector_mag(gr_complex a, gr_complex b)
+ {
+ return abs(a-b);
+ }
+
+ void
+ qa_rotator::t1()
+ {
+ static const unsigned int N = 100000;
+
+ rotator r;
+
+ double phase_incr = 2*M_PI / 1003;
+ double phase = 0;
+
+ // Old code: We increment then return the rotated value, thus we
+ // need to start one tick back
+ // r.set_phase(gr_complex(1,0) * conj(gr_expj(phase_incr)));
+
+ r.set_phase(gr_complex(1,0));
+ r.set_phase_incr(gr_expj(phase_incr));
+
+ for(unsigned i = 0; i < N; i++) {
+ gr_complex expected = gr_expj(phase);
+ gr_complex actual = r.rotate(gr_complex(1, 0));
+
+#if 0
+ float evm = error_vector_mag(expected, actual);
+ printf("[%6d] expected: (%8.6f, %8.6f) actual: (%8.6f, %8.6f) evm: %8.6f\n",
+ i, expected.real(), expected.imag(), actual.real(), actual.imag(), evm);
+#endif
+
+ CPPUNIT_ASSERT_COMPLEXES_EQUAL(expected, actual, 0.0001);
+
+ phase += phase_incr;
+ if(phase >= 2*M_PI)
+ phase -= 2*M_PI;
+ }
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/qa_rotator.h b/gr-analog/lib/qa_rotator.h
new file mode 100644
index 000000000..a22e41ec2
--- /dev/null
+++ b/gr-analog/lib/qa_rotator.h
@@ -0,0 +1,45 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008,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 _QA_ANALOG_ROTATOR_H_
+#define _QA_ANALOG_ROTATOR_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+namespace gr {
+ namespace analog {
+
+ class qa_rotator : public CppUnit::TestCase
+ {
+ CPPUNIT_TEST_SUITE(qa_rotator);
+ CPPUNIT_TEST(t1);
+ CPPUNIT_TEST_SUITE_END();
+
+ private:
+ void t1();
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* _QA_ANALOG_ROTATOR_H_ */
diff --git a/gr-analog/lib/qa_sincos.cc b/gr-analog/lib/qa_sincos.cc
new file mode 100644
index 000000000..62642c117
--- /dev/null
+++ b/gr-analog/lib/qa_sincos.cc
@@ -0,0 +1,75 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 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 <qa_sincos.h>
+#include <analog/sincos.h>
+#include <gruel/attributes.h>
+#include <cppunit/TestAssert.h>
+#include <cmath>
+
+namespace gr {
+ namespace analog {
+
+ void
+ qa_sincos::t1()
+ {
+ static const unsigned int N = 1000;
+ double c_sin, c_cos;
+ double gr_sin, gr_cos;
+
+ for(unsigned i = 0; i < N; i++) {
+ double x = i/100.0;
+ c_sin = sin(x);
+ c_cos = cos(x);
+
+ analog::sincos(x, &gr_sin, &gr_cos);
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(c_sin, gr_sin, 0.0001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(c_cos, gr_cos, 0.0001);
+ }
+ }
+
+ void
+ qa_sincos::t2()
+ {
+ static const unsigned int N = 1000;
+ float c_sin, c_cos;
+ float gr_sin, gr_cos;
+
+ for(unsigned i = 0; i < N; i++) {
+ float x = i/100.0;
+ c_sin = sinf(x);
+ c_cos = cosf(x);
+
+ analog::sincosf(x, &gr_sin, &gr_cos);
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(c_sin, gr_sin, 0.0001);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(c_cos, gr_cos, 0.0001);
+ }
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/qa_sincos.h b/gr-analog/lib/qa_sincos.h
new file mode 100644
index 000000000..f18e879dd
--- /dev/null
+++ b/gr-analog/lib/qa_sincos.h
@@ -0,0 +1,47 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 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 _QA_ANALOG_SINCOS_H_
+#define _QA_ANALOG_SINCOS_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+namespace gr {
+ namespace analog {
+
+ class qa_sincos : public CppUnit::TestCase
+ {
+ CPPUNIT_TEST_SUITE(qa_sincos);
+ CPPUNIT_TEST(t1);
+ CPPUNIT_TEST(t2);
+ CPPUNIT_TEST_SUITE_END();
+
+ private:
+ void t1();
+ void t2();
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* _QA_ANALOG_SINCOS_H_ */
diff --git a/gr-analog/lib/quadrature_demod_cf_impl.cc b/gr-analog/lib/quadrature_demod_cf_impl.cc
new file mode 100644
index 000000000..9490ba6be
--- /dev/null
+++ b/gr-analog/lib/quadrature_demod_cf_impl.cc
@@ -0,0 +1,72 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2005,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 "quadrature_demod_cf_impl.h"
+#include <gr_io_signature.h>
+#include <gr_math.h>
+
+namespace gr {
+ namespace analog {
+
+ quadrature_demod_cf::sptr
+ quadrature_demod_cf::make(float gain)
+ {
+ return gnuradio::get_initial_sptr
+ (new quadrature_demod_cf_impl(gain));
+ }
+
+ quadrature_demod_cf_impl::quadrature_demod_cf_impl(float gain)
+ : gr_sync_block("quadrature_demod_cf",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(float))),
+ d_gain(gain)
+ {
+ set_history(2); // we need to look at the previous value
+ }
+
+ quadrature_demod_cf_impl::~quadrature_demod_cf_impl()
+ {
+ }
+
+ int
+ quadrature_demod_cf_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ gr_complex *in = (gr_complex*)input_items[0];
+ float *out = (float*)output_items[0];
+ in++; // ensure that in[-1] is valid
+
+ for(int i = 0; i < noutput_items; i++) {
+ gr_complex product = in[i] * conj(in[i-1]);
+ out[i] = d_gain * gr_fast_atan2f(imag(product), real(product));
+ }
+
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/quadrature_demod_cf_impl.h b/gr-analog/lib/quadrature_demod_cf_impl.h
new file mode 100644
index 000000000..72beb2331
--- /dev/null
+++ b/gr-analog/lib/quadrature_demod_cf_impl.h
@@ -0,0 +1,51 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,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_QUADRATURE_DEMOD_CF_IMPL_H
+#define INCLUDED_ANALOG_QUADRATURE_DEMOD_CF_IMPL_H
+
+#include <analog/quadrature_demod_cf.h>
+
+namespace gr {
+ namespace analog {
+
+ class quadrature_demod_cf_impl : public quadrature_demod_cf
+ {
+ private:
+ float d_gain;
+
+ public:
+ quadrature_demod_cf_impl(float gain);
+ ~quadrature_demod_cf_impl();
+
+ void set_gain(float gain) { d_gain = gain; }
+ float gain() const { return d_gain; }
+
+ 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_QUADRATURE_DEMOD_CF_IMPL_H */
diff --git a/gr-analog/lib/rail_ff_impl.cc b/gr-analog/lib/rail_ff_impl.cc
new file mode 100644
index 000000000..106c6353a
--- /dev/null
+++ b/gr-analog/lib/rail_ff_impl.cc
@@ -0,0 +1,91 @@
+/* -*- 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 "rail_ff_impl.h"
+#include <gr_io_signature.h>
+#include <gr_math.h>
+
+namespace gr {
+ namespace analog {
+
+ rail_ff::sptr
+ rail_ff::make(float lo, float hi)
+ {
+ return gnuradio::get_initial_sptr
+ (new rail_ff_impl(lo, hi));
+ }
+
+ rail_ff_impl::rail_ff_impl(float lo, float hi)
+ : gr_sync_block("rail_ff",
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(float))),
+ d_lo(lo), d_hi(hi)
+ {
+ set_clipping();
+ }
+
+ rail_ff_impl::~rail_ff_impl()
+ {
+ }
+
+ void
+ rail_ff_impl::set_lo(float lo)
+ {
+ d_lo = lo;
+ set_clipping();
+ }
+
+ void
+ rail_ff_impl::set_hi(float hi)
+ {
+ d_hi = hi;
+ set_clipping();
+ }
+
+ void
+ rail_ff_impl::set_clipping()
+ {
+ d_mid = (d_lo + d_hi)/2;
+ d_clip = d_hi - d_mid;
+ }
+
+ int
+ rail_ff_impl::work(int noutput_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];
+
+ for(int i = 0; i < noutput_items; i++) {
+ out[i] = d_mid + gr_branchless_clip(in[i] - d_mid, d_clip);
+ }
+
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/rail_ff_impl.h b/gr-analog/lib/rail_ff_impl.h
new file mode 100644
index 000000000..436b10b41
--- /dev/null
+++ b/gr-analog/lib/rail_ff_impl.h
@@ -0,0 +1,57 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,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_RAIL_FF_IMPL_H
+#define INCLUDED_ANALOG_RAIL_FF_IMPL_H
+
+#include <analog/rail_ff.h>
+
+namespace gr {
+ namespace analog {
+
+ class rail_ff_impl : public rail_ff
+ {
+ private:
+ float d_lo, d_hi;
+ float d_mid, d_clip;
+
+ void set_clipping();
+
+ public:
+ rail_ff_impl(float lo, float hi);
+ ~rail_ff_impl();
+
+ float lo() const { return d_lo; }
+ float hi() const { return d_hi; }
+
+ void set_lo(float lo);
+ void set_hi(float hi);
+
+ 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_RAIL_FF_IMPL_H */
diff --git a/gr-analog/lib/sig_source_X_impl.cc.t b/gr-analog/lib/sig_source_X_impl.cc.t
new file mode 100644
index 000000000..60653dc1b
--- /dev/null
+++ b/gr-analog/lib/sig_source_X_impl.cc.t
@@ -0,0 +1,253 @@
+/* -*- 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.
+ */
+
+/* @WARNING@ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "@IMPL_NAME@.h"
+#include <algorithm>
+#include <gr_io_signature.h>
+#include <stdexcept>
+#include <algorithm>
+#include <gr_complex.h>
+
+namespace gr {
+ namespace analog {
+
+ @BASE_NAME@::sptr
+ @BASE_NAME@::make(double sampling_freq, gr_waveform_t waveform,
+ double frequency, double ampl, @TYPE@ offset)
+ {
+ return gnuradio::get_initial_sptr
+ (new @IMPL_NAME@(sampling_freq, waveform, frequency, ampl, offset));
+ }
+
+ @IMPL_NAME@::@IMPL_NAME@(double sampling_freq, gr_waveform_t waveform,
+ double frequency, double ampl, @TYPE@ offset)
+ : gr_sync_block("@BASE_NAME@",
+ gr_make_io_signature(0, 0, 0),
+ gr_make_io_signature(1, 1, sizeof(@TYPE@))),
+ d_sampling_freq(sampling_freq), d_waveform(waveform),
+ d_frequency(frequency), d_ampl(ampl), d_offset(offset)
+ {
+ d_nco.set_freq(2 * M_PI * d_frequency / d_sampling_freq);
+ }
+
+ @IMPL_NAME@::~@IMPL_NAME@()
+ {
+ }
+
+ int
+ @IMPL_NAME@::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ @TYPE@ *optr = (@TYPE@*)output_items[0];
+ @TYPE@ t;
+
+ switch(d_waveform) {
+
+#if @IS_COMPLEX@ // complex?
+
+ case GR_CONST_WAVE:
+ t = (gr_complex) d_ampl + d_offset;
+ std::fill_n(optr, noutput_items, t);
+ break;
+
+ case GR_SIN_WAVE:
+ case GR_COS_WAVE:
+ d_nco.sincos(optr, noutput_items, d_ampl);
+ if(d_offset == gr_complex(0,0))
+ break;
+
+ for(int i = 0; i < noutput_items; i++) {
+ optr[i] += d_offset;
+ }
+ break;
+
+ /* Implements a real square wave high from -PI to 0.
+ * The imaginary square wave leads by 90 deg.
+ */
+ case GR_SQR_WAVE:
+ for(int i = 0; i < noutput_items; i++) {
+ if(d_nco.get_phase() < -1*M_PI/2)
+ optr[i] = gr_complex(d_ampl, 0) + d_offset;
+ else if(d_nco.get_phase() < 0)
+ optr[i] = gr_complex(d_ampl, d_ampl) + d_offset;
+ else if(d_nco.get_phase() < M_PI/2)
+ optr[i] = gr_complex(0, d_ampl) + d_offset;
+ else
+ optr[i] = d_offset;
+ d_nco.step();
+ }
+ break;
+
+ /* Implements a real triangle wave rising from -PI to 0 and
+ * falling from 0 to PI. The imaginary triangle wave leads by
+ * 90 deg.
+ */
+ case GR_TRI_WAVE:
+ for(int i = 0; i < noutput_items; i++) {
+ if(d_nco.get_phase() < -1*M_PI/2){
+ optr[i] = gr_complex(d_ampl*d_nco.get_phase()/M_PI + d_ampl,
+ -1*d_ampl*d_nco.get_phase()/M_PI - d_ampl/2) + d_offset;
+ }
+ else if(d_nco.get_phase() < 0) {
+ optr[i] = gr_complex(d_ampl*d_nco.get_phase()/M_PI + d_ampl,
+ d_ampl*d_nco.get_phase()/M_PI + d_ampl/2) + d_offset;
+ }
+ else if(d_nco.get_phase() < M_PI/2) {
+ optr[i] = gr_complex(-1*d_ampl*d_nco.get_phase()/M_PI + d_ampl,
+ d_ampl*d_nco.get_phase()/M_PI + d_ampl/2) + d_offset;
+ }
+ else {
+ optr[i] = gr_complex(-1*d_ampl*d_nco.get_phase()/M_PI + d_ampl,
+ -1*d_ampl*d_nco.get_phase()/M_PI + 3*d_ampl/2) + d_offset;
+ }
+ d_nco.step();
+ }
+ break;
+
+ /* Implements a real saw tooth wave rising from -PI to PI.
+ * The imaginary saw tooth wave leads by 90 deg.
+ */
+ case GR_SAW_WAVE:
+ for(int i = 0; i < noutput_items; i++) {
+ if(d_nco.get_phase() < -1*M_PI/2) {
+ optr[i] = gr_complex(d_ampl*d_nco.get_phase()/(2*M_PI) + d_ampl/2,
+ d_ampl*d_nco.get_phase()/(2*M_PI) + 5*d_ampl/4) + d_offset;
+ }
+ else {
+ optr[i] = gr_complex(d_ampl*d_nco.get_phase()/(2*M_PI) + d_ampl/2,
+ d_ampl*d_nco.get_phase()/(2*M_PI) + d_ampl/4) + d_offset;
+ }
+ d_nco.step();
+ }
+ break;
+
+#else // nope...
+
+ case GR_CONST_WAVE:
+ t = (@TYPE@)d_ampl + d_offset;
+ std::fill_n(optr, noutput_items, t);
+ break;
+
+ case GR_SIN_WAVE:
+ d_nco.sin(optr, noutput_items, d_ampl);
+ if(d_offset == 0)
+ break;
+
+ for(int i = 0; i < noutput_items; i++) {
+ optr[i] += d_offset;
+ }
+ break;
+
+ case GR_COS_WAVE:
+ d_nco.cos(optr, noutput_items, d_ampl);
+ if(d_offset == 0)
+ break;
+
+ for(int i = 0; i < noutput_items; i++) {
+ optr[i] += d_offset;
+ }
+ break;
+
+ /* The square wave is high from -PI to 0. */
+ case GR_SQR_WAVE:
+ t = (@TYPE@)d_ampl + d_offset;
+ for(int i = 0; i < noutput_items; i++) {
+ if(d_nco.get_phase() < 0)
+ optr[i] = t;
+ else
+ optr[i] = d_offset;
+ d_nco.step();
+ }
+ break;
+
+ /* The triangle wave rises from -PI to 0 and falls from 0 to PI. */
+ case GR_TRI_WAVE:
+ for(int i = 0; i < noutput_items; i++) {
+ double t = d_ampl*d_nco.get_phase()/M_PI;
+ if (d_nco.get_phase() < 0)
+ optr[i] = static_cast<@TYPE@>(t + d_ampl + d_offset);
+ else
+ optr[i] = static_cast<@TYPE@>(-1*t + d_ampl + d_offset);
+ d_nco.step();
+ }
+ break;
+
+ /* The saw tooth wave rises from -PI to PI. */
+ case GR_SAW_WAVE:
+ for(int i = 0; i < noutput_items; i++) {
+ t = static_cast<@TYPE@>(d_ampl*d_nco.get_phase()/(2*M_PI)
+ + d_ampl/2 + d_offset);
+ optr[i] = t;
+ d_nco.step();
+ }
+ break;
+
+#endif
+
+ default:
+ throw std::runtime_error("gr_sig_source: invalid waveform");
+ }
+
+ return noutput_items;
+ }
+
+ void
+ @NAME@::set_sampling_freq(double sampling_freq)
+ {
+ d_sampling_freq = sampling_freq;
+ d_nco.set_freq (2 * M_PI * d_frequency / d_sampling_freq);
+ }
+
+ void
+ @NAME@::set_waveform(gr_waveform_t waveform)
+ {
+ d_waveform = waveform;
+ }
+
+ void
+ @NAME@::set_frequency(double frequency)
+ {
+ d_frequency = frequency;
+ d_nco.set_freq(2 * M_PI * d_frequency / d_sampling_freq);
+ }
+
+ void
+ @NAME@::set_amplitude(double ampl)
+ {
+ d_ampl = ampl;
+ }
+
+ void
+ @NAME@::set_offset(@TYPE@ offset)
+ {
+ d_offset = offset;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/sig_source_X_impl.h.t b/gr-analog/lib/sig_source_X_impl.h.t
new file mode 100644
index 000000000..50f179127
--- /dev/null
+++ b/gr-analog/lib/sig_source_X_impl.h.t
@@ -0,0 +1,70 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,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.
+ */
+
+/* @WARNING@ */
+
+#ifndef @GUARD_NAME@
+#define @GUARD_NAME@
+
+#include <analog/@BASE_NAME@.h>
+#include <gr_sync_block.h>
+#include <gr_fxpt_nco.h>
+
+namespace gr {
+ namespace analog {
+
+ class @IMPL_NAME@ : public @BASE_NAME@
+ {
+ private:
+ double d_sampling_freq;
+ gr_waveform_t d_waveform;
+ double d_frequency;
+ double d_ampl;
+ @TYPE@ d_offset;
+ gr_fxpt_nco d_nco;
+
+ public:
+ @IMPL_NAME@(double sampling_freq, gr_waveform_t waveform,
+ double wave_freq, double ampl, @TYPE@ offset = 0);
+ ~@IMPL_NAME@();
+
+ virtual int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+
+ double sampling_freq() const { return d_sampling_freq; }
+ gr_waveform_t waveform() const { return d_waveform; }
+ double frequency() const { return d_frequency; }
+ double amplitude() const { return d_ampl; }
+ @TYPE@ offset() const { return d_offset; }
+
+ void set_sampling_freq(double sampling_freq);
+ void set_waveform(gr_waveform_t waveform);
+ void set_frequency(double frequency);
+ void set_amplitude(double ampl);
+ void set_offset(@TYPE@ offset);
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* @GUARD_NAME@ */
diff --git a/gr-analog/lib/simple_squelch_cc_impl.cc b/gr-analog/lib/simple_squelch_cc_impl.cc
new file mode 100644
index 000000000..02ccc535d
--- /dev/null
+++ b/gr-analog/lib/simple_squelch_cc_impl.cc
@@ -0,0 +1,106 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,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 "simple_squelch_cc_impl.h"
+#include <gr_io_signature.h>
+#include <cmath>
+
+namespace gr {
+ namespace analog {
+
+ simple_squelch_cc::sptr
+ simple_squelch_cc::make(double threshold_db, double alpha)
+ {
+ return gnuradio::get_initial_sptr
+ (new simple_squelch_cc_impl(threshold_db, alpha));
+ }
+
+ simple_squelch_cc_impl::simple_squelch_cc_impl(double threshold_db, double alpha)
+ : gr_sync_block("simple_squelch_cc",
+ gr_make_io_signature(1, 1, sizeof(gr_complex)),
+ gr_make_io_signature(1, 1, sizeof(gr_complex))),
+ d_unmuted(false), d_iir(alpha)
+ {
+ set_threshold(threshold_db);
+ }
+
+ simple_squelch_cc_impl::~simple_squelch_cc_impl()
+ {
+ }
+
+ void
+ simple_squelch_cc_impl::set_threshold(double decibels)
+ {
+ // convert to absolute threshold (mag squared)
+ d_threshold = std::pow(10.0, decibels/10);
+ }
+
+ double
+ simple_squelch_cc_impl::threshold() const
+ {
+ return 10 * log10(d_threshold);
+ }
+
+ void
+ simple_squelch_cc_impl::set_alpha(double alpha)
+ {
+ d_iir.set_taps(alpha);
+ }
+
+ std::vector<float>
+ simple_squelch_cc_impl::squelch_range() const
+ {
+ std::vector<float> r(3);
+ r[0] = -50.0; // min FIXME
+ r[1] = +50.0; // max FIXME
+ r[2] = (r[1] - r[0]) / 100; // step size
+
+ return r;
+ }
+
+ int
+ simple_squelch_cc_impl::work(int noutput_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];
+
+ for(int i = 0; i < noutput_items; i++) {
+ double mag_sqrd = in[i].real()*in[i].real() + in[i].imag()*in[i].imag();
+ double f = d_iir.filter(mag_sqrd);
+ if(f >= d_threshold)
+ out[i] = in[i];
+ else
+ out[i] = 0;
+ }
+
+ d_unmuted = d_iir.prev_output() >= d_threshold;
+ return noutput_items;
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/simple_squelch_cc_impl.h b/gr-analog/lib/simple_squelch_cc_impl.h
new file mode 100644
index 000000000..ba11de91e
--- /dev/null
+++ b/gr-analog/lib/simple_squelch_cc_impl.h
@@ -0,0 +1,59 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2005,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_SIMPLE_SQUELCH_CC_IMPL_H
+#define INCLUDED_ANALOG_SIMPLE_SQUELCH_CC_IMPL_H
+
+#include <analog/simple_squelch_cc.h>
+#include <filter/single_pole_iir.h>
+
+namespace gr {
+ namespace analog {
+
+ class simple_squelch_cc_impl : public simple_squelch_cc
+ {
+ private:
+ double d_threshold;
+ bool d_unmuted;
+ filter::single_pole_iir<double,double,double> d_iir;
+
+ public:
+ simple_squelch_cc_impl(double threshold_db, double alpha);
+ ~simple_squelch_cc_impl();
+
+ bool unmuted() const { return d_unmuted; }
+
+ void set_alpha(double alpha);
+ void set_threshold(double decibels);
+
+ double threshold() const;
+ std::vector<float> squelch_range() 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_SIMPLE_SQUELCH_CC_IMPL_H */
diff --git a/gr-analog/lib/sincos.c b/gr-analog/lib/sincos.c
new file mode 100644
index 000000000..aa72b1cd4
--- /dev/null
+++ b/gr-analog/lib/sincos.c
@@ -0,0 +1,86 @@
+/* -*- 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
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE // ask for GNU extensions if available
+#endif
+
+#include <analog/sincos.h>
+#include <math.h>
+
+namespace gr {
+ namespace analog {
+
+// ----------------------------------------------------------------
+
+#if defined (HAVE_SINCOS)
+
+ void
+ sincos(double x, double *sinx, double *cosx)
+ {
+ sincos(x, sinx, cosx);
+ }
+
+#else
+
+ void
+ sincos(double x, double *sinx, double *cosx)
+ {
+ *sinx = sin(x);
+ *cosx = cos(x);
+ }
+
+#endif
+
+// ----------------------------------------------------------------
+
+#if defined (HAVE_SINCOSF)
+
+ void
+ sincosf(float x, float *sinx, float *cosx)
+ {
+ sincosf(x, sinx, cosx);
+ }
+
+#elif defined (HAVE_SINF) && defined (HAVE_COSF)
+
+ void
+ sincosf(float x, float *sinx, float *cosx)
+ {
+ *sinx = sinf(x);
+ *cosx = cosf(x);
+ }
+
+#else
+
+ void
+ sincosf(float x, float *sinx, float *cosx)
+ {
+ *sinx = sin(x);
+ *cosx = cos(x);
+ }
+
+#endif
diff --git a/gr-analog/lib/squelch_base_cc_impl.cc b/gr-analog/lib/squelch_base_cc_impl.cc
new file mode 100644
index 000000000..cba7b30db
--- /dev/null
+++ b/gr-analog/lib/squelch_base_cc_impl.cc
@@ -0,0 +1,140 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2006,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 "squelch_base_cc_impl.h"
+#include <gr_io_signature.h>
+
+namespace gr {
+ namespace analog {
+
+ squelch_base_cc_impl::squelch_base_cc_impl(const char *name, int ramp, bool gate)
+ : gr_block(name,
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(float)))
+ {
+ set_ramp(ramp);
+ set_gate(gate);
+ d_state = ST_MUTED;
+ d_envelope = d_ramp ? 0.0 : 1.0;
+ d_ramped = 0;
+ }
+
+ squelch_base_cc_impl::~squelch_base_cc_impl()
+ {
+ }
+
+ int
+ squelch_base_cc_impl::ramp() const
+ {
+ return d_ramp;
+ }
+
+ void
+ squelch_base_cc_impl::set_ramp(int ramp)
+ {
+ d_ramp = ramp;
+ }
+
+ bool
+ squelch_base_cc_impl::gate() const
+ {
+ return d_gate;
+ }
+
+ void
+ squelch_base_cc_impl::set_gate(bool gate)
+ {
+ d_gate = gate;
+ }
+
+ bool
+ squelch_base_cc_impl::unmuted() const
+ {
+ return (d_state == ST_UNMUTED || d_state == ST_ATTACK);
+ }
+
+ int
+ squelch_base_cc_impl::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 j = 0;
+
+ for(int i = 0; i < noutput_items; i++) {
+ update_state(in[i]);
+
+ // Adjust envelope based on current state
+ switch(d_state) {
+ case ST_MUTED:
+ if(!mute()) {
+ d_state = d_ramp ? ST_ATTACK : ST_UNMUTED; // If not ramping, go straight to unmuted
+ }
+ break;
+
+ case ST_UNMUTED:
+ if(mute()) {
+ d_state = d_ramp ? ST_DECAY : ST_MUTED; // If not ramping, go straight to muted
+ }
+ break;
+
+ case ST_ATTACK:
+ d_envelope = 0.5-std::cos(M_PI*(++d_ramped)/d_ramp)/2.0; // FIXME: precalculate window for speed
+ if(d_ramped >= d_ramp) { // use >= in case d_ramp is set to lower value elsewhere
+ d_state = ST_UNMUTED;
+ d_envelope = 1.0;
+ }
+ break;
+
+ case ST_DECAY:
+ d_envelope = 0.5-std::cos(M_PI*(--d_ramped)/d_ramp)/2.0; // FIXME: precalculate window for speed
+ if(d_ramped == 0.0) {
+ d_state = ST_MUTED;
+ }
+ break;
+ };
+
+ // If unmuted, copy input times envelope to output
+ // Otherwise, if not gating, copy zero to output
+ if(d_state != ST_MUTED) {
+ out[j++] = in[i]*gr_complex(d_envelope, 0.0);
+ }
+ else {
+ if(!d_gate) {
+ out[j++] = 0.0;
+ }
+ }
+ }
+
+ consume_each(noutput_items); // Use all the inputs
+ return j; // But only report outputs copied
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/squelch_base_cc_impl.h b/gr-analog/lib/squelch_base_cc_impl.h
new file mode 100644
index 000000000..19dccaa10
--- /dev/null
+++ b/gr-analog/lib/squelch_base_cc_impl.h
@@ -0,0 +1,65 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,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_GR_SQUELCH_BASE_CC_IMPL_H
+#define INCLUDED_GR_SQUELCH_BASE_CC_IMPL_H
+
+#include <analog/squelch_base_cc.h>
+
+namespace gr {
+ namespace analog {
+
+ class squelch_base_cc_impl : public squelch_base_cc
+ {
+ private:
+ int d_ramp;
+ int d_ramped;
+ bool d_gate;
+ double d_envelope;
+ enum { ST_MUTED, ST_ATTACK, ST_UNMUTED, ST_DECAY } d_state;
+
+ protected:
+ virtual void update_state(const gr_complex &sample) {};
+ virtual bool mute() const { return false; };
+
+ public:
+ squelch_base_cc_impl(const char *name, int ramp, bool gate);
+ ~squelch_base_cc_impl();
+
+ int ramp() const;
+ void set_ramp(int ramp);
+ bool gate() const;
+ void set_gate(bool gate);
+ bool unmuted() const;
+
+ virtual std::vector<float> squelch_range() const = 0;
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* INCLUDED_ANALOG_SQUELCH_BASE_IMPL_FF_H */
diff --git a/gr-analog/lib/squelch_base_ff_impl.cc b/gr-analog/lib/squelch_base_ff_impl.cc
new file mode 100644
index 000000000..f9f07d36d
--- /dev/null
+++ b/gr-analog/lib/squelch_base_ff_impl.cc
@@ -0,0 +1,140 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2004,2006,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 "squelch_base_ff_impl.h"
+#include <gr_io_signature.h>
+
+namespace gr {
+ namespace analog {
+
+ squelch_base_ff_impl::squelch_base_ff_impl(const char *name, int ramp, bool gate)
+ : gr_block(name,
+ gr_make_io_signature(1, 1, sizeof(float)),
+ gr_make_io_signature(1, 1, sizeof(float)))
+ {
+ set_ramp(ramp);
+ set_gate(gate);
+ d_state = ST_MUTED;
+ d_envelope = d_ramp ? 0.0 : 1.0;
+ d_ramped = 0;
+ }
+
+ squelch_base_ff_impl::~squelch_base_ff_impl()
+ {
+ }
+
+ int
+ squelch_base_ff_impl::ramp() const
+ {
+ return d_ramp;
+ }
+
+ void
+ squelch_base_ff_impl::set_ramp(int ramp)
+ {
+ d_ramp = ramp;
+ }
+
+ bool
+ squelch_base_ff_impl::gate() const
+ {
+ return d_gate;
+ }
+
+ void
+ squelch_base_ff_impl::set_gate(bool gate)
+ {
+ d_gate = gate;
+ }
+
+ bool
+ squelch_base_ff_impl::unmuted() const
+ {
+ return (d_state == ST_UNMUTED || d_state == ST_ATTACK);
+ }
+
+ int
+ squelch_base_ff_impl::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];
+
+ int j = 0;
+
+ for(int i = 0; i < noutput_items; i++) {
+ update_state(in[i]);
+
+ // Adjust envelope based on current state
+ switch(d_state) {
+ case ST_MUTED:
+ if(!mute())
+ // If not ramping, go straight to unmuted
+ d_state = d_ramp ? ST_ATTACK : ST_UNMUTED;
+ break;
+
+ case ST_UNMUTED:
+ if(mute())
+ // If not ramping, go straight to muted
+ d_state = d_ramp ? ST_DECAY : ST_MUTED;
+ break;
+
+ case ST_ATTACK:
+ // FIXME: precalculate window for speed
+ d_envelope = 0.5-std::cos(M_PI*(++d_ramped)/d_ramp)/2.0;
+
+ // use >= in case d_ramp is set to lower value elsewhere
+ if(d_ramped >= d_ramp) {
+ d_state = ST_UNMUTED;
+ d_envelope = 1.0;
+ }
+ break;
+
+ case ST_DECAY:
+ // FIXME: precalculate window for speed
+ d_envelope = 0.5-std::cos(M_PI*(--d_ramped)/d_ramp)/2.0;
+ if(d_ramped == 0.0)
+ d_state = ST_MUTED;
+ break;
+ };
+
+ // If unmuted, copy input times envelope to output
+ // Otherwise, if not gating, copy zero to output
+ if(d_state != ST_MUTED)
+ out[j++] = in[i]*d_envelope;
+ else
+ if(!d_gate)
+ out[j++] = 0.0;
+ }
+
+ consume_each(noutput_items); // Use all the inputs
+ return j; // But only report outputs copied
+ }
+
+ } /* namespace analog */
+} /* namespace gr */
diff --git a/gr-analog/lib/squelch_base_ff_impl.h b/gr-analog/lib/squelch_base_ff_impl.h
new file mode 100644
index 000000000..22659be74
--- /dev/null
+++ b/gr-analog/lib/squelch_base_ff_impl.h
@@ -0,0 +1,65 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2006,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_GR_SQUELCH_BASE_FF_IMPL_H
+#define INCLUDED_GR_SQUELCH_BASE_FF_IMPL_H
+
+#include <analog/squelch_base_ff.h>
+
+namespace gr {
+ namespace analog {
+
+ class squelch_base_ff_impl : public squelch_base_ff
+ {
+ private:
+ int d_ramp;
+ int d_ramped;
+ bool d_gate;
+ double d_envelope;
+ enum { ST_MUTED, ST_ATTACK, ST_UNMUTED, ST_DECAY } d_state;
+
+ protected:
+ virtual void update_state(const float &sample) {};
+ virtual bool mute() const { return false; };
+
+ public:
+ squelch_base_ff_impl(const char *name, int ramp, bool gate);
+ ~squelch_base_ff_impl();
+
+ int ramp() const;
+ void set_ramp(int ramp);
+ bool gate() const;
+ void set_gate(bool gate);
+ bool unmuted() const;
+
+ virtual std::vector<float> squelch_range() const = 0;
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } /* namespace analog */
+} /* namespace gr */
+
+#endif /* INCLUDED_ANALOG_SQUELCH_BASE_IMPL_FF_H */
diff --git a/gr-analog/lib/test_gr_analog.cc b/gr-analog/lib/test_gr_analog.cc
new file mode 100644
index 000000000..00d624269
--- /dev/null
+++ b/gr-analog/lib/test_gr_analog.cc
@@ -0,0 +1,43 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 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.
+ */
+
+#include <cppunit/TextTestRunner.h>
+#include <cppunit/XmlOutputter.h>
+
+#include <gr_unittests.h>
+#include "qa_analog.h"
+#include <iostream>
+
+int
+main (int argc, char **argv)
+{
+ CppUnit::TextTestRunner runner;
+ std::ofstream xmlfile(get_unittest_path("gr_analog.xml").c_str());
+ CppUnit::XmlOutputter *xmlout = new CppUnit::XmlOutputter(&runner.result(), xmlfile);
+
+ runner.addTest(qa_gr_analog::suite());
+ runner.setOutputter(xmlout);
+
+ bool was_successful = runner.run("", false);
+
+ return was_successful ? 0 : 1;
+}