diff options
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 |