summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--docs/doxygen/Doxyfile.in33
-rw-r--r--gnuradio-runtime/include/gnuradio/block.h63
-rw-r--r--gnuradio-runtime/include/gnuradio/flowgraph.h2
-rw-r--r--gnuradio-runtime/lib/flat_flowgraph.cc9
-rw-r--r--gnuradio-runtime/lib/flat_flowgraph.h2
-rw-r--r--gr-blocks/include/gnuradio/blocks/peak_detector2_fb.h2
-rw-r--r--gr-blocks/lib/peak_detector2_fb_impl.cc8
-rw-r--r--gr-blocks/lib/peak_detector2_fb_impl.h2
-rw-r--r--gr-digital/examples/CMakeLists.txt1
-rw-r--r--gr-digital/examples/demod/test_corr_est.grc3500
-rw-r--r--gr-digital/grc/digital_block_tree.xml4
-rw-r--r--gr-digital/grc/digital_corr_est_cc.xml41
-rw-r--r--gr-digital/grc/digital_modulate_vector.xml34
-rw-r--r--gr-digital/include/gnuradio/digital/CMakeLists.txt4
-rw-r--r--gr-digital/include/gnuradio/digital/corr_est_cc.h112
-rw-r--r--gr-digital/include/gnuradio/digital/modulate_vector.h70
-rw-r--r--gr-digital/lib/CMakeLists.txt2
-rw-r--r--gr-digital/lib/corr_est_cc_impl.cc282
-rw-r--r--gr-digital/lib/corr_est_cc_impl.h64
-rw-r--r--gr-digital/lib/modulate_vector.cc70
-rw-r--r--gr-digital/swig/digital_swig.i7
-rw-r--r--gr-fec/examples/CMakeLists.txt2
-rw-r--r--gr-fec/examples/ber_curve_gen.grc1693
-rw-r--r--gr-fec/examples/tpc_ber_curve_gen.grc2610
-rw-r--r--gr-fec/include/gnuradio/fec/tpc_decoder.h30
-rw-r--r--gr-fec/lib/tpc_decoder.cc133
-rwxr-xr-xgr-fec/lib/tpc_encoder.cc144
-rwxr-xr-xgr-qtgui/python/qtgui/range.py196
-rw-r--r--grc/gui/ActionHandler.py10
-rw-r--r--grc/gui/Param.py2
-rw-r--r--grc/gui/PropsDialog.py3
-rwxr-xr-xgrc/scripts/gnuradio-companion2
m---------volk0
34 files changed, 8449 insertions, 692 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f7602ac1d0..060bcab9e8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright 2010-2012,2014 Free Software Foundation, Inc.
+# Copyright 2010-2015 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -46,7 +46,7 @@ message(STATUS "Build type set to ${CMAKE_BUILD_TYPE}.")
# Set the version information here
set(VERSION_INFO_MAJOR_VERSION 3)
set(VERSION_INFO_API_COMPAT 7)
-set(VERSION_INFO_MINOR_VERSION 7)
+set(VERSION_INFO_MINOR_VERSION 8)
set(VERSION_INFO_MAINT_VERSION git)
include(GrVersion) #setup version info
diff --git a/docs/doxygen/Doxyfile.in b/docs/doxygen/Doxyfile.in
index 3f558526e7..97e67610cc 100644
--- a/docs/doxygen/Doxyfile.in
+++ b/docs/doxygen/Doxyfile.in
@@ -185,8 +185,12 @@ STRIP_FROM_INC_PATH = @CMAKE_SOURCE_DIR@/gnuradio-runtime/include \
@CMAKE_BINARY_DIR@/gr-wavelet/include \
@CMAKE_SOURCE_DIR@/gr-wxgui/include \
@CMAKE_BINARY_DIR@/gr-wxgui/include \
+ @CMAKE_SOURCE_DIR@/gr-zeromq/include \
+ @CMAKE_BINARY_DIR@/gr-zeromq/include \
@CMAKE_SOURCE_DIR@/volk/include \
- @CMAKE_BINARY_DIR@/volk/include
+ @CMAKE_BINARY_DIR@/volk/include \
+ @CMAKE_SOURCE_DIR@/volk/tmpl \
+ @CMAKE_BINARY_DIR@/volk/tmpl
# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
# (but less readable) file names. This can be useful if your file system
@@ -733,9 +737,13 @@ RECURSIVE = YES
# Note that relative paths are relative to the directory from which doxygen is
# run.
-EXCLUDE = @abs_top_builddir@/docs/doxygen/html \
+EXCLUDE = @abs_top_srcdir@/volk \
+ @abs_top_builddir@/volk \
+ @abs_top_builddir@/cmake/msvc \
+ @abs_top_builddir@/docs/doxygen/html \
@abs_top_builddir@/docs/doxygen/xml \
@abs_top_builddir@/docs/doxygen/other/doxypy.py \
+ @abs_top_srcdir@/docs/doxygen/other/shared_ptr_docstub.h \
@abs_top_builddir@/dtools \
@abs_top_builddir@/gnuradio-runtime/lib/runtime/gr_error_handler.cc \
@abs_top_builddir@/gnuradio-runtime/swig \
@@ -774,12 +782,24 @@ EXCLUDE = @abs_top_builddir@/docs/doxygen/html \
@abs_top_builddir@/gr-comedi/lib \
@abs_top_srcdir@/gr-digital/lib \
@abs_top_builddir@/gr-digital/lib \
+ @abs_top_srcdir@/gr-dtv/lib \
+ @abs_top_builddir@/gr-dtv/lib \
+ @abs_top_srcdir@/gr-dtv/lib/atsc \
+ @abs_top_builddir@/gr-dtv/lib/atsc \
+ @abs_top_srcdir@/gr-dtv/lib/dvb \
+ @abs_top_builddir@/gr-dtv/lib/dvb \
+ @abs_top_srcdir@/gr-dtv/lib/dvbs2 \
+ @abs_top_builddir@/gr-dtv/lib/dvbs2 \
+ @abs_top_srcdir@/gr-dtv/lib/dvbt2 \
+ @abs_top_builddir@/gr-dtv/lib/dvbr2 \
@abs_top_srcdir@/gr-fcd/lib \
@abs_top_builddir@/gr-fcd/lib \
@abs_top_srcdir@/gr-fec/lib \
@abs_top_builddir@/gr-fec/lib \
@abs_top_srcdir@/gr-filter/lib \
@abs_top_builddir@/gr-filter/lib \
+ @abs_top_srcdir@/gr-fft/lib \
+ @abs_top_builddir@/gr-fft/lib \
@abs_top_srcdir@/gr-noaa/lib \
@abs_top_builddir@/gr-noaa/lib \
@abs_top_srcdir@/gr-pager/lib \
@@ -790,6 +810,8 @@ EXCLUDE = @abs_top_builddir@/docs/doxygen/html \
@abs_top_builddir@/gr-trellis/lib \
@abs_top_srcdir@/gr-uhd/lib \
@abs_top_builddir@/gr-uhd/lib \
+ @abs_top_srcdir@/gr-uhd/examples/c++ \
+ @abs_top_builddir@/gr-uhd/examples/c++ \
@abs_top_srcdir@/gr-utils/lib \
@abs_top_builddir@/gr-utils/lib \
@abs_top_srcdir@/gr-video-sdl/lib \
@@ -799,7 +821,12 @@ EXCLUDE = @abs_top_builddir@/docs/doxygen/html \
@abs_top_srcdir@/gr-wavelet/lib \
@abs_top_builddir@/gr-wavelet/lib \
@abs_top_srcdir@/gr-wxgui/lib \
- @abs_top_builddir@/gr-wxgui/lib
+ @abs_top_builddir@/gr-wxgui/lib \
+ @abs_top_srcdir@/gr-zeromq/lib \
+ @abs_top_builddir@/gr-zeromq/lib \
+ @abs_top_srcdir@/volk/cmake/msvc \
+ @abs_top_builddir@/volk/cmake/msvc \
+ @abs_top_srcdir@/volk/kernels/volk/volk_8u_conv_k7_r2puppet_8u.h
# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
# directories that are symbolic links (a Unix file system feature) are excluded
diff --git a/gnuradio-runtime/include/gnuradio/block.h b/gnuradio-runtime/include/gnuradio/block.h
index 264ef9bd44..c6185d9f2d 100644
--- a/gnuradio-runtime/include/gnuradio/block.h
+++ b/gnuradio-runtime/include/gnuradio/block.h
@@ -367,12 +367,39 @@ namespace gr {
long max_output_buffer(size_t i);
/*!
- * \brief Sets max buffer size on all output ports.
+ * \brief Request limit on max buffer size on all output ports.
+ *
+ * \details
+ * This is an advanced feature. Calling this can affect some
+ * fundamental assumptions about the system behavior and
+ * performance.
+ *
+ * The actual buffer size is determined by a number of other
+ * factors from the block and system. This function only provides
+ * a requested maximum. The buffers will always be a multiple of
+ * the system page size, which may be larger than the value asked
+ * for here.
+ *
+ * \param max_output_buffer the requested maximum output size in items.
*/
void set_max_output_buffer(long max_output_buffer);
/*!
- * \brief Sets max buffer size on output port \p port.
+ * \brief Request limit on max buffer size on output port \p port.
+ *
+ * \details
+ * This is an advanced feature. Calling this can affect some
+ * fundamental assumptions about the system behavior and
+ * performance.
+ *
+ * The actual buffer size is determined by a number of other
+ * factors from the block and system. This function only provides
+ * a requested maximum. The buffers will always be a multiple of
+ * the system page size, which may be larger than the value asked
+ * for here.
+ *
+ * \param port the output port the request applies to.
+ * \param max_output_buffer the requested maximum output size in items.
*/
void set_max_output_buffer(int port, long max_output_buffer);
@@ -382,12 +409,40 @@ namespace gr {
long min_output_buffer(size_t i);
/*!
- * \brief Sets min buffer size on all output ports.
+ * \brief Request limit on the mininum buffer size on all output
+ * ports.
+ *
+ * \details
+ * This is an advanced feature. Calling this can affect some
+ * fundamental assumptions about the system behavior and
+ * performance.
+ *
+ * The actual buffer size is determined by a number of other
+ * factors from the block and system. This function only provides
+ * a requested minimum. The buffers will always be a multiple of
+ * the system page size, which may be larger than the value asked
+ * for here.
+ *
+ * \param min_output_buffer the requested minimum output size in items.
*/
void set_min_output_buffer(long min_output_buffer);
/*!
- * \brief Sets min buffer size on output port \p port.
+ * \brief Request limit on min buffer size on output port \p port.
+ *
+ * \details
+ * This is an advanced feature. Calling this can affect some
+ * fundamental assumptions about the system behavior and
+ * performance.
+ *
+ * The actual buffer size is determined by a number of other
+ * factors from the block and system. This function only provides
+ * a requested minimum. The buffers will always be a multiple of
+ * the system page size, which may be larger than the value asked
+ * for here.
+ *
+ * \param port the output port the request applies to.
+ * \param min_output_buffer the requested minimum output size in items.
*/
void set_min_output_buffer(int port, long min_output_buffer);
diff --git a/gnuradio-runtime/include/gnuradio/flowgraph.h b/gnuradio-runtime/include/gnuradio/flowgraph.h
index 1c04a5f21d..452a20cbc6 100644
--- a/gnuradio-runtime/include/gnuradio/flowgraph.h
+++ b/gnuradio-runtime/include/gnuradio/flowgraph.h
@@ -147,7 +147,7 @@ namespace gr {
friend GR_RUNTIME_API flowgraph_sptr make_flowgraph();
// Destruct an arbitrary flowgraph
- ~flowgraph();
+ virtual ~flowgraph();
// Connect two endpoints
void connect(const endpoint &src, const endpoint &dst);
diff --git a/gnuradio-runtime/lib/flat_flowgraph.cc b/gnuradio-runtime/lib/flat_flowgraph.cc
index b580238b7c..56123fcc88 100644
--- a/gnuradio-runtime/lib/flat_flowgraph.cc
+++ b/gnuradio-runtime/lib/flat_flowgraph.cc
@@ -109,12 +109,9 @@ namespace gr {
// Update the block's max_output_buffer based on what was actually allocated.
if((grblock->max_output_buffer(i) != buffer->bufsize()) && (grblock->max_output_buffer(i) != -1))
- GR_LOG_WARN(d_logger, boost::format("Block (%1%) max output buffer set to %2% instead of requested %3%") \
- % grblock->alias() % buffer->bufsize() % grblock->max_output_buffer(i));
- //std::cout << ">>> Warning: Block (" << grblock->alias()
- // << ") max output buffer set to " << buffer->bufsize()
- // << " instead of requested " << grblock->max_output_buffer(i)
- // << std::endl;
+ GR_LOG_WARN(d_logger, boost::format("Block (%1%) max output buffer set to %2%"
+ " instead of requested %3%") \
+ % grblock->alias() % buffer->bufsize() % grblock->max_output_buffer(i));
grblock->set_max_output_buffer(i, buffer->bufsize());
}
diff --git a/gnuradio-runtime/lib/flat_flowgraph.h b/gnuradio-runtime/lib/flat_flowgraph.h
index fad14279ae..d0b3a3ae64 100644
--- a/gnuradio-runtime/lib/flat_flowgraph.h
+++ b/gnuradio-runtime/lib/flat_flowgraph.h
@@ -45,7 +45,7 @@ namespace gr {
friend GR_RUNTIME_API flat_flowgraph_sptr make_flat_flowgraph();
// Destruct an arbitrary gr::flat_flowgraph
- ~flat_flowgraph();
+ virtual ~flat_flowgraph();
// Wire list of gr::block together in new flat_flowgraph
void setup_connections();
diff --git a/gr-blocks/include/gnuradio/blocks/peak_detector2_fb.h b/gr-blocks/include/gnuradio/blocks/peak_detector2_fb.h
index 7336a46f8e..da2d9fc740 100644
--- a/gr-blocks/include/gnuradio/blocks/peak_detector2_fb.h
+++ b/gr-blocks/include/gnuradio/blocks/peak_detector2_fb.h
@@ -71,7 +71,7 @@ namespace gr {
/*! \brief Set the running average alpha
* \param alpha new alpha for running average
*/
- virtual void set_alpha(int alpha) = 0;
+ virtual void set_alpha(float alpha) = 0;
/*! \brief Get the threshold factor value for the rise time
* \return threshold factor
diff --git a/gr-blocks/lib/peak_detector2_fb_impl.cc b/gr-blocks/lib/peak_detector2_fb_impl.cc
index dd1b677222..7ff7f542ec 100644
--- a/gr-blocks/lib/peak_detector2_fb_impl.cc
+++ b/gr-blocks/lib/peak_detector2_fb_impl.cc
@@ -43,8 +43,8 @@ namespace gr {
peak_detector2_fb_impl::peak_detector2_fb_impl(float threshold_factor_rise,
int look_ahead, float alpha)
: sync_block("peak_detector2_fb",
- io_signature::make(1, 1, sizeof(float)),
- io_signature::make2(1, 2, sizeof(char), sizeof(float))),
+ io_signature::make(1, 1, sizeof(float)),
+ io_signature::make2(1, 2, sizeof(char), sizeof(float))),
d_threshold_factor_rise(threshold_factor_rise),
d_look_ahead(look_ahead), d_alpha(alpha), d_avg(0.0f), d_found(false)
{
@@ -62,8 +62,6 @@ namespace gr {
float *iptr = (float *)input_items[0];
char *optr = (char *)output_items[0];
- assert(noutput_items >= 2);
-
memset(optr, 0, noutput_items*sizeof(char));
for(int i = 0; i < noutput_items; i++) {
@@ -114,5 +112,3 @@ namespace gr {
} /* namespace blocks */
} /* namespace gr */
-
-
diff --git a/gr-blocks/lib/peak_detector2_fb_impl.h b/gr-blocks/lib/peak_detector2_fb_impl.h
index 53c06ca810..f5a8ac1a6b 100644
--- a/gr-blocks/lib/peak_detector2_fb_impl.h
+++ b/gr-blocks/lib/peak_detector2_fb_impl.h
@@ -47,7 +47,7 @@ namespace gr {
void set_threshold_factor_rise(float thr) { d_threshold_factor_rise = thr; }
void set_look_ahead(int look) { d_look_ahead = look; }
- void set_alpha(int alpha) { d_alpha = alpha; }
+ void set_alpha(float alpha) { d_alpha = alpha; }
float threshold_factor_rise() { return d_threshold_factor_rise; }
int look_ahead() { return d_look_ahead; }
diff --git a/gr-digital/examples/CMakeLists.txt b/gr-digital/examples/CMakeLists.txt
index 8faad96708..fa15501936 100644
--- a/gr-digital/examples/CMakeLists.txt
+++ b/gr-digital/examples/CMakeLists.txt
@@ -82,6 +82,7 @@ install(
demod/dpsk_loopback.grc
demod/gfsk_loopback.grc
demod/test_corr_and_sync.grc
+ demod/test_corr_est.grc
demod/uhd_corr_and_sync_tx.grc
demod/uhd_corr_and_sync_rx.grc
DESTINATION ${GR_PKG_DIGITAL_EXAMPLES_DIR}/demod
diff --git a/gr-digital/examples/demod/test_corr_est.grc b/gr-digital/examples/demod/test_corr_est.grc
new file mode 100644
index 0000000000..6237565a4b
--- /dev/null
+++ b/gr-digital/examples/demod/test_corr_est.grc
@@ -0,0 +1,3500 @@
+<?xml version='1.0' encoding='ASCII'?>
+<?grc format='1' created='3.7.7'?>
+<flow_graph>
+ <timestamp>Fri Jul 11 16:54:10 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>id</key>
+ <value>test_corr_est</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value></value>
+ </param>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>2000,2000</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>qt_gui</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>thread_safe_setters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(10, 10)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>data</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[0]*4+[random.getrandbits(8) for i in range(payload_size)]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(16, 251)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>rrc_taps</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), eb, 5*sps*nfilts)</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1075, 73)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>nfilts</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>32</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1074, 9)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>payload_size</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>992</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(101, 73)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>bb_filter</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>firdes.root_raised_cosine(sps, sps, 1, eb, 101)</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(429, 8)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>sps</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(278, 72)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>matched_filter</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>firdes.root_raised_cosine(nfilts, nfilts, 1, eb, int(11*sps*nfilts))</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(429, 72)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>100000</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(11, 72)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>gap</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>20000</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(202, 72)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>eb</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0.35</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(346, 72)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>preamble</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[0xac, 0xdd, 0xa4, 0xe2, 0xf2, 0x8c, 0x20, 0xfc]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(279, 8)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>rxmod</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>digital.generic_mod(constel, False, sps, True, eb, False, False)</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 427)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>channels_channel_model</key>
+ <param>
+ <key>id</key>
+ <value>channels_channel_model_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>noise_voltage</key>
+ <value>noise</value>
+ </param>
+ <param>
+ <key>freq_offset</key>
+ <value>freq_offset</value>
+ </param>
+ <param>
+ <key>epsilon</key>
+ <value>time_offset</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>block_tags</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(772, 158)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_throttle</key>
+ <param>
+ <key>id</key>
+ <value>blocks_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>ignoretag</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(586, 190)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_null_source</key>
+ <param>
+ <key>id</key>
+ <value>blocks_null_source_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_outputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>bus_conns</key>
+ <value>[[0,],]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(402, 322)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_qtgui_range</key>
+ <param>
+ <key>id</key>
+ <value>phase</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Phase offset</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>start</key>
+ <value>-2*scipy.pi</value>
+ </param>
+ <param>
+ <key>stop</key>
+ <value>2*scipy.pi</value>
+ </param>
+ <param>
+ <key>step</key>
+ <value>0.1</value>
+ </param>
+ <param>
+ <key>widget</key>
+ <value>slider</value>
+ </param>
+ <param>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
+ </param>
+ <param>
+ <key>min_len</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value>3,1,1,1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(692, 7)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_qtgui_range</key>
+ <param>
+ <key>id</key>
+ <value>time_offset</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Timing Offset</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>start</key>
+ <value>0.995</value>
+ </param>
+ <param>
+ <key>stop</key>
+ <value>1.005</value>
+ </param>
+ <param>
+ <key>step</key>
+ <value>0.00001</value>
+ </param>
+ <param>
+ <key>widget</key>
+ <value>slider</value>
+ </param>
+ <param>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
+ </param>
+ <param>
+ <key>min_len</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value>4,1,1,1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(950, 8)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_qtgui_range</key>
+ <param>
+ <key>id</key>
+ <value>noise</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Noise</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>stop</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>step</key>
+ <value>0.005</value>
+ </param>
+ <param>
+ <key>widget</key>
+ <value>slider</value>
+ </param>
+ <param>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
+ </param>
+ <param>
+ <key>min_len</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value>3,0,1,1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(584, 7)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_pfb_clock_sync_xxx</key>
+ <param>
+ <key>id</key>
+ <value>digital_pfb_clock_sync_xxx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ccf</value>
+ </param>
+ <param>
+ <key>sps</key>
+ <value>sps</value>
+ </param>
+ <param>
+ <key>loop_bw</key>
+ <value>2*3.14/100.0</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>rrc_taps</value>
+ </param>
+ <param>
+ <key>filter_size</key>
+ <value>nfilts</value>
+ </param>
+ <param>
+ <key>init_phase</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>max_dev</key>
+ <value>0.5</value>
+ </param>
+ <param>
+ <key>osps</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(790, 289)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_sub_xx</key>
+ <param>
+ <key>id</key>
+ <value>blocks_sub_xx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1125, 617)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_qtgui_range</key>
+ <param>
+ <key>id</key>
+ <value>delay</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>delay</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>90</value>
+ </param>
+ <param>
+ <key>start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>stop</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>step</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>widget</key>
+ <value>counter_slider</value>
+ </param>
+ <param>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
+ </param>
+ <param>
+ <key>min_len</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value>5,0,1,2</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(875, 571)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(752, 517)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_unpack_k_bits_bb</key>
+ <param>
+ <key>id</key>
+ <value>blocks_unpack_k_bits_bb_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>8</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(576, 517)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_stream_mux</key>
+ <param>
+ <key>id</key>
+ <value>blocks_stream_mux_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>lengths</key>
+ <value>(len(preamble)/8+payload_size), gap/sps/8</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(390, 504)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_null_source</key>
+ <param>
+ <key>id</key>
+ <value>blocks_null_source_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_outputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>bus_conns</key>
+ <value>[[0,],]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(210, 538)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_delay</key>
+ <param>
+ <key>id</key>
+ <value>blocks_delay_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>delay</key>
+ <value>int(delay)</value>
+ </param>
+ <param>
+ <key>num_ports</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(923, 518)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_char_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_char_to_float_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>scale</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1112, 482)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_time_sink_x</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_time_sink_x_0_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ylabel</key>
+ <value>Amplitude</value>
+ </param>
+ <param>
+ <key>yunit</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>20000</value>
+ </param>
+ <param>
+ <key>srate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>grid</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-2</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>entags</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value>2,0,1,2</value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_TAG</value>
+ </param>
+ <param>
+ <key>tr_slope</key>
+ <value>qtgui.TRIG_SLOPE_POS</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>tr_delay</key>
+ <value>0.010</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>time_est</value>
+ </param>
+ <param>
+ <key>ctrlpanel</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>legend</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1345, 531)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_constellation_decoder_cb</key>
+ <param>
+ <key>id</key>
+ <value>digital_constellation_decoder_cb_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>constellation</key>
+ <value>constel</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1111, 433)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_costas_loop_cc</key>
+ <param>
+ <key>id</key>
+ <value>digital_costas_loop_cc_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>w</key>
+ <value>1*3.14/50.0</value>
+ </param>
+ <param>
+ <key>order</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>use_snr</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1091, 303)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_time_sink_x</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_time_sink_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ylabel</key>
+ <value>Amplitude</value>
+ </param>
+ <param>
+ <key>yunit</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>50000</value>
+ </param>
+ <param>
+ <key>srate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>grid</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-2</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>entags</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value>0,0,1,1</value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_TAG</value>
+ </param>
+ <param>
+ <key>tr_slope</key>
+ <value>qtgui.TRIG_SLOPE_POS</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>tr_delay</key>
+ <value>0.1</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>time_est</value>
+ </param>
+ <param>
+ <key>ctrlpanel</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>legend</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1398, 370)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_constellation</key>
+ <param>
+ <key>id</key>
+ <value>constel</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>sym_map</key>
+ <value>[0,1]</value>
+ </param>
+ <param>
+ <key>const_points</key>
+ <value>[1,-1]</value>
+ </param>
+ <param>
+ <key>rot_sym</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dims</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>precision</key>
+ <value>8</value>
+ </param>
+ <param>
+ <key>soft_dec_lut</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1237, 27)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_qtgui_range</key>
+ <param>
+ <key>id</key>
+ <value>freq_offset</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>Frequency Offset</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>start</key>
+ <value>-0.001</value>
+ </param>
+ <param>
+ <key>stop</key>
+ <value>0.001</value>
+ </param>
+ <param>
+ <key>step</key>
+ <value>0.00002</value>
+ </param>
+ <param>
+ <key>widget</key>
+ <value>slider</value>
+ </param>
+ <param>
+ <key>orient</key>
+ <value>Qt.Horizontal</value>
+ </param>
+ <param>
+ <key>min_len</key>
+ <value>200</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value>4,0,1,1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(808, 7)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_const_sink_x</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_const_sink_x_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value></value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>(len(preamble)+payload_size)*8</value>
+ </param>
+ <param>
+ <key>grid</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-2</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>xmin</key>
+ <value>-2</value>
+ </param>
+ <param>
+ <key>xmax</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value>0,1,1,1</value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_TAG</value>
+ </param>
+ <param>
+ <key>tr_slope</key>
+ <value>qtgui.TRIG_SLOPE_POS</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>time_est</value>
+ </param>
+ <param>
+ <key>legend</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1399, 283)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_complex_to_mag</key>
+ <param>
+ <key>id</key>
+ <value>blocks_complex_to_mag_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1235, 149)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_complex_to_float</key>
+ <param>
+ <key>id</key>
+ <value>blocks_complex_to_float_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1235, 194)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>import</key>
+ <param>
+ <key>id</key>
+ <value>import_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>import</key>
+ <value>import scipy</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(181, 16)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>import</key>
+ <param>
+ <key>id</key>
+ <value>import_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>import</key>
+ <value>import random</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(176, 147)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_vector_source_x</key>
+ <param>
+ <key>id</key>
+ <value>blocks_vector_source_x_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>vector</key>
+ <value>preamble+data</value>
+ </param>
+ <param>
+ <key>tags</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(15, 165)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_constellation_modulator</key>
+ <param>
+ <key>id</key>
+ <value>digital_constellation_modulator_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>constellation</key>
+ <value>constel</value>
+ </param>
+ <param>
+ <key>differential</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>samples_per_symbol</key>
+ <value>sps</value>
+ </param>
+ <param>
+ <key>excess_bw</key>
+ <value>eb</value>
+ </param>
+ <param>
+ <key>verbose</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>log</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(312, 166)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_stream_mux</key>
+ <param>
+ <key>id</key>
+ <value>blocks_stream_mux_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>lengths</key>
+ <value>(len(preamble)+len(data))*8*sps, gap</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(568, 288)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>qtgui_time_sink_x</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_time_sink_x_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>float</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ylabel</key>
+ <value>Amplitude</value>
+ </param>
+ <param>
+ <key>yunit</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>size</key>
+ <value>80000</value>
+ </param>
+ <param>
+ <key>srate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>grid</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>autoscale</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-200</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>400</value>
+ </param>
+ <param>
+ <key>nconnections</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>entags</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value>1,0,1,2</value>
+ </param>
+ <param>
+ <key>tr_mode</key>
+ <value>qtgui.TRIG_MODE_NORM</value>
+ </param>
+ <param>
+ <key>tr_slope</key>
+ <value>qtgui.TRIG_SLOPE_POS</value>
+ </param>
+ <param>
+ <key>tr_level</key>
+ <value>100</value>
+ </param>
+ <param>
+ <key>tr_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_chan</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>tr_tag</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>ctrlpanel</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>legend</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value>|corr|^2</value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value>Re{corr}</value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value>Im{corr}</value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"green"</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"black"</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"cyan"</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"yellow"</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"dark green"</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1433, 160)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_modulate_vector</key>
+ <param>
+ <key>id</key>
+ <value>modulated_sync_word</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>mod</key>
+ <value>rxmod</value>
+ </param>
+ <param>
+ <key>data</key>
+ <value>preamble</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>[1]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 491)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_corr_est_cc</key>
+ <param>
+ <key>id</key>
+ <value>digital_corr_est_cc_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>symbols</key>
+ <value>modulated_sync_word</value>
+ </param>
+ <param>
+ <key>sps</key>
+ <value>sps</value>
+ </param>
+ <param>
+ <key>mark_delay</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>threshold</key>
+ <value>0.9</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(972, 174)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>digital_costas_loop_cc_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_costas_loop_cc_0</source_block_id>
+ <sink_block_id>digital_constellation_decoder_cb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_complex_to_float_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_complex_to_mag_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_corr_est_cc_0</source_block_id>
+ <sink_block_id>digital_pfb_clock_sync_xxx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_null_source_0_0</source_block_id>
+ <sink_block_id>blocks_stream_mux_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_stream_mux_0_0</source_block_id>
+ <sink_block_id>blocks_throttle_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_complex_to_float_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_1</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>2</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>channels_channel_model_0</source_block_id>
+ <sink_block_id>digital_corr_est_cc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_constellation_modulator_0</source_block_id>
+ <sink_block_id>blocks_stream_mux_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_corr_est_cc_0</source_block_id>
+ <sink_block_id>blocks_complex_to_mag_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_corr_est_cc_0</source_block_id>
+ <sink_block_id>blocks_complex_to_float_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_throttle_0</source_block_id>
+ <sink_block_id>channels_channel_model_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_pfb_clock_sync_xxx_0</source_block_id>
+ <sink_block_id>digital_costas_loop_cc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_delay_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_0_0</source_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_delay_0</source_block_id>
+ <sink_block_id>blocks_sub_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_sub_xx_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>2</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_0_0</source_block_id>
+ <sink_block_id>qtgui_time_sink_x_0_1</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_stream_mux_0</source_block_id>
+ <sink_block_id>blocks_unpack_k_bits_bb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_unpack_k_bits_bb_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_null_source_0</source_block_id>
+ <sink_block_id>blocks_stream_mux_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_char_to_float_0</source_block_id>
+ <sink_block_id>blocks_delay_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_constellation_decoder_cb_0</source_block_id>
+ <sink_block_id>blocks_char_to_float_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>digital_costas_loop_cc_0</source_block_id>
+ <sink_block_id>qtgui_const_sink_x_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_vector_source_x_0_0</source_block_id>
+ <sink_block_id>digital_constellation_modulator_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/gr-digital/grc/digital_block_tree.xml b/gr-digital/grc/digital_block_tree.xml
index f6dcceb6d0..6707a8e4db 100644
--- a/gr-digital/grc/digital_block_tree.xml
+++ b/gr-digital/grc/digital_block_tree.xml
@@ -1,6 +1,6 @@
<?xml version="1.0"?>
<!--
- Copyright 2011-2013 Free Software Foundation, Inc.
+ Copyright 2011-2015 Free Software Foundation, Inc.
This file is part of GNU Radio
@@ -63,6 +63,7 @@
<block>digital_constellation_receiver_cb</block>
<block>variable_constellation</block>
<block>variable_constellation_rect</block>
+ <block>variable_modulate_vector</block>
</cat>
<cat>
<name>Packet Operators</name>
@@ -120,6 +121,7 @@
<block>digital_mpsk_receiver_cc</block>
<block>digital_pfb_clock_sync_xxx</block>
<block>digital_pn_correlator_cc</block>
+ <block>digital_corr_est_cc</block>
<block>digital_correlate_and_sync_cc</block>
</cat>
<cat>
diff --git a/gr-digital/grc/digital_corr_est_cc.xml b/gr-digital/grc/digital_corr_est_cc.xml
new file mode 100644
index 0000000000..d687cef67d
--- /dev/null
+++ b/gr-digital/grc/digital_corr_est_cc.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0"?>
+<block>
+ <name>Correlation Estimator</name>
+ <key>digital_corr_est_cc</key>
+ <import>from gnuradio import digital</import>
+ <make>digital.corr_est_cc($symbols, $sps, $mark_delay, $threshold)</make>
+ <param>
+ <name>Symbols</name>
+ <key>symbols</key>
+ <type>complex_vector</type>
+ </param>
+ <param>
+ <name>Samples per Symbol</name>
+ <key>sps</key>
+ <type>float</type>
+ </param>
+ <param>
+ <name>Tag marking delay</name>
+ <key>mark_delay</key>
+ <type>int</type>
+ </param>
+ <param>
+ <name>Threshold</name>
+ <key>threshold</key>
+ <value>0.9</value>
+ <type>float</type>
+ </param>
+ <sink>
+ <name>in</name>
+ <type>complex</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>complex</type>
+ </source>
+ <source>
+ <name>corr</name>
+ <type>complex</type>
+ <optional>1</optional>
+ </source>
+</block>
diff --git a/gr-digital/grc/digital_modulate_vector.xml b/gr-digital/grc/digital_modulate_vector.xml
new file mode 100644
index 0000000000..91614dd3fd
--- /dev/null
+++ b/gr-digital/grc/digital_modulate_vector.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+# modulate_vector_bc
+###################################################
+ -->
+<block>
+ <name>Modulate Vector</name>
+ <key>variable_modulate_vector</key>
+ <category>Modulators</category>
+ <import>from gnuradio import digital</import>
+ <var_make>self.$(id) = $(id) = digital.modulate_vector_bc($mod .to_basic_block(), $data, $taps)</var_make>
+ <var_value>digital.modulate_vector_bc($mod .to_basic_block(), $data, $taps)</var_value>
+ <make></make>
+
+ <param>
+ <name>Modulator</name>
+ <key>mod</key>
+ <value></value>
+ <type>raw</type>
+ </param>
+ <param>
+ <name>Data vector</name>
+ <key>data</key>
+ <value></value>
+ <type>int_vector</type>
+ </param>
+ <param>
+ <name>Filter taps</name>
+ <key>taps</key>
+ <value></value>
+ <type>float_vector</type>
+ </param>
+</block>
diff --git a/gr-digital/include/gnuradio/digital/CMakeLists.txt b/gr-digital/include/gnuradio/digital/CMakeLists.txt
index c39b12bed2..2993497e93 100644
--- a/gr-digital/include/gnuradio/digital/CMakeLists.txt
+++ b/gr-digital/include/gnuradio/digital/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright 2011-2014 Free Software Foundation, Inc.
+# Copyright 2011-2015 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -42,6 +42,7 @@ install(FILES
constellation_decoder_cb.h
constellation_receiver_cb.h
constellation_soft_decoder_cf.h
+ corr_est_cc.h
correlate_access_code_bb.h
correlate_access_code_tag_bb.h
correlate_access_code_bb_ts.h
@@ -69,6 +70,7 @@ install(FILES
lms_dd_equalizer_cc.h
map_bb.h
metric_type.h
+ modulate_vector.h
mpsk_receiver_cc.h
mpsk_snr_est.h
mpsk_snr_est_cc.h
diff --git a/gr-digital/include/gnuradio/digital/corr_est_cc.h b/gr-digital/include/gnuradio/digital/corr_est_cc.h
new file mode 100644
index 0000000000..0d432ba409
--- /dev/null
+++ b/gr-digital/include/gnuradio/digital/corr_est_cc.h
@@ -0,0 +1,112 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2015 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_DIGITAL_CORR_EST_CC_CC_H
+#define INCLUDED_DIGITAL_CORR_EST_CC_CC_H
+
+#include <gnuradio/digital/api.h>
+#include <gnuradio/sync_block.h>
+
+namespace gr {
+ namespace digital {
+
+ /*!
+ * \brief Correlate stream with a pre-defined sequence and estimate peak
+ * \ingroup synchronizers_blk
+ *
+ * \details
+ * Input:
+ * \li Stream of complex samples.
+ *
+ * Output:
+ * \li Output stream that just passes the input complex samples
+ * \li tag 'phase_est': estimate of phase offset
+ * \li tag 'time_est': estimate of symbol timing offset
+ * \li tag 'corr_est': the correlation value of the estimates
+ * \li tag 'corr_start': the start sample of the correlation and the value
+ *
+ * \li Optional 2nd output stream providing the advanced correlator output
+ *
+ * This block is designed to search for a sync word by correlation
+ * and uses the results of the correlation to get a time and phase
+ * offset estimate. These estimates are passed downstream as
+ * stream tags for use by follow-on synchronization blocks.
+ *
+ * The sync word is provided as a set of symbols along with a
+ * baseband matched filter which we use to create the filtered and
+ * upsampled symbols that we will receive over-the-air.
+ *
+ * The phase_est tag can be used by downstream blocks to adjust
+ * their phase estimatopm/correction loops, and is currently
+ * implemented by the gr::digital::costas_loop_cc block.
+ *
+ * The time_est tag can be used to adjust the sampling timing
+ * estimate of any downstream synchronization blocks and is
+ * currently implemented by the gr::digital::pfb_clock_sync_ccf
+ * block.
+ *
+ * The caller must provide a "time_est" and "phase_est" tag
+ * marking delay from the start of the correlated signal segment,
+ * in order to mark the proper point in the sync word for
+ * downstream synchronization blocks. Generally this block cannot
+ * know where the actual sync word symbols are located relative to
+ * "corr_start", given that some modulations have pulses with
+ * intentional ISI. The user should manually examine the primary
+ * output and the "corr_start" tag postition to determine the
+ * required tag delay settings for the particular modulation,
+ * sync word, and downstream blocks used.
+ *
+ * For a discussion of the properties of complex correlations,
+ * with respect to signal processing, see:
+ * Marple, Jr., S. L., "Estimating Group Delay and Phase Delay
+ * via Discrete-Time 'Analytic' Cross-Correlation, _IEEE_Transcations_
+ * _on_Signal_Processing_, Volume 47, No. 9, September 1999
+ *
+ */
+ class DIGITAL_API corr_est_cc : virtual public sync_block
+ {
+ public:
+ typedef boost::shared_ptr<corr_est_cc> sptr;
+
+ /*!
+ * Make a block that correlates against the \p symbols vector
+ * and outputs a phase and symbol timing estimate.
+ *
+ * \param symbols Set of symbols to correlate against (e.g., a
+ * sync word).
+ * \param sps Samples per symbol
+ * \param mark_delay tag marking delay in samples after the
+ * corr_start tag
+ * \param threshold Threshold of correlator, relative to a 100%
+ * correlation (1.0). Default is 0.9.
+ */
+ static sptr make(const std::vector<gr_complex> &symbols,
+ float sps, unsigned int mark_delay, float threshold=0.9);
+
+ virtual std::vector<gr_complex> symbols() const = 0;
+ virtual void set_symbols(const std::vector<gr_complex> &symbols) = 0;
+ };
+
+ } // namespace digital
+} // namespace gr
+
+#endif /* INCLUDED_DIGITAL_CORR_EST_CC_H */
diff --git a/gr-digital/include/gnuradio/digital/modulate_vector.h b/gr-digital/include/gnuradio/digital/modulate_vector.h
new file mode 100644
index 0000000000..6083099a89
--- /dev/null
+++ b/gr-digital/include/gnuradio/digital/modulate_vector.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2015 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_DIGITAL_MODULATE_VECTOR_H
+#define INCLUDED_DIGITAL_MODULATE_VECTOR_H
+
+#include <gnuradio/digital/api.h>
+#include <gnuradio/types.h>
+
+namespace gr {
+ namespace digital {
+
+ /*!
+ * \brief Modulate a vector of data and apply a shaping filter.
+ *
+ * \p modulator: Pointer to a byte-to-complex modulator block.
+ * \p data: Vector of bytes to modulate into symbols.
+ * \p taps: Post-modulation symbol shaping filter taps.
+ *
+ * \details
+ * This function modulates the input vector and applies a
+ * symbol shaping filter. It is intended for use with the
+ * corr_est_cc block as the symbol stream to correlate
+ * against.
+ *
+ * Any differential encoding or other data coding must be
+ * performed on the input vector before this modulation
+ * operation.
+ *
+ * Be aware that the format of the incoming data must match
+ * the format the modulator block is expecting. GNURadio
+ * modulator blocks are inconsistent in their data type
+ * expectations. For instance, cpmmod_bc expects unpacked,
+ * signed bytes in (-1, 1), while gmsk_mod expects packed,
+ * unsigned bytes in (0, 1). In other words, the output of
+ * gmsk_mod given the input vector [0xaa, 0x00] is equivalent
+ * to the output of cpmmod_bc given the input vector
+ * [1,255,1,255,1,255,1,255,255,255,255,255,255,255,255,255]
+ *
+ * Please check the documentation or source of the modulator
+ * before using this function.
+ *
+ */
+ DIGITAL_API std::vector<gr_complex>
+ modulate_vector_bc(basic_block_sptr modulator,
+ std::vector<uint8_t> data,
+ std::vector<float> taps);
+
+ } /* namespace digital */
+} /* namespace gr */
+
+#endif /* INCLUDED_DIGITAL_MODULATE_VECTOR_H */
diff --git a/gr-digital/lib/CMakeLists.txt b/gr-digital/lib/CMakeLists.txt
index eb1008423b..0c213d7ac8 100644
--- a/gr-digital/lib/CMakeLists.txt
+++ b/gr-digital/lib/CMakeLists.txt
@@ -60,6 +60,7 @@ list(APPEND digital_sources
constellation_decoder_cb_impl.cc
constellation_receiver_cb_impl.cc
constellation_soft_decoder_cf_impl.cc
+ corr_est_cc_impl.cc
correlate_access_code_bb_impl.cc
correlate_access_code_tag_bb_impl.cc
correlate_access_code_bb_ts_impl.cc
@@ -85,6 +86,7 @@ list(APPEND digital_sources
kurtotic_equalizer_cc_impl.cc
lms_dd_equalizer_cc_impl.cc
map_bb_impl.cc
+ modulate_vector.cc
mpsk_receiver_cc_impl.cc
mpsk_snr_est.cc
mpsk_snr_est_cc_impl.cc
diff --git a/gr-digital/lib/corr_est_cc_impl.cc b/gr-digital/lib/corr_est_cc_impl.cc
new file mode 100644
index 0000000000..0d2470b678
--- /dev/null
+++ b/gr-digital/lib/corr_est_cc_impl.cc
@@ -0,0 +1,282 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2015 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 <gnuradio/io_signature.h>
+#include <gnuradio/math.h>
+#include "corr_est_cc_impl.h"
+#include <volk/volk.h>
+#include <boost/format.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include <gnuradio/filter/pfb_arb_resampler.h>
+#include <gnuradio/filter/firdes.h>
+
+namespace gr {
+ namespace digital {
+
+ corr_est_cc::sptr
+ corr_est_cc::make(const std::vector<gr_complex> &symbols,
+ float sps, unsigned int mark_delay,
+ float threshold)
+ {
+ return gnuradio::get_initial_sptr
+ (new corr_est_cc_impl(symbols, sps, mark_delay, threshold));
+ }
+
+ corr_est_cc_impl::corr_est_cc_impl(const std::vector<gr_complex> &symbols,
+ float sps, unsigned int mark_delay,
+ float threshold)
+ : sync_block("corr_est_cc",
+ io_signature::make(1, 1, sizeof(gr_complex)),
+ io_signature::make(1, 2, sizeof(gr_complex))),
+ d_src_id(pmt::intern(alias()))
+ {
+ d_sps = sps;
+
+ // Create time-reversed conjugate of symbols
+ d_symbols = symbols;
+ for(size_t i=0; i < d_symbols.size(); i++) {
+ d_symbols[i] = conj(d_symbols[i]);
+ }
+ std::reverse(d_symbols.begin(), d_symbols.end());
+
+ d_mark_delay = mark_delay >= d_symbols.size() ? d_symbols.size() - 1
+ : mark_delay;
+
+ // Compute a correlation threshold.
+ // Compute the value of the discrete autocorrelation of the matched
+ // filter with offset 0 (aka the autocorrelation peak).
+ float corr = 0;
+ for(size_t i = 0; i < d_symbols.size(); i++)
+ corr += abs(d_symbols[i]*conj(d_symbols[i]));
+ d_thresh = threshold*corr*corr;
+
+ // Correlation filter
+ d_filter = new kernel::fft_filter_ccc(1, d_symbols);
+
+ // Per comments in gr-filter/include/gnuradio/filter/fft_filter.h,
+ // set the block output multiple to the FFT filter kernel's internal,
+ // assumed "nsamples", to ensure the scheduler always passes a
+ // proper number of samples.
+ int nsamples;
+ nsamples = d_filter->set_taps(d_symbols);
+ set_output_multiple(nsamples);
+
+ // It looks like the kernel::fft_filter_ccc stashes a tail between
+ // calls, so that contains our filtering history (I think). The
+ // fft_filter_ccc block (which calls the kernel::fft_filter_ccc) sets
+ // the history to 1 (0 history items), so let's follow its lead.
+ //set_history(1);
+
+ // We'll (ab)use the history for our own purposes of tagging back in time.
+ // Keep a history of the length of the sync word to delay for tagging.
+ set_history(d_symbols.size()+1);
+
+ declare_sample_delay(1, 0);
+ declare_sample_delay(0, d_symbols.size());
+
+ // Setting the alignment multiple for volk causes problems with the
+ // expected behavior of setting the output multiple for the FFT filter.
+ // Don't set the alignment multiple.
+ //const int alignment_multiple =
+ // volk_get_alignment() / sizeof(gr_complex);
+ //set_alignment(std::max(1,alignment_multiple));
+
+ // In order to easily support the optional second output,
+ // don't deal with an unbounded max number of output items.
+ // For the common case of not using the optional second output,
+ // this ensures we optimally call the volk routines.
+ const size_t nitems = 24*1024;
+ set_max_noutput_items(nitems);
+ d_corr = (gr_complex *)
+ volk_malloc(sizeof(gr_complex)*nitems, volk_get_alignment());
+ d_corr_mag = (float *)
+ volk_malloc(sizeof(float)*nitems, volk_get_alignment());
+ }
+
+ corr_est_cc_impl::~corr_est_cc_impl()
+ {
+ delete d_filter;
+ volk_free(d_corr);
+ volk_free(d_corr_mag);
+ }
+
+ std::vector<gr_complex>
+ corr_est_cc_impl::symbols() const
+ {
+ return d_symbols;
+ }
+
+ void
+ corr_est_cc_impl::set_symbols(const std::vector<gr_complex> &symbols)
+ {
+ gr::thread::scoped_lock lock(d_setlock);
+
+ d_symbols = symbols;
+
+ // Per comments in gr-filter/include/gnuradio/filter/fft_filter.h,
+ // set the block output multiple to the FFT filter kernel's internal,
+ // assumed "nsamples", to ensure the scheduler always passes a
+ // proper number of samples.
+ int nsamples;
+ nsamples = d_filter->set_taps(d_symbols);
+ set_output_multiple(nsamples);
+
+ // It looks like the kernel::fft_filter_ccc stashes a tail between
+ // calls, so that contains our filtering history (I think). The
+ // fft_filter_ccc block (which calls the kernel::fft_filter_ccc) sets
+ // the history to 1 (0 history items), so let's follow its lead.
+ //set_history(1);
+
+ // We'll (ab)use the history for our own purposes of tagging back in time.
+ // Keep a history of the length of the sync word to delay for tagging.
+ set_history(d_symbols.size()+1);
+
+ declare_sample_delay(1, 0);
+ declare_sample_delay(0, d_symbols.size());
+
+ d_mark_delay = d_mark_delay >= d_symbols.size() ? d_symbols.size()-1
+ : d_mark_delay;
+ }
+
+ int
+ corr_est_cc_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ gr::thread::scoped_lock lock(d_setlock);
+
+ const gr_complex *in = (gr_complex *)input_items[0];
+ gr_complex *out = (gr_complex*)output_items[0];
+ gr_complex *corr;
+ if (output_items.size() > 1)
+ corr = (gr_complex *) output_items[1];
+ else
+ corr = d_corr;
+
+ // Our correlation filter length
+ unsigned int hist_len = history() - 1;
+
+ // Delay the output by our correlation filter length so we can
+ // tag backwards in time
+ memcpy(out, &in[0], sizeof(gr_complex)*noutput_items);
+
+ // Calculate the correlation of the non-delayed input with the
+ // known symbols.
+ d_filter->filter(noutput_items, &in[hist_len], corr);
+
+ // Find the magnitude squared of the correlation
+ volk_32fc_magnitude_squared_32f(&d_corr_mag[0], corr, noutput_items);
+
+ int isps = (int)(d_sps + 0.5f);
+ int i = 0;
+ while(i < noutput_items) {
+ // Look for the correlator output to cross the threshold
+ if (d_corr_mag[i] <= d_thresh) {
+ i++;
+ continue;
+ }
+ // Go to (just past) the current correlator output peak
+ while ((i < (noutput_items-1)) &&
+ (d_corr_mag[i] < d_corr_mag[i+1]))
+ i++;
+
+ // Delaying the primary signal output by the matched filter
+ // length using history(), means that the the peak output of
+ // the matched filter aligns with the start of the desired
+ // sync word in the primary signal output. This corr_start
+ // tag is not offset to another sample, so that downstream
+ // data-aided blocks (like adaptive equalizers) know exactly
+ // where the start of the correlated symbols are.
+ add_item_tag(0, nitems_written(0) + i, pmt::intern("corr_start"),
+ pmt::from_double(d_corr_mag[i]), d_src_id);
+
+ // Peak detector using a "center of mass" approach center
+ // holds the +/- fraction of a sample index from the found
+ // peak index to the estimated actual peak index.
+ double center = 0.0;
+ if (i > 0 and i < (noutput_items - 1)) {
+ double nom = 0, den = 0;
+ for(int s = 0; s < 3; s++) {
+ nom += (s+1)*d_corr_mag[i+s-1];
+ den += d_corr_mag[i+s-1];
+ }
+ center = nom / den - 2.0;
+ }
+
+ // Calculate the phase offset of the incoming signal.
+ //
+ // The analytic cross-correlation is:
+ //
+ // 2A*e_bb(t-t_d)*exp(-j*2*pi*f*(t-t_d) - j*phi_bb(t-t_d) - j*theta_c)
+ //
+
+ // The analytic auto-correlation's envelope, e_bb(), has its
+ // peak at the "group delay" time, t = t_d. The analytic
+ // cross-correlation's center frequency phase shift, theta_c,
+ // is determined from the argument of the analytic
+ // cross-correlation at the "group delay" time, t = t_d.
+ //
+ // Taking the argument of the analytic cross-correlation at
+ // any other time will include the baseband auto-correlation's
+ // phase term, phi_bb(t-t_d), and a frequency dependent term
+ // of the cross-correlation, which I don't believe maps simply
+ // to expected symbol phase differences.
+ float phase = fast_atan2f(corr[i].imag(), corr[i].real());
+ int index = i + d_mark_delay;
+
+ add_item_tag(0, nitems_written(0) + index, pmt::intern("phase_est"),
+ pmt::from_double(phase), d_src_id);
+ add_item_tag(0, nitems_written(0) + index, pmt::intern("time_est"),
+ pmt::from_double(center), d_src_id);
+ // N.B. the appropriate d_corr_mag[] index is "i", not "index".
+ add_item_tag(0, nitems_written(0) + index, pmt::intern("corr_est"),
+ pmt::from_double(d_corr_mag[i]), d_src_id);
+
+ if (output_items.size() > 1) {
+ // N.B. these debug tags are not offset to avoid walking off out buf
+ add_item_tag(1, nitems_written(0) + i, pmt::intern("phase_est"),
+ pmt::from_double(phase), d_src_id);
+ add_item_tag(1, nitems_written(0) + i, pmt::intern("time_est"),
+ pmt::from_double(center), d_src_id);
+ add_item_tag(1, nitems_written(0) + i, pmt::intern("corr_est"),
+ pmt::from_double(d_corr_mag[i]), d_src_id);
+ }
+
+ // Skip ahead to the next potential symbol peak
+ // (for non-offset/interleaved symbols)
+ i += isps;
+ }
+
+ //if (output_items.size() > 1)
+ // add_item_tag(1, nitems_written(0) + noutput_items - 1,
+ // pmt::intern("ce_eow"), pmt::from_uint64(noutput_items),
+ // d_src_id);
+
+ return noutput_items;
+ }
+
+ } /* namespace digital */
+} /* namespace gr */
diff --git a/gr-digital/lib/corr_est_cc_impl.h b/gr-digital/lib/corr_est_cc_impl.h
new file mode 100644
index 0000000000..83b5db60e1
--- /dev/null
+++ b/gr-digital/lib/corr_est_cc_impl.h
@@ -0,0 +1,64 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2013 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DIGITAL_CORR_EST_CC_IMPL_H
+#define INCLUDED_DIGITAL_CORR_EST_CC_IMPL_H
+
+#include <gnuradio/digital/corr_est_cc.h>
+#include <gnuradio/filter/fft_filter.h>
+
+using namespace gr::filter;
+
+namespace gr {
+ namespace digital {
+
+ class corr_est_cc_impl : public corr_est_cc
+ {
+ private:
+ pmt::pmt_t d_src_id;
+ std::vector<gr_complex> d_symbols;
+ float d_sps;
+ unsigned int d_mark_delay;
+ float d_thresh;
+ kernel::fft_filter_ccc *d_filter;
+
+ gr_complex *d_corr;
+ float *d_corr_mag;
+
+ public:
+ corr_est_cc_impl(const std::vector<gr_complex> &symbols,
+ float sps, unsigned int mark_delay,
+ float threshold=0.9);
+ ~corr_est_cc_impl();
+
+ std::vector<gr_complex> symbols() const;
+ void set_symbols(const std::vector<gr_complex> &symbols);
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } // namespace digital
+} // namespace gr
+
+#endif /* INCLUDED_DIGITAL_CORR_EST_CC_IMPL_H */
diff --git a/gr-digital/lib/modulate_vector.cc b/gr-digital/lib/modulate_vector.cc
new file mode 100644
index 0000000000..281e3435c5
--- /dev/null
+++ b/gr-digital/lib/modulate_vector.cc
@@ -0,0 +1,70 @@
+/*
+* Copyright 2015 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.
+*
+*/
+
+/*
+* Generate a modulated transmit vector corresponding to a particular
+* data sequence, resampling rate, and shaping filter. The output is
+* suitable for use as a candidate filter for the correlate_and_sync
+* block, or just for prototyping.
+*
+* It accepts a sptr to a modulator block as an argument; given
+* suitable data vectors and arguments you should be able to use any of
+* the GNU Radio modulator blocks as a modulator. Be careful that some
+* modulators expect packed words, some expect unpacked words, and some
+* have unique expectations, requirements, or limitations.
+
+* modulator as: gr.block or gr.hier_block
+* taps as: list or array
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnuradio/blocks/vector_source_b.h>
+#include <gnuradio/blocks/vector_sink_c.h>
+#include <gnuradio/filter/fir_filter_ccf.h>
+#include <gnuradio/top_block.h>
+#include <gnuradio/digital/modulate_vector.h>
+
+namespace gr {
+ namespace digital {
+ std::vector<gr_complex> modulate_vector_bc(basic_block_sptr modulator,
+ std::vector<uint8_t> data,
+ std::vector<float> taps)
+ {
+ blocks::vector_source_b::sptr vector_src = blocks::vector_source_b::make(data);
+ filter::fir_filter_ccf::sptr filter = filter::fir_filter_ccf::make(1, taps);
+ blocks::vector_sink_c::sptr vector_sink = blocks::vector_sink_c::make();
+
+ top_block_sptr tb = make_top_block("modulate_vector");
+
+ tb->connect(vector_src, 0, modulator, 0);
+ tb->connect(modulator, 0, filter, 0);
+ tb->connect(filter, 0, vector_sink, 0);
+
+ tb->run();
+
+ return vector_sink->data();
+ }
+ } /* namespace digital */
+} /* namespace gr */
diff --git a/gr-digital/swig/digital_swig.i b/gr-digital/swig/digital_swig.i
index 43f68a3d6e..675c9b02b5 100644
--- a/gr-digital/swig/digital_swig.i
+++ b/gr-digital/swig/digital_swig.i
@@ -1,5 +1,5 @@
/*
- * Copyright 2011,2012 Free Software Foundation, Inc.
+ * Copyright 2011-2015 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -52,6 +52,7 @@
#include "gnuradio/digital/constellation_decoder_cb.h"
#include "gnuradio/digital/constellation_receiver_cb.h"
#include "gnuradio/digital/constellation_soft_decoder_cf.h"
+#include "gnuradio/digital/corr_est_cc.h"
#include "gnuradio/digital/correlate_access_code_bb.h"
#include "gnuradio/digital/correlate_access_code_tag_bb.h"
#include "gnuradio/digital/correlate_access_code_bb_ts.h"
@@ -78,6 +79,7 @@
#include "gnuradio/digital/lms_dd_equalizer_cc.h"
#include "gnuradio/digital/map_bb.h"
#include "gnuradio/digital/metric_type.h"
+#include "gnuradio/digital/modulate_vector.h"
#include "gnuradio/digital/mpsk_receiver_cc.h"
#include "gnuradio/digital/mpsk_snr_est.h"
#include "gnuradio/digital/mpsk_snr_est_cc.h"
@@ -128,6 +130,7 @@
%include "gnuradio/digital/constellation_decoder_cb.h"
%include "gnuradio/digital/constellation_receiver_cb.h"
%include "gnuradio/digital/constellation_soft_decoder_cf.h"
+%include "gnuradio/digital/corr_est_cc.h"
%include "gnuradio/digital/correlate_access_code_bb.h"
%include "gnuradio/digital/correlate_access_code_tag_bb.h"
%include "gnuradio/digital/correlate_access_code_bb_ts.h"
@@ -154,6 +157,7 @@
%include "gnuradio/digital/lms_dd_equalizer_cc.h"
%include "gnuradio/digital/map_bb.h"
%include "gnuradio/digital/metric_type.h"
+%include "gnuradio/digital/modulate_vector.h"
%include "gnuradio/digital/mpsk_receiver_cc.h"
%include "gnuradio/digital/mpsk_snr_est.h"
%include "gnuradio/digital/mpsk_snr_est_cc.h"
@@ -199,6 +203,7 @@ GR_SWIG_BLOCK_MAGIC2(digital, cma_equalizer_cc);
GR_SWIG_BLOCK_MAGIC2(digital, constellation_decoder_cb);
GR_SWIG_BLOCK_MAGIC2(digital, constellation_receiver_cb);
GR_SWIG_BLOCK_MAGIC2(digital, constellation_soft_decoder_cf);
+GR_SWIG_BLOCK_MAGIC2(digital, corr_est_cc);
GR_SWIG_BLOCK_MAGIC2(digital, correlate_access_code_bb);
GR_SWIG_BLOCK_MAGIC2(digital, correlate_access_code_tag_bb);
GR_SWIG_BLOCK_MAGIC2(digital, correlate_access_code_bb_ts);
diff --git a/gr-fec/examples/CMakeLists.txt b/gr-fec/examples/CMakeLists.txt
index b203e9cc8b..88d6d5c069 100644
--- a/gr-fec/examples/CMakeLists.txt
+++ b/gr-fec/examples/CMakeLists.txt
@@ -21,6 +21,7 @@ include(GrPython)
install(
FILES
+ 271.127.3.112
ber_test.grc
ber_curve_gen.grc
fecapi_decoders.grc
@@ -31,6 +32,7 @@ install(
fecapi_async_packed_decoders.grc
fecapi_tagged_decoders.grc
fecapi_tagged_encoders.grc
+ tpc_ber_curve_gen.grc
DESTINATION ${GR_PKG_FEC_EXAMPLES_DIR}
COMPONENT "fec_python"
)
diff --git a/gr-fec/examples/ber_curve_gen.grc b/gr-fec/examples/ber_curve_gen.grc
index 455dca4cf5..ba83715400 100644
--- a/gr-fec/examples/ber_curve_gen.grc
+++ b/gr-fec/examples/ber_curve_gen.grc
@@ -1,4 +1,5 @@
<?xml version='1.0' encoding='ASCII'?>
+<?grc format='1' created='3.7.7'?>
<flow_graph>
<timestamp>Tue May 13 19:32:00 2014</timestamp>
<block>
@@ -52,66 +53,20 @@
<value></value>
</param>
<param>
- <key>alias</key>
+ <key>thread_safe_setters</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(10, 10)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>variable</key>
- <param>
- <key>id</key>
- <value>samp_rate_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>value</key>
- <value>35000000</value>
- </param>
- <param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(12, 99)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>variable</key>
- <param>
- <key>id</key>
- <value>k</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>value</key>
- <value>7</value>
- </param>
- <param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(16, 370)</value>
+ <value>(8, 11)</value>
</param>
<param>
<key>_rotation</key>
@@ -137,8 +92,12 @@
<value></value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(110, 371)</value>
+ <value>(80, 379)</value>
</param>
<param>
<key>_rotation</key>
@@ -164,35 +123,12 @@
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(249, 373)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>variable</key>
- <param>
- <key>id</key>
- <value>framebits</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>value</key>
- <value>4096</value>
- </param>
- <param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(160, 101)</value>
+ <value>(8, 315)</value>
</param>
<param>
<key>_rotation</key>
@@ -203,7 +139,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>esno_0</value>
+ <value>k</value>
</param>
<param>
<key>_enabled</key>
@@ -211,58 +147,19 @@
</param>
<param>
<key>value</key>
- <value>numpy.arange(0, 8, .5) </value>
+ <value>7</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(13, 193)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>variable_dummy_decoder_def</key>
- <param>
- <key>id</key>
- <value>dec_dummy</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>value</key>
- <value>"ok"</value>
- </param>
- <param>
- <key>ndim</key>
- <value>2</value>
- </param>
- <param>
- <key>dim1</key>
- <value>len(esno_0)</value>
- </param>
- <param>
- <key>dim2</key>
- <value>1</value>
- </param>
- <param>
- <key>framebits</key>
- <value>framebits</value>
- </param>
- <param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(594, 604)</value>
+ <value>(8, 379)</value>
</param>
<param>
<key>_rotation</key>
@@ -270,10 +167,10 @@
</param>
</block>
<block>
- <key>variable_dummy_encoder_def</key>
+ <key>variable</key>
<param>
<key>id</key>
- <value>enc_dummy</value>
+ <value>samp_rate_0</value>
</param>
<param>
<key>_enabled</key>
@@ -281,31 +178,19 @@
</param>
<param>
<key>value</key>
- <value>"ok"</value>
- </param>
- <param>
- <key>ndim</key>
- <value>2</value>
- </param>
- <param>
- <key>dim1</key>
- <value>len(esno_0)</value>
- </param>
- <param>
- <key>dim2</key>
- <value>1</value>
+ <value>35000000</value>
</param>
<param>
- <key>framebits</key>
- <value>framebits</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(592, 455)</value>
+ <value>(8, 75)</value>
</param>
<param>
<key>_rotation</key>
@@ -313,10 +198,10 @@
</param>
</block>
<block>
- <key>variable_repetition_encoder_def</key>
+ <key>variable</key>
<param>
<key>id</key>
- <value>enc_rep</value>
+ <value>framebits</value>
</param>
<param>
<key>_enabled</key>
@@ -324,35 +209,19 @@
</param>
<param>
<key>value</key>
- <value>"ok"</value>
- </param>
- <param>
- <key>ndim</key>
- <value>2</value>
- </param>
- <param>
- <key>dim1</key>
- <value>len(esno_0)</value>
- </param>
- <param>
- <key>dim2</key>
- <value>1</value>
- </param>
- <param>
- <key>framebits</key>
- <value>framebits</value>
+ <value>4096</value>
</param>
<param>
- <key>rep</key>
- <value>3</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(301, 455)</value>
+ <value>(112, 75)</value>
</param>
<param>
<key>_rotation</key>
@@ -360,10 +229,10 @@
</param>
</block>
<block>
- <key>variable_cc_encoder_def</key>
+ <key>variable</key>
<param>
<key>id</key>
- <value>enc_cc</value>
+ <value>esno_0</value>
</param>
<param>
<key>_enabled</key>
@@ -371,51 +240,19 @@
</param>
<param>
<key>value</key>
- <value>"ok"</value>
- </param>
- <param>
- <key>ndim</key>
- <value>2</value>
- </param>
- <param>
- <key>dim1</key>
- <value>len(esno_0)</value>
- </param>
- <param>
- <key>dim2</key>
- <value>1</value>
- </param>
- <param>
- <key>framebits</key>
- <value>framebits</value>
- </param>
- <param>
- <key>k</key>
- <value>k</value>
- </param>
- <param>
- <key>rate</key>
- <value>rate</value>
- </param>
- <param>
- <key>polys</key>
- <value>polys</value>
- </param>
- <param>
- <key>state_start</key>
- <value>0</value>
+ <value>numpy.arange(0, 8, .5) </value>
</param>
<param>
- <key>mode</key>
- <value>fec.CC_STREAMING</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(13, 451)</value>
+ <value>(8, 139)</value>
</param>
<param>
<key>_rotation</key>
@@ -423,128 +260,78 @@
</param>
</block>
<block>
- <key>variable_cc_decoder_def</key>
+ <key>fec_bercurve_generator</key>
<param>
<key>id</key>
- <value>dec_cc</value>
+ <value>fec_bercurve_generator_0_1</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>value</key>
- <value>"ok"</value>
- </param>
- <param>
- <key>ndim</key>
- <value>2</value>
- </param>
- <param>
- <key>dim1</key>
- <value>len(esno_0)</value>
- </param>
- <param>
- <key>dim2</key>
- <value>1</value>
- </param>
- <param>
- <key>framebits</key>
- <value>framebits</value>
+ <key>esno</key>
+ <value>esno_0</value>
</param>
<param>
- <key>k</key>
- <value>k</value>
+ <key>samp_rate</key>
+ <value>samp_rate_0</value>
</param>
<param>
- <key>rate</key>
- <value>rate</value>
+ <key>encoder_list</key>
+ <value>enc_ldpc</value>
</param>
<param>
- <key>polys</key>
- <value>polys</value>
+ <key>decoder_list</key>
+ <value>dec_ldpc</value>
</param>
<param>
- <key>state_start</key>
- <value>0</value>
+ <key>puncpat</key>
+ <value>'11'</value>
</param>
<param>
- <key>state_end</key>
- <value>-1</value>
+ <key>threadtype</key>
+ <value>"capillary"</value>
</param>
<param>
- <key>mode</key>
- <value>fec.CC_STREAMING</value>
+ <key>seed</key>
+ <value>-100</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(15, 705)</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>_rotation</key>
+ <key>minoutbuf</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>variable_repetition_decoder_def</key>
- <param>
- <key>id</key>
- <value>dec_rep</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>value</key>
- <value>"ok"</value>
- </param>
- <param>
- <key>ndim</key>
- <value>2</value>
- </param>
<param>
- <key>dim1</key>
- <value>len(esno_0)</value>
- </param>
- <param>
- <key>dim2</key>
- <value>1</value>
- </param>
- <param>
- <key>framebits</key>
- <value>framebits</value>
- </param>
- <param>
- <key>rep</key>
- <value>3</value>
- </param>
- <param>
- <key>prob</key>
- <value>0.5</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(301, 626)</value>
+ <value>(248, 299)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
+ <bus_source>1</bus_source>
</block>
<block>
<key>fec_bercurve_generator</key>
<param>
<key>id</key>
- <value>fec_bercurve_generator_0_0_0</value>
+ <value>fec_bercurve_generator_0</value>
</param>
<param>
<key>_enabled</key>
@@ -560,11 +347,11 @@
</param>
<param>
<key>encoder_list</key>
- <value>enc_dummy</value>
+ <value>enc_cc</value>
</param>
<param>
<key>decoder_list</key>
- <value>dec_dummy</value>
+ <value>dec_cc</value>
</param>
<param>
<key>puncpat</key>
@@ -595,8 +382,12 @@
<value>0</value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(481, 9)</value>
+ <value>(248, 203)</value>
</param>
<param>
<key>_rotation</key>
@@ -659,8 +450,12 @@
<value>0</value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(481, 132)</value>
+ <value>(248, 107)</value>
</param>
<param>
<key>_rotation</key>
@@ -672,7 +467,7 @@
<key>fec_bercurve_generator</key>
<param>
<key>id</key>
- <value>fec_bercurve_generator_0</value>
+ <value>fec_bercurve_generator_0_0_0</value>
</param>
<param>
<key>_enabled</key>
@@ -688,11 +483,11 @@
</param>
<param>
<key>encoder_list</key>
- <value>enc_cc</value>
+ <value>enc_dummy</value>
</param>
<param>
<key>decoder_list</key>
- <value>dec_cc</value>
+ <value>dec_dummy</value>
</param>
<param>
<key>puncpat</key>
@@ -723,8 +518,12 @@
<value>0</value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(481, 260)</value>
+ <value>(248, 11)</value>
</param>
<param>
<key>_rotation</key>
@@ -756,7 +555,7 @@
</param>
<param>
<key>num_curves</key>
- <value>3</value>
+ <value>5</value>
</param>
<param>
<key>curvenames</key>
@@ -852,19 +651,19 @@
</param>
<param>
<key>label4</key>
- <value></value>
+ <value>LDPC</value>
</param>
<param>
<key>width4</key>
- <value>1</value>
+ <value>2</value>
</param>
<param>
<key>color4</key>
- <value>"red"</value>
+ <value>"dark red"</value>
</param>
<param>
<key>style4</key>
- <value>0</value>
+ <value>5</value>
</param>
<param>
<key>marker4</key>
@@ -876,19 +675,19 @@
</param>
<param>
<key>label5</key>
- <value></value>
+ <value>TPC</value>
</param>
<param>
<key>width5</key>
- <value>1</value>
+ <value>2</value>
</param>
<param>
<key>color5</key>
- <value>"red"</value>
+ <value>"Dark Blue"</value>
</param>
<param>
<key>style5</key>
- <value>0</value>
+ <value>4</value>
</param>
<param>
<key>marker5</key>
@@ -1027,8 +826,12 @@
<value></value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(925, 56)</value>
+ <value>(696, 15)</value>
</param>
<param>
<key>_rotation</key>
@@ -1036,205 +839,1247 @@
</param>
<bus_sink>1</bus_sink>
</block>
+ <block>
+ <key>variable_tpc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_tpc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(776, 467)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_dummy_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_dummy</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>framebits</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(424, 659)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_repetition_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_rep</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>framebits</value>
+ </param>
+ <param>
+ <key>rep</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>prob</key>
+ <value>0.5</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(216, 739)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_dummy_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_dummy</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>framebits</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(424, 771)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_cc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_cc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>framebits</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>polys</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>state_end</key>
+ <value>-1</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
+ </param>
+ <param>
+ <key>padding</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 659)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_cc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_cc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>framebits</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>polys</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>state_start</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>mode</key>
+ <value>fec.CC_STREAMING</value>
+ </param>
+ <param>
+ <key>padding</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 451)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_repetition_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_rep</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>framebits</key>
+ <value>framebits</value>
+ </param>
+ <param>
+ <key>rep</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(216, 603)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_tpc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>max_iter</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>decoder_type</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(776, 659)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_ldpc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_ldpc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>file</key>
+ <value>271.127.3.112</value>
+ </param>
+ <param>
+ <key>sigma</key>
+ <value>0.5</value>
+ </param>
+ <param>
+ <key>max_iter</key>
+ <value>50</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(608, 739)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_ldpc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_ldpc</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>file</key>
+ <value>271.127.3.112</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(608, 627)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_bercurve_generator</key>
+ <param>
+ <key>id</key>
+ <value>fec_bercurve_generator_0_1_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno_0</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate_0</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_tpc</value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>dec_tpc</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>"capillary"</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-100</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(248, 395)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <bus_source>1</bus_source>
+ </block>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>0</sink_key>
+ <sink_key>128</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>1</source_key>
- <sink_key>1</sink_key>
+ <sink_key>129</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>2</source_key>
- <sink_key>2</sink_key>
+ <sink_key>130</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>3</source_key>
- <sink_key>3</sink_key>
+ <sink_key>131</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>4</source_key>
- <sink_key>4</sink_key>
+ <sink_key>132</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>5</source_key>
- <sink_key>5</sink_key>
+ <sink_key>133</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>6</source_key>
- <sink_key>6</sink_key>
+ <sink_key>134</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>7</source_key>
- <sink_key>7</sink_key>
+ <sink_key>135</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>8</source_key>
- <sink_key>8</sink_key>
+ <sink_key>136</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>9</source_key>
- <sink_key>9</sink_key>
+ <sink_key>137</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>10</source_key>
- <sink_key>10</sink_key>
+ <sink_key>138</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>11</source_key>
- <sink_key>11</sink_key>
+ <sink_key>139</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>12</source_key>
- <sink_key>12</sink_key>
+ <sink_key>140</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>13</source_key>
- <sink_key>13</sink_key>
+ <sink_key>141</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>14</source_key>
- <sink_key>14</sink_key>
+ <sink_key>142</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>15</source_key>
- <sink_key>15</sink_key>
+ <sink_key>143</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>16</source_key>
- <sink_key>16</sink_key>
+ <sink_key>144</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>17</source_key>
- <sink_key>17</sink_key>
+ <sink_key>145</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>18</source_key>
- <sink_key>18</sink_key>
+ <sink_key>146</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>19</source_key>
- <sink_key>19</sink_key>
+ <sink_key>147</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>20</source_key>
- <sink_key>20</sink_key>
+ <sink_key>148</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>21</source_key>
- <sink_key>21</sink_key>
+ <sink_key>149</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>22</source_key>
- <sink_key>22</sink_key>
+ <sink_key>150</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>23</source_key>
- <sink_key>23</sink_key>
+ <sink_key>151</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>24</source_key>
- <sink_key>24</sink_key>
+ <sink_key>152</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>25</source_key>
- <sink_key>25</sink_key>
+ <sink_key>153</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>26</source_key>
- <sink_key>26</sink_key>
+ <sink_key>154</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>27</source_key>
- <sink_key>27</sink_key>
+ <sink_key>155</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>28</source_key>
- <sink_key>28</sink_key>
+ <sink_key>156</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>29</source_key>
- <sink_key>29</sink_key>
+ <sink_key>157</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>30</source_key>
- <sink_key>30</sink_key>
+ <sink_key>158</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>31</source_key>
- <sink_key>31</sink_key>
+ <sink_key>159</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>32</source_key>
+ <sink_key>164</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
<sink_key>96</sink_key>
</connection>
<connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>97</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>98</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>99</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>100</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>101</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>102</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>103</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>104</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>105</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>106</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>107</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>108</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>109</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>110</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>111</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>112</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>113</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>114</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>115</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>116</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>21</source_key>
+ <sink_key>117</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>22</source_key>
+ <sink_key>118</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>23</source_key>
+ <sink_key>119</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>24</source_key>
+ <sink_key>120</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>25</source_key>
+ <sink_key>121</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>26</source_key>
+ <sink_key>122</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>27</source_key>
+ <sink_key>123</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>28</source_key>
+ <sink_key>124</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>29</source_key>
+ <sink_key>125</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>30</source_key>
+ <sink_key>126</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>31</source_key>
+ <sink_key>127</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>32</source_key>
+ <sink_key>163</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>64</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>65</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>66</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>67</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>68</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>69</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>70</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>71</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>72</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>73</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>74</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>75</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>76</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>77</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>78</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>79</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>80</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>81</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>82</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>83</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>84</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>21</source_key>
+ <sink_key>85</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>22</source_key>
+ <sink_key>86</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>23</source_key>
+ <sink_key>87</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>24</source_key>
+ <sink_key>88</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>25</source_key>
+ <sink_key>89</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>26</source_key>
+ <sink_key>90</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>27</source_key>
+ <sink_key>91</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>28</source_key>
+ <sink_key>92</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>29</source_key>
+ <sink_key>93</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>30</source_key>
+ <sink_key>94</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>31</source_key>
+ <sink_key>95</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>32</source_key>
+ <sink_key>162</sink_key>
+ </connection>
+ <connection>
<source_block_id>fec_bercurve_generator_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>0</source_key>
@@ -1430,204 +2275,204 @@
<source_block_id>fec_bercurve_generator_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>32</source_key>
- <sink_key>97</sink_key>
+ <sink_key>161</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>0</source_key>
- <sink_key>64</sink_key>
+ <sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>1</source_key>
- <sink_key>65</sink_key>
+ <sink_key>1</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>2</source_key>
- <sink_key>66</sink_key>
+ <sink_key>2</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>3</source_key>
- <sink_key>67</sink_key>
+ <sink_key>3</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>4</source_key>
- <sink_key>68</sink_key>
+ <sink_key>4</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>5</source_key>
- <sink_key>69</sink_key>
+ <sink_key>5</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>6</source_key>
- <sink_key>70</sink_key>
+ <sink_key>6</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>7</source_key>
- <sink_key>71</sink_key>
+ <sink_key>7</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>8</source_key>
- <sink_key>72</sink_key>
+ <sink_key>8</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>9</source_key>
- <sink_key>73</sink_key>
+ <sink_key>9</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>10</source_key>
- <sink_key>74</sink_key>
+ <sink_key>10</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>11</source_key>
- <sink_key>75</sink_key>
+ <sink_key>11</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>12</source_key>
- <sink_key>76</sink_key>
+ <sink_key>12</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>13</source_key>
- <sink_key>77</sink_key>
+ <sink_key>13</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>14</source_key>
- <sink_key>78</sink_key>
+ <sink_key>14</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>15</source_key>
- <sink_key>79</sink_key>
+ <sink_key>15</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>16</source_key>
- <sink_key>80</sink_key>
+ <sink_key>16</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>17</source_key>
- <sink_key>81</sink_key>
+ <sink_key>17</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>18</source_key>
- <sink_key>82</sink_key>
+ <sink_key>18</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>19</source_key>
- <sink_key>83</sink_key>
+ <sink_key>19</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>20</source_key>
- <sink_key>84</sink_key>
+ <sink_key>20</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>21</source_key>
- <sink_key>85</sink_key>
+ <sink_key>21</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>22</source_key>
- <sink_key>86</sink_key>
+ <sink_key>22</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>23</source_key>
- <sink_key>87</sink_key>
+ <sink_key>23</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>24</source_key>
- <sink_key>88</sink_key>
+ <sink_key>24</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>25</source_key>
- <sink_key>89</sink_key>
+ <sink_key>25</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>26</source_key>
- <sink_key>90</sink_key>
+ <sink_key>26</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>27</source_key>
- <sink_key>91</sink_key>
+ <sink_key>27</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>28</source_key>
- <sink_key>92</sink_key>
+ <sink_key>28</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>29</source_key>
- <sink_key>93</sink_key>
+ <sink_key>29</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>30</source_key>
- <sink_key>94</sink_key>
+ <sink_key>30</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>31</source_key>
- <sink_key>95</sink_key>
+ <sink_key>31</sink_key>
</connection>
<connection>
- <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
<sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
<source_key>32</source_key>
- <sink_key>98</sink_key>
+ <sink_key>160</sink_key>
</connection>
</flow_graph>
diff --git a/gr-fec/examples/tpc_ber_curve_gen.grc b/gr-fec/examples/tpc_ber_curve_gen.grc
new file mode 100644
index 0000000000..7d595cf47c
--- /dev/null
+++ b/gr-fec/examples/tpc_ber_curve_gen.grc
@@ -0,0 +1,2610 @@
+<?xml version='1.0' encoding='ASCII'?>
+<?grc format='1' created='3.7.7'?>
+<flow_graph>
+ <timestamp>Tue May 13 19:32:00 2014</timestamp>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>framebits</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>4096</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(112, 75)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>polys</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>[79, 109]</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(80, 379)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>rate</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 315)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>k</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>7</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 379)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>samp_rate_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>35000000</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 75)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>id</key>
+ <value>esno_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>numpy.arange(0, 8, .5) </value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 139)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_tpc_2</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(416, 483)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_tpc_3</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(616, 483)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_tpc_4</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(896, 483)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_tpc_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>max_iter</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>decoder_type</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(216, 675)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_tpc_2</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>max_iter</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>decoder_type</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(416, 675)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_tpc_3</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>max_iter</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>decoder_type</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(616, 675)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_tpc_4</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>max_iter</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>decoder_type</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(896, 675)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_decoder_def</key>
+ <param>
+ <key>id</key>
+ <value>dec_tpc_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>max_iter</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>decoder_type</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(16, 675)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_tpc_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(16, 483)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_tpc_encoder_def</key>
+ <param>
+ <key>id</key>
+ <value>enc_tpc_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>"ok"</value>
+ </param>
+ <param>
+ <key>ndim</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>dim1</key>
+ <value>len(esno_0)</value>
+ </param>
+ <param>
+ <key>dim2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>row_poly</key>
+ <value>[3]</value>
+ </param>
+ <param>
+ <key>col_poly</key>
+ <value>[43]</value>
+ </param>
+ <param>
+ <key>krow</key>
+ <value>26</value>
+ </param>
+ <param>
+ <key>kcol</key>
+ <value>6</value>
+ </param>
+ <param>
+ <key>bval</key>
+ <value>9</value>
+ </param>
+ <param>
+ <key>qval</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(216, 483)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_bercurve_generator</key>
+ <param>
+ <key>id</key>
+ <value>fec_bercurve_generator_0_1_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno_0</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate_0</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_tpc_4</value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>dec_tpc_4</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>"capillary"</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-100</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(248, 395)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <bus_source>1</bus_source>
+ </block>
+ <block>
+ <key>fec_bercurve_generator</key>
+ <param>
+ <key>id</key>
+ <value>fec_bercurve_generator_0_1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno_0</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate_0</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_tpc_3</value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>dec_tpc_3</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>"capillary"</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-100</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(248, 299)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <bus_source>1</bus_source>
+ </block>
+ <block>
+ <key>fec_bercurve_generator</key>
+ <param>
+ <key>id</key>
+ <value>fec_bercurve_generator_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno_0</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate_0</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_tpc_2</value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>dec_tpc_2</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>"capillary"</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-100</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(248, 203)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <bus_source>1</bus_source>
+ </block>
+ <block>
+ <key>fec_bercurve_generator</key>
+ <param>
+ <key>id</key>
+ <value>fec_bercurve_generator_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno_0</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate_0</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_tpc_1</value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>dec_tpc_1</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>"capillary"</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-100</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(248, 107)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <bus_source>1</bus_source>
+ </block>
+ <block>
+ <key>fec_bercurve_generator</key>
+ <param>
+ <key>id</key>
+ <value>fec_bercurve_generator_0_0_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno_0</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate_0</value>
+ </param>
+ <param>
+ <key>encoder_list</key>
+ <value>enc_tpc_0</value>
+ </param>
+ <param>
+ <key>decoder_list</key>
+ <value>dec_tpc_0</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>'11'</value>
+ </param>
+ <param>
+ <key>threadtype</key>
+ <value>"capillary"</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>-100</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(248, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <bus_source>1</bus_source>
+ </block>
+ <block>
+ <key>qtgui_bercurve_sink</key>
+ <param>
+ <key>id</key>
+ <value>qtgui_bercurve_sink_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>esno</key>
+ <value>esno_0</value>
+ </param>
+ <param>
+ <key>berminerrors</key>
+ <value>1000</value>
+ </param>
+ <param>
+ <key>berlimit</key>
+ <value>-10</value>
+ </param>
+ <param>
+ <key>num_curves</key>
+ <value>5</value>
+ </param>
+ <param>
+ <key>curvenames</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>ymin</key>
+ <value>-10</value>
+ </param>
+ <param>
+ <key>ymax</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>update_time</key>
+ <value>0.10</value>
+ </param>
+ <param>
+ <key>gui_hint</key>
+ <value></value>
+ </param>
+ <param>
+ <key>label1</key>
+ <value>Linear LOG-MAP</value>
+ </param>
+ <param>
+ <key>width1</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>color1</key>
+ <value>"blue"</value>
+ </param>
+ <param>
+ <key>style1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>marker1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha1</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label2</key>
+ <value>MAX LOG-MAP</value>
+ </param>
+ <param>
+ <key>width2</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>color2</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style2</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>marker2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alpha2</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label3</key>
+ <value>Constant LOG-MAP</value>
+ </param>
+ <param>
+ <key>width3</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>color3</key>
+ <value>"magenta"</value>
+ </param>
+ <param>
+ <key>style3</key>
+ <value>5</value>
+ </param>
+ <param>
+ <key>marker3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha3</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>label4</key>
+ <value>LOG-MAP (LUT)</value>
+ </param>
+ <param>
+ <key>width4</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>color4</key>
+ <value>"dark red"</value>
+ </param>
+ <param>
+ <key>style4</key>
+ <value>5</value>
+ </param>
+ <param>
+ <key>marker4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha4</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label5</key>
+ <value>LOG-MAP (C Correction)</value>
+ </param>
+ <param>
+ <key>width5</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>color5</key>
+ <value>"Dark Blue"</value>
+ </param>
+ <param>
+ <key>style5</key>
+ <value>4</value>
+ </param>
+ <param>
+ <key>marker5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha5</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width6</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color6</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha6</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width7</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color7</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha7</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width8</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color8</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha8</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width9</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color9</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha9</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>label10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>width10</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>color10</key>
+ <value>"red"</value>
+ </param>
+ <param>
+ <key>style10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>marker10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>alpha10</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(696, 15)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <bus_sink>1</bus_sink>
+ </block>
+ <block>
+ <key>options</key>
+ <param>
+ <key>id</key>
+ <value>tpc_ber_curve_gen</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value></value>
+ </param>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>2000,2000</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>qt_gui</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>thread_safe_setters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>128</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>129</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>130</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>131</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>132</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>133</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>134</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>135</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>136</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>137</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>138</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>139</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>140</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>141</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>142</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>143</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>144</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>145</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>146</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>147</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>148</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>21</source_key>
+ <sink_key>149</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>22</source_key>
+ <sink_key>150</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>23</source_key>
+ <sink_key>151</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>24</source_key>
+ <sink_key>152</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>25</source_key>
+ <sink_key>153</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>26</source_key>
+ <sink_key>154</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>27</source_key>
+ <sink_key>155</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>28</source_key>
+ <sink_key>156</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>29</source_key>
+ <sink_key>157</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>30</source_key>
+ <sink_key>158</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>31</source_key>
+ <sink_key>159</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>32</source_key>
+ <sink_key>164</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>96</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>97</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>98</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>99</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>100</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>101</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>102</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>103</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>104</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>105</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>106</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>107</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>108</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>109</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>110</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>111</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>112</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>113</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>114</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>115</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>116</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>21</source_key>
+ <sink_key>117</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>22</source_key>
+ <sink_key>118</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>23</source_key>
+ <sink_key>119</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>24</source_key>
+ <sink_key>120</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>25</source_key>
+ <sink_key>121</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>26</source_key>
+ <sink_key>122</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>27</source_key>
+ <sink_key>123</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>28</source_key>
+ <sink_key>124</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>29</source_key>
+ <sink_key>125</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>30</source_key>
+ <sink_key>126</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>31</source_key>
+ <sink_key>127</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_1</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>32</source_key>
+ <sink_key>163</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>64</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>65</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>66</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>67</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>68</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>69</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>70</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>71</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>72</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>73</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>74</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>75</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>76</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>77</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>78</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>79</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>80</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>81</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>82</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>83</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>84</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>21</source_key>
+ <sink_key>85</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>22</source_key>
+ <sink_key>86</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>23</source_key>
+ <sink_key>87</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>24</source_key>
+ <sink_key>88</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>25</source_key>
+ <sink_key>89</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>26</source_key>
+ <sink_key>90</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>27</source_key>
+ <sink_key>91</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>28</source_key>
+ <sink_key>92</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>29</source_key>
+ <sink_key>93</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>30</source_key>
+ <sink_key>94</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>31</source_key>
+ <sink_key>95</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>32</source_key>
+ <sink_key>162</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>32</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>33</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>34</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>35</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>36</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>37</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>38</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>39</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>40</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>41</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>42</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>43</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>44</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>45</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>46</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>47</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>48</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>49</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>50</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>51</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>52</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>21</source_key>
+ <sink_key>53</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>22</source_key>
+ <sink_key>54</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>23</source_key>
+ <sink_key>55</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>24</source_key>
+ <sink_key>56</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>25</source_key>
+ <sink_key>57</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>26</source_key>
+ <sink_key>58</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>27</source_key>
+ <sink_key>59</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>28</source_key>
+ <sink_key>60</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>29</source_key>
+ <sink_key>61</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>30</source_key>
+ <sink_key>62</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>31</source_key>
+ <sink_key>63</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>32</source_key>
+ <sink_key>161</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>1</source_key>
+ <sink_key>1</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>2</source_key>
+ <sink_key>2</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>3</source_key>
+ <sink_key>3</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>4</source_key>
+ <sink_key>4</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>5</source_key>
+ <sink_key>5</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>6</source_key>
+ <sink_key>6</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>7</source_key>
+ <sink_key>7</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>8</source_key>
+ <sink_key>8</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>9</source_key>
+ <sink_key>9</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>10</source_key>
+ <sink_key>10</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>11</source_key>
+ <sink_key>11</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>12</source_key>
+ <sink_key>12</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>13</source_key>
+ <sink_key>13</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>14</source_key>
+ <sink_key>14</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>15</source_key>
+ <sink_key>15</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>16</source_key>
+ <sink_key>16</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>17</source_key>
+ <sink_key>17</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>18</source_key>
+ <sink_key>18</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>19</source_key>
+ <sink_key>19</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>20</source_key>
+ <sink_key>20</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>21</source_key>
+ <sink_key>21</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>22</source_key>
+ <sink_key>22</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>23</source_key>
+ <sink_key>23</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>24</source_key>
+ <sink_key>24</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>25</source_key>
+ <sink_key>25</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>26</source_key>
+ <sink_key>26</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>27</source_key>
+ <sink_key>27</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>28</source_key>
+ <sink_key>28</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>29</source_key>
+ <sink_key>29</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>30</source_key>
+ <sink_key>30</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>31</source_key>
+ <sink_key>31</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_bercurve_generator_0_0_0</source_block_id>
+ <sink_block_id>qtgui_bercurve_sink_0</sink_block_id>
+ <source_key>32</source_key>
+ <sink_key>160</sink_key>
+ </connection>
+</flow_graph>
diff --git a/gr-fec/include/gnuradio/fec/tpc_decoder.h b/gr-fec/include/gnuradio/fec/tpc_decoder.h
index aa09430bf7..13d7141819 100644
--- a/gr-fec/include/gnuradio/fec/tpc_decoder.h
+++ b/gr-fec/include/gnuradio/fec/tpc_decoder.h
@@ -32,7 +32,7 @@ typedef unsigned char OUTPUT_DATATYPE;
#include <vector>
namespace gr {
- namespace fec {
+ namespace fec {
#define MAXLOG 1e7
@@ -53,16 +53,16 @@ class FEC_API tpc_decoder : public generic_decoder {
std::vector<int> d_rowpolys;
std::vector<int> d_colpolys;
-
+
unsigned int d_krow;
unsigned int d_kcol;
-
+
int d_bval;
int d_qval;
-
+
int d_max_iter;
int d_decoder_type;
-
+
// store the state transitions & outputs
int rowNumStates;
std::vector< std::vector<int> > rowOutputs;
@@ -70,7 +70,7 @@ class FEC_API tpc_decoder : public generic_decoder {
int colNumStates;
std::vector< std::vector<int> > colOutputs;
std::vector< std::vector<int> > colNextStates;
-
+
int rowEncoder_K;
int rowEncoder_n;
int rowEncoder_m;
@@ -79,15 +79,15 @@ class FEC_API tpc_decoder : public generic_decoder {
int colEncoder_m;
int outputSize;
int inputSize;
-
+
uint32_t codeword_M;
uint32_t codeword_N;
-
+
int mInit, nInit;
// memory allocated for processing
int inputSizeWithPad;
-
+
std::vector< std::vector<float> > channel_llr;
std::vector< std::vector<float> > Z;
std::vector<float> extrinsic_info;
@@ -99,7 +99,7 @@ class FEC_API tpc_decoder : public generic_decoder {
std::vector<float> output_u_cols;
std::vector<float> output_c_rows;
std::vector<float> output_c_cols;
-
+
uint32_t numInitLoadIter;
int numInitRemaining;
int output_c_col_idx;
@@ -107,7 +107,7 @@ class FEC_API tpc_decoder : public generic_decoder {
bool earlyExit;
FILE *fp;
-
+
// soft input soft output decoding
int mm_row, max_states_row, num_symbols_row;
std::vector< std::vector<float> > beta_row;
@@ -118,7 +118,7 @@ class FEC_API tpc_decoder : public generic_decoder {
std::vector<float> num_llr_c_row;
std::vector<float> den_llr_c_row;
void siso_decode_row();
-
+
int mm_col, max_states_col, num_symbols_col;
std::vector< std::vector<float> > beta_col;
std::vector<float> alpha_prime_col;
@@ -132,15 +132,15 @@ class FEC_API tpc_decoder : public generic_decoder {
// Computes the branch metric used for decoding, returning a metric between the
// hypothetical symbol and received vector
float gamma(const std::vector<float> rec_array, const int symbol);
-
+
float (tpc_decoder::*max_star)(const float, const float);
-
+
float linear_log_map(const float delta1, const float delta2);
float max_log_map(const float delta1, const float delta2);
float constant_log_map(const float delta1, const float delta2);
float log_map_lut_correction(const float delta1, const float delta2);
float log_map_cfunction_correction(const float delta1, const float delta2);
-
+
template <typename T> static int sgn(T val);
public:
diff --git a/gr-fec/lib/tpc_decoder.cc b/gr-fec/lib/tpc_decoder.cc
index 700721dbf0..b3fbcc92df 100644
--- a/gr-fec/lib/tpc_decoder.cc
+++ b/gr-fec/lib/tpc_decoder.cc
@@ -35,8 +35,8 @@
#include <gnuradio/fec/maxstar.h>
-namespace gr {
- namespace fec {
+namespace gr {
+ namespace fec {
generic_decoder::sptr
tpc_decoder::make(std::vector<int> row_polys, std::vector<int> col_polys, int krow, int kcol, int bval, int qval, int max_iter, int decoder_type)
@@ -51,46 +51,47 @@ tpc_decoder::tpc_decoder (std::vector<int> row_polys, std::vector<int> col_polys
// first we operate on data chunks of get_input_size()
// TODO: should we verify this and throw an error if it doesn't match? YES
// hwo do we do that?
-
+
rowEncoder_K = ceil(log(d_rowpolys[0])/log(2)); // rowEncoder_K is the constraint length of the row encoder polynomial
rowEncoder_n = d_rowpolys.size();
rowEncoder_m = rowEncoder_K - 1;
colEncoder_K = ceil(log(d_colpolys[0])/log(2)); // colEncoder_K is the constraint length of the col encoder polynomial
colEncoder_n = d_colpolys.size();
colEncoder_m = colEncoder_K - 1;
-
+
// calculate the input and output sizes
inputSize = ((d_krow+rowEncoder_m)*rowEncoder_n)*((d_kcol+colEncoder_m)*colEncoder_n) - d_bval;
outputSize = (d_krow*d_kcol - (d_bval+d_qval));
-
+
+ fp = NULL;
//DEBUG_PRINT("inputSize=%d outputSize=%d\n", inputSize, outputSize);
//fp = fopen("c_decoder_output.txt", "w");
-
+
rowNumStates = 1 << (rowEncoder_m); // 2^(row_mm)
colNumStates = 1 << (colEncoder_m); // 2^(col_mm)
rowOutputs.resize(2, std::vector<int>(rowNumStates,0));
rowNextStates.resize(2, std::vector<int>(rowNumStates,0));
colOutputs.resize(2, std::vector<int>(colNumStates,0));
colNextStates.resize(2, std::vector<int>(colNumStates,0));;
-
+
// precalculate the state transition matrix for the row polynomial
- tpc_common::precomputeStateTransitionMatrix_RSCPoly(rowNumStates, d_rowpolys, rowEncoder_K, rowEncoder_n,
+ tpc_common::precomputeStateTransitionMatrix_RSCPoly(rowNumStates, d_rowpolys, rowEncoder_K, rowEncoder_n,
rowOutputs, rowNextStates);
-
+
// precalculate the state transition matrix for the column polynomial
- tpc_common::precomputeStateTransitionMatrix_RSCPoly(colNumStates, d_colpolys, colEncoder_K, colEncoder_n,
+ tpc_common::precomputeStateTransitionMatrix_RSCPoly(colNumStates, d_colpolys, colEncoder_K, colEncoder_n,
colOutputs, colNextStates);
-
+
codeword_M = d_kcol + colEncoder_K - 1;
codeword_N = d_krow + rowEncoder_K - 1;
-
+
// pre-allocate memory we use for encoding
inputSizeWithPad = inputSize + d_bval;
-
+
channel_llr.resize(codeword_M, std::vector<float>(codeword_N, 0));
Z.resize(codeword_M, std::vector<float>(codeword_N, 0));
extrinsic_info.resize(codeword_M*codeword_N, 0);
-
+
input_u_rows.resize(d_krow, 0);
input_u_cols.resize(d_kcol, 0);
input_c_rows.resize(codeword_N, 0);
@@ -98,10 +99,10 @@ tpc_decoder::tpc_decoder (std::vector<int> row_polys, std::vector<int> col_polys
output_u_rows.resize(d_krow, 0);
output_u_cols.resize(d_kcol, 0);
output_c_rows.resize(codeword_N, 0);
-
+
output_c_cols.resize(codeword_M*codeword_N, 0);
output_c_col_idx = 0;
-
+
// setup the max_star function based on decoder type
switch(d_decoder_type) {
case 0:
@@ -123,7 +124,7 @@ tpc_decoder::tpc_decoder (std::vector<int> row_polys, std::vector<int> col_polys
max_star = &tpc_decoder::linear_log_map;
break;
}
-
+
// declare the reverse sweep trellis
// the beta vector is logically layed out in memory as follows, assuming the
// following values (for educational purposes)
@@ -199,7 +200,7 @@ int tpc_decoder::get_input_size() {
// as well as some comments being added to help understand
// exactly what is going on w/ the siso decoder
void tpc_decoder::siso_decode_row() {
-
+
int LL, state, k, ii, symbol, mask;
float app_in, delta1, delta2;
LL = input_u_rows.size(); // code length
@@ -208,7 +209,7 @@ void tpc_decoder::siso_decode_row() {
float num_llr_u;
// log-likelihood ratio of the uncoded bit being a 0
float den_llr_u;
-
+
// initialize beta_row trellis
// this initialization is saying that the likelihood that the reverse sweep
// starts at state=0 is 100%, b/c state 1, 2, 3's likelihood's are basically -inf
@@ -218,7 +219,7 @@ void tpc_decoder::siso_decode_row() {
// }
// filling w/ 0xCC yields a value close to -MAXLOG, and memset is faster than for loops
memset(&beta_row[LL+rowEncoder_K-1][1], 0xCC, sizeof(float)*(max_states_row-1));
-
+
// initialize alpha_prime_row (current time instant), alpha_prime_row then gets updated
// by shifting in alpha_row at the end of each time instant of processing
// alpha_row needs to get initialized at the beginning of each processing loop, so we
@@ -230,7 +231,7 @@ void tpc_decoder::siso_decode_row() {
// alpha_prime_row[state] = -MAXLOG;
// }
memset(&alpha_prime_row[1], 0xCC, sizeof(float)*(max_states_row-1));
-
+
// compute the beta_row matrix first, which is the reverse sweep (hence we start at the last
// time instant-1 and work our way back to t=0). we start at last time instant-1 b/c
// we already filled in beta_row values for the last time instant, forcing the trellis to
@@ -245,30 +246,30 @@ void tpc_decoder::siso_decode_row() {
else {
app_in = 0;
}
-
+
// get the input associated w/ this time instant
memcpy(&rec_array_row[0], &input_c_rows[rowEncoder_n*k], sizeof(float)*rowEncoder_n);
-
+
// DEBUG_PRINT("k=%d\n", k);
// DEBUG_PRINT_F(fp, "k=%d\n", k);
-//
+//
// DEBUG_PRINT("rec_array -->\n");
// DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT(&rec_array_row[0], rec_array_row.size());
// DEBUG_PRINT_F(fp, "rec_array -->\n");
// DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT_F(fp, &rec_array_row[0], rec_array_row.size());
-
- // for each input at this time instant, create a metric which
+
+ // for each input at this time instant, create a metric which
// represents the likelihood that this input corresponds to
// each of the possible symbols
for(symbol=0; symbol<num_symbols_row; symbol++) {
metric_c_row[symbol] = gamma(rec_array_row, symbol);
}
-
+
// DEBUG_PRINT("metric_c -->\n");
// DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT(&metric_c_row[0], metric_c_row.size());
// DEBUG_PRINT_F(fp, "metric_c -->\n");
// DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT_F(fp, &metric_c_row[0], metric_c_row.size());
-
+
// step through all states -- populating the beta_row values for each node
// in the trellis diagram as shown above w/ the maximum-likelihood
// of this current node coming from the previous node
@@ -279,19 +280,19 @@ void tpc_decoder::siso_decode_row() {
delta2 = beta_row[k+1][rowNextStates[1][state]] + metric_c_row[rowOutputs[1][state]] + app_in;
// update beta_row
beta_row[k][state] = (*this.*max_star)(delta1, delta2);
-
+
// DEBUG_PRINT("delta1=%f delta2=%f beta=%f\n", delta1, delta2, beta_row[k][state]);
// DEBUG_PRINT_F(fp, "delta1=%f delta2=%f beta=%f\n", delta1, delta2, beta_row[k][state]);
}
-
+
// normalize beta_row
for (state=1;state<max_states_row;state++) {
beta_row[k][state] = beta_row[k][state] - beta_row[k][0];
}
beta_row[k][0] = 0;
-
+
}
-
+
// compute the forward sweep (alpha_row values), and update the llr's
// notice that we start at time index=1, b/c time index=0 has already been
// initialized, and we are forcing the trellis to start from state=0
@@ -299,7 +300,7 @@ void tpc_decoder::siso_decode_row() {
// initialize the llr's for the uncoded bits
num_llr_u = -MAXLOG;
den_llr_u = -MAXLOG;
-
+
// intialize alpha_row
// for (state=0;state<max_states_row;state++) {
// alpha_row[state] = -MAXLOG;
@@ -319,18 +320,18 @@ void tpc_decoder::siso_decode_row() {
num_llr_c_row[ii] = -MAXLOG;
rec_array_row[ii] = input_c_rows[rowEncoder_n*(k-1)+ii];
}
-
- // for each input at this time instant, create a metric which
+
+ // for each input at this time instant, create a metric which
// represents the likelihood that this input corresponds to
// each of the possible symbols
for(symbol=0; symbol<num_symbols_row; symbol++) {
metric_c_row[ii] = gamma(rec_array_row, symbol);
}
-
+
// compute the alpha_row vector
// to understand the loop below, we need to think about the forward trellis.
// we know that any node, at any time instant in the trellis diagram can have
- // multiple transitions into that node (i.e. any number of nodes in the
+ // multiple transitions into that node (i.e. any number of nodes in the
// previous time instance can transition into this current node, based on the
// polynomial). SO, in the loop below, delta1 represents the transition from
// the previous time instant for input (either 0 or 1) and the current state
@@ -352,7 +353,7 @@ void tpc_decoder::siso_decode_row() {
delta2 = alpha_row[rowNextStates[1][state]];
alpha_row[rowNextStates[1][state]] = (*this.*max_star)(delta1, delta2);
}
-
+
// compute the llr's
for (state=0;state<max_states_row;state++) {
// data 0 branch (departing)
@@ -374,7 +375,7 @@ void tpc_decoder::siso_decode_row() {
}
mask = mask>>1;
}
-
+
// data 1 branch (departing)
delta1 = alpha_prime_row[state] + metric_c_row[rowOutputs[1][state]] + beta_row[k][rowNextStates[1][state]] + app_in;
// the information bit
@@ -398,8 +399,8 @@ void tpc_decoder::siso_decode_row() {
// shift alpha_row back to alpha_prime_row
alpha_prime_row[state] = alpha_row[state] - alpha_row[0];
}
-
- // assign uncoded outputs
+
+ // assign uncoded outputs
if (k-1<LL) {
output_u_rows[k-1] = num_llr_u - den_llr_u;
}
@@ -619,7 +620,7 @@ void tpc_decoder::siso_decode_col() {
float tpc_decoder::linear_log_map(const float delta1, const float delta2) {
float diff;
-
+
diff = delta2 - delta1;
if ( diff > TJIAN )
@@ -641,7 +642,7 @@ float tpc_decoder::max_log_map(const float delta1, const float delta2) {
float tpc_decoder::constant_log_map(const float delta1, const float delta2) {
// Return maximum of delta1 and delta2
// and in correction value if |delta1-delta2| < TVALUE
- register float diff;
+ register float diff;
diff = delta2 - delta1;
if ( diff > TVALUE )
@@ -657,7 +658,7 @@ float tpc_decoder::constant_log_map(const float delta1, const float delta2) {
float tpc_decoder::log_map_lut_correction(const float delta1, const float delta2) {
float diff;
diff = (float) fabs( delta2 - delta1 );
-
+
if (delta1 > delta2) {
if (diff > BOUNDARY8 )
return( delta1 );
@@ -672,7 +673,7 @@ float tpc_decoder::log_map_lut_correction(const float delta1, const float delta2
return( delta1 + VALUE5 + SLOPE5*(diff-BOUNDARY5) );
else
return( delta1 + VALUE4 + SLOPE4*(diff-BOUNDARY4) );
- }
+ }
} else {
if (diff > BOUNDARY2 ) {
if ( diff > BOUNDARY3 )
@@ -700,7 +701,7 @@ float tpc_decoder::log_map_lut_correction(const float delta1, const float delta2
return( delta2 + VALUE5 + SLOPE5*(diff-BOUNDARY5) );
else
return( delta2 + VALUE4 + SLOPE4*(diff-BOUNDARY4) );
- }
+ }
} else {
if (diff > BOUNDARY2 ) {
if ( diff > BOUNDARY3 )
@@ -720,9 +721,9 @@ float tpc_decoder::log_map_lut_correction(const float delta1, const float delta2
float tpc_decoder::log_map_cfunction_correction(const float delta1, const float delta2) {
// Use C-function calls to compute the correction function
if (delta1 > delta2) {
- return( (float) (delta1 + log( 1 + exp( delta2-delta1) ) ) );
+ return( (float) (delta1 + log( 1 + exp( delta2-delta1) ) ) );
} else {
- return( (float) (delta2 + log( 1 + exp( delta1-delta2) ) ) );
+ return( (float) (delta2 + log( 1 + exp( delta1-delta2) ) ) );
}
}
@@ -731,7 +732,7 @@ float tpc_decoder::gamma(const std::vector<float> rx_array, const int symbol) {
int ii;
int mask;
int nn = rx_array.size();
-
+
mask = 1;
for (ii=0;ii<nn;ii++) {
if (symbol&mask)
@@ -741,7 +742,7 @@ float tpc_decoder::gamma(const std::vector<float> rx_array, const int symbol) {
// DEBUG_PRINT("nn=%d symbol=%d rm = %f\n", nn, symbol, rm);
// DEBUG_PRINT_F(fp, "nn=%d symbol=%d rm = %f\n", nn, symbol, rm);
-
+
return(rm);
}
@@ -752,10 +753,10 @@ template <typename T> int tpc_decoder::sgn(T val) {
void tpc_decoder::generic_work(void *inBuffer, void *outBuffer) {
const float *inPtr = (const float *) inBuffer;
unsigned char *out = (unsigned char *) outBuffer;
-
+
unsigned int m, n, ii;
int iter;
-
+
for(ii=0; ii<numInitLoadIter; ii++) {
memset(&channel_llr[ii][0], 0, sizeof(float)*codeword_N);
memset(&Z[ii][0], 0, sizeof(float)*codeword_N);
@@ -775,7 +776,7 @@ void tpc_decoder::generic_work(void *inBuffer, void *outBuffer) {
memset(&extrinsic_info[0], 0, sizeof(float)*extrinsic_info.size());
//DEBUG_PRINT("Starting TURBO Decoding\n");
-
+
for(iter=0; iter<d_max_iter; iter++) {
//DEBUG_PRINT("Turbo Iter=%d\n", iter+1);
//DEBUG_PRINT_F(fp, "Turbo Iter=%d\n", iter+1);
@@ -788,10 +789,10 @@ void tpc_decoder::generic_work(void *inBuffer, void *outBuffer) {
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT(&input_c_rows[0], codeword_N);
//DEBUG_PRINT_F(fp, "input_c_rows -->\n");
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT_F(fp, &input_c_rows[0], codeword_N);
-
+
// call siso decode
siso_decode_row();
-
+
//DEBUG_PRINT("output_u_rows -->\n");
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT(&output_u_rows[0], output_u_rows.size());
//DEBUG_PRINT_F(fp, "output_u_rows -->\n");
@@ -800,12 +801,12 @@ void tpc_decoder::generic_work(void *inBuffer, void *outBuffer) {
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT(&output_c_rows[0], output_c_rows.size());
//DEBUG_PRINT_F(fp, "output_c_rows -->\n");
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT_F(fp, &output_c_rows[0], output_c_rows.size());
-
+
// copy the output coded back into Z, so we can feed it back through the decoder
// for more iterations
volk_32f_x2_subtract_32f(&Z[m][0], &output_c_rows[0], &extrinsic_info[m*codeword_N], codeword_N);
}
-
+
// decode each col
earlyExit = true;
output_c_col_idx = 0;
@@ -814,15 +815,15 @@ void tpc_decoder::generic_work(void *inBuffer, void *outBuffer) {
for(ii=0; ii<codeword_M; ii++) {
input_c_cols[ii] = Z[ii][n];
}
-
+
//DEBUG_PRINT("input_c_cols -->\n");
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT(&input_c_cols[0], codeword_M);
//DEBUG_PRINT_F(fp, "input_c_cols -->\n");
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT_F(fp, &input_c_cols[0], codeword_M);
-
+
// call siso decode
siso_decode_col();
-
+
//DEBUG_PRINT("output_u_cols -->\n");
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT(&output_u_cols[0], output_u_cols.size());
//DEBUG_PRINT_F(fp, "output_u_cols -->\n");
@@ -831,13 +832,13 @@ void tpc_decoder::generic_work(void *inBuffer, void *outBuffer) {
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT(&output_c_cols[output_c_col_idx], codeword_M);
//DEBUG_PRINT_F(fp, "output_c_cols -->\n");
//DEBUG_PRINT_FLOAT_ARRAY_AS_FLOAT_F(fp, &output_c_cols[output_c_col_idx], codeword_M);
-
+
// create the extrinsic_info vector, which subtracts from input_c_cols to prevent feedback
//DEBUG_PRINT("extrinsic_info -->\n");
//DEBUG_PRINT_F(fp, "extrinsic_info -->\n");
for(ii=0; ii<codeword_M; ii++) {
extrinsic_info[ii*codeword_N+n] = output_c_cols[output_c_col_idx+ii] - input_c_cols[ii];
-
+
if(earlyExit) {
if(sgn(output_c_cols[output_c_col_idx+ii])!=sgn(input_c_cols[ii])) {
earlyExit = false;
@@ -850,7 +851,7 @@ void tpc_decoder::generic_work(void *inBuffer, void *outBuffer) {
}
//DEBUG_PRINT("\n");
//DEBUG_PRINT_F(fp, "\n");
-
+
output_c_col_idx += codeword_M;
}
if(earlyExit) break;
@@ -874,7 +875,7 @@ void tpc_decoder::generic_work(void *inBuffer, void *outBuffer) {
}
}
}
-
+
//DEBUG_PRINT(("Output\n"));
//DEBUG_PRINT_UCHAR_ARRAY(out, outputSize);
//DEBUG_PRINT_F(fp, "Output\n");
@@ -901,7 +902,9 @@ const char* tpc_decoder::get_conversion() {
return "none";
}
-tpc_decoder::~tpc_decoder() {
+tpc_decoder::~tpc_decoder()
+{
+ if(fp)
fclose(fp);
}
diff --git a/gr-fec/lib/tpc_encoder.cc b/gr-fec/lib/tpc_encoder.cc
index 941bd7bdca..849205753e 100755
--- a/gr-fec/lib/tpc_encoder.cc
+++ b/gr-fec/lib/tpc_encoder.cc
@@ -35,7 +35,7 @@
#include <string.h> // for memcpy
namespace gr {
-namespace fec {
+namespace fec {
generic_encoder::sptr
tpc_encoder::make(std::vector<int> row_polys, std::vector<int> col_polys, int krow, int kcol, int bval, int qval)
{
@@ -49,7 +49,7 @@ tpc_encoder::tpc_encoder (std::vector<int> row_polys, std::vector<int> col_polys
// first we operate on data chunks of get_input_size()
// TODO: should we verify this and throw an error if it doesn't match? YES
// hwo do we do that?
-
+
// calculate the input and output sizes
inputSize = (d_krow*d_kcol - (d_bval+d_qval));
rowEncoder_K = ceil(log(d_rowpolys[0])/log(2)); // rowEncoder_K is the constraint length of the row encoder polynomial
@@ -58,12 +58,13 @@ tpc_encoder::tpc_encoder (std::vector<int> row_polys, std::vector<int> col_polys
colEncoder_K = ceil(log(d_colpolys[0])/log(2)); // colEncoder_K is the constraint length of the col encoder polynomial
colEncoder_n = d_colpolys.size();
colEncoder_m = colEncoder_K - 1;
-
+
outputSize = ((d_krow+rowEncoder_m)*rowEncoder_n)*((d_kcol+colEncoder_m)*colEncoder_n) - d_bval;
-
+
+ fp = NULL;
//DEBUG_PRINT("inputSize=%d outputSize=%d\n", inputSize, outputSize);
//fp = fopen("c_encoder_output.txt", "w");
-
+
// resize internal matrices
rowNumStates = 1 << (rowEncoder_K-1); // 2^(row_mm)
colNumStates = 1 << (colEncoder_K-1); // 2^(col_mm)
@@ -71,32 +72,32 @@ tpc_encoder::tpc_encoder (std::vector<int> row_polys, std::vector<int> col_polys
rowNextStates.resize(2, std::vector<int>(rowNumStates,0));
colOutputs.resize(2, std::vector<int>(colNumStates,0));
colNextStates.resize(2, std::vector<int>(colNumStates,0));;
-
+
rowTail.resize(rowNumStates, 0);
colTail.resize(colNumStates, 0);
-
+
// precalculate the state transition matrix for the row polynomial
tpc_common::precomputeStateTransitionMatrix_RSCPoly(rowNumStates, d_rowpolys, rowEncoder_K, rowEncoder_n,
rowOutputs, rowNextStates);
-
+
// calculate the tail for the row
tpc_common::rsc_tail(rowTail, d_rowpolys, rowNumStates, rowEncoder_m);
-
+
// precalculate the state transition matrix for the column polynomial
tpc_common::precomputeStateTransitionMatrix_RSCPoly(colNumStates, d_colpolys, colEncoder_K, colEncoder_n,
colOutputs, colNextStates);
// calculate the tail for the col
tpc_common::rsc_tail(colTail, d_colpolys, colNumStates, colEncoder_m);
-
+
// pre-allocate memory we use for encoding
inputSizeWithPad = d_bval+d_qval+inputSize;
inputWithPad.resize(inputSizeWithPad, 0);
-
+
numRowsToEncode = inputSizeWithPad/d_krow; // this should be OK w/ integer division -- TODO: check this?
rowToEncode.resize(d_krow,0);
rowEncoded_block.resize(d_krow+(rowEncoder_m*rowEncoder_n), 0);
rowEncodedBits.resize(d_kcol, std::vector<uint8_t>(rowEncoder_m*rowEncoder_n,0) );
-
+
numColsToEncode = d_krow+(rowEncoder_m*rowEncoder_n);
colToEncode.resize(d_kcol,0);
colEncoded_block.resize(d_kcol+(colEncoder_m*colEncoder_n), 0);
@@ -112,11 +113,11 @@ int tpc_encoder::get_input_size() {
}
void tpc_encoder::block_conv_encode( std::vector<uint8_t> &output,
- std::vector<uint8_t> input,
+ std::vector<uint8_t> input,
std::vector< std::vector<int> > transOutputVec,
std::vector< std::vector<int> > transNextStateVec,
std::vector<int> tail,
- size_t KK,
+ size_t KK,
size_t nn)
{
size_t outsym, ii, jj;
@@ -124,16 +125,16 @@ void tpc_encoder::block_conv_encode( std::vector<uint8_t> &output,
size_t LL = input.size();
std::vector<int> binVec(nn,0);
-
+
// encode data bits one bit at a time
for (ii=0; ii<LL; ii++) {
-
+
// determine the output symbol
outsym = transOutputVec[(int)input[ii]][state];
// determine the next state
state = transNextStateVec[(int)input[ii]][state];
-
- // Convert symbol to a binary vector
+
+ // Convert symbol to a binary vector
tpc_common::itob( binVec, outsym, nn );
// Assign to output : TODO: investigate using memcpy for this?
@@ -144,12 +145,12 @@ void tpc_encoder::block_conv_encode( std::vector<uint8_t> &output,
// encode tail
for (ii=LL;ii<LL+KK-1;ii++) {
-
+
// determine the output symbol
outsym = transOutputVec[tail[state]][state];
// determine the next state
state = transNextStateVec[tail[state]][state];
-
+
// Convert symbol to a binary vector
tpc_common::itob( binVec, outsym, nn );
@@ -165,49 +166,49 @@ void tpc_encoder::generic_work(void *inBuffer, void *outBuffer) {
uint8_t *out = (uint8_t *) outBuffer;
size_t ii, jj; // indexing var
-
+
//DEBUG_PRINT_UCHAR_ARRAY(in, inputSize);
-
+
// TODO: probably a better way to do this than memcpy?
memcpy(&inputWithPad[d_bval+d_qval], in, sizeof(unsigned char)*inputSize);
-
+
//DEBUG_PRINT("Input with Pad -->\n");
//DEBUG_PRINT_UCHAR_ARRAY(&inputWithPad[0], inputSizeWithPad);
//DEBUG_PRINT_F(fp, "Input with Pad -->\n");
//DEBUG_PRINT_UCHAR_ARRAY_F(fp, &inputWithPad[0], inputSizeWithPad);
-
+
// encode the row data
for(ii=0; ii<numRowsToEncode; ii++) {
// populate rowToEncode
memcpy(&rowToEncode[0], &inputWithPad[ii*d_krow], sizeof(unsigned char)*d_krow);
-
+
//DEBUG_PRINT("Encoding row=[%d] -->\n",ii);
//DEBUG_PRINT_UCHAR_ARRAY(&rowToEncode[0], d_krow);
//DEBUG_PRINT_F(fp, "Encoding row=[%d] -->\n",ii);
//DEBUG_PRINT_UCHAR_ARRAY_F(fp, &rowToEncode[0], d_krow);
-
+
// encode it
- block_conv_encode( rowEncoded_block,
- rowToEncode,
- rowOutputs,
- rowNextStates,
- rowTail,
+ block_conv_encode( rowEncoded_block,
+ rowToEncode,
+ rowOutputs,
+ rowNextStates,
+ rowTail,
rowEncoder_K,
rowEncoder_n);
-
+
//DEBUG_PRINT("Row Encoded Block=[%d] -->\n",ii);
//DEBUG_PRINT_FLOAT_ARRAY_AS_UCHAR(&rowEncoded_block[0], tmp);
//DEBUG_PRINT_F(fp, "Row Encoded Block=[%d] -->\n",ii);
//DEBUG_PRINT_FLOAT_ARRAY_AS_UCHAR_F(fp, &rowEncoded_block[0], tmp);
-
+
// store only the encoded bits, b/c we read out the data in a special way
memcpy(&rowEncodedBits[ii][0], &rowEncoded_block[d_krow], sizeof(uint8_t)*(rowEncoder_m*rowEncoder_n));
-
+
// DEBUG_PRINT("Row Encoded Bits");
// tmp = rowEncoder_m*rowEncoder_n;
// DEBUG_PRINT_FLOAT_ARRAY_AS_UCHAR(&rowEncodedBits[ii][0], tmp);
}
-
+
// encode the column data
size_t numDataColsToEncode = d_krow;
size_t numCheckColsToEncode = numColsToEncode-numDataColsToEncode;
@@ -216,76 +217,75 @@ void tpc_encoder::generic_work(void *inBuffer, void *outBuffer) {
for(jj=0; jj<d_kcol; jj++) {
colToEncode[jj] = inputWithPad[jj*d_krow+ii];
}
-
+
//DEBUG_PRINT("Encoding col=[%d] -->\n",ii);
//DEBUG_PRINT_UCHAR_ARRAY(&colToEncode[0], d_kcol);
//DEBUG_PRINT_F(fp, "Encoding col=[%d] -->\n",ii);
//DEBUG_PRINT_UCHAR_ARRAY_F(fp, &colToEncode[0], d_kcol);
-
+
// encode it
- block_conv_encode( colEncoded_block,
- colToEncode,
- colOutputs,
- colNextStates,
- colTail,
+ block_conv_encode( colEncoded_block,
+ colToEncode,
+ colOutputs,
+ colNextStates,
+ colTail,
colEncoder_K,
colEncoder_n);
-
+
//DEBUG_PRINT("Col Encoded Block=[%d] -->\n",ii);
//DEBUG_PRINT_FLOAT_ARRAY_AS_UCHAR(&colEncoded_block[0], tmp);
//DEBUG_PRINT_F(fp, "Col Encoded Block=[%d] -->\n",ii);
//DEBUG_PRINT_FLOAT_ARRAY_AS_UCHAR_F(fp, &colEncoded_block[0], tmp);
-
+
// store only the encoded bits, b/c we read the data out in a special way
memcpy(&colEncodedBits[ii][0], &colEncoded_block[d_kcol], sizeof(uint8_t)*(colEncoder_m*colEncoder_n));
-
+
// DEBUG_PRINT("Col Encoded Bits");
// tmp = colEncoder_m*colEncoder_n;
// DEBUG_PRINT_FLOAT_ARRAY(&colEncodedBits[ii][0], tmp);
}
-
+
// encode checks on checks (encode the row-encoded bits)
for(ii=0; ii<numCheckColsToEncode; ii++) {
// populate colToEncode
for(jj=0; jj<d_kcol; jj++) {
colToEncode[jj] = rowEncodedBits[jj][ii]; // indexing is wierd b/c of the way we declared the vector :(
}
-
+
//DEBUG_PRINT("Encoding col=[%d] -->\n",ii+numDataColsToEncode);
//DEBUG_PRINT_UCHAR_ARRAY(&colToEncode[0], d_kcol);
//DEBUG_PRINT_F(fp, "Encoding col=[%d] -->\n",ii+numDataColsToEncode);
//DEBUG_PRINT_UCHAR_ARRAY_F(fp, &colToEncode[0], d_kcol);
-
+
// encode it
- block_conv_encode( colEncoded_block,
- colToEncode,
- colOutputs,
- colNextStates,
- colTail,
+ block_conv_encode( colEncoded_block,
+ colToEncode,
+ colOutputs,
+ colNextStates,
+ colTail,
colEncoder_K,
colEncoder_n);
-
+
//DEBUG_PRINT("Col Encoded Block=[%d] -->\n",ii+numDataColsToEncode);
//DEBUG_PRINT_FLOAT_ARRAY_AS_UCHAR(&colEncoded_block[0], tmp);
-
+
//DEBUG_PRINT_F(fp, "Col Encoded Block=[%d] -->\n",ii+numDataColsToEncode);
//DEBUG_PRINT_FLOAT_ARRAY_AS_UCHAR_F(fp, &colEncoded_block[0], tmp);
-
-
+
// store only the encoded bits, b/c we read the data out in a special way
memcpy(&colEncodedBits[ii+numDataColsToEncode][0], &colEncoded_block[d_kcol], sizeof(uint8_t)*(colEncoder_m*colEncoder_n));
-
+
// DEBUG_PRINT("Col Encoded Bits");
// tmp = colEncoder_m*colEncoder_n;
// DEBUG_PRINT_FLOAT_ARRAY(&colEncodedBits[ii][0], tmp);
}
-
+
unsigned char* inputDataPtr;
uint8_t *outputDataPtr = out;
-
+
int curRowInRowEncodedBits = 0;
// read out the data along the rows into the "out" array
-
+
// skip B zeros & do the first row
inputDataPtr = &inputWithPad[d_bval];
if(d_bval > d_krow){ throw std::runtime_error("bval must be < krow"); }
@@ -293,27 +293,27 @@ void tpc_encoder::generic_work(void *inBuffer, void *outBuffer) {
for(ii=0; ii<firstRowRemainingBits; ii++) {
*outputDataPtr++ = (uint8_t)(*inputDataPtr++);
}
-
+
// copy the encoded bits
- memcpy(outputDataPtr, &rowEncodedBits[curRowInRowEncodedBits++][0],
+ memcpy(outputDataPtr, &rowEncodedBits[curRowInRowEncodedBits++][0],
sizeof(uint8_t)*(rowEncoder_m*rowEncoder_n));
-
+
outputDataPtr += (rowEncoder_m*rowEncoder_n);
-
+
// copy out the rest of the data
for(ii=1; ii<d_kcol; ii++) { // ii starts at 1, b/c we already did idx=0
// copy systematic bits
for(jj=0; jj<d_krow; jj++) {
*outputDataPtr++ = (uint8_t)(*inputDataPtr++);
}
-
+
// copy the encoded bits
- memcpy(outputDataPtr, &rowEncodedBits[curRowInRowEncodedBits++][0],
+ memcpy(outputDataPtr, &rowEncodedBits[curRowInRowEncodedBits++][0],
sizeof(uint8_t)*(rowEncoder_m*rowEncoder_n));
-
+
outputDataPtr += (rowEncoder_m*rowEncoder_n);
}
-
+
// copy the encoded cols
for(ii=0; ii<(colEncoder_m*colEncoder_n); ii++) {
// copy checks
@@ -326,17 +326,17 @@ void tpc_encoder::generic_work(void *inBuffer, void *outBuffer) {
*outputDataPtr++ = colEncodedBits[kk++][ii];
}
}
-
+
//DEBUG_PRINT("Output\n");
//DEBUG_PRINT_FLOAT_ARRAY_AS_UCHAR(out, outputSize);
//DEBUG_PRINT_F(fp, "Output\n");
//DEBUG_PRINT_FLOAT_ARRAY_AS_UCHAR_F(fp, out, outputSize);
}
-
tpc_encoder::~tpc_encoder()
{
- fclose(fp);
+ if(fp)
+ fclose(fp);
}
}
diff --git a/gr-qtgui/python/qtgui/range.py b/gr-qtgui/python/qtgui/range.py
index e66a660d24..168e6662c3 100755
--- a/gr-qtgui/python/qtgui/range.py
+++ b/gr-qtgui/python/qtgui/range.py
@@ -23,6 +23,7 @@
from PyQt4 import Qt, QtCore, QtGui
+
class Range(object):
def __init__(self, minv, maxv, step, default, min_length):
self.min = float(minv)
@@ -34,157 +35,192 @@ class Range(object):
self.find_nsteps()
def find_precision(self):
- temp = str(float(self.step)-int(self.step))[2:]
- if len(temp) > 13:
- self.precision = 15
+ # Get the decimal part of the step
+ temp = str(float(self.step) - int(self.step))[2:]
+ precision = len(temp) if temp is not '0' else 0
+ precision = min(precision, 13)
+
+ if precision == 0 and self.max < 100:
+ self.precision = 1 # Always have a decimal in this case
else:
- self.precision = len(temp)+2
+ self.precision = (precision + 2) if precision > 0 else 0
def find_nsteps(self):
self.nsteps = (self.max + self.step - self.min)/self.step
- def demap_range(self,val):
+ def demap_range(self, val):
if val > self.max:
- val = self.max
+ val = self.max
if val < self.min:
- val = self.min
+ val = self.min
return ((val-self.min)/self.step)
- def map_range(self,val):
+ def map_range(self, val):
if val > self.nsteps:
- val = self.max
+ val = self.max
if val < 0:
- val = 0
+ val = 0
return (val*self.step+self.min)
+
class RangeWidget(QtGui.QWidget):
def __init__(self, ranges, slot, label, style):
""" Creates the QT Range widget """
QtGui.QWidget.__init__(self)
self.range = ranges
- self.slot = slot
self.style = style
+ # Top-block function to call when any value changes
+ # Some widgets call this directly when their value changes.
+ # Others have intermediate functions to map the value into the right range.
+ self.notifyChanged = slot
+
layout = Qt.QHBoxLayout()
label = Qt.QLabel(label)
layout.addWidget(label)
if style == "dial":
- self.d_widget = self.Dial(self, self.range, self.ds_modified_slot)
+ self.d_widget = self.Dial(self, self.range, self.notifyChanged)
elif style == "slider":
- self.d_widget = self.Slider(self, self.range, self.ds_modified_slot)
+ self.d_widget = self.Slider(self, self.range, self.notifyChanged)
elif style == "counter":
- self.d_widget = self.Counter(self, self.range, self.c_modified_slot)
- elif style == "counter_slider":
- self.d_widget = self.CounterSlider(self, self.range, self.ds_modified_slot, self.c_modified_slot)
+ # The counter widget can be directly wired to the notifyChanged slot
+ self.d_widget = self.Counter(self, self.range, self.notifyChanged)
else:
- self.d_widget = self.CounterSlider(self, self.range, self.ds_modified_slot, self.c_modified_slot)
+ # The CounterSlider needs its own internal handlers before calling notifyChanged
+ self.d_widget = self.CounterSlider(self, self.range, self.notifyChanged)
layout.addWidget(self.d_widget)
self.setLayout(layout)
- def ds_modified_slot(self,val):
- nval = self.range.map_range(val)
- self.slot(nval)
- if self.style == "counter_slider":
- self.d_widget.set_counter(nval)
-
- def c_modified_slot(self,val):
- self.slot(val)
- if self.style == "counter_slider":
- temp = self.range.demap_range(val)
- if temp-int(temp) >= 0.5:
- self.d_widget.set_slider(int(temp)+1)
- else:
- self.d_widget.set_slider(int(temp))
-
class Dial(QtGui.QDial):
""" Creates the range using a dial """
def __init__(self, parent, ranges, slot):
QtGui.QDial.__init__(self, parent)
+
+ # Setup the dial
self.setRange(0, ranges.nsteps-1)
self.setSingleStep(1)
self.setNotchesVisible(True)
- temp = ranges.demap_range(ranges.default)
- if temp-int(temp) >= 0.5:
- temp = int(temp)+1
- else:
- temp = int(temp)
+ self.range = ranges
+
+ # Round the initial value to the closest tick
+ temp = int(round(ranges.demap_range(ranges.default), 0))
self.setValue(temp)
- self.valueChanged.connect(slot)
+
+ # Setup the slots
+ self.valueChanged.connect(self.changed)
+ self.notifyChanged = slot
+
+ def changed(self, value):
+ """ Handles maping the value to the right range before calling the slot. """
+ val = self.range.map_range(value)
+ self.notifyChanged(val)
class Slider(QtGui.QSlider):
""" Creates the range using a slider """
def __init__(self, parent, ranges, slot):
QtGui.QSlider.__init__(self, QtCore.Qt.Horizontal, parent)
- self.setFocusPolicy(QtCore.Qt.NoFocus)
- self.setRange(0, ranges.nsteps-1)
- temp = ranges.demap_range(ranges.default)
- if temp-int(temp) >= 0.5:
- temp = int(temp)+1
- else:
- temp = int(temp)
- self.setValue(temp)
- self.setPageStep(1)
- self.setSingleStep(1)
+
+ # Setup the slider
+ #self.setFocusPolicy(QtCore.Qt.NoFocus)
+ self.setRange(0, ranges.nsteps - 1)
self.setTickPosition(2)
+ self.setSingleStep(1)
+ self.range = ranges
+
+ # Round the initial value to the closest tick
+ temp = int(round(ranges.demap_range(ranges.default), 0))
+ self.setValue(temp)
+
if ranges.nsteps > ranges.min_length:
- self.setTickInterval(int(ranges.nsteps/ranges.min_length))
+ interval = int(ranges.nsteps/ranges.min_length)
+ self.setTickInterval(interval)
+ self.setPageStep(interval)
else:
- self.setTickInterval(1)
- self.valueChanged.connect(slot)
+ self.setTickInterval(1)
+ self.setPageStep(1)
+
+ # Setup the handler function
+ self.valueChanged.connect(self.changed)
+ self.notifyChanged = slot
+
+ def changed(self, value):
+ """ Handle the valueChanged signal and map the value into the correct range """
+ val = self.range.map_range(value)
+ self.notifyChanged(val)
def mousePressEvent(self, event):
if((event.button() == QtCore.Qt.LeftButton)):
- newVal = self.minimum() + ((self.maximum()-self.minimum()) * event.x()) / self.width()
- self.setValue(newVal)
+ new = self.minimum() + ((self.maximum()-self.minimum()) * event.x()) / self.width()
+ self.setValue(new)
event.accept()
- QtGui.QSlider.mousePressEvent(self, event)
+ # Use repaint rather than calling the super mousePressEvent.
+ # Calling super causes issue where slider jumps to wrong value.
+ QtGui.QSlider.repaint(self)
+
+ def mouseMoveEvent(self, event):
+ new = self.minimum() + ((self.maximum()-self.minimum()) * event.x()) / self.width()
+ self.setValue(new)
+ event.accept()
+ QtGui.QSlider.repaint(self)
class Counter(QtGui.QDoubleSpinBox):
""" Creates the range using a counter """
def __init__(self, parent, ranges, slot):
QtGui.QDoubleSpinBox.__init__(self, parent)
+
+ # Setup the counter
self.setRange(ranges.min, ranges.max)
self.setValue(ranges.default)
self.setSingleStep(ranges.step)
self.setKeyboardTracking(False)
self.setDecimals(ranges.precision)
+
+ # The counter already handles floats and can be connected directly.
self.valueChanged.connect(slot)
class CounterSlider(QtGui.QWidget):
""" Creates the range using a counter and slider """
- def __init__(self, parent, ranges, s_slot, c_slot):
+ def __init__(self, parent, ranges, slot):
QtGui.QWidget.__init__(self, parent)
- # Need another horizontal layout
- layout = Qt.QHBoxLayout()
+ # Slot to call in the parent
+ self.notifyChanged = slot
- # Create a slider with the top-level widget as the parent
- self.slider = RangeWidget.Slider(parent,ranges,s_slot)
- layout.addWidget(self.slider)
+ self.slider = RangeWidget.Slider(parent, ranges, self.sliderChanged)
+ self.counter = RangeWidget.Counter(parent, ranges, self.counterChanged)
- # Setup the counter
- self.counter = RangeWidget.Counter(parent,ranges,c_slot)
+ # Need another horizontal layout to wrap the other widgets.
+ layout = Qt.QHBoxLayout()
+ layout.addWidget(self.slider)
layout.addWidget(self.counter)
-
- # Wire the events to each other
- #counter.valueChanged.connect(slider.setValue)
- #slider.valueChanged.connect(counter.setValue)
- self.counter.valueChanged.connect(c_slot)
- self.slider.valueChanged.connect(s_slot)
-
self.setLayout(layout)
- def set_slider(self,val):
- self.slider.setValue(val)
- def set_counter(self,val):
- self.counter.setValue(val)
-
-
-
-
-
-
-
+ # Flag to ignore the slider event caused by a change to the counter.
+ self.ignoreSlider = False
+ self.range = ranges
+
+ def sliderChanged(self, value):
+ """ Handles changing the counter when the slider is updated """
+ # If the counter was changed, ignore any of these events
+ if not self.ignoreSlider:
+ # Value is already float. Just set the counter
+ self.counter.setValue(value)
+ self.notifyChanged(value)
+ self.ignoreSlider = False
+
+ def counterChanged(self, value):
+ """ Handles changing the slider when the counter is updated """
+ # Get the current slider value and check to see if the new value changes it
+ current = self.slider.value()
+ new = int(round(self.range.demap_range(value), 0))
+
+ # If it needs to change, ignore the slider event
+ # Otherwise, the slider will cause the counter to round to the nearest tick
+ if current != new:
+ self.ignoreSlider = True
+ self.slider.setValue(new)
+
+ self.notifyChanged(value)
diff --git a/grc/gui/ActionHandler.py b/grc/gui/ActionHandler.py
index 83ce5ff8ce..fee96624bb 100644
--- a/grc/gui/ActionHandler.py
+++ b/grc/gui/ActionHandler.py
@@ -413,12 +413,9 @@ class ActionHandler:
if selected_block:
dialog = PropsDialog(selected_block)
response = gtk.RESPONSE_APPLY
- while response == gtk.RESPONSE_APPLY: # do while construct: rerun the dialog if Apply was hit
+ while response == gtk.RESPONSE_APPLY: # rerun the dialog if Apply was hit
response = dialog.run()
- if response == gtk.RESPONSE_APPLY:
- self.get_flow_graph().update()
- Actions.ELEMENT_SELECT() # empty action, that updates the main window and flowgraph
- elif response == gtk.RESPONSE_ACCEPT:
+ if response in (gtk.RESPONSE_APPLY, gtk.RESPONSE_ACCEPT):
self.get_flow_graph().update()
self.get_page().get_state_cache().save_new_state(self.get_flow_graph().export_data())
self.get_page().set_saved(False)
@@ -426,6 +423,9 @@ class ActionHandler:
n = self.get_page().get_state_cache().get_current_state()
self.get_flow_graph().import_data(n)
self.get_flow_graph().update()
+ if response == gtk.RESPONSE_APPLY:
+ # null action, that updates the main window
+ Actions.ELEMENT_SELECT()
dialog.destroy()
##################################################
# View Parser Errors
diff --git a/grc/gui/Param.py b/grc/gui/Param.py
index 7933973837..b9436ab06e 100644
--- a/grc/gui/Param.py
+++ b/grc/gui/Param.py
@@ -169,6 +169,7 @@ class EnumParam(InputParam):
self._input = gtk.combo_box_new_text()
for option in self.param.get_options(): self._input.append_text(option.get_name())
self._input.set_active(self.param.get_option_keys().index(self.param.get_value()))
+ self._input.connect('changed', self._editing_callback)
self._input.connect('changed', self._apply_change)
self.pack_start(self._input, False)
def get_text(self): return self.param.get_option_keys()[self._input.get_active()]
@@ -248,6 +249,7 @@ class FileParam(EntryParam):
if gtk.RESPONSE_OK == file_dialog.run(): #run the dialog
file_path = file_dialog.get_filename() #get the file path
self._input.set_text(file_path)
+ self._editing_callback()
self._apply_change()
file_dialog.destroy() #destroy the dialog
diff --git a/grc/gui/PropsDialog.py b/grc/gui/PropsDialog.py
index d706a0d7b7..d301a75dd1 100644
--- a/grc/gui/PropsDialog.py
+++ b/grc/gui/PropsDialog.py
@@ -142,9 +142,8 @@ class PropsDialog(gtk.Dialog):
self._block.rewrite()
self._block.validate()
self._update_gui()
- self._activate_apply()
- def _activate_apply(self):
+ def _activate_apply(self, *args):
self.set_response_sensitive(gtk.RESPONSE_APPLY, True)
def _update_gui(self, *args):
diff --git a/grc/scripts/gnuradio-companion b/grc/scripts/gnuradio-companion
index 239fc95d8a..7a407eaaf8 100755
--- a/grc/scripts/gnuradio-companion
+++ b/grc/scripts/gnuradio-companion
@@ -74,7 +74,7 @@ def ensure_blocks_path():
def get_source_tree_root():
source_tree_subpath = "/grc/scripts"
- script_path = os.path.dirname(__file__)
+ script_path = os.path.dirname(os.path.abspath(__file__))
if script_path.endswith(source_tree_subpath):
return script_path[:-len(source_tree_subpath)]
diff --git a/volk b/volk
-Subproject 7fddc07516165bb7019446f50f7b02d1e579e64
+Subproject f28a8be8af974d1a55a176009cb0b7927bc2222