summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Müller <marcus@hostalia.de>2018-08-23 19:31:42 +0200
committerMarcus Müller <marcus@hostalia.de>2018-08-23 19:31:42 +0200
commit75b4ae3d2a64cbf9b3dc473f5821aaf1997b4a6c (patch)
tree31b6bd0deaceba43b95cb2ee326ee5ab80ef774c
parent8c8f166d8383c39bdcacdf8ecf28cfd4eca4452f (diff)
parent3144094136393ceef099528117390b16f800da7d (diff)
Merge branch 'tag_fix4'
This converts the floating point-based tag offset calculation to a rational-numbers high precision approach. It introduces a dependency on GMP (or MPIR, on Windows).
-rw-r--r--CMakeLists.txt5
-rw-r--r--cmake/Modules/FindGMP.cmake45
-rw-r--r--cmake/Modules/FindMPIR.cmake45
-rw-r--r--cmake/Modules/FindMPLIB.cmake27
-rw-r--r--config.h.in6
-rw-r--r--gnuradio-runtime/CMakeLists.txt6
-rw-r--r--gnuradio-runtime/gnuradio-runtime.pc.in2
-rw-r--r--gnuradio-runtime/include/gnuradio/block.h48
-rw-r--r--gnuradio-runtime/include/gnuradio/block_gateway.h16
-rw-r--r--gnuradio-runtime/include/gnuradio/sync_decimator.h2
-rw-r--r--gnuradio-runtime/include/gnuradio/sync_interpolator.h2
-rw-r--r--gnuradio-runtime/lib/CMakeLists.txt2
-rw-r--r--gnuradio-runtime/lib/block.cc31
-rw-r--r--gnuradio-runtime/lib/block_executor.cc54
-rw-r--r--gnuradio-runtime/lib/single_threaded_scheduler.cc366
-rw-r--r--gnuradio-runtime/swig/block.i2
-rw-r--r--gr-blocks/lib/annotator_1to1_impl.cc2
-rw-r--r--gr-blocks/lib/annotator_raw_impl.cc2
-rw-r--r--gr-blocks/lib/deinterleave_impl.cc2
-rw-r--r--gr-blocks/lib/interleave_impl.cc2
-rw-r--r--gr-blocks/lib/keep_m_in_n_impl.cc6
-rw-r--r--gr-blocks/lib/packed_to_unpacked_XX_impl.cc.t2
-rw-r--r--gr-blocks/lib/repack_bits_bb_impl.cc4
-rw-r--r--gr-blocks/lib/tagged_stream_multiply_length_impl.cc2
-rw-r--r--gr-blocks/lib/tagged_stream_mux_impl.cc2
-rw-r--r--gr-blocks/lib/test_tag_variable_rate_ff_impl.cc2
-rw-r--r--gr-blocks/lib/unpacked_to_packed_XX_impl.cc.t2
-rw-r--r--gr-channels/lib/sro_model_impl.cc4
-rw-r--r--gr-digital/lib/burst_shaper_XX_impl.cc.t2
-rw-r--r--gr-digital/lib/clock_recovery_mm_cc_impl.cc2
-rw-r--r--gr-digital/lib/clock_recovery_mm_ff_impl.cc2
-rw-r--r--gr-digital/lib/constellation_decoder_cb_impl.cc2
-rw-r--r--gr-digital/lib/header_payload_demux_impl.cc5
-rw-r--r--gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc3
-rw-r--r--gr-digital/lib/ofdm_chanest_vcvc_impl.cc3
-rw-r--r--gr-digital/lib/ofdm_cyclic_prefixer_impl.cc2
-rw-r--r--gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc2
-rw-r--r--gr-digital/lib/ofdm_sampler_impl.cc2
-rw-r--r--gr-digital/lib/ofdm_serializer_vcc_impl.cc3
-rw-r--r--gr-digital/lib/packet_headergenerator_bb_impl.cc2
-rw-r--r--gr-digital/lib/pfb_clock_sync_ccf_impl.cc2
-rw-r--r--gr-digital/lib/pfb_clock_sync_fff_impl.cc2
-rw-r--r--gr-digital/lib/protocol_formatter_bb_impl.cc2
-rw-r--r--gr-dtv/lib/dvbt/dvbt_convolutional_deinterleaver_impl.cc2
-rw-r--r--gr-dtv/lib/dvbt/dvbt_energy_descramble_impl.cc2
-rw-r--r--gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc2
-rw-r--r--gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc3
-rw-r--r--gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc2
-rw-r--r--gr-fec/lib/decoder_impl.cc3
-rw-r--r--gr-fec/lib/depuncture_bb_impl.cc3
-rw-r--r--gr-fec/lib/encoder_impl.cc3
-rw-r--r--gr-fec/lib/puncture_bb_impl.cc3
-rw-r--r--gr-fec/lib/puncture_ff_impl.cc3
-rw-r--r--gr-filter/lib/fractional_interpolator_cc_impl.cc12
-rw-r--r--gr-filter/lib/fractional_interpolator_cc_impl.h4
-rw-r--r--gr-filter/lib/fractional_interpolator_ff_impl.cc12
-rw-r--r--gr-filter/lib/fractional_interpolator_ff_impl.h4
-rw-r--r--gr-filter/lib/fractional_resampler_cc_impl.cc18
-rw-r--r--gr-filter/lib/fractional_resampler_cc_impl.h4
-rw-r--r--gr-filter/lib/fractional_resampler_ff_impl.cc18
-rw-r--r--gr-filter/lib/fractional_resampler_ff_impl.h4
-rw-r--r--gr-filter/lib/pfb_decimator_ccf_impl.cc2
-rw-r--r--gr-filter/lib/rational_resampler_base_XXX_impl.cc.t2
-rw-r--r--gr-trellis/lib/constellation_metrics_cf_impl.cc2
-rw-r--r--gr-trellis/lib/metrics_X_impl.cc.t6
-rw-r--r--gr-trellis/lib/pccc_decoder_X_impl.cc.t2
-rw-r--r--gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t2
-rw-r--r--gr-trellis/lib/sccc_decoder_X_impl.cc.t2
-rw-r--r--gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t2
-rw-r--r--gr-trellis/lib/siso_combined_f_impl.cc8
-rw-r--r--gr-trellis/lib/siso_f_impl.cc8
-rw-r--r--gr-trellis/lib/viterbi_X_impl.cc.t4
-rw-r--r--gr-trellis/lib/viterbi_combined_XX_impl.cc.t4
73 files changed, 387 insertions, 486 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f6e1448ec3..382f1b5ebc 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -507,6 +507,11 @@ list(APPEND GR_TEST_PYTHON_DIRS
# installed code to import the same names, so we have to grab from the
# binary directory first.
+# gnuradio-runtime/include/gnuradio/block.h needs a define to tell it which
+# multiprecision arithmetic library header to include
+find_package(MPLIB)
+add_definitions(${MPLIB_DEFINITIONS})
+
########################################################################
# Add subdirectories (in order of deps)
########################################################################
diff --git a/cmake/Modules/FindGMP.cmake b/cmake/Modules/FindGMP.cmake
new file mode 100644
index 0000000000..8782334e80
--- /dev/null
+++ b/cmake/Modules/FindGMP.cmake
@@ -0,0 +1,45 @@
+include(FindPkgConfig)
+pkg_check_modules(PC_GMP "gmp")
+
+set(GMP_DEFINITIONS ${PC_GMP_CFLAGS_OTHER})
+
+find_path(
+ GMP_INCLUDE_DIR
+ NAMES gmpxx.h
+ HINTS ${PC_GMP_INCLUDEDIR}
+ PATHS ${CMAKE_INSTALL_PREFIX}/include
+ /usr/local/include
+ /usr/include
+)
+set(GMP_INCLUDE_DIRS ${GMP_INCLUDE_DIR})
+set(GMP_PC_ADD_CFLAGS "-I${GMP_INCLUDE_DIR}")
+
+find_library(
+ GMPXX_LIBRARY
+ NAMES gmpxx
+ HINTS ${PC_GMP_LIBDIR}
+ PATHS ${CMAKE_INSTALL_PREFIX}/lib
+ ${CMAKE_INSTALL_PREFIX}/lib64
+ /usr/local/lib
+ /usr/local/lib64
+ /usr/lib
+ /usr/lib64
+)
+
+find_library(
+ GMP_LIBRARY
+ NAMES gmp
+ HINTS ${PC_GMP_LIBDIR}
+ PATHS ${CMAKE_INSTALL_PREFIX}/lib
+ ${CMAKE_INSTALL_PREFIX}/lib64
+ /usr/local/lib
+ /usr/local/lib64
+ /usr/lib
+ /usr/lib64
+)
+set(GMP_LIBRARIES ${GMPXX_LIBRARY} ${GMP_LIBRARY})
+set(GMP_PC_ADD_LIBS "-lgmpxx -lgmp")
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(GMP DEFAULT_MSG GMPXX_LIBRARY GMP_LIBRARY GMP_INCLUDE_DIR)
+mark_as_advanced(GMPXX_LIBRARY GMP_LIBRARY GMP_INCLUDE_DIR)
diff --git a/cmake/Modules/FindMPIR.cmake b/cmake/Modules/FindMPIR.cmake
new file mode 100644
index 0000000000..647b3815a4
--- /dev/null
+++ b/cmake/Modules/FindMPIR.cmake
@@ -0,0 +1,45 @@
+include(FindPkgConfig)
+pkg_check_modules(PC_MPIR "mpir >= 3.0")
+
+set(MPIR_DEFINITIONS ${PC_MPIR_CFLAGS_OTHER})
+
+find_path(
+ MPIR_INCLUDE_DIR
+ NAMES mpirxx.h
+ HINTS ${PC_MPIR_INCLUDEDIR}
+ PATHS ${CMAKE_INSTALL_PREFIX}/include
+ /usr/local/include
+ /usr/include
+)
+set(MPIR_INCLUDE_DIRS ${MPIR_INCLUDE_DIR})
+set(MPIR_PC_ADD_CFLAGS "-I${MPIR_INCLUDE_DIR}")
+
+find_library(
+ MPIRXX_LIBRARY
+ NAMES mpirxx
+ HINTS ${PC_MPIR_LIBDIR}
+ PATHS ${CMAKE_INSTALL_PREFIX}/lib
+ ${CMAKE_INSTALL_PREFIX}/lib64
+ /usr/local/lib
+ /usr/local/lib64
+ /usr/lib
+ /usr/lib64
+)
+
+find_library(
+ MPIR_LIBRARY
+ NAMES mpir
+ HINTS ${PC_MPIR_LIBDIR}
+ PATHS ${CMAKE_INSTALL_PREFIX}/lib
+ ${CMAKE_INSTALL_PREFIX}/lib64
+ /usr/local/lib
+ /usr/local/lib64
+ /usr/lib
+ /usr/lib64
+)
+set(MPIR_LIBRARIES ${MPIRXX_LIBRARY} ${MPIR_LIBRARY})
+set(MPIR_PC_ADD_LIBS "-lmpirxx -lmpir")
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(MPIR DEFAULT_MSG MPIRXX_LIBRARY MPIR_LIBRARY MPIR_INCLUDE_DIR)
+mark_as_advanced(MPIRXX_LIBRARY MPIR_LIBRARY MPIR_INCLUDE_DIR)
diff --git a/cmake/Modules/FindMPLIB.cmake b/cmake/Modules/FindMPLIB.cmake
new file mode 100644
index 0000000000..2f4ec8c689
--- /dev/null
+++ b/cmake/Modules/FindMPLIB.cmake
@@ -0,0 +1,27 @@
+find_package(GMP)
+find_package(MPIR)
+
+if(GMP_FOUND)
+ set(GR_MPLIB_GMP True)
+ set(MPLIB_DEFINITIONS "-DGR_MPLIB_GMP" ${GMP_DEFINITIONS})
+ set(MPLIB_INCLUDE_DIR ${GMP_INCLUDE_DIR})
+ set(MPLIB_LIBRARY ${GMP_LIBRARY})
+ set(MPLIBXX_LIBRARY ${GMPXX_LIBRARY})
+ set(MPLIB_PC_ADD_CFLAGS ${GMP_PC_ADD_CFLAGS})
+ set(MPLIB_PC_ADD_LIBS ${GMP_PC_ADD_LIBS})
+else(GMP_FOUND)
+ set(GR_MPLIB_MPIR True)
+ set(MPLIB_DEFINITIONS "-DGR_MPLIB_MPIR" ${MPIR_DEFINITIONS})
+ set(MPLIB_INCLUDE_DIR ${MPIR_INCLUDE_DIR})
+ set(MPLIB_LIBRARY ${MPIR_LIBRARY})
+ set(MPLIBXX_LIBRARY ${MPIRXX_LIBRARY})
+ set(MPLIB_PC_ADD_CFLAGS ${MPIR_PC_ADD_CFLAGS})
+ set(MPLIB_PC_ADD_LIBS ${MPIR_PC_ADD_LIBS})
+endif(GMP_FOUND)
+
+set(MPLIB_INCLUDE_DIRS ${MPLIB_INCLUDE_DIR})
+set(MPLIB_LIBRARIES ${MPLIBXX_LIBRARY} ${MPLIB_LIBRARY})
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(MPLIB DEFAULT_MSG MPLIBXX_LIBRARY MPLIB_LIBRARY MPLIB_INCLUDE_DIR)
+mark_as_advanced(MPLIBXX_LIBRARY MPLIB_LIBRARY MPLIB_INCLUDE_DIR)
diff --git a/config.h.in b/config.h.in
index e1f98cdac4..e3570941a7 100644
--- a/config.h.in
+++ b/config.h.in
@@ -36,5 +36,11 @@
#ifndef GR_RPCSERVER_THRIFT
#cmakedefine GR_RPCSERVER_THRIFT
#endif
+#ifndef GR_MPLIB_GMP
+#cmakedefine GR_MPLIB_GMP
+#endif
+#ifndef GR_MPLIB_MPIR
+#cmakedefine GR_MPLIB_MPIR
+#endif
#endif /* GNURADIO_CONFIG_H */
diff --git a/gnuradio-runtime/CMakeLists.txt b/gnuradio-runtime/CMakeLists.txt
index 51eb3b0f8b..47d690a77d 100644
--- a/gnuradio-runtime/CMakeLists.txt
+++ b/gnuradio-runtime/CMakeLists.txt
@@ -23,6 +23,8 @@
include(GrBoost)
include(GrPython)
+find_package(MPLIB REQUIRED)
+
########################################################################
# Setup compatibility checks and defines
########################################################################
@@ -37,6 +39,7 @@ GR_REGISTER_COMPONENT("gnuradio-runtime" ENABLE_GNURADIO_RUNTIME
Boost_FOUND
ENABLE_VOLK
PYTHONINTERP_FOUND
+ MPLIB_FOUND
)
GR_SET_GLOBAL(GNURADIO_RUNTIME_INCLUDE_DIRS
@@ -133,6 +136,9 @@ install(FILES
set(PC_ADD_LIBS -llog4cpp)
endif(ENABLE_GR_LOG AND HAVE_LOG4CPP)
+set(PC_ADD_LIBS "${MPLIB_PC_ADD_LIBS} ${PC_ADD_LIBS}")
+set(PC_ADD_CFLAGS ${MPLIB_PC_ADD_CFLAGS})
+
########################################################################
# Add subdirectories
########################################################################
diff --git a/gnuradio-runtime/gnuradio-runtime.pc.in b/gnuradio-runtime/gnuradio-runtime.pc.in
index acd052d3c6..280adaddd1 100644
--- a/gnuradio-runtime/gnuradio-runtime.pc.in
+++ b/gnuradio-runtime/gnuradio-runtime.pc.in
@@ -8,4 +8,4 @@ Description: GNU Radio core runtime infrastructure
Requires:
Version: @LIBVER@
Libs: -L${libdir} -lgnuradio-runtime -lgnuradio-pmt @PC_ADD_LIBS@
-Cflags: -I${includedir}
+Cflags: -I${includedir} @PC_ADD_CFLAGS@
diff --git a/gnuradio-runtime/include/gnuradio/block.h b/gnuradio-runtime/include/gnuradio/block.h
index c3de303c3b..6fce9a9e72 100644
--- a/gnuradio-runtime/include/gnuradio/block.h
+++ b/gnuradio-runtime/include/gnuradio/block.h
@@ -23,10 +23,16 @@
#ifndef INCLUDED_GR_RUNTIME_BLOCK_H
#define INCLUDED_GR_RUNTIME_BLOCK_H
+#include <gnuradio/config.h>
#include <gnuradio/api.h>
#include <gnuradio/basic_block.h>
#include <gnuradio/tags.h>
#include <gnuradio/logger.h>
+#ifdef GR_MPLIB_MPIR
+#include <mpirxx.h>
+#else
+#include <gmpxx.h>
+#endif
namespace gr {
@@ -281,10 +287,51 @@ namespace gr {
void set_relative_rate(double relative_rate);
/*!
+ * \brief Set the approximate output rate / input rate
+ * using its reciprocal
+ *
+ * This is a convenience function to avoid
+ * numerical problems with tag propagation that calling
+ * set_relative_rate(1.0/relative_rate) might introduce.
+ */
+ void set_inverse_relative_rate(double inverse_relative_rate);
+
+ /*!
+ * \brief Set the approximate output rate / input rate as an integer ratio
+ *
+ * Provide a hint to the buffer allocator and scheduler.
+ * The default relative_rate is interpolation / decimation = 1 / 1
+ *
+ * decimators have relative_rates < 1.0
+ * interpolators have relative_rates > 1.0
+ */
+ void set_relative_rate(uint64_t interpolation, uint64_t decimation);
+
+ /*!
* \brief return the approximate output rate / input rate
*/
double relative_rate() const { return d_relative_rate; }
+ /*!
+ * \brief return the numerator, or interpolation rate, of the
+ * approximate output rate / input rate
+ */
+ uint64_t relative_rate_i() const {
+ return (uint64_t) d_mp_relative_rate.get_num().get_ui(); }
+
+ /*!
+ * \brief return the denominator, or decimation rate, of the
+ * approximate output rate / input rate
+ */
+ uint64_t relative_rate_d() const {
+ return (uint64_t) d_mp_relative_rate.get_den().get_ui(); }
+
+ /*!
+ * \brief return a reference to the multiple precision rational
+ * represntation of the approximate output rate / input rate
+ */
+ mpq_class &mp_relative_rate() { return d_mp_relative_rate; }
+
/*
* The following two methods provide special case info to the
* scheduler in the event that a block has a fixed input to output
@@ -670,6 +717,7 @@ namespace gr {
int d_unaligned;
bool d_is_unaligned;
double d_relative_rate; // approx output_rate / input_rate
+ mpq_class d_mp_relative_rate;
block_detail_sptr d_detail; // implementation details
unsigned d_history;
unsigned d_attr_delay; // the block's sample delay
diff --git a/gnuradio-runtime/include/gnuradio/block_gateway.h b/gnuradio-runtime/include/gnuradio/block_gateway.h
index ef218ea662..28589f8f9f 100644
--- a/gnuradio-runtime/include/gnuradio/block_gateway.h
+++ b/gnuradio-runtime/include/gnuradio/block_gateway.h
@@ -177,10 +177,26 @@ namespace gr {
return gr::block::set_relative_rate(relative_rate);
}
+ void block__set_inverse_relative_rate(double inverse_relative_rate) {
+ return gr::block::set_inverse_relative_rate(inverse_relative_rate);
+ }
+
+ void block__set_relative_rate(uint64_t interpolation, uint64_t decimation) {
+ return gr::block::set_relative_rate(interpolation, decimation);
+ }
+
double block__relative_rate(void) const {
return gr::block::relative_rate();
}
+ uint64_t block__relative_rate_i(void) const {
+ return gr::block::relative_rate_i();
+ }
+
+ uint64_t block__relative_rate_d(void) const {
+ return gr::block::relative_rate_d();
+ }
+
uint64_t block__nitems_read(unsigned int which_input) {
return gr::block::nitems_read(which_input);
}
diff --git a/gnuradio-runtime/include/gnuradio/sync_decimator.h b/gnuradio-runtime/include/gnuradio/sync_decimator.h
index 129abdca79..f6306f169a 100644
--- a/gnuradio-runtime/include/gnuradio/sync_decimator.h
+++ b/gnuradio-runtime/include/gnuradio/sync_decimator.h
@@ -51,7 +51,7 @@ namespace gr {
void set_decimation(unsigned decimation)
{
d_decimation = decimation;
- set_relative_rate(1.0 / decimation);
+ set_relative_rate(1, (uint64_t) decimation);
}
// gr::sync_decimator overrides these to assist work
diff --git a/gnuradio-runtime/include/gnuradio/sync_interpolator.h b/gnuradio-runtime/include/gnuradio/sync_interpolator.h
index bfe79f902e..58351a51ea 100644
--- a/gnuradio-runtime/include/gnuradio/sync_interpolator.h
+++ b/gnuradio-runtime/include/gnuradio/sync_interpolator.h
@@ -51,7 +51,7 @@ namespace gr {
void set_interpolation(unsigned interpolation)
{
d_interpolation = interpolation;
- set_relative_rate(1.0 * interpolation);
+ set_relative_rate((uint64_t) interpolation, 1);
set_output_multiple(interpolation);
}
diff --git a/gnuradio-runtime/lib/CMakeLists.txt b/gnuradio-runtime/lib/CMakeLists.txt
index 2e8312aaad..3482c69d3f 100644
--- a/gnuradio-runtime/lib/CMakeLists.txt
+++ b/gnuradio-runtime/lib/CMakeLists.txt
@@ -51,6 +51,7 @@ include_directories(${GNURADIO_RUNTIME_INCLUDE_DIRS}
${CMAKE_CURRENT_BINARY_DIR}/../include/
${VOLK_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
+ ${MPLIB_INCLUDE_DIRS}
)
if(ENABLE_CTRLPORT_THRIFT)
@@ -137,6 +138,7 @@ list(APPEND gnuradio_runtime_libs
${VOLK_LIBRARIES}
${Boost_LIBRARIES}
${LOG4CPP_LIBRARIES}
+ ${MPLIB_LIBRARIES}
)
#Add libraries for winsock2.h on Windows
diff --git a/gnuradio-runtime/lib/block.cc b/gnuradio-runtime/lib/block.cc
index 86c4aa701f..7d364de32d 100644
--- a/gnuradio-runtime/lib/block.cc
+++ b/gnuradio-runtime/lib/block.cc
@@ -43,6 +43,7 @@ namespace gr {
d_unaligned(0),
d_is_unaligned(false),
d_relative_rate (1.0),
+ d_mp_relative_rate(1.0),
d_history(1),
d_attr_delay(0),
d_fixed_rate(false),
@@ -172,10 +173,36 @@ namespace gr {
void
block::set_relative_rate(double relative_rate)
{
- if(relative_rate < 0.0)
- throw std::invalid_argument("block::set_relative_rate");
+ if(relative_rate <= 0.0)
+ throw std::invalid_argument("block::set_relative_rate: relative rate must be > 0.0");
d_relative_rate = relative_rate;
+ d_mp_relative_rate = mpq_class(relative_rate);
+ }
+
+ void
+ block::set_inverse_relative_rate(double inverse_relative_rate)
+ {
+ if(inverse_relative_rate <= 0.0)
+ throw std::invalid_argument("block::set_inverse_relative_rate: inverse relative rate must be > 0.0");
+
+ mpq_class inv_rr_q(inverse_relative_rate);
+ set_relative_rate((uint64_t) inv_rr_q.get_den().get_ui(),
+ (uint64_t) inv_rr_q.get_num().get_ui());
+ }
+
+ void
+ block::set_relative_rate(uint64_t interpolation, uint64_t decimation)
+ {
+ if (interpolation < 1)
+ throw std::invalid_argument("block::set_relative_rate: interpolation rate cannot be 0");
+
+ if (decimation < 1)
+ throw std::invalid_argument("block::set_relative_rate: decimation rate cannot be 0");
+
+ d_mp_relative_rate = mpq_class(interpolation, decimation);
+ d_mp_relative_rate.canonicalize();
+ d_relative_rate = d_mp_relative_rate.get_d();
}
void
diff --git a/gnuradio-runtime/lib/block_executor.cc b/gnuradio-runtime/lib/block_executor.cc
index 754744449a..6152ff6765 100644
--- a/gnuradio-runtime/lib/block_executor.cc
+++ b/gnuradio-runtime/lib/block_executor.cc
@@ -94,8 +94,11 @@ namespace gr {
static bool
propagate_tags(block::tag_propagation_policy_t policy, block_detail *d,
const std::vector<uint64_t> &start_nitems_read, double rrate,
+ mpq_class &mp_rrate, bool use_fp_rrate,
std::vector<tag_t> &rtags, long block_id)
{
+ static const mpq_class one_half(1, 2);
+
// Move tags downstream
// if a sink, we don't need to move downstream
if(d->sink_p()) {
@@ -131,7 +134,7 @@ namespace gr {
out_buf[o]->add_item_tag(*t);
}
}
- else {
+ else if(use_fp_rrate) {
for(t = rtags.begin(); t != rtags.end(); t++) {
tag_t new_tag = *t;
new_tag.offset = ((double)new_tag.offset * rrate) + 0.5;
@@ -139,6 +142,16 @@ namespace gr {
out_buf[o]->add_item_tag(new_tag);
}
}
+ else {
+ mpz_class offset;
+ for(t = rtags.begin(); t != rtags.end(); t++) {
+ tag_t new_tag = *t;
+ offset = new_tag.offset * mp_rrate + one_half;
+ new_tag.offset = offset.get_ui();
+ for(int o = 0; o < d->noutputs(); o++)
+ out_buf[o]->add_item_tag(new_tag);
+ }
+ }
}
}
break;
@@ -159,10 +172,26 @@ namespace gr {
out_buf = d->output(i);
std::vector<tag_t>::iterator t;
- for(t = rtags.begin(); t != rtags.end(); t++) {
- tag_t new_tag = *t;
- new_tag.offset = ((double)new_tag.offset * rrate) + 0.5;
- out_buf->add_item_tag(new_tag);
+ if(rrate == 1.0) {
+ for(t = rtags.begin(); t != rtags.end(); t++) {
+ out_buf->add_item_tag(*t);
+ }
+ }
+ else if(use_fp_rrate) {
+ for(t = rtags.begin(); t != rtags.end(); t++) {
+ tag_t new_tag = *t;
+ new_tag.offset = ((double)new_tag.offset * rrate) + 0.5;
+ out_buf->add_item_tag(new_tag);
+ }
+ }
+ else {
+ mpz_class offset;
+ for(t = rtags.begin(); t != rtags.end(); t++) {
+ tag_t new_tag = *t;
+ offset = new_tag.offset * mp_rrate + one_half;
+ new_tag.offset = offset.get_ui();
+ out_buf->add_item_tag(new_tag);
+ }
}
}
}
@@ -212,7 +241,6 @@ namespace gr {
int max_noutput_items;
int new_alignment = 0;
int alignment_state = -1;
- double rrate;
block *m = d_block.get();
block_detail *d = m->detail().get();
@@ -321,10 +349,8 @@ namespace gr {
noutput_items = min_available_space(d, m->output_multiple(), m->min_noutput_items());
if(ENABLE_LOGGING) {
*d_log << " regular ";
- if(m->relative_rate() >= 1.0)
- *d_log << "1:" << m->relative_rate() << std::endl;
- else
- *d_log << 1.0/m->relative_rate() << ":1\n";
+ *d_log << m->relative_rate_i() << ":"
+ << m->relative_rate_d() << std::endl;
*d_log << " max_items_avail = " << max_items_avail << std::endl;
*d_log << " noutput_items = " << noutput_items << std::endl;
}
@@ -490,6 +516,7 @@ namespace gr {
// Now propagate the tags based on the new relative rate
if(!propagate_tags(m->tag_propagation_policy(), d,
d_start_nitems_read, m->relative_rate(),
+ m->mp_relative_rate(), m->update_rate(),
d_returned_tags, m->unique_id()))
goto were_done;
@@ -505,9 +532,10 @@ namespace gr {
// In the block constructor, use enable_update_rate(true).
if(m->update_rate()) {
//rrate = ((double)(m->nitems_written(0))) / ((double)m->nitems_read(0));
- rrate = (double)n / (double)d->consumed();
- if(rrate > 0)
- m->set_relative_rate(rrate);
+ //if(rrate > 0.0)
+ // m->set_relative_rate(rrate);
+ if((n > 0) && (d->consumed() > 0))
+ m->set_relative_rate((uint64_t)n, (uint64_t)d->consumed());
}
if(d->d_produce_or > 0) // block produced something
diff --git a/gnuradio-runtime/lib/single_threaded_scheduler.cc b/gnuradio-runtime/lib/single_threaded_scheduler.cc
deleted file mode 100644
index a85f390a30..0000000000
--- a/gnuradio-runtime/lib/single_threaded_scheduler.cc
+++ /dev/null
@@ -1,366 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2004 Free Software Foundation, Inc.
- *
- * This file is part of GNU Radio
- *
- * GNU Radio is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 3, or (at your option)
- * any later version.
- *
- * GNU Radio is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with GNU Radio; see the file COPYING. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street,
- * Boston, MA 02110-1301, USA.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "single_threaded_scheduler.h"
-#include <gnuradio/block.h>
-#include <gnuradio/block_detail.h>
-#include <gnuradio/buffer.h>
-#include <boost/thread.hpp>
-#include <boost/format.hpp>
-#include <iostream>
-#include <limits>
-#include <assert.h>
-#include <stdio.h>
-
-namespace gr {
-
- // must be defined to either 0 or 1
-#define ENABLE_LOGGING 0
-
-#if (ENABLE_LOGGING)
-#define LOG(x) do { x; } while(0)
-#else
-#define LOG(x) do {;} while(0)
-#endif
-
- static int which_scheduler = 0;
-
- single_threaded_scheduler_sptr
- make_single_threaded_scheduler(const std::vector<block_sptr> &blocks)
- {
- return single_threaded_scheduler_sptr
- (new single_threaded_scheduler(blocks));
- }
-
- single_threaded_scheduler::single_threaded_scheduler(const std::vector<block_sptr> &blocks)
- : d_blocks(blocks), d_enabled(true), d_log(0)
- {
- if(ENABLE_LOGGING) {
- std::string name = str(boost::format("sst-%d.log") % which_scheduler++);
- d_log = new std::ofstream(name.c_str());
- *d_log << "single_threaded_scheduler: "
- << d_blocks.size ()
- << " blocks\n";
- }
- }
-
- single_threaded_scheduler::~single_threaded_scheduler()
- {
- if(ENABLE_LOGGING)
- delete d_log;
- }
-
- void
- single_threaded_scheduler::run()
- {
- // d_enabled = true; // KLUDGE
- main_loop ();
- }
-
- void
- single_threaded_scheduler::stop()
- {
- if(0)
- std::cout << "gr_singled_threaded_scheduler::stop() "
- << this << std::endl;
- d_enabled = false;
- }
-
- inline static unsigned int
- round_up(unsigned int n, unsigned int multiple)
- {
- return ((n + multiple - 1) / multiple) * multiple;
- }
-
- inline static unsigned int
- round_down(unsigned int n, unsigned int multiple)
- {
- return (n / multiple) * multiple;
- }
-
- //
- // Return minimum available write space in all our downstream
- // buffers or -1 if we're output blocked and the output we're
- // blocked on is done.
- //
- static int
- min_available_space(block_detail *d, int output_multiple)
- {
- int min_space = std::numeric_limits<int>::max();
-
- for(int i = 0; i < d->noutputs (); i++) {
- buffer_sptr out_buf = d->output(i);
- int n = round_down (out_buf->space_available (), output_multiple);
- if(n == 0) { // We're blocked on output.
- if(out_buf->done()) { // Downstream is done, therefore we're done.
- return -1;
- }
- return 0;
- }
- min_space = std::min (min_space, n);
- }
- return min_space;
- }
-
- void
- single_threaded_scheduler::main_loop()
- {
- static const int DEFAULT_CAPACITY = 16;
-
- int noutput_items;
- gr_vector_int ninput_items_required(DEFAULT_CAPACITY);
- gr_vector_int ninput_items(DEFAULT_CAPACITY);
- gr_vector_const_void_star input_items(DEFAULT_CAPACITY);
- gr_vector_void_star output_items(DEFAULT_CAPACITY);
- unsigned int bi;
- unsigned int nalive;
- int max_items_avail;
- bool made_progress_last_pass;
- bool making_progress;
-
- for(unsigned i = 0; i < d_blocks.size (); i++)
- d_blocks[i]->detail()->set_done (false); // reset any done flags
-
- for(unsigned i = 0; i < d_blocks.size (); i++) // enable any drivers, etc.
- d_blocks[i]->start();
-
- bi = 0;
- made_progress_last_pass = true;
- making_progress = false;
-
- // Loop while there are still blocks alive
-
- nalive = d_blocks.size ();
- while(d_enabled && nalive > 0) {
- if(boost::this_thread::interruption_requested())
- break;
-
- block *m = d_blocks[bi].get ();
- block_detail *d = m->detail().get ();
-
- LOG(*d_log << std::endl << m);
-
- if(d->done ())
- goto next_block;
-
- if(d->source_p ()) {
- // Invoke sources as a last resort. As long as the previous
- // pass made progress, don't call a source.
- if(made_progress_last_pass) {
- LOG(*d_log << " Skipping source\n");
- goto next_block;
- }
-
- ninput_items_required.resize (0);
- ninput_items.resize (0);
- input_items.resize (0);
- output_items.resize (d->noutputs ());
-
- // determine the minimum available output space
- noutput_items = min_available_space (d, m->output_multiple ());
- LOG(*d_log << " source\n noutput_items = " << noutput_items << std::endl);
- if(noutput_items == -1) // we're done
- goto were_done;
-
- if(noutput_items == 0) { // we're output blocked
- LOG(*d_log << " BLKD_OUT\n");
- goto next_block;
- }
-
- goto setup_call_to_work; // jump to common code
- }
-
- else if(d->sink_p ()) {
- ninput_items_required.resize (d->ninputs ());
- ninput_items.resize (d->ninputs ());
- input_items.resize (d->ninputs ());
- output_items.resize (0);
- LOG(*d_log << " sink\n");
-
- max_items_avail = 0;
- for(int i = 0; i < d->ninputs (); i++) {
- buffer_reader_sptr in_buf = d->input(i);
- ninput_items[i] = in_buf->items_available();
- //if (ninput_items[i] == 0 && in_buf->done())
- if(ninput_items[i] < m->output_multiple() && in_buf->done())
- goto were_done;
-
- max_items_avail = std::max (max_items_avail, ninput_items[i]);
- }
-
- // take a swag at how much output we can sink
- noutput_items = (int) (max_items_avail * m->relative_rate ());
- noutput_items = round_down (noutput_items, m->output_multiple ());
- LOG(*d_log << " max_items_avail = " << max_items_avail << std::endl);
- LOG(*d_log << " noutput_items = " << noutput_items << std::endl);
-
- if(noutput_items == 0) { // we're blocked on input
- LOG(*d_log << " BLKD_IN\n");
- goto next_block;
- }
-
- goto try_again; // Jump to code shared with regular case.
- }
-
- else {
- // do the regular thing
- ninput_items_required.resize(d->ninputs ());
- ninput_items.resize(d->ninputs ());
- input_items.resize(d->ninputs ());
- output_items.resize(d->noutputs ());
-
- max_items_avail = 0;
- for(int i = 0; i < d->ninputs (); i++) {
- ninput_items[i] = d->input(i)->items_available ();
- max_items_avail = std::max(max_items_avail, ninput_items[i]);
- }
-
- // determine the minimum available output space
- noutput_items = min_available_space(d, m->output_multiple ());
- if(ENABLE_LOGGING){
- *d_log << " regular ";
- if(m->relative_rate() >= 1.0)
- *d_log << "1:" << m->relative_rate() << std::endl;
- else
- *d_log << 1.0/m->relative_rate() << ":1\n";
- *d_log << " max_items_avail = " << max_items_avail << std::endl;
- *d_log << " noutput_items = " << noutput_items << std::endl;
- }
- if(noutput_items == -1) // we're done
- goto were_done;
-
- if(noutput_items == 0) { // we're output blocked
- LOG(*d_log << " BLKD_OUT\n");
- goto next_block;
- }
-
-#if 0
- // Compute best estimate of noutput_items that we can really use.
- noutput_items =
- std::min((unsigned)noutput_items,
- std::max((unsigned)m->output_multiple(),
- round_up((unsigned)(max_items_avail * m->relative_rate()),
- m->output_multiple())));
-
- LOG(*d_log << " revised noutput_items = " << noutput_items << std::endl);
-#endif
-
- try_again:
- if(m->fixed_rate()) {
- // try to work it forward starting with max_items_avail.
- // We want to try to consume all the input we've got.
- int reqd_noutput_items = m->fixed_rate_ninput_to_noutput(max_items_avail);
- reqd_noutput_items = round_up(reqd_noutput_items, m->output_multiple());
- if(reqd_noutput_items > 0 && reqd_noutput_items <= noutput_items)
- noutput_items = reqd_noutput_items;
- }
-
- // ask the block how much input they need to produce noutput_items
- m->forecast(noutput_items, ninput_items_required);
-
- // See if we've got sufficient input available
- int i;
- for(i = 0; i < d->ninputs (); i++)
- if(ninput_items_required[i] > ninput_items[i]) // not enough
- break;
-
- if(i < d->ninputs()) { // not enough input on input[i]
- // if we can, try reducing the size of our output request
- if(noutput_items > m->output_multiple ()){
- noutput_items /= 2;
- noutput_items = round_up (noutput_items, m->output_multiple ());
- goto try_again;
- }
-
- // We're blocked on input
- buffer_reader_sptr in_buf = d->input(i);
- LOG(*d_log << " BLKD_IN\n");
- if(in_buf->done()) // If the upstream block is done, we're done
- goto were_done;
-
- // Is it possible to ever fulfill this request?
- if(ninput_items_required[i] > in_buf->max_possible_items_available ()) {
- // Nope, never going to happen...
- std::cerr << "\nsched: <block " << m->name()
- << " (" << m->unique_id() << ")>"
- << " is requesting more input data\n"
- << " than we can provide.\n"
- << " ninput_items_required = "
- << ninput_items_required[i] << "\n"
- << " max_possible_items_available = "
- << in_buf->max_possible_items_available() << "\n"
- << " If this is a filter, consider reducing the number of taps.\n";
- goto were_done;
- }
-
- goto next_block;
- }
-
- // We've got enough data on each input to produce noutput_items.
- // Finish setting up the call to work.
- for(int i = 0; i < d->ninputs (); i++)
- input_items[i] = d->input(i)->read_pointer();
-
- setup_call_to_work:
-
- for(int i = 0; i < d->noutputs (); i++)
- output_items[i] = d->output(i)->write_pointer();
-
- // Do the actual work of the block
- int n = m->general_work(noutput_items, ninput_items,
- input_items, output_items);
- LOG(*d_log << " general_work: noutput_items = " << noutput_items
- << " result = " << n << std::endl);
-
- if(n == -1) // block is done
- goto were_done;
-
- d->produce_each(n); // advance write pointers
- if(n > 0)
- making_progress = true;
-
- goto next_block;
- }
- assert(0);
-
- were_done:
- LOG(*d_log << " were_done\n");
- d->set_done (true);
- nalive--;
-
- next_block:
- if(++bi >= d_blocks.size ()) {
- bi = 0;
- made_progress_last_pass = making_progress;
- making_progress = false;
- }
- }
-
- for(unsigned i = 0; i < d_blocks.size(); i++) // disable any drivers, etc.
- d_blocks[i]->stop();
- }
-
-} /* namespace gr */
diff --git a/gnuradio-runtime/swig/block.i b/gnuradio-runtime/swig/block.i
index 6b364a417a..96205296ef 100644
--- a/gnuradio-runtime/swig/block.i
+++ b/gnuradio-runtime/swig/block.i
@@ -51,6 +51,8 @@ class gr::block : public gr::basic_block
void set_output_multiple(int multiple);
int output_multiple () const;
double relative_rate () const;
+ uint64_t relative_rate_i () const;
+ uint64_t relative_rate_d () const;
bool start();
bool stop();
diff --git a/gr-blocks/lib/annotator_1to1_impl.cc b/gr-blocks/lib/annotator_1to1_impl.cc
index 04f9a2f458..a7d8ce9d3d 100644
--- a/gr-blocks/lib/annotator_1to1_impl.cc
+++ b/gr-blocks/lib/annotator_1to1_impl.cc
@@ -49,7 +49,7 @@ namespace gr {
set_tag_propagation_policy(TPP_ONE_TO_ONE);
d_tag_counter = 0;
- set_relative_rate(1.0);
+ set_relative_rate(1, 1);
}
annotator_1to1_impl::~annotator_1to1_impl()
diff --git a/gr-blocks/lib/annotator_raw_impl.cc b/gr-blocks/lib/annotator_raw_impl.cc
index ea763c7658..ce15103822 100644
--- a/gr-blocks/lib/annotator_raw_impl.cc
+++ b/gr-blocks/lib/annotator_raw_impl.cc
@@ -50,7 +50,7 @@ namespace gr {
d_itemsize(sizeof_stream_item)
{
set_tag_propagation_policy(TPP_ONE_TO_ONE);
- set_relative_rate(1.0);
+ set_relative_rate(1, 1);
}
annotator_raw_impl::~annotator_raw_impl()
diff --git a/gr-blocks/lib/deinterleave_impl.cc b/gr-blocks/lib/deinterleave_impl.cc
index 9e18c35e58..d7fdbb8f8f 100644
--- a/gr-blocks/lib/deinterleave_impl.cc
+++ b/gr-blocks/lib/deinterleave_impl.cc
@@ -54,7 +54,7 @@ namespace gr {
bool
deinterleave_impl::check_topology(int ninputs, int noutputs)
{
- set_relative_rate(1.0/(double)noutputs);
+ set_relative_rate(1, (uint64_t)noutputs);
d_noutputs = noutputs;
return true;
}
diff --git a/gr-blocks/lib/interleave_impl.cc b/gr-blocks/lib/interleave_impl.cc
index 3e5a8295bd..65a5cb69b7 100644
--- a/gr-blocks/lib/interleave_impl.cc
+++ b/gr-blocks/lib/interleave_impl.cc
@@ -48,7 +48,7 @@ namespace gr {
bool
interleave_impl::check_topology(int ninputs, int noutputs)
{
- set_relative_rate((double)ninputs);
+ set_relative_rate((uint64_t)ninputs, 1);
d_ninputs = ninputs;
set_output_multiple(d_blocksize * d_ninputs);
return true;
diff --git a/gr-blocks/lib/keep_m_in_n_impl.cc b/gr-blocks/lib/keep_m_in_n_impl.cc
index a466761c0b..4784d3c1a2 100644
--- a/gr-blocks/lib/keep_m_in_n_impl.cc
+++ b/gr-blocks/lib/keep_m_in_n_impl.cc
@@ -66,7 +66,7 @@ namespace gr {
}
set_output_multiple(m);
- set_relative_rate(static_cast<double>(d_m)/static_cast<double>(d_n));
+ set_relative_rate(static_cast<uint64_t>(d_m), static_cast<uint64_t>(d_n));
}
void
@@ -80,14 +80,14 @@ namespace gr {
{
d_m = m;
set_output_multiple(m);
- set_relative_rate(static_cast<double>(d_m)/static_cast<double>(d_n));
+ set_relative_rate(static_cast<uint64_t>(d_m), static_cast<uint64_t>(d_n));
}
void
keep_m_in_n_impl::set_n(int n)
{
d_n = n;
- set_relative_rate(static_cast<double>(d_m)/static_cast<double>(d_n));
+ set_relative_rate(static_cast<uint64_t>(d_m), static_cast<uint64_t>(d_n));
}
void
diff --git a/gr-blocks/lib/packed_to_unpacked_XX_impl.cc.t b/gr-blocks/lib/packed_to_unpacked_XX_impl.cc.t
index de96135ce8..9478ce25c0 100644
--- a/gr-blocks/lib/packed_to_unpacked_XX_impl.cc.t
+++ b/gr-blocks/lib/packed_to_unpacked_XX_impl.cc.t
@@ -55,7 +55,7 @@ namespace gr {
assert(bits_per_chunk <= BITS_PER_TYPE);
assert(bits_per_chunk > 0);
- set_relative_rate((1.0 * BITS_PER_TYPE) / bits_per_chunk);
+ set_relative_rate((uint64_t)BITS_PER_TYPE, (uint64_t)bits_per_chunk);
}
@NAME_IMPL@::~@NAME_IMPL@()
diff --git a/gr-blocks/lib/repack_bits_bb_impl.cc b/gr-blocks/lib/repack_bits_bb_impl.cc
index c20c99786a..a8185a95dc 100644
--- a/gr-blocks/lib/repack_bits_bb_impl.cc
+++ b/gr-blocks/lib/repack_bits_bb_impl.cc
@@ -55,7 +55,7 @@ namespace gr {
throw std::invalid_argument("k and l must be in [1, 8]");
}
- set_relative_rate((double) d_k / d_l);
+ set_relative_rate((uint64_t) d_k, (uint64_t) d_l);
}
void
@@ -64,7 +64,7 @@ namespace gr {
gr::thread::scoped_lock guard(d_setlock);
d_k = k;
d_l = l;
- set_relative_rate((double) d_k / d_l);
+ set_relative_rate((uint64_t) d_k, (uint64_t) d_l);
}
repack_bits_bb_impl::~repack_bits_bb_impl()
diff --git a/gr-blocks/lib/tagged_stream_multiply_length_impl.cc b/gr-blocks/lib/tagged_stream_multiply_length_impl.cc
index e9699d28f5..266b967e69 100644
--- a/gr-blocks/lib/tagged_stream_multiply_length_impl.cc
+++ b/gr-blocks/lib/tagged_stream_multiply_length_impl.cc
@@ -45,7 +45,7 @@ namespace gr {
d_itemsize(itemsize)
{
set_tag_propagation_policy(TPP_DONT);
- set_relative_rate(1);
+ set_relative_rate(1, 1);
message_port_register_in(pmt::intern("set_scalar"));
set_msg_handler(pmt::intern("set_scalar"),
boost::bind(&tagged_stream_multiply_length_impl::set_scalar_pmt, this, _1));
diff --git a/gr-blocks/lib/tagged_stream_mux_impl.cc b/gr-blocks/lib/tagged_stream_mux_impl.cc
index ac2d1c2203..90587639ce 100644
--- a/gr-blocks/lib/tagged_stream_mux_impl.cc
+++ b/gr-blocks/lib/tagged_stream_mux_impl.cc
@@ -74,7 +74,7 @@ namespace gr {
unsigned char *out = (unsigned char *) output_items[0];
int n_produced = 0;
- set_relative_rate(ninput_items.size());
+ set_relative_rate((uint64_t)ninput_items.size(), 1);
for (unsigned int i = 0; i < input_items.size(); i++) {
const unsigned char *in = (const unsigned char *) input_items[i];
diff --git a/gr-blocks/lib/test_tag_variable_rate_ff_impl.cc b/gr-blocks/lib/test_tag_variable_rate_ff_impl.cc
index cca86ad832..cc9e1eeab9 100644
--- a/gr-blocks/lib/test_tag_variable_rate_ff_impl.cc
+++ b/gr-blocks/lib/test_tag_variable_rate_ff_impl.cc
@@ -52,7 +52,7 @@ namespace gr {
d_update_once(update_once), d_update_step(update_step)
{
set_tag_propagation_policy(TPP_DONT);
- set_relative_rate(0.5);
+ set_relative_rate(1, 2);
d_accum = 0;
d_rrate = 0.5;
d_old_in = 0;
diff --git a/gr-blocks/lib/unpacked_to_packed_XX_impl.cc.t b/gr-blocks/lib/unpacked_to_packed_XX_impl.cc.t
index 8e06570740..c4e385deea 100644
--- a/gr-blocks/lib/unpacked_to_packed_XX_impl.cc.t
+++ b/gr-blocks/lib/unpacked_to_packed_XX_impl.cc.t
@@ -53,7 +53,7 @@ namespace gr {
assert(bits_per_chunk <= BITS_PER_TYPE);
assert(bits_per_chunk > 0);
- set_relative_rate(bits_per_chunk/(1.0 * BITS_PER_TYPE));
+ set_relative_rate((uint64_t)bits_per_chunk, (uint64_t)BITS_PER_TYPE);
}
@NAME_IMPL@::~@NAME_IMPL@()
diff --git a/gr-channels/lib/sro_model_impl.cc b/gr-channels/lib/sro_model_impl.cc
index 116d8e38d2..b8eb7fb195 100644
--- a/gr-channels/lib/sro_model_impl.cc
+++ b/gr-channels/lib/sro_model_impl.cc
@@ -56,8 +56,8 @@ namespace gr {
d_noise(gr::analog::fastnoise_source_f::make(analog::GR_GAUSSIAN, std_dev_hz, noise_seed)),
d_noise_seed(noise_seed)
{
- //set_relative_rate(1.0 / interp_ratio);
- set_relative_rate(1.0);
+ //set_inverse_relative_rate(interp_ratio);
+ set_relative_rate(1, 1);
}
sro_model_impl::~sro_model_impl()
diff --git a/gr-digital/lib/burst_shaper_XX_impl.cc.t b/gr-digital/lib/burst_shaper_XX_impl.cc.t
index 0a60696b8e..45629d543c 100644
--- a/gr-digital/lib/burst_shaper_XX_impl.cc.t
+++ b/gr-digital/lib/burst_shaper_XX_impl.cc.t
@@ -84,7 +84,7 @@ namespace gr {
d_down_phasing[i] = symbol * d_down_ramp[i];
}
- //set_relative_rate(1.0);
+ //set_relative_rate(1, 1);
set_tag_propagation_policy(TPP_DONT);
}
diff --git a/gr-digital/lib/clock_recovery_mm_cc_impl.cc b/gr-digital/lib/clock_recovery_mm_cc_impl.cc
index fd05f24168..d3609763a4 100644
--- a/gr-digital/lib/clock_recovery_mm_cc_impl.cc
+++ b/gr-digital/lib/clock_recovery_mm_cc_impl.cc
@@ -66,7 +66,7 @@ namespace gr {
throw std::out_of_range("Gains must be non-negative");
set_omega(omega); // also sets min and max omega
- set_relative_rate(1.0 / omega);
+ set_inverse_relative_rate(omega);
set_history(3); // ensure 2 extra input samples are available
enable_update_rate(true); // fixes tag propagation through variable rate block
}
diff --git a/gr-digital/lib/clock_recovery_mm_ff_impl.cc b/gr-digital/lib/clock_recovery_mm_ff_impl.cc
index 57578bca28..4a17f94b64 100644
--- a/gr-digital/lib/clock_recovery_mm_ff_impl.cc
+++ b/gr-digital/lib/clock_recovery_mm_ff_impl.cc
@@ -59,7 +59,7 @@ namespace gr {
throw std::out_of_range("Gains must be non-negative");
set_omega(omega); // also sets min and max omega
- set_relative_rate (1.0 / omega);
+ set_inverse_relative_rate (omega);
enable_update_rate(true); // fixes tag propagation through variable rate block
}
diff --git a/gr-digital/lib/constellation_decoder_cb_impl.cc b/gr-digital/lib/constellation_decoder_cb_impl.cc
index e8075d2225..fed6a30a27 100644
--- a/gr-digital/lib/constellation_decoder_cb_impl.cc
+++ b/gr-digital/lib/constellation_decoder_cb_impl.cc
@@ -45,7 +45,7 @@ namespace gr {
d_constellation(constellation),
d_dim(constellation->dimensionality())
{
- set_relative_rate(1.0 / ((double)d_dim));
+ set_relative_rate(1, (uint64_t)d_dim);
}
constellation_decoder_cb_impl::~constellation_decoder_cb_impl()
diff --git a/gr-digital/lib/header_payload_demux_impl.cc b/gr-digital/lib/header_payload_demux_impl.cc
index c6ec53ba35..6fa54d329f 100644
--- a/gr-digital/lib/header_payload_demux_impl.cc
+++ b/gr-digital/lib/header_payload_demux_impl.cc
@@ -142,9 +142,10 @@ namespace gr {
throw std::invalid_argument("Items and symbol sizes must be at least 1.");
}
if (d_output_symbols) {
- set_relative_rate(1.0 / (d_items_per_symbol + d_gi));
+ set_relative_rate(1, (uint64_t)(d_items_per_symbol + d_gi));
} else {
- set_relative_rate((double)d_items_per_symbol / (d_items_per_symbol + d_gi));
+ set_relative_rate((uint64_t)d_items_per_symbol,
+ (uint64_t)(d_items_per_symbol + d_gi));
set_output_multiple(d_items_per_symbol);
}
if ((d_output_symbols || d_gi) && d_header_padding_items) {
diff --git a/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc b/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc
index 7df2caeb3b..d55790a5a3 100644
--- a/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc
+++ b/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc
@@ -125,7 +125,8 @@ namespace gr {
d_symbols_per_set += d_occupied_carriers[i].size();
}
set_tag_propagation_policy(TPP_DONT);
- set_relative_rate((double) d_symbols_per_set / d_occupied_carriers.size());
+ set_relative_rate((uint64_t) d_symbols_per_set,
+ (uint64_t) d_occupied_carriers.size());
}
ofdm_carrier_allocator_cvc_impl::~ofdm_carrier_allocator_cvc_impl()
diff --git a/gr-digital/lib/ofdm_chanest_vcvc_impl.cc b/gr-digital/lib/ofdm_chanest_vcvc_impl.cc
index f27107f2db..70d49cab46 100644
--- a/gr-digital/lib/ofdm_chanest_vcvc_impl.cc
+++ b/gr-digital/lib/ofdm_chanest_vcvc_impl.cc
@@ -128,7 +128,8 @@ namespace gr {
}
set_output_multiple(d_n_data_syms);
- set_relative_rate((double) d_n_data_syms / (d_n_data_syms + d_n_sync_syms));
+ set_relative_rate((uint64_t) d_n_data_syms,
+ (uint64_t) (d_n_data_syms + d_n_sync_syms));
set_tag_propagation_policy(TPP_DONT);
}
diff --git a/gr-digital/lib/ofdm_cyclic_prefixer_impl.cc b/gr-digital/lib/ofdm_cyclic_prefixer_impl.cc
index 9db7273e26..0ab2d2b951 100644
--- a/gr-digital/lib/ofdm_cyclic_prefixer_impl.cc
+++ b/gr-digital/lib/ofdm_cyclic_prefixer_impl.cc
@@ -50,7 +50,7 @@ namespace gr {
d_down_flank((rolloff_len ? rolloff_len-1 : 0), 0),
d_delay_line(0, 0)
{
- set_relative_rate(d_output_size);
+ set_relative_rate((uint64_t)d_output_size, 1);
// Flank of length 1 would just be rectangular
if (d_rolloff_len == 1) {
diff --git a/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc b/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc
index 1b0dee4055..0412ef77fe 100644
--- a/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc
+++ b/gr-digital/lib/ofdm_frame_equalizer_vcvc_impl.cc
@@ -77,7 +77,7 @@ namespace gr {
if (d_fixed_frame_len) {
set_output_multiple(d_fixed_frame_len);
}
- set_relative_rate(1.0);
+ set_relative_rate(1, 1);
// Really, we have TPP_ONE_TO_ONE, but the channel state is not propagated
set_tag_propagation_policy(TPP_DONT);
}
diff --git a/gr-digital/lib/ofdm_sampler_impl.cc b/gr-digital/lib/ofdm_sampler_impl.cc
index 01fa24d9a9..d0c664cb2f 100644
--- a/gr-digital/lib/ofdm_sampler_impl.cc
+++ b/gr-digital/lib/ofdm_sampler_impl.cc
@@ -52,7 +52,7 @@ namespace gr {
{
GR_LOG_WARN(d_logger, "The gr::digital::ofdm_sampler block has been deprecated.");
- set_relative_rate(1.0/(double) fft_length); // buffer allocator hint
+ set_relative_rate(1, (uint64_t)fft_length); // buffer allocator hint
}
ofdm_sampler_impl::~ofdm_sampler_impl()
diff --git a/gr-digital/lib/ofdm_serializer_vcc_impl.cc b/gr-digital/lib/ofdm_serializer_vcc_impl.cc
index 1398dcd2a1..fa31e97efd 100644
--- a/gr-digital/lib/ofdm_serializer_vcc_impl.cc
+++ b/gr-digital/lib/ofdm_serializer_vcc_impl.cc
@@ -115,7 +115,8 @@ namespace gr {
for (unsigned i = 0; i < d_occupied_carriers.size(); i++) {
d_symbols_per_set += d_occupied_carriers[i].size();
}
- set_relative_rate((double) d_symbols_per_set / d_occupied_carriers.size());
+ set_relative_rate((uint64_t) d_symbols_per_set,
+ (uint64_t) d_occupied_carriers.size());
set_tag_propagation_policy(TPP_DONT);
}
diff --git a/gr-digital/lib/packet_headergenerator_bb_impl.cc b/gr-digital/lib/packet_headergenerator_bb_impl.cc
index 3dd2e0469b..a06227e8e2 100644
--- a/gr-digital/lib/packet_headergenerator_bb_impl.cc
+++ b/gr-digital/lib/packet_headergenerator_bb_impl.cc
@@ -65,7 +65,7 @@ namespace gr {
{
set_output_multiple(d_formatter->header_len());
// This is the worst case rate, because we don't know the true value, of course
- set_relative_rate(d_formatter->header_len());
+ set_relative_rate((uint64_t)d_formatter->header_len(), 1);
set_tag_propagation_policy(TPP_DONT);
}
diff --git a/gr-digital/lib/pfb_clock_sync_ccf_impl.cc b/gr-digital/lib/pfb_clock_sync_ccf_impl.cc
index 6ac39fbcfc..14f9701353 100644
--- a/gr-digital/lib/pfb_clock_sync_ccf_impl.cc
+++ b/gr-digital/lib/pfb_clock_sync_ccf_impl.cc
@@ -113,7 +113,7 @@ namespace gr {
d_new_in = 0;
d_last_out = 0;
- set_relative_rate((float)d_osps/(float)d_sps);
+ set_relative_rate((uint64_t)d_osps, (uint64_t)d_sps);
}
pfb_clock_sync_ccf_impl::~pfb_clock_sync_ccf_impl()
diff --git a/gr-digital/lib/pfb_clock_sync_fff_impl.cc b/gr-digital/lib/pfb_clock_sync_fff_impl.cc
index 30ef526ad0..6fcd392796 100644
--- a/gr-digital/lib/pfb_clock_sync_fff_impl.cc
+++ b/gr-digital/lib/pfb_clock_sync_fff_impl.cc
@@ -105,7 +105,7 @@ namespace gr {
set_taps(taps, d_taps, d_filters);
set_taps(dtaps, d_dtaps, d_diff_filters);
- set_relative_rate((float)d_osps/(float)d_sps);
+ set_relative_rate((uint64_t)d_osps, (uint64_t)d_sps);
}
pfb_clock_sync_fff_impl::~pfb_clock_sync_fff_impl()
diff --git a/gr-digital/lib/protocol_formatter_bb_impl.cc b/gr-digital/lib/protocol_formatter_bb_impl.cc
index fcf2f6609b..197914185f 100644
--- a/gr-digital/lib/protocol_formatter_bb_impl.cc
+++ b/gr-digital/lib/protocol_formatter_bb_impl.cc
@@ -51,7 +51,7 @@ namespace gr {
set_output_multiple(d_format->header_nbytes());
// This is the worst case rate, because we don't know the true value, of course
- set_relative_rate(d_format->header_nbytes());
+ set_relative_rate((uint64_t)d_format->header_nbytes(), 1);
set_tag_propagation_policy(TPP_DONT);
}
diff --git a/gr-dtv/lib/dvbt/dvbt_convolutional_deinterleaver_impl.cc b/gr-dtv/lib/dvbt/dvbt_convolutional_deinterleaver_impl.cc
index 0358ada1ff..c04b433f7f 100644
--- a/gr-dtv/lib/dvbt/dvbt_convolutional_deinterleaver_impl.cc
+++ b/gr-dtv/lib/dvbt/dvbt_convolutional_deinterleaver_impl.cc
@@ -48,7 +48,7 @@ namespace gr {
io_signature::make(1, 1, sizeof (unsigned char) * I * blocks)),
d_blocks(blocks), d_I(I), d_M(M)
{
- set_relative_rate(1.0 / d_I * d_blocks);
+ set_relative_rate(1, (uint64_t)(d_I * d_blocks));
set_output_multiple(2);
//The positions are shift registers (FIFOs)
//of length i*M
diff --git a/gr-dtv/lib/dvbt/dvbt_energy_descramble_impl.cc b/gr-dtv/lib/dvbt/dvbt_energy_descramble_impl.cc
index 6b47814f8c..1cb020eb0d 100644
--- a/gr-dtv/lib/dvbt/dvbt_energy_descramble_impl.cc
+++ b/gr-dtv/lib/dvbt/dvbt_energy_descramble_impl.cc
@@ -72,7 +72,7 @@ namespace gr {
io_signature::make(1, 1, sizeof (unsigned char))),
d_reg(0xa9), d_index(0), d_search(0)
{
- set_relative_rate((double) (d_nblocks * d_bsize));
+ set_relative_rate((uint64_t) (d_nblocks * d_bsize), 1);
// Set output multiple of (2 search + 1 data = 3) at least (4 for now)
set_output_multiple(4 * d_nblocks * d_bsize);
diff --git a/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc b/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc
index ff8042f2c8..d70ddf1f03 100644
--- a/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc
+++ b/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc
@@ -70,7 +70,7 @@ namespace gr {
d_nblocks(nblocks),
d_reg(0xa9)
{
- set_relative_rate(1.0/(double) (d_nblocks * d_npacks * d_psize));
+ set_relative_rate(1, (uint64_t) (d_nblocks * d_npacks * d_psize));
}
/*
diff --git a/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc b/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc
index e26c0eb8d9..cc740359e0 100644
--- a/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc
+++ b/gr-dtv/lib/dvbt/dvbt_inner_coder_impl.cc
@@ -162,7 +162,8 @@ namespace gr {
// Set relative rate out/in
assert((d_noutput * d_k * d_m) % (d_ninput * 8 * d_n) == 0);
- set_relative_rate((float)(d_ninput * 8 * d_n) / (float)d_noutput * d_k * d_m);
+ set_relative_rate((uint64_t)(d_ninput * 8 * d_n),
+ (uint64_t)(d_noutput * d_k * d_m));
// calculate in and out block sizes
d_in_bs = (d_k * d_m) / 2;
diff --git a/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc b/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc
index 1a347d3d8d..6ad4463ffd 100644
--- a/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc
+++ b/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc
@@ -240,7 +240,7 @@ namespace gr {
d_initial_acquisition(0), d_cp_start(0), \
d_to_consume(0), d_to_out(0), d_consumed(0), d_out(0)
{
- set_relative_rate(1.0 / (double) (d_cp_length + d_fft_length));
+ set_relative_rate(1, (uint64_t) (d_cp_length + d_fft_length));
d_snr = pow(10, d_snr / 10.0);
d_rho = d_snr / (d_snr + 1.0);
diff --git a/gr-fec/lib/decoder_impl.cc b/gr-fec/lib/decoder_impl.cc
index d570c4077a..bbb4f18772 100644
--- a/gr-fec/lib/decoder_impl.cc
+++ b/gr-fec/lib/decoder_impl.cc
@@ -49,7 +49,8 @@ namespace gr {
d_input_item_size(input_item_size), d_output_item_size(output_item_size)
{
set_fixed_rate(true);
- set_relative_rate((double)(my_decoder->get_output_size())/my_decoder->get_input_size());
+ set_relative_rate((uint64_t)my_decoder->get_output_size(),
+ (uint64_t)my_decoder->get_input_size());
//want to guarantee you have enough to run at least one time...
//remember! this is not a sync block... set_output_multiple does not
diff --git a/gr-fec/lib/depuncture_bb_impl.cc b/gr-fec/lib/depuncture_bb_impl.cc
index e388120bbf..22417e4f0f 100644
--- a/gr-fec/lib/depuncture_bb_impl.cc
+++ b/gr-fec/lib/depuncture_bb_impl.cc
@@ -74,7 +74,8 @@ namespace gr {
d_puncholes = count_mask - count_pat;
set_fixed_rate(true);
- set_relative_rate((double)d_puncsize/(d_puncsize - d_puncholes));
+ set_relative_rate((uint64_t)d_puncsize,
+ (uint64_t)(d_puncsize - d_puncholes));
set_output_multiple(d_puncsize);
//set_msg_handler(boost::bind(&depuncture_bb_impl::catch_msg, this, _1));
}
diff --git a/gr-fec/lib/encoder_impl.cc b/gr-fec/lib/encoder_impl.cc
index dfa1f48592..ec5a818485 100644
--- a/gr-fec/lib/encoder_impl.cc
+++ b/gr-fec/lib/encoder_impl.cc
@@ -51,7 +51,8 @@ namespace gr {
d_output_item_size(output_item_size)
{
set_fixed_rate(true);
- set_relative_rate((double)my_encoder->get_output_size()/(double)my_encoder->get_input_size());
+ set_relative_rate((uint64_t)my_encoder->get_output_size(),
+ (uint64_t)my_encoder->get_input_size());
set_output_multiple(my_encoder->get_output_size());
d_encoder = my_encoder;
diff --git a/gr-fec/lib/puncture_bb_impl.cc b/gr-fec/lib/puncture_bb_impl.cc
index 63633b2748..53808fb158 100644
--- a/gr-fec/lib/puncture_bb_impl.cc
+++ b/gr-fec/lib/puncture_bb_impl.cc
@@ -71,7 +71,8 @@ namespace gr {
d_puncholes = count_mask - count_pat;
set_fixed_rate(true);
- set_relative_rate((double)(d_puncsize - d_puncholes)/d_puncsize);
+ set_relative_rate((uint64_t)(d_puncsize - d_puncholes),
+ (uint64_t)d_puncsize);
set_output_multiple(d_puncsize - d_puncholes);
//set_msg_handler(boost::bind(&puncture_bb_impl::catch_msg, this, _1));
}
diff --git a/gr-fec/lib/puncture_ff_impl.cc b/gr-fec/lib/puncture_ff_impl.cc
index 9a7c8f6dc2..abc3da541a 100644
--- a/gr-fec/lib/puncture_ff_impl.cc
+++ b/gr-fec/lib/puncture_ff_impl.cc
@@ -71,7 +71,8 @@ namespace gr {
d_puncholes = count_mask - count_pat;
set_fixed_rate(true);
- set_relative_rate((double)(d_puncsize - d_puncholes)/d_puncsize);
+ set_relative_rate((uint64_t)(d_puncsize - d_puncholes),
+ (uint64_t)d_puncsize);
set_output_multiple(d_puncsize - d_puncholes);
//set_msg_handler(boost::bind(&puncture_ff_impl::catch_msg, this, _1));
}
diff --git a/gr-filter/lib/fractional_interpolator_cc_impl.cc b/gr-filter/lib/fractional_interpolator_cc_impl.cc
index 938c377cc8..2b7cc590bc 100644
--- a/gr-filter/lib/fractional_interpolator_cc_impl.cc
+++ b/gr-filter/lib/fractional_interpolator_cc_impl.cc
@@ -53,7 +53,7 @@ namespace gr {
if(phase_shift < 0 || phase_shift > 1)
throw std::out_of_range("phase shift ratio must be > 0 and < 1");
- set_relative_rate(1.0 / interp_ratio);
+ set_inverse_relative_rate(d_mu_inc);
}
fractional_interpolator_cc_impl::~fractional_interpolator_cc_impl()
@@ -85,7 +85,7 @@ namespace gr {
int oo = 0; // output index
while(oo < noutput_items) {
- out[oo++] = d_interp->interpolate(&in[ii], d_mu);
+ out[oo++] = d_interp->interpolate(&in[ii], (float)d_mu);
double s = d_mu + d_mu_inc;
double f = floor(s);
@@ -102,25 +102,25 @@ namespace gr {
float
fractional_interpolator_cc_impl::mu() const
{
- return d_mu;
+ return (float)d_mu;
}
float
fractional_interpolator_cc_impl::interp_ratio() const
{
- return d_mu_inc;
+ return (float)d_mu_inc;
}
void
fractional_interpolator_cc_impl::set_mu(float mu)
{
- d_mu = mu;
+ d_mu = (double)mu;
}
void
fractional_interpolator_cc_impl::set_interp_ratio(float interp_ratio)
{
- d_mu_inc = interp_ratio;
+ d_mu_inc = (double)interp_ratio;
}
} /* namespace filter */
diff --git a/gr-filter/lib/fractional_interpolator_cc_impl.h b/gr-filter/lib/fractional_interpolator_cc_impl.h
index 786bccfbaf..215d49448b 100644
--- a/gr-filter/lib/fractional_interpolator_cc_impl.h
+++ b/gr-filter/lib/fractional_interpolator_cc_impl.h
@@ -33,8 +33,8 @@ namespace gr {
: public fractional_interpolator_cc
{
private:
- float d_mu;
- float d_mu_inc;
+ double d_mu;
+ double d_mu_inc;
mmse_fir_interpolator_cc *d_interp;
public:
diff --git a/gr-filter/lib/fractional_interpolator_ff_impl.cc b/gr-filter/lib/fractional_interpolator_ff_impl.cc
index 60730aa6be..0d2c2b1082 100644
--- a/gr-filter/lib/fractional_interpolator_ff_impl.cc
+++ b/gr-filter/lib/fractional_interpolator_ff_impl.cc
@@ -53,7 +53,7 @@ namespace gr {
if(phase_shift < 0 || phase_shift > 1)
throw std::out_of_range("phase shift ratio must be > 0 and < 1");
- set_relative_rate(1.0 / interp_ratio);
+ set_inverse_relative_rate(d_mu_inc);
}
fractional_interpolator_ff_impl::~fractional_interpolator_ff_impl()
@@ -85,7 +85,7 @@ namespace gr {
int oo = 0; // output index
while(oo < noutput_items) {
- out[oo++] = d_interp->interpolate(&in[ii], d_mu);
+ out[oo++] = d_interp->interpolate(&in[ii], (float)d_mu);
double s = d_mu + d_mu_inc;
double f = floor(s);
@@ -102,25 +102,25 @@ namespace gr {
float
fractional_interpolator_ff_impl::mu() const
{
- return d_mu;
+ return (float)d_mu;
}
float
fractional_interpolator_ff_impl::interp_ratio() const
{
- return d_mu_inc;
+ return (float)d_mu_inc;
}
void
fractional_interpolator_ff_impl::set_mu(float mu)
{
- d_mu = mu;
+ d_mu = (double)mu;
}
void
fractional_interpolator_ff_impl::set_interp_ratio(float interp_ratio)
{
- d_mu_inc = interp_ratio;
+ d_mu_inc = (double)interp_ratio;
}
} /* namespace filter */
diff --git a/gr-filter/lib/fractional_interpolator_ff_impl.h b/gr-filter/lib/fractional_interpolator_ff_impl.h
index 3b3047888f..c96873e7db 100644
--- a/gr-filter/lib/fractional_interpolator_ff_impl.h
+++ b/gr-filter/lib/fractional_interpolator_ff_impl.h
@@ -33,8 +33,8 @@ namespace gr {
: public fractional_interpolator_ff
{
private:
- float d_mu;
- float d_mu_inc;
+ double d_mu;
+ double d_mu_inc;
mmse_fir_interpolator_ff *d_interp;
public:
diff --git a/gr-filter/lib/fractional_resampler_cc_impl.cc b/gr-filter/lib/fractional_resampler_cc_impl.cc
index 4d8def70cd..c4fabd4f9d 100644
--- a/gr-filter/lib/fractional_resampler_cc_impl.cc
+++ b/gr-filter/lib/fractional_resampler_cc_impl.cc
@@ -51,7 +51,7 @@ namespace gr {
if(phase_shift < 0 || phase_shift > 1)
throw std::out_of_range("phase shift ratio must be > 0 and < 1");
- set_relative_rate(1.0 / resamp_ratio);
+ set_inverse_relative_rate(d_mu_inc);
message_port_register_in(pmt::intern("msg_in"));
set_msg_handler(pmt::intern("msg_in"), boost::bind(
&fractional_resampler_cc_impl::handle_msg, this, _1));
@@ -110,7 +110,7 @@ namespace gr {
if(ninput_items.size() == 1) {
while(oo < noutput_items) {
- out[oo++] = d_resamp->interpolate(&in[ii], d_mu);
+ out[oo++] = d_resamp->interpolate(&in[ii], (float)d_mu);
double s = d_mu + d_mu_inc;
double f = floor(s);
@@ -126,8 +126,8 @@ namespace gr {
else {
const float *rr = (const float*)input_items[1];
while(oo < noutput_items) {
- out[oo++] = d_resamp->interpolate(&in[ii], d_mu);
- d_mu_inc = rr[ii];
+ out[oo++] = d_resamp->interpolate(&in[ii], (float)d_mu);
+ d_mu_inc = (double)rr[ii];
double s = d_mu + d_mu_inc;
double f = floor(s);
@@ -136,7 +136,7 @@ namespace gr {
ii += incr;
}
- set_relative_rate(1.0 / d_mu_inc);
+ set_inverse_relative_rate(d_mu_inc);
consume_each(ii);
return noutput_items;
}
@@ -145,25 +145,25 @@ namespace gr {
float
fractional_resampler_cc_impl::mu() const
{
- return d_mu;
+ return (float)d_mu;
}
float
fractional_resampler_cc_impl::resamp_ratio() const
{
- return d_mu_inc;
+ return (float)d_mu_inc;
}
void
fractional_resampler_cc_impl::set_mu(float mu)
{
- d_mu = mu;
+ d_mu = (double)mu;
}
void
fractional_resampler_cc_impl::set_resamp_ratio(float resamp_ratio)
{
- d_mu_inc = resamp_ratio;
+ d_mu_inc = (double)resamp_ratio;
}
} /* namespace filter */
diff --git a/gr-filter/lib/fractional_resampler_cc_impl.h b/gr-filter/lib/fractional_resampler_cc_impl.h
index 8b7d9de317..811bedf633 100644
--- a/gr-filter/lib/fractional_resampler_cc_impl.h
+++ b/gr-filter/lib/fractional_resampler_cc_impl.h
@@ -33,8 +33,8 @@ namespace gr {
: public fractional_resampler_cc
{
private:
- float d_mu;
- float d_mu_inc;
+ double d_mu;
+ double d_mu_inc;
mmse_fir_interpolator_cc *d_resamp;
public:
diff --git a/gr-filter/lib/fractional_resampler_ff_impl.cc b/gr-filter/lib/fractional_resampler_ff_impl.cc
index 6fcd7e53d3..9c427abfb0 100644
--- a/gr-filter/lib/fractional_resampler_ff_impl.cc
+++ b/gr-filter/lib/fractional_resampler_ff_impl.cc
@@ -51,7 +51,7 @@ namespace gr {
if(phase_shift < 0 || phase_shift > 1)
throw std::out_of_range("phase shift ratio must be > 0 and < 1");
- set_relative_rate(1.0 / resamp_ratio);
+ set_inverse_relative_rate(d_mu_inc);
message_port_register_in(pmt::intern("msg_in"));
set_msg_handler(pmt::intern("msg_in"), boost::bind(
@@ -111,7 +111,7 @@ namespace gr {
if(ninput_items.size() == 1) {
while(oo < noutput_items) {
- out[oo++] = d_resamp->interpolate(&in[ii], d_mu);
+ out[oo++] = d_resamp->interpolate(&in[ii], (float)d_mu);
double s = d_mu + d_mu_inc;
double f = floor(s);
@@ -126,8 +126,8 @@ namespace gr {
else {
const float *rr = (const float*)input_items[1];
while(oo < noutput_items) {
- out[oo++] = d_resamp->interpolate(&in[ii], d_mu);
- d_mu_inc = rr[ii];
+ out[oo++] = d_resamp->interpolate(&in[ii], (float)d_mu);
+ d_mu_inc = (double)rr[ii];
double s = d_mu + d_mu_inc;
double f = floor(s);
@@ -136,7 +136,7 @@ namespace gr {
ii += incr;
}
- set_relative_rate(1.0 / d_mu_inc);
+ set_inverse_relative_rate(d_mu_inc);
consume_each(ii);
return noutput_items;
}
@@ -145,25 +145,25 @@ namespace gr {
float
fractional_resampler_ff_impl::mu() const
{
- return d_mu;
+ return (float)d_mu;
}
float
fractional_resampler_ff_impl::resamp_ratio() const
{
- return d_mu_inc;
+ return (float)d_mu_inc;
}
void
fractional_resampler_ff_impl::set_mu(float mu)
{
- d_mu = mu;
+ d_mu = (double)mu;
}
void
fractional_resampler_ff_impl::set_resamp_ratio(float resamp_ratio)
{
- d_mu_inc = resamp_ratio;
+ d_mu_inc = (double)resamp_ratio;
}
} /* namespace filter */
diff --git a/gr-filter/lib/fractional_resampler_ff_impl.h b/gr-filter/lib/fractional_resampler_ff_impl.h
index cccc1be4b3..15b0121c39 100644
--- a/gr-filter/lib/fractional_resampler_ff_impl.h
+++ b/gr-filter/lib/fractional_resampler_ff_impl.h
@@ -33,8 +33,8 @@ namespace gr {
: public fractional_resampler_ff
{
private:
- float d_mu;
- float d_mu_inc;
+ double d_mu;
+ double d_mu_inc;
mmse_fir_interpolator_ff *d_resamp;
public:
diff --git a/gr-filter/lib/pfb_decimator_ccf_impl.cc b/gr-filter/lib/pfb_decimator_ccf_impl.cc
index 9d1d6f6139..8951820558 100644
--- a/gr-filter/lib/pfb_decimator_ccf_impl.cc
+++ b/gr-filter/lib/pfb_decimator_ccf_impl.cc
@@ -64,7 +64,7 @@ namespace gr {
d_rotator[i] = gr_expj(i*d_chan*2*M_PI/d_rate);
}
- set_relative_rate(1.0/(float)decim);
+ set_relative_rate(1, (uint64_t)decim);
if(d_use_fft_filters) {
set_history(1);
diff --git a/gr-filter/lib/rational_resampler_base_XXX_impl.cc.t b/gr-filter/lib/rational_resampler_base_XXX_impl.cc.t
index 0b74e60969..4bf98d533e 100644
--- a/gr-filter/lib/rational_resampler_base_XXX_impl.cc.t
+++ b/gr-filter/lib/rational_resampler_base_XXX_impl.cc.t
@@ -61,7 +61,7 @@ namespace gr {
if(decimation == 0)
throw std::out_of_range("@IMPL_NAME@: decimation must be > 0");
- set_relative_rate(1.0 * interpolation / decimation);
+ set_relative_rate((uint64_t)interpolation, (uint64_t)decimation);
set_output_multiple(1);
std::vector<@TAP_TYPE@> dummy_taps;
diff --git a/gr-trellis/lib/constellation_metrics_cf_impl.cc b/gr-trellis/lib/constellation_metrics_cf_impl.cc
index 6aa7dce6c8..79dbe414bd 100644
--- a/gr-trellis/lib/constellation_metrics_cf_impl.cc
+++ b/gr-trellis/lib/constellation_metrics_cf_impl.cc
@@ -51,7 +51,7 @@ namespace gr {
d_O(constellation->arity()),
d_D(constellation->dimensionality())
{
- set_relative_rate(1.0 * d_O / ((double) d_D));
+ set_relative_rate((uint64_t)d_O, (uint64_t)d_D);
set_output_multiple((int)d_O);
}
diff --git a/gr-trellis/lib/metrics_X_impl.cc.t b/gr-trellis/lib/metrics_X_impl.cc.t
index 5e74e4b2fc..08dc2d1b17 100644
--- a/gr-trellis/lib/metrics_X_impl.cc.t
+++ b/gr-trellis/lib/metrics_X_impl.cc.t
@@ -50,7 +50,7 @@ namespace gr {
io_signature::make(1, -1, sizeof (float))),
d_O(O), d_D(D), d_TYPE(TYPE), d_TABLE(TABLE)
{
- set_relative_rate (1.0 * d_O / ((double) d_D));
+ set_relative_rate ((uint64_t)d_O, (uint64_t)d_D);
set_output_multiple ((int)d_O);
}
@@ -58,7 +58,7 @@ namespace gr {
{
gr::thread::scoped_lock guard(d_setlock);
d_O = O;
- set_relative_rate (1.0 * d_O / ((double) d_D));
+ set_relative_rate ((uint64_t)d_O, (uint64_t)d_D);
set_output_multiple ((int)d_O);
}
@@ -66,7 +66,7 @@ namespace gr {
{
gr::thread::scoped_lock guard(d_setlock);
d_D = D;
- set_relative_rate (1.0 * d_O / ((double) d_D));
+ set_relative_rate ((uint64_t)d_O, (uint64_t)d_D);
}
void
diff --git a/gr-trellis/lib/pccc_decoder_X_impl.cc.t b/gr-trellis/lib/pccc_decoder_X_impl.cc.t
index aa19884712..14c169272a 100644
--- a/gr-trellis/lib/pccc_decoder_X_impl.cc.t
+++ b/gr-trellis/lib/pccc_decoder_X_impl.cc.t
@@ -69,7 +69,7 @@ namespace gr {
d_repetitions(repetitions),
d_SISO_TYPE(SISO_TYPE)
{
- set_relative_rate (1.0 / ((double) d_FSM1.O() * d_FSM2.O()));
+ set_relative_rate (1, (uint64_t)(d_FSM1.O() * d_FSM2.O()));
set_output_multiple (d_blocklength);
}
diff --git a/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
index 5b3cdeeb62..fdde7a0e5d 100644
--- a/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
+++ b/gr-trellis/lib/pccc_decoder_combined_XX_impl.cc.t
@@ -79,7 +79,7 @@ namespace gr {
d_scaling(scaling)
{
assert(d_FSMo.I() == d_FSMi.I());
- set_relative_rate (1.0 / ((double) d_D));
+ set_relative_rate (1, (uint64_t) d_D);
set_output_multiple (d_blocklength);
}
diff --git a/gr-trellis/lib/sccc_decoder_X_impl.cc.t b/gr-trellis/lib/sccc_decoder_X_impl.cc.t
index d217bbccfb..9d8106b1ff 100644
--- a/gr-trellis/lib/sccc_decoder_X_impl.cc.t
+++ b/gr-trellis/lib/sccc_decoder_X_impl.cc.t
@@ -66,7 +66,7 @@ namespace gr {
d_repetitions(repetitions),
d_SISO_TYPE(SISO_TYPE)
{
- set_relative_rate(1.0 / ((double) d_FSMi.O()));
+ set_relative_rate(1, (uint64_t) d_FSMi.O());
set_output_multiple(d_blocklength);
}
diff --git a/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
index f66b1f37e7..2909b7b0b7 100644
--- a/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
+++ b/gr-trellis/lib/sccc_decoder_combined_XX_impl.cc.t
@@ -78,7 +78,7 @@ namespace gr {
d_METRIC_TYPE(METRIC_TYPE),
d_scaling(scaling)
{
- set_relative_rate(1.0 / ((double) d_D));
+ set_relative_rate(1, (uint64_t) d_D);
set_output_multiple(d_blocklength);
}
diff --git a/gr-trellis/lib/siso_combined_f_impl.cc b/gr-trellis/lib/siso_combined_f_impl.cc
index 3b89684bf0..6c7a6c1d23 100644
--- a/gr-trellis/lib/siso_combined_f_impl.cc
+++ b/gr-trellis/lib/siso_combined_f_impl.cc
@@ -63,15 +63,15 @@ namespace gr {
set_output_multiple(d_K*multiple);
//what is the meaning of relative rate for a block with 2 inputs?
- //set_relative_rate ( multiple / ((double) d_FSM.I()) );
+ //set_relative_rate ((uint64_t) multiple, (uint64_t) d_FSM.I() );
// it turns out that the above gives problems in the scheduler, so
// let's try (assumption O>I)
- //set_relative_rate ( multiple / ((double) d_FSM.O()) );
+ //set_relative_rate ((uint64_t) multiple, (uint64_t) d_FSM.O() );
// I am tempted to automate like this
if(d_FSM.I() <= d_D)
- set_relative_rate(multiple / ((double)d_D));
+ set_relative_rate((uint64_t)multiple, (uint64_t)d_D);
else
- set_relative_rate(multiple / ((double)d_FSM.I()));
+ set_relative_rate((uint64_t)multiple, (uint64_t)d_FSM.I());
}
diff --git a/gr-trellis/lib/siso_f_impl.cc b/gr-trellis/lib/siso_f_impl.cc
index 2af5a21710..6ec6773ac5 100644
--- a/gr-trellis/lib/siso_f_impl.cc
+++ b/gr-trellis/lib/siso_f_impl.cc
@@ -61,15 +61,15 @@ namespace gr {
set_output_multiple (d_K*multiple);
//what is the meaning of relative rate for a block with 2 inputs?
- //set_relative_rate ( multiple / ((double) d_FSM.I()) );
+ //set_relative_rate ( (uint64_t) multiple, (uint64_t) d_FSM.I() );
// it turns out that the above gives problems in the scheduler, so
// let's try (assumption O>I)
- //set_relative_rate ( multiple / ((double) d_FSM.O()) );
+ //set_relative_rate ( (uint64_t) multiple, (uint64_t) d_FSM.O() );
// I am tempted to automate like this
if(d_FSM.I() <= d_FSM.O())
- set_relative_rate(multiple / ((double) d_FSM.O()));
+ set_relative_rate((uint64_t)multiple, (uint64_t)d_FSM.O());
else
- set_relative_rate(multiple / ((double) d_FSM.I()));
+ set_relative_rate((uint64_t)multiple, (uint64_t)d_FSM.I());
}
siso_f_impl::siso_f_impl(const fsm &FSM, int K,
diff --git a/gr-trellis/lib/viterbi_X_impl.cc.t b/gr-trellis/lib/viterbi_X_impl.cc.t
index 1d4864596e..c9592a299c 100644
--- a/gr-trellis/lib/viterbi_X_impl.cc.t
+++ b/gr-trellis/lib/viterbi_X_impl.cc.t
@@ -51,7 +51,7 @@ namespace gr {
d_FSM(FSM), d_K(K), d_S0(S0), d_SK(SK)//,
//d_trace(FSM.S()*K)
{
- set_relative_rate(1.0 / ((double)d_FSM.O()));
+ set_relative_rate(1, (uint64_t)d_FSM.O());
set_output_multiple(d_K);
}
@@ -59,7 +59,7 @@ namespace gr {
{
gr::thread::scoped_lock guard(d_setlock);
d_FSM = FSM;
- set_relative_rate(1.0 / ((double)d_FSM.O()));
+ set_relative_rate(1, (uint64_t)d_FSM.O());
}
void @IMPL_NAME@::set_K(int K)
diff --git a/gr-trellis/lib/viterbi_combined_XX_impl.cc.t b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
index 722708bcd2..60ad731227 100644
--- a/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
+++ b/gr-trellis/lib/viterbi_combined_XX_impl.cc.t
@@ -56,7 +56,7 @@ namespace gr {
d_TABLE(TABLE), d_TYPE(TYPE)//,
//d_trace(FSM.S()*K)
{
- set_relative_rate(1.0 / ((double)d_D));
+ set_relative_rate(1, (uint64_t)d_D);
set_output_multiple(d_K);
}
@@ -73,7 +73,7 @@ namespace gr {
{
gr::thread::scoped_lock guard(d_setlock);
d_D = D;
- set_relative_rate(1.0 / ((double)d_D));
+ set_relative_rate(1, (uint64_t)d_D);
}
void @IMPL_NAME@::set_FSM(const fsm &FSM)