summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--gr-blocks/grc/blocks_repeat.xml1
-rw-r--r--gr-blocks/include/gnuradio/blocks/repeat.h18
-rw-r--r--gr-blocks/include/gnuradio/blocks/vector_sink_X.h.t1
-rw-r--r--gr-blocks/lib/repeat_impl.cc20
-rw-r--r--gr-blocks/lib/repeat_impl.h6
-rw-r--r--gr-blocks/lib/tuntap_pdu_impl.cc33
-rw-r--r--gr-blocks/lib/tuntap_pdu_impl.h1
-rw-r--r--gr-blocks/lib/vector_sink_X_impl.h.t2
-rw-r--r--gr-dtv/CMakeLists.txt2
-rw-r--r--gr-dtv/examples/CMakeLists.txt27
-rw-r--r--gr-dtv/examples/README.catv31
-rw-r--r--gr-dtv/examples/README.dvbs26
-rwxr-xr-xgr-dtv/examples/atsc_ctrlport_monitor.py149
-rw-r--r--gr-dtv/examples/catv_tx_64qam.grc2079
-rw-r--r--gr-dtv/examples/dvbs2_tx.grc2256
-rw-r--r--gr-dtv/examples/dvbs_tx.grc2853
-rw-r--r--gr-dtv/grc/CMakeLists.txt7
-rw-r--r--gr-dtv/grc/dtv_block_tree.xml10
-rw-r--r--gr-dtv/grc/dtv_catv_frame_sync_enc_bb.xml26
-rw-r--r--gr-dtv/grc/dtv_catv_randomizer_bb.xml20
-rw-r--r--gr-dtv/grc/dtv_catv_reed_solomon_enc_bb.xml20
-rw-r--r--gr-dtv/grc/dtv_catv_transport_framing_enc_bb.xml20
-rw-r--r--gr-dtv/grc/dtv_catv_trellis_enc_bb.xml20
-rw-r--r--gr-dtv/grc/dtv_dvbs2_modulator_bc.xml22
-rw-r--r--gr-dtv/include/gnuradio/dtv/CMakeLists.txt7
-rw-r--r--gr-dtv/include/gnuradio/dtv/atsc_equalizer.h3
-rw-r--r--gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h15
-rw-r--r--gr-dtv/include/gnuradio/dtv/atsc_viterbi_decoder.h6
-rw-r--r--gr-dtv/include/gnuradio/dtv/catv_frame_sync_enc_bb.h54
-rw-r--r--gr-dtv/include/gnuradio/dtv/catv_randomizer_bb.h53
-rw-r--r--gr-dtv/include/gnuradio/dtv/catv_reed_solomon_enc_bb.h53
-rw-r--r--gr-dtv/include/gnuradio/dtv/catv_transport_framing_enc_bb.h53
-rw-r--r--gr-dtv/include/gnuradio/dtv/catv_trellis_enc_bb.h53
-rw-r--r--gr-dtv/include/gnuradio/dtv/dvbs2_config.h6
-rw-r--r--gr-dtv/include/gnuradio/dtv/dvbs2_modulator_bc.h6
-rw-r--r--gr-dtv/lib/CMakeLists.txt7
-rw-r--r--gr-dtv/lib/atsc/atsc_equalizer_impl.cc89
-rw-r--r--gr-dtv/lib/atsc/atsc_equalizer_impl.h7
-rw-r--r--gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc89
-rw-r--r--gr-dtv/lib/atsc/atsc_rs_decoder_impl.h13
-rw-r--r--gr-dtv/lib/atsc/atsc_single_viterbi.cc65
-rw-r--r--gr-dtv/lib/atsc/atsc_single_viterbi.h17
-rw-r--r--gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc25
-rw-r--r--gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.h4
-rw-r--r--gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.cc96
-rw-r--r--gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.h50
-rw-r--r--gr-dtv/lib/catv/catv_randomizer_bb_impl.cc104
-rw-r--r--gr-dtv/lib/catv/catv_randomizer_bb_impl.h49
-rw-r--r--gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.cc153
-rw-r--r--gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.h56
-rw-r--r--gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.cc131
-rw-r--r--gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.h84
-rw-r--r--gr-dtv/lib/catv/catv_trellis_enc_bb_impl.cc193
-rw-r--r--gr-dtv/lib/catv/catv_trellis_enc_bb_impl.h60
-rw-r--r--gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc272
-rw-r--r--gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h3
-rw-r--r--gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc178
-rw-r--r--gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.h21
-rw-r--r--gr-dtv/swig/dtv_swig.i17
-rw-r--r--gr-uhd/apps/uhd_app.py7
-rw-r--r--gr-uhd/include/gnuradio/uhd/usrp_source.h5
-rw-r--r--gr-uhd/lib/usrp_sink_impl.cc6
-rw-r--r--gr-uhd/lib/usrp_source_impl.cc45
-rw-r--r--gr-uhd/lib/usrp_source_impl.h4
-rw-r--r--grc/gui/ActionHandler.py6
-rw-r--r--grc/gui/Actions.py2
-rw-r--r--grc/gui/BlockTreeWindow.py2
-rw-r--r--grc/gui/Colors.py3
-rw-r--r--grc/gui/DrawingArea.py27
-rw-r--r--grc/gui/FileDialogs.py15
-rw-r--r--grc/gui/Preferences.py4
72 files changed, 8922 insertions, 950 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 130fe7e1d0..3641ab4b5c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -46,8 +46,8 @@ 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 9)
-set(VERSION_INFO_MAINT_VERSION 0)
+set(VERSION_INFO_MINOR_VERSION 10)
+set(VERSION_INFO_MAINT_VERSION git)
include(GrVersion) #setup version info
# Append -O2 optimization flag for Debug builds
diff --git a/gr-blocks/grc/blocks_repeat.xml b/gr-blocks/grc/blocks_repeat.xml
index c6c17c9900..793d0148b2 100644
--- a/gr-blocks/grc/blocks_repeat.xml
+++ b/gr-blocks/grc/blocks_repeat.xml
@@ -9,6 +9,7 @@
<key>blocks_repeat</key>
<import>from gnuradio import blocks</import>
<make>blocks.repeat($type.size*$vlen, $interp)</make>
+ <callback>set_interpolation($interp)</callback>
<param>
<name>Type</name>
<key>type</key>
diff --git a/gr-blocks/include/gnuradio/blocks/repeat.h b/gr-blocks/include/gnuradio/blocks/repeat.h
index 622b066017..b34bda1ec5 100644
--- a/gr-blocks/include/gnuradio/blocks/repeat.h
+++ b/gr-blocks/include/gnuradio/blocks/repeat.h
@@ -32,6 +32,10 @@ namespace gr {
/*!
* \brief repeat each input \p repeat times
* \ingroup stream_operators_blk
+ *
+ * Message Ports:
+ * * interpolation (in):
+ * Takes a pmt_pair(pmt::mp("interpolation"), pmt_long interp), setting the interpolation to interp.
*/
class BLOCKS_API repeat : virtual public sync_interpolator
{
@@ -46,6 +50,20 @@ namespace gr {
* \param repeat number of times to repeat the input
*/
static sptr make(size_t itemsize, int repeat);
+
+ /*!
+ * \brief Return current interpolation
+ */
+ virtual int interpolation() const = 0;
+
+ /*!
+ * \brief sets the interpolation
+ *
+ * Call this method in a callback to adjust the interpolation at run time.
+ *
+ * \param interp interpolation to be set
+ */
+ virtual void set_interpolation(int interp) = 0;
};
} /* namespace blocks */
diff --git a/gr-blocks/include/gnuradio/blocks/vector_sink_X.h.t b/gr-blocks/include/gnuradio/blocks/vector_sink_X.h.t
index 527ebf7dff..a4ef38fd04 100644
--- a/gr-blocks/include/gnuradio/blocks/vector_sink_X.h.t
+++ b/gr-blocks/include/gnuradio/blocks/vector_sink_X.h.t
@@ -43,6 +43,7 @@ namespace gr {
static sptr make(int vlen = 1);
+ //! Clear the data and tags containers.
virtual void reset() = 0;
virtual std::vector<@TYPE@> data() const = 0;
virtual std::vector<tag_t> tags() const = 0;
diff --git a/gr-blocks/lib/repeat_impl.cc b/gr-blocks/lib/repeat_impl.cc
index 9c2ccc63c8..fb62265134 100644
--- a/gr-blocks/lib/repeat_impl.cc
+++ b/gr-blocks/lib/repeat_impl.cc
@@ -43,6 +43,26 @@ namespace gr {
d_itemsize(itemsize),
d_interp(interp)
{
+ message_port_register_in(pmt::mp("interpolation"));
+ set_msg_handler(pmt::mp("interpolation"),
+ boost::bind(&repeat_impl::msg_set_interpolation, this, _1));
+ }
+
+ void
+ repeat_impl::msg_set_interpolation(pmt::pmt_t msg)
+ {
+ // Dynamization by Kevin McQuiggin:
+ d_interp = pmt::to_long(pmt::cdr(msg));
+ sync_interpolator::set_interpolation(d_interp);
+ }
+ void
+ repeat_impl::set_interpolation(int interp)
+ {
+ // This ensures that interpolation is only changed between calls to work
+ // (and not in the middle of an ongoing work)
+ _post( pmt::mp("interpolation"), /* port */
+ pmt::cons(pmt::mp("interpolation"), pmt::from_long(interp)) /* pair */
+ );
}
int
diff --git a/gr-blocks/lib/repeat_impl.h b/gr-blocks/lib/repeat_impl.h
index 1942729194..486a47a1ad 100644
--- a/gr-blocks/lib/repeat_impl.h
+++ b/gr-blocks/lib/repeat_impl.h
@@ -36,9 +36,15 @@ namespace gr {
public:
repeat_impl(size_t itemsize, int d_interp);
+ int interpolation() const { return d_interp; }
+ void set_interpolation(int interp);
+
+
int work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
+ private:
+ void msg_set_interpolation(pmt::pmt_t msg);
};
} /* namespace blocks */
diff --git a/gr-blocks/lib/tuntap_pdu_impl.cc b/gr-blocks/lib/tuntap_pdu_impl.cc
index 45995e4803..391b33937a 100644
--- a/gr-blocks/lib/tuntap_pdu_impl.cc
+++ b/gr-blocks/lib/tuntap_pdu_impl.cc
@@ -76,6 +76,14 @@ namespace gr {
if (d_fd <= 0)
throw std::runtime_error("gr::tuntap_pdu::make: tun_alloc failed (are you running as root?)");
+ int err = set_mtu(dev_cstr, MTU);
+ if(err < 0)
+ std::cerr << boost::format(
+ "gr::tuntap_pdu: failed to set MTU to %d.\n"
+ "You should use ifconfig to set the MTU. E.g.,\n"
+ " $ sudo ifconfig %s mtu %d\n"
+ ) % MTU % dev % MTU << std::endl;
+
std::cout << boost::format(
"Allocated virtual ethernet interface: %s\n"
"You must now use ifconfig to set its IP address. E.g.,\n"
@@ -140,6 +148,31 @@ namespace gr {
*/
return fd;
}
+
+ int
+ tuntap_pdu_impl::set_mtu(const char *dev, int MTU)
+ {
+ struct ifreq ifr;
+ int sfd, err;
+
+ /* MTU must be set by passing a socket fd to ioctl;
+ * create an arbitrary socket for this purpose
+ */
+ if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
+ return sfd;
+
+ /* preparation of the struct ifr, of type "struct ifreq" */
+ memset(&ifr, 0, sizeof(ifr));
+ strncpy(ifr.ifr_name, dev, IFNAMSIZ);
+ ifr.ifr_addr.sa_family = AF_INET; /* address family */
+ ifr.ifr_mtu = MTU;
+
+ /* try to set MTU */
+ if ((err = ioctl(sfd, SIOCSIFMTU, (void *) &ifr)) < 0)
+ return err;
+
+ return MTU;
+ }
#endif
} /* namespace blocks */
diff --git a/gr-blocks/lib/tuntap_pdu_impl.h b/gr-blocks/lib/tuntap_pdu_impl.h
index 360f954630..3a53e3acb5 100644
--- a/gr-blocks/lib/tuntap_pdu_impl.h
+++ b/gr-blocks/lib/tuntap_pdu_impl.h
@@ -40,6 +40,7 @@ namespace gr {
std::string d_dev;
bool d_istunflag;
int tun_alloc(char *dev, int flags);
+ int set_mtu(const char *dev, int MTU);
public:
tuntap_pdu_impl(std::string dev, int MTU, bool istunflag);
diff --git a/gr-blocks/lib/vector_sink_X_impl.h.t b/gr-blocks/lib/vector_sink_X_impl.h.t
index b5d3bd6432..86f0e8773c 100644
--- a/gr-blocks/lib/vector_sink_X_impl.h.t
+++ b/gr-blocks/lib/vector_sink_X_impl.h.t
@@ -41,7 +41,7 @@ namespace gr {
@NAME_IMPL@(int vlen);
~@NAME_IMPL@();
- void reset() { d_data.clear(); }
+ void reset() { d_data.clear(); d_tags.clear(); }
std::vector<@TYPE@> data() const;
std::vector<tag_t> tags() const;
diff --git a/gr-dtv/CMakeLists.txt b/gr-dtv/CMakeLists.txt
index fc7ab56bef..5a23482b26 100644
--- a/gr-dtv/CMakeLists.txt
+++ b/gr-dtv/CMakeLists.txt
@@ -41,6 +41,8 @@ GR_SET_GLOBAL(GR_DTV_INCLUDE_DIRS
${CMAKE_CURRENT_BINARY_DIR}/lib
)
+SET(GR_PKG_DTV_EXAMPLES_DIR ${GR_PKG_DATA_DIR}/examples/dtv)
+
########################################################################
# Begin conditional configuration
########################################################################
diff --git a/gr-dtv/examples/CMakeLists.txt b/gr-dtv/examples/CMakeLists.txt
index 82b663d924..8f209bce4f 100644
--- a/gr-dtv/examples/CMakeLists.txt
+++ b/gr-dtv/examples/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright 2014 Free Software Foundation, Inc.
+# Copyright 2014-2015 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -21,6 +21,31 @@ include(GrPython)
GR_PYTHON_INSTALL(
PROGRAMS
+ atsc_ctrlport_monitor.py
+ DESTINATION ${GR_PKG_DTV_EXAMPLES_DIR}
+ COMPONENT "dtv_python"
+)
+
+install(
+ FILES
+ README.dvbs
+ README.dvbs2
+ README.dvbt
+ README.dvbt2
+ README.catv
+ dvbs2_tx.grc
+ dvbs_tx.grc
+ dvbt_rx_8k.grc
+ dvbt_tx_2k.grc
+ dvbt_tx_8k.grc
+ file_atsc_rx.grc
+ file_atsc_tx.grc
+ uhd_atsc_capture.grc
+ uhd_rx_atsc.grc
+ vv003-cr23.grc
+ vv009-4kfft.grc
+ vv018-miso.grc
+ catv_tx_64qam.grc
DESTINATION ${GR_PKG_DTV_EXAMPLES_DIR}
COMPONENT "dtv_python"
)
diff --git a/gr-dtv/examples/README.catv b/gr-dtv/examples/README.catv
new file mode 100644
index 0000000000..84c4cd0b26
--- /dev/null
+++ b/gr-dtv/examples/README.catv
@@ -0,0 +1,31 @@
+A test Transport Stream (26.970352 Mbps) for the example flow graph
+is available here:
+
+http://www.w6rz.net/advqam64.ts
+
+It is 357,356,980 bytes.
+
+The three parameters Control_Word, I_taps and J_increment can be
+used to control the interleaver from the following table.
+
+Control_Word I_taps J_increment Burst protection Latency
+ 0 128 1 95 us 4 ms
+ 1 128 1 95 us 4 ms
+ 2 128 2 190 us 8 ms
+ 3 64 2 47 us 2 ms
+ 4 128 3 285 us 12 ms
+ 5 32 4 24 us 0.98 ms
+ 6 128 4 379 us 16 ms
+ 7 16 8 12 us 0.48 ms
+ 8 128 5 474 us 20 ms
+ 9 8 16 5.9 us 0.22 ms
+ 10 128 6 569 us 24 ms
+ 11 Reserved
+ 12 128 7 664 us 28 ms
+ 13 Reserved
+ 14 128 8 759 us 32 ms
+ 15 Reserved
+
+The default is Control_Word = 6, I_taps = 128 and J_increment = 4
+which seems to be the most commonly used on CATV systems.
+
diff --git a/gr-dtv/examples/README.dvbs b/gr-dtv/examples/README.dvbs
new file mode 100644
index 0000000000..d9097c4876
--- /dev/null
+++ b/gr-dtv/examples/README.dvbs
@@ -0,0 +1,26 @@
+Puncturing values for DVB-S code rates:
+
+1/2 code rate = Puncture Size = 2, Puncture Pattern = 0b11
+2/3 code rate = Puncture Size = 4, Puncture Pattern = 0b1101
+3/4 code rate = Puncture Size = 6, Puncture Pattern = 0b110110
+5/6 code rate = Puncture Size = 10, Puncture Pattern = 0b1101100110
+7/8 code rate = Puncture Size = 14, Puncture Pattern = 0b11010101100110
+
+A test Transport Stream for the example flow graph
+(8 Msyms/s and 7/8 code rate) is available here:
+
+http://www.w6rz.net/advdvbs78.ts
+
+It is 170,950,844 bytes.
+
+This stream can also be used at:
+
+14 Msyms/s 1/2 code rate
+10.5 MSyms/s 2/3 code rate
+9.333333 MSyms/s 3/4 code rate
+8.4 Msyms/s 5/6 code rate
+
+The equation for calculating the correct Transport Stream bit-rate is:
+
+TS bit-rate = symbol rate * 2 * code rate * (188 / 204)
+
diff --git a/gr-dtv/examples/atsc_ctrlport_monitor.py b/gr-dtv/examples/atsc_ctrlport_monitor.py
new file mode 100755
index 0000000000..7c43aebb77
--- /dev/null
+++ b/gr-dtv/examples/atsc_ctrlport_monitor.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python
+#
+# Copyright 2015 Free Software Foundation
+#
+# This program 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.
+#
+# This program 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 this program; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+import sys
+import matplotlib
+matplotlib.use("QT4Agg")
+import matplotlib.pyplot as plt
+import matplotlib.animation as animation
+from gnuradio.ctrlport.GNURadioControlPortClient import GNURadioControlPortClient
+import scipy
+from scipy import fftpack
+
+"""
+If a host is running the ATSC receiver chain with ControlPort
+turned on, this script will connect to the host using the hostname and
+port pair of the ControlPort instance and display metrics of the
+receiver. The ATSC publishes information about the succes of the
+Reed-Solomon decoder and Viterbi metrics for use here in displaying
+the link quality. This also gets the equalizer taps of the receiver
+and displays the frequency response.
+"""
+
+class atsc_ctrlport_monitor:
+ def __init__(self, host, port):
+ argv = [None, host, port]
+ radiosys = GNURadioControlPortClient(argv=argv, rpcmethod='thrift')
+ self.radio = radiosys.client
+ print self.radio
+
+
+ vt_init_key = 'dtv_atsc_viterbi_decoder0::decoder_metrics'
+ data = self.radio.getKnobs([vt_init_key])[vt_init_key]
+ init_metric = scipy.mean(data.value)
+ self._viterbi_metric = 100*[init_metric,]
+
+ table_col_labels = ('Num Packets', 'Error Rate', 'Packet Error Rate',
+ 'Viterbi Metric', 'SNR')
+
+ self._fig = plt.figure(1, figsize=(12,12), facecolor='w')
+ self._sp0 = self._fig.add_subplot(4,1,1)
+ self._sp1 = self._fig.add_subplot(4,1,2)
+ self._sp2 = self._fig.add_subplot(4,1,3)
+ self._plot_taps = self._sp0.plot([], [], 'k', linewidth=2)
+ self._plot_psd = self._sp1.plot([], [], 'k', linewidth=2)
+ self._plot_data = self._sp2.plot([], [], 'ok', linewidth=2, markersize=4, alpha=0.05)
+
+ self._ax2 = self._fig.add_subplot(4,1,4)
+ self._table = self._ax2.table(cellText=[len(table_col_labels)*['0']],
+ colLabels=table_col_labels,
+ loc='center')
+ self._ax2.axis('off')
+ cells = self._table.properties()['child_artists']
+ for c in cells:
+ c.set_lw(0.1) # set's line width
+ c.set_ls('solid')
+ c.set_height(0.2)
+
+ ani = animation.FuncAnimation(self._fig, self.update_data, frames=200,
+ fargs=(self._plot_taps[0], self._plot_psd[0],
+ self._plot_data[0], self._table),
+ init_func=self.init_function,
+ blit=True)
+ plt.show()
+
+ def update_data(self, x, taps, psd, syms, table):
+ try:
+ eqdata_key = 'dtv_atsc_equalizer0::taps'
+ symdata_key = 'dtv_atsc_equalizer0::data'
+ rs_nump_key = 'dtv_atsc_rs_decoder0::num_packets'
+ rs_numbp_key = 'dtv_atsc_rs_decoder0::num_bad_packets'
+ rs_numerrs_key = 'dtv_atsc_rs_decoder0::num_errors_corrected'
+ vt_metrics_key = 'dtv_atsc_viterbi_decoder0::decoder_metrics'
+ snr_key = 'probe2_f0::SNR'
+
+ data = self.radio.getKnobs([])
+ eqdata = data[eqdata_key]
+ symdata = data[symdata_key]
+ rs_num_packets = data[rs_nump_key]
+ rs_num_bad_packets = data[rs_numbp_key]
+ rs_num_errors_corrected = data[rs_numerrs_key]
+ vt_decoder_metrics = data[vt_metrics_key]
+ snr_est = data[snr_key]
+
+ vt_decoder_metrics = scipy.mean(vt_decoder_metrics.value)
+ self._viterbi_metric.pop()
+ self._viterbi_metric.insert(0, vt_decoder_metrics)
+
+ except:
+ sys.stderr.write("Lost connection, exiting")
+ sys.exit(1)
+
+ ntaps = len(eqdata.value)
+ taps.set_ydata(eqdata.value)
+ taps.set_xdata(xrange(ntaps))
+ self._sp0.set_xlim(0, ntaps)
+ self._sp0.set_ylim(min(eqdata.value), max(eqdata.value))
+
+ fs = 6.25e6
+ freq = scipy.linspace(-fs/2, fs/2, 10000)
+ H = fftpack.fftshift(fftpack.fft(eqdata.value, 10000))
+ HdB = 20.0*scipy.log10(abs(H))
+ psd.set_ydata(HdB)
+ psd.set_xdata(freq)
+ self._sp1.set_xlim(0, fs/2)
+ self._sp1.set_ylim([min(HdB), max(HdB)])
+ self._sp1.set_yticks([min(HdB), max(HdB)])
+ self._sp1.set_yticklabels(["min", "max"])
+
+ nsyms = len(symdata.value)
+ syms.set_ydata(symdata.value)
+ syms.set_xdata(nsyms*[0,])
+ self._sp2.set_xlim([-1, 1])
+ self._sp2.set_ylim([-10, 10])
+
+ per = float(rs_num_bad_packets.value) / float(rs_num_packets.value)
+ ber = float(rs_num_errors_corrected.value) / float(187*rs_num_packets.value)
+
+ table._cells[(1,0)]._text.set_text("{0}".format(rs_num_packets.value))
+ table._cells[(1,1)]._text.set_text("{0:.2g}".format(ber))
+ table._cells[(1,2)]._text.set_text("{0:.2g}".format(per))
+ table._cells[(1,3)]._text.set_text("{0:.1f}".format(scipy.mean(self._viterbi_metric)))
+ table._cells[(1,4)]._text.set_text("{0:.4f}".format(snr_est.value[0]))
+
+ return (taps, psd, syms, table)
+
+ def init_function(self):
+ return self._plot_taps + self._plot_psd + self._plot_data
+
+if __name__ == "__main__":
+ host = sys.argv[1]
+ port = sys.argv[2]
+ m = atsc_ctrlport_monitor(host, port)
diff --git a/gr-dtv/examples/catv_tx_64qam.grc b/gr-dtv/examples/catv_tx_64qam.grc
new file mode 100644
index 0000000000..964ef8470f
--- /dev/null
+++ b/gr-dtv/examples/catv_tx_64qam.grc
@@ -0,0 +1,2079 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.10'?>
+<flow_graph>
+ <timestamp>Thu Feb 20 21:02:41 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>1280, 1024</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>wx_gui</value>
+ </param>
+ <param>
+ <key>hier_block_src_path</key>
+ <value>.:</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>catv_tx_64qam</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>qt_qss_theme</key>
+ <value></value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>run_command</key>
+ <value>{python} -u {filename}</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>thread_safe_setters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>title</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 299)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>Control_Word</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>6</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 371)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>I_taps</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>128</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 443)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>J_increment</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>4</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 155)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>center_freq</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>429000000</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 227)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>rrc_taps</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>100</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 83)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>5056941 * 2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>int_converter</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>-8</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(312, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>vga1_gain</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>VGA1 Gain</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>-4</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>-35</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>31</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ </block>
+ <block>
+ <key>variable_slider</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>int_converter</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(448, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>vga2_gain</value>
+ </param>
+ <param>
+ <key>label</key>
+ <value>VGA2 Gain</value>
+ </param>
+ <param>
+ <key>max</key>
+ <value>25</value>
+ </param>
+ <param>
+ <key>min</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>25</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_file_source</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>file</key>
+ <value>/run/shm/advqam64.ts</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(128, 163)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_file_source_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_packed_to_unpacked_xx</key>
+ <param>
+ <key>bits_per_chunk</key>
+ <value>7</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>endianness</key>
+ <value>gr.GR_MSB_FIRST</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(624, 163)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_packed_to_unpacked_xx_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>num_ports</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_stream_to_vector</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(536, 251)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>180</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_stream_to_vector_0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>num_items</key>
+ <value>I_taps</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_catv_frame_sync_enc_bb</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ctrlword</key>
+ <value>Control_Word</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(584, 347)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_catv_frame_sync_enc_bb_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_catv_randomizer_bb</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(424, 353)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_catv_randomizer_bb_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_catv_reed_solomon_enc_bb</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(848, 177)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_catv_reed_solomon_enc_bb_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_catv_transport_framing_enc_bb</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(360, 177)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_catv_transport_framing_enc_bb_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_catv_trellis_enc_bb</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(800, 353)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_catv_trellis_enc_bb_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_dvbs2_modulator_bc</key>
+ <param>
+ <key>interpolation</key>
+ <value>INTERPOLATION_ON</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>C_OTHER</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>constellation</key>
+ <value>MOD_64QAM</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(400, 499)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_dvbs2_modulator_bc_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_dvbt_convolutional_interleaver</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>blocks</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>M</key>
+ <value>J_increment</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(168, 339)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_dvbt_convolutional_interleaver_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>I</key>
+ <value>I_taps</value>
+ </param>
+ </block>
+ <block>
+ <key>fft_filter_xxx</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>decim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(712, 507)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>fft_filter_xxx_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>nthreads</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>samp_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>firdes.root_raised_cosine(0.14, samp_rate, samp_rate/2, 0.18, rrc_taps)</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ccf</value>
+ </param>
+ </block>
+ <block>
+ <key>osmosdr_sink</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ant0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain0</key>
+ <value>vga1_gain</value>
+ </param>
+ <param>
+ <key>bw0</key>
+ <value>6000000</value>
+ </param>
+ <param>
+ <key>corr0</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq0</key>
+ <value>center_freq</value>
+ </param>
+ <param>
+ <key>if_gain0</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>gain0</key>
+ <value>vga2_gain</value>
+ </param>
+ <param>
+ <key>ant10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain10</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq10</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain10</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain10</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant11</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain11</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq11</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain11</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain11</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant12</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain12</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq12</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain12</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain12</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant13</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain13</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq13</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain13</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain13</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant14</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain14</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq14</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain14</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain14</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant15</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain15</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq15</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain15</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain15</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant16</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain16</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq16</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain16</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain16</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant17</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain17</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq17</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain17</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain17</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant18</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain18</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq18</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain18</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain18</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant19</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain19</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq19</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain19</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain19</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain1</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq1</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain1</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain1</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant20</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain20</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq20</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain20</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain20</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant21</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain21</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq21</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain21</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain21</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant22</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain22</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq22</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain22</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain22</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant23</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain23</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq23</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain23</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain23</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant24</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain24</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq24</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain24</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain24</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant25</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain25</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq25</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain25</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain25</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant26</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain26</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq26</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain26</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain26</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant27</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain27</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq27</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain27</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain27</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant28</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain28</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq28</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain28</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain28</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant29</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain29</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq29</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain29</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain29</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain2</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq2</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain2</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain2</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant30</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain30</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq30</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain30</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain30</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant31</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain31</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq31</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain31</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain31</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain3</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq3</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain3</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain3</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain4</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq4</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain4</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain4</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain5</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq5</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain5</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain5</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain6</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq6</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain6</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain6</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain7</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq7</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain7</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain7</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain8</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq8</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain8</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain8</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain9</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq9</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain9</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain9</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>args</key>
+ <value>bladerf=0,buffers=128,buflen=32768</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1056, 467)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>osmosdr_sink_0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>fc32</value>
+ </param>
+ <param>
+ <key>clock_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>nchan</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_mboards</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>sample_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>sync</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_fftsink2</key>
+ <param>
+ <key>avg_alpha</key>
+ <value>0.1333</value>
+ </param>
+ <param>
+ <key>average</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>baseband_freq</key>
+ <value>center_freq</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>fft_size</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>freqvar</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1056, 203)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>wxgui_fftsink2_0_0</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>peak_hold</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ref_level</key>
+ <value>-10</value>
+ </param>
+ <param>
+ <key>ref_scale</key>
+ <value>2.0</value>
+ </param>
+ <param>
+ <key>fft_rate</key>
+ <value>15</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>FFT Plot</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>win_size</key>
+ <value>640,480</value>
+ </param>
+ <param>
+ <key>win</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>y_divs</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>y_per_div</key>
+ <value>10</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>blocks_file_source_0</source_block_id>
+ <sink_block_id>dtv_catv_transport_framing_enc_bb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_packed_to_unpacked_xx_0</source_block_id>
+ <sink_block_id>dtv_catv_reed_solomon_enc_bb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_stream_to_vector_0</source_block_id>
+ <sink_block_id>dtv_dvbt_convolutional_interleaver_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_catv_frame_sync_enc_bb_0</source_block_id>
+ <sink_block_id>dtv_catv_trellis_enc_bb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_catv_randomizer_bb_0</source_block_id>
+ <sink_block_id>dtv_catv_frame_sync_enc_bb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_catv_reed_solomon_enc_bb_0</source_block_id>
+ <sink_block_id>blocks_stream_to_vector_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_catv_transport_framing_enc_bb_0</source_block_id>
+ <sink_block_id>blocks_packed_to_unpacked_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_catv_trellis_enc_bb_0</source_block_id>
+ <sink_block_id>dtv_dvbs2_modulator_bc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_dvbs2_modulator_bc_0</source_block_id>
+ <sink_block_id>fft_filter_xxx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_dvbt_convolutional_interleaver_0</source_block_id>
+ <sink_block_id>dtv_catv_randomizer_bb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>osmosdr_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>wxgui_fftsink2_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+</flow_graph>
diff --git a/gr-dtv/examples/dvbs2_tx.grc b/gr-dtv/examples/dvbs2_tx.grc
index 47daa4cb9d..c6de308ae3 100644
--- a/gr-dtv/examples/dvbs2_tx.grc
+++ b/gr-dtv/examples/dvbs2_tx.grc
@@ -1,23 +1,23 @@
-<?xml version='1.0' encoding='ASCII'?>
-<?grc format='1' created='3.7.7'?>
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.10'?>
<flow_graph>
<timestamp>Wed Sep 3 03:03:39 2014</timestamp>
<block>
<key>options</key>
<param>
- <key>id</key>
- <value>dvbs2_tx</value>
+ <key>author</key>
+ <value></value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>window_size</key>
+ <value>1280, 1024</value>
</param>
<param>
- <key>title</key>
- <value></value>
+ <key>category</key>
+ <value>Custom</value>
</param>
<param>
- <key>author</key>
+ <key>comment</key>
<value></value>
</param>
<param>
@@ -25,16 +25,44 @@
<value></value>
</param>
<param>
- <key>window_size</key>
- <value>1280, 1024</value>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
</param>
<param>
<key>generate_options</key>
<value>wx_gui</value>
</param>
<param>
- <key>category</key>
- <value>Custom</value>
+ <key>hier_block_src_path</key>
+ <value>.:</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dvbs2_tx</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>qt_qss_theme</key>
+ <value></value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>run_command</key>
+ <value>{python} -u {filename}</value>
</param>
<param>
<key>run_options</key>
@@ -45,45 +73,79 @@
<value>True</value>
</param>
<param>
- <key>max_nouts</key>
- <value>0</value>
+ <key>thread_safe_setters</key>
+ <value></value>
</param>
<param>
- <key>realtime_scheduling</key>
+ <key>title</key>
<value></value>
</param>
+ </block>
+ <block>
+ <key>variable</key>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(8, 11)</value>
+ <value>(8, 203)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
+ <param>
+ <key>id</key>
+ <value>frequency</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1280e6</value>
+ </param>
</block>
<block>
<key>variable</key>
<param>
- <key>id</key>
- <value>samp_rate</value>
+ <key>comment</key>
+ <value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>_coordinate</key>
+ <value>(8, 267)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>rolloff</value>
+ </param>
+ <param>
<key>value</key>
- <value>symbol_rate * 2</value>
+ <value>0.2</value>
</param>
+ </block>
+ <block>
+ <key>variable</key>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
<key>_coordinate</key>
<value>(8, 75)</value>
</param>
@@ -91,107 +153,186 @@
<key>_rotation</key>
<value>0</value>
</param>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>symbol_rate * 2</value>
+ </param>
</block>
<block>
<key>variable</key>
<param>
- <key>id</key>
- <value>symbol_rate</value>
+ <key>comment</key>
+ <value></value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
+ <key>_coordinate</key>
+ <value>(8, 139)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>symbol_rate</value>
+ </param>
+ <param>
<key>value</key>
<value>5000000</value>
</param>
+ </block>
+ <block>
+ <key>variable</key>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(8, 139)</value>
+ <value>(8, 331)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>variable</key>
<param>
<key>id</key>
- <value>rolloff</value>
+ <value>taps</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>value</key>
+ <value>100</value>
</param>
+ </block>
+ <block>
+ <key>blocks_file_sink</key>
<param>
- <key>value</key>
- <value>0.2</value>
+ <key>append</key>
+ <value>False</value>
</param>
<param>
<key>alias</key>
<value></value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>file</key>
+ <value>adv.cfile</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(8, 203)</value>
+ <value>(784, 547)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>variable</key>
<param>
<key>id</key>
- <value>taps</value>
+ <value>blocks_file_sink_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>type</key>
+ <value>complex</value>
</param>
<param>
- <key>value</key>
- <value>50</value>
+ <key>unbuffered</key>
+ <value>False</value>
</param>
<param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_file_source</key>
+ <param>
<key>alias</key>
<value></value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>file</key>
+ <value>/run/shm/adv16apsk910.ts</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(8, 267)</value>
+ <value>(176, 43)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>dtv_dvb_bch_bb</key>
<param>
<key>id</key>
- <value>dtv_dvb_bch_bb_0</value>
+ <value>blocks_file_source_0</value>
</param>
<param>
- <key>_enabled</key>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>repeat</key>
<value>True</value>
</param>
<param>
- <key>standard</key>
- <value>STANDARD_DVBS2</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
+ </block>
+ <block>
+ <key>dtv_dvb_bbheader_bb</key>
<param>
- <key>framesize</key>
+ <key>mode</key>
<value>FECFRAME_NORMAL</value>
</param>
<param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
<key>rate1</key>
<value>C1_2</value>
</param>
@@ -208,7 +349,7 @@
<value>C1_4</value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
@@ -216,39 +357,59 @@
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>fecblocks</key>
+ <value>168</value>
+ </param>
+ <param>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
</param>
<param>
<key>_coordinate</key>
- <value>(824, 35)</value>
+ <value>(400, 27)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>dtv_dvb_bbscrambler_bb</key>
<param>
<key>id</key>
- <value>dtv_dvb_bbscrambler_bb_0</value>
+ <value>dtv_dvb_bbheader_bb_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>inband</key>
+ <value>INBAND_OFF</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>rolloff</key>
+ <value>RO_0_20</value>
</param>
<param>
<key>standard</key>
<value>STANDARD_DVBS2</value>
</param>
<param>
- <key>framesize</key>
- <value>FECFRAME_NORMAL</value>
+ <key>tsrate</key>
+ <value>4000000</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_dvb_bbscrambler_bb</key>
+ <param>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>rate1</key>
@@ -267,7 +428,7 @@
<value>C1_4</value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
@@ -275,12 +436,12 @@
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
</param>
<param>
<key>_coordinate</key>
@@ -290,24 +451,28 @@
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>dtv_dvb_ldpc_bb</key>
<param>
<key>id</key>
- <value>dtv_dvb_ldpc_bb_0</value>
+ <value>dtv_dvb_bbscrambler_bb_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>standard</key>
<value>STANDARD_DVBS2</value>
</param>
+ </block>
+ <block>
+ <key>dtv_dvb_bch_bb</key>
<param>
- <key>framesize</key>
- <value>FECFRAME_NORMAL</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>rate1</key>
@@ -326,11 +491,7 @@
<value>C1_4</value>
</param>
<param>
- <key>constellation</key>
- <value>MOD_OTHER</value>
- </param>
- <param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
@@ -338,239 +499,310 @@
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
</param>
<param>
<key>_coordinate</key>
- <value>(1048, 27)</value>
+ <value>(824, 35)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
+ <param>
+ <key>id</key>
+ <value>dtv_dvb_bch_bb_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>standard</key>
+ <value>STANDARD_DVBS2</value>
+ </param>
</block>
<block>
- <key>dtv_dvbs2_interleaver_bb</key>
+ <key>dtv_dvb_ldpc_bb</key>
<param>
- <key>id</key>
- <value>dtv_dvbs2_interleaver_bb_0</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>rate1</key>
+ <value>C1_2</value>
</param>
<param>
- <key>framesize</key>
- <value>FECFRAME_NORMAL</value>
+ <key>rate2</key>
+ <value>C1_3</value>
</param>
<param>
- <key>constellation</key>
- <value>MOD_16APSK</value>
+ <key>rate3</key>
+ <value>C9_10</value>
</param>
<param>
- <key>rate</key>
- <value>C_OTHER</value>
+ <key>rate4</key>
+ <value>C1_4</value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
+ <key>constellation</key>
+ <value>MOD_OTHER</value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
</param>
<param>
<key>_coordinate</key>
- <value>(192, 235)</value>
+ <value>(1048, 27)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>wxgui_fftsink2</key>
<param>
<key>id</key>
- <value>wxgui_fftsink2_0</value>
+ <value>dtv_dvb_ldpc_bb_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>title</key>
- <value>FFT Plot</value>
+ <key>standard</key>
+ <value>STANDARD_DVBS2</value>
</param>
+ </block>
+ <block>
+ <key>dtv_dvbs2_interleaver_bb</key>
<param>
- <key>samp_rate</key>
- <value>samp_rate</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>baseband_freq</key>
- <value>1280000000</value>
+ <key>rate</key>
+ <value>C_OTHER</value>
</param>
<param>
- <key>y_per_div</key>
- <value>10</value>
+ <key>comment</key>
+ <value></value>
</param>
<param>
- <key>y_divs</key>
- <value>10</value>
+ <key>constellation</key>
+ <value>MOD_16APSK</value>
</param>
<param>
- <key>ref_level</key>
- <value>0</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>ref_scale</key>
- <value>2.0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>fft_size</key>
- <value>1024</value>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
</param>
<param>
- <key>fft_rate</key>
- <value>15</value>
+ <key>_coordinate</key>
+ <value>(192, 235)</value>
</param>
<param>
- <key>peak_hold</key>
- <value>False</value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
<param>
- <key>average</key>
- <value>True</value>
+ <key>id</key>
+ <value>dtv_dvbs2_interleaver_bb_0</value>
</param>
<param>
- <key>avg_alpha</key>
- <value>0.13333</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>win</key>
- <value>None</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>dtv_dvbs2_modulator_bc</key>
<param>
- <key>win_size</key>
- <value></value>
+ <key>interpolation</key>
+ <value>INTERPOLATION_OFF</value>
</param>
<param>
- <key>grid_pos</key>
+ <key>alias</key>
<value></value>
</param>
<param>
- <key>notebook</key>
- <value></value>
+ <key>rate</key>
+ <value>C9_10</value>
</param>
<param>
- <key>freqvar</key>
- <value>None</value>
+ <key>comment</key>
+ <value></value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>constellation</key>
+ <value>MOD_16APSK</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(1000, 395)</value>
+ <value>(472, 227)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>dtv_dvbs2_modulator_bc</key>
<param>
<key>id</key>
<value>dtv_dvbs2_modulator_bc_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>maxoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>framesize</key>
- <value>FECFRAME_NORMAL</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>dtv_dvbs2_physical_cc</key>
<param>
- <key>constellation</key>
- <value>MOD_16APSK</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
<key>rate</key>
<value>C9_10</value>
</param>
<param>
- <key>alias</key>
+ <key>comment</key>
<value></value>
</param>
<param>
+ <key>constellation</key>
+ <value>MOD_16APSK</value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
</param>
<param>
<key>_coordinate</key>
- <value>(472, 235)</value>
+ <value>(192, 443)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
+ <param>
+ <key>goldcode</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_dvbs2_physical_cc_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>pilots</key>
+ <value>PILOTS_ON</value>
+ </param>
</block>
<block>
<key>fft_filter_xxx</key>
<param>
- <key>id</key>
- <value>fft_filter_xxx_0</value>
+ <key>alias</key>
+ <value></value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>comment</key>
+ <value></value>
</param>
<param>
- <key>type</key>
- <value>ccc</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
<key>decim</key>
<value>1</value>
</param>
<param>
- <key>taps</key>
- <value>firdes.root_raised_cosine(1, samp_rate, samp_rate/2, rolloff, taps)</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>samp_delay</key>
+ <key>_coordinate</key>
+ <value>(472, 459)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>fft_filter_xxx_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
<value>0</value>
</param>
<param>
@@ -578,1014 +810,1458 @@
<value>1</value>
</param>
<param>
+ <key>samp_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>firdes.root_raised_cosine(1.0, samp_rate, samp_rate/2, rolloff, taps)</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ccc</value>
+ </param>
+ </block>
+ <block>
+ <key>osmosdr_sink</key>
+ <param>
<key>alias</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>ant0</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
+ <key>bb_gain0</key>
+ <value>-10</value>
+ </param>
+ <param>
+ <key>bw0</key>
+ <value>6000000</value>
+ </param>
+ <param>
+ <key>corr0</key>
<value>0</value>
</param>
<param>
- <key>maxoutbuf</key>
+ <key>freq0</key>
+ <value>frequency</value>
+ </param>
+ <param>
+ <key>if_gain0</key>
<value>0</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(472, 459)</value>
+ <key>gain0</key>
+ <value>15</value>
</param>
<param>
- <key>_rotation</key>
+ <key>ant10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain10</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw10</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>dtv_dvbs2_physical_cc</key>
<param>
- <key>id</key>
- <value>dtv_dvbs2_physical_cc_0</value>
+ <key>corr10</key>
+ <value>0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>freq10</key>
+ <value>100e6</value>
</param>
<param>
- <key>framesize</key>
- <value>FECFRAME_NORMAL</value>
+ <key>if_gain10</key>
+ <value>20</value>
</param>
<param>
- <key>constellation</key>
- <value>MOD_16APSK</value>
+ <key>gain10</key>
+ <value>10</value>
</param>
<param>
- <key>rate</key>
- <value>C9_10</value>
+ <key>ant11</key>
+ <value></value>
</param>
<param>
- <key>pilots</key>
- <value>PILOTS_ON</value>
+ <key>bb_gain11</key>
+ <value>20</value>
</param>
<param>
- <key>goldcode</key>
+ <key>bw11</key>
<value>0</value>
</param>
<param>
- <key>alias</key>
- <value></value>
+ <key>corr11</key>
+ <value>0</value>
</param>
<param>
- <key>affinity</key>
+ <key>freq11</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain11</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain11</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant12</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
+ <key>bb_gain12</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw12</key>
<value>0</value>
</param>
<param>
- <key>maxoutbuf</key>
+ <key>corr12</key>
<value>0</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(192, 443)</value>
+ <key>freq12</key>
+ <value>100e6</value>
</param>
<param>
- <key>_rotation</key>
+ <key>if_gain12</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain12</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant13</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain13</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw13</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>osmosdr_sink</key>
<param>
- <key>id</key>
- <value>osmosdr_sink_0</value>
+ <key>corr13</key>
+ <value>0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>freq13</key>
+ <value>100e6</value>
</param>
<param>
- <key>type</key>
- <value>fc32</value>
+ <key>if_gain13</key>
+ <value>20</value>
</param>
<param>
- <key>args</key>
- <value>bladerf=0,buffers=128,buflen=32768</value>
+ <key>gain13</key>
+ <value>10</value>
</param>
<param>
- <key>sync</key>
+ <key>ant14</key>
<value></value>
</param>
<param>
- <key>num_mboards</key>
- <value>1</value>
+ <key>bb_gain14</key>
+ <value>20</value>
</param>
<param>
- <key>clock_source0</key>
- <value></value>
+ <key>bw14</key>
+ <value>0</value>
</param>
<param>
- <key>time_source0</key>
- <value></value>
+ <key>corr14</key>
+ <value>0</value>
</param>
<param>
- <key>clock_source1</key>
- <value></value>
+ <key>freq14</key>
+ <value>100e6</value>
</param>
<param>
- <key>time_source1</key>
- <value></value>
+ <key>if_gain14</key>
+ <value>20</value>
</param>
<param>
- <key>clock_source2</key>
- <value></value>
+ <key>gain14</key>
+ <value>10</value>
</param>
<param>
- <key>time_source2</key>
+ <key>ant15</key>
<value></value>
</param>
<param>
- <key>clock_source3</key>
- <value></value>
+ <key>bb_gain15</key>
+ <value>20</value>
</param>
<param>
- <key>time_source3</key>
- <value></value>
+ <key>bw15</key>
+ <value>0</value>
</param>
<param>
- <key>clock_source4</key>
- <value></value>
+ <key>corr15</key>
+ <value>0</value>
</param>
<param>
- <key>time_source4</key>
- <value></value>
+ <key>freq15</key>
+ <value>100e6</value>
</param>
<param>
- <key>clock_source5</key>
- <value></value>
+ <key>if_gain15</key>
+ <value>20</value>
</param>
<param>
- <key>time_source5</key>
- <value></value>
+ <key>gain15</key>
+ <value>10</value>
</param>
<param>
- <key>clock_source6</key>
+ <key>ant16</key>
<value></value>
</param>
<param>
- <key>time_source6</key>
- <value></value>
+ <key>bb_gain16</key>
+ <value>20</value>
</param>
<param>
- <key>clock_source7</key>
- <value></value>
+ <key>bw16</key>
+ <value>0</value>
</param>
<param>
- <key>time_source7</key>
- <value></value>
+ <key>corr16</key>
+ <value>0</value>
</param>
<param>
- <key>nchan</key>
- <value>1</value>
+ <key>freq16</key>
+ <value>100e6</value>
</param>
<param>
- <key>sample_rate</key>
- <value>samp_rate</value>
+ <key>if_gain16</key>
+ <value>20</value>
</param>
<param>
- <key>freq0</key>
- <value>1280e6</value>
+ <key>gain16</key>
+ <value>10</value>
</param>
<param>
- <key>corr0</key>
- <value>0</value>
+ <key>ant17</key>
+ <value></value>
</param>
<param>
- <key>gain0</key>
- <value>15</value>
+ <key>bb_gain17</key>
+ <value>20</value>
</param>
<param>
- <key>if_gain0</key>
+ <key>bw17</key>
<value>0</value>
</param>
<param>
- <key>bb_gain0</key>
- <value>-10</value>
+ <key>corr17</key>
+ <value>0</value>
</param>
<param>
- <key>ant0</key>
+ <key>freq17</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain17</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain17</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant18</key>
<value></value>
</param>
<param>
- <key>bw0</key>
- <value>6000000</value>
+ <key>bb_gain18</key>
+ <value>20</value>
</param>
<param>
- <key>freq1</key>
- <value>100e6</value>
+ <key>bw18</key>
+ <value>0</value>
</param>
<param>
- <key>corr1</key>
+ <key>corr18</key>
<value>0</value>
</param>
<param>
- <key>gain1</key>
+ <key>freq18</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain18</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain18</key>
<value>10</value>
</param>
<param>
- <key>if_gain1</key>
+ <key>ant19</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain19</key>
<value>20</value>
</param>
<param>
- <key>bb_gain1</key>
+ <key>bw19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq19</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain19</key>
<value>20</value>
</param>
<param>
+ <key>gain19</key>
+ <value>10</value>
+ </param>
+ <param>
<key>ant1</key>
<value></value>
</param>
<param>
+ <key>bb_gain1</key>
+ <value>20</value>
+ </param>
+ <param>
<key>bw1</key>
<value>0</value>
</param>
<param>
- <key>freq2</key>
+ <key>corr1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq1</key>
<value>100e6</value>
</param>
<param>
- <key>corr2</key>
- <value>0</value>
+ <key>if_gain1</key>
+ <value>20</value>
</param>
<param>
- <key>gain2</key>
+ <key>gain1</key>
<value>10</value>
</param>
<param>
- <key>if_gain2</key>
- <value>20</value>
+ <key>ant20</key>
+ <value></value>
</param>
<param>
- <key>bb_gain2</key>
+ <key>bb_gain20</key>
<value>20</value>
</param>
<param>
- <key>ant2</key>
- <value></value>
+ <key>bw20</key>
+ <value>0</value>
</param>
<param>
- <key>bw2</key>
+ <key>corr20</key>
<value>0</value>
</param>
<param>
- <key>freq3</key>
+ <key>freq20</key>
<value>100e6</value>
</param>
<param>
- <key>corr3</key>
- <value>0</value>
+ <key>if_gain20</key>
+ <value>20</value>
</param>
<param>
- <key>gain3</key>
+ <key>gain20</key>
<value>10</value>
</param>
<param>
- <key>if_gain3</key>
- <value>20</value>
+ <key>ant21</key>
+ <value></value>
</param>
<param>
- <key>bb_gain3</key>
+ <key>bb_gain21</key>
<value>20</value>
</param>
<param>
- <key>ant3</key>
- <value></value>
+ <key>bw21</key>
+ <value>0</value>
</param>
<param>
- <key>bw3</key>
+ <key>corr21</key>
<value>0</value>
</param>
<param>
- <key>freq4</key>
+ <key>freq21</key>
<value>100e6</value>
</param>
<param>
- <key>corr4</key>
- <value>0</value>
+ <key>if_gain21</key>
+ <value>20</value>
</param>
<param>
- <key>gain4</key>
+ <key>gain21</key>
<value>10</value>
</param>
<param>
- <key>if_gain4</key>
- <value>20</value>
+ <key>ant22</key>
+ <value></value>
</param>
<param>
- <key>bb_gain4</key>
+ <key>bb_gain22</key>
<value>20</value>
</param>
<param>
- <key>ant4</key>
- <value></value>
+ <key>bw22</key>
+ <value>0</value>
</param>
<param>
- <key>bw4</key>
+ <key>corr22</key>
<value>0</value>
</param>
<param>
- <key>freq5</key>
+ <key>freq22</key>
<value>100e6</value>
</param>
<param>
- <key>corr5</key>
- <value>0</value>
+ <key>if_gain22</key>
+ <value>20</value>
</param>
<param>
- <key>gain5</key>
+ <key>gain22</key>
<value>10</value>
</param>
<param>
- <key>if_gain5</key>
- <value>20</value>
+ <key>ant23</key>
+ <value></value>
</param>
<param>
- <key>bb_gain5</key>
+ <key>bb_gain23</key>
<value>20</value>
</param>
<param>
- <key>ant5</key>
- <value></value>
+ <key>bw23</key>
+ <value>0</value>
</param>
<param>
- <key>bw5</key>
+ <key>corr23</key>
<value>0</value>
</param>
<param>
- <key>freq6</key>
+ <key>freq23</key>
<value>100e6</value>
</param>
<param>
- <key>corr6</key>
- <value>0</value>
+ <key>if_gain23</key>
+ <value>20</value>
</param>
<param>
- <key>gain6</key>
+ <key>gain23</key>
<value>10</value>
</param>
<param>
- <key>if_gain6</key>
- <value>20</value>
+ <key>ant24</key>
+ <value></value>
</param>
<param>
- <key>bb_gain6</key>
+ <key>bb_gain24</key>
<value>20</value>
</param>
<param>
- <key>ant6</key>
- <value></value>
+ <key>bw24</key>
+ <value>0</value>
</param>
<param>
- <key>bw6</key>
+ <key>corr24</key>
<value>0</value>
</param>
<param>
- <key>freq7</key>
+ <key>freq24</key>
<value>100e6</value>
</param>
<param>
- <key>corr7</key>
- <value>0</value>
+ <key>if_gain24</key>
+ <value>20</value>
</param>
<param>
- <key>gain7</key>
+ <key>gain24</key>
<value>10</value>
</param>
<param>
- <key>if_gain7</key>
- <value>20</value>
+ <key>ant25</key>
+ <value></value>
</param>
<param>
- <key>bb_gain7</key>
+ <key>bb_gain25</key>
<value>20</value>
</param>
<param>
- <key>ant7</key>
- <value></value>
+ <key>bw25</key>
+ <value>0</value>
</param>
<param>
- <key>bw7</key>
+ <key>corr25</key>
<value>0</value>
</param>
<param>
- <key>freq8</key>
+ <key>freq25</key>
<value>100e6</value>
</param>
<param>
- <key>corr8</key>
- <value>0</value>
+ <key>if_gain25</key>
+ <value>20</value>
</param>
<param>
- <key>gain8</key>
+ <key>gain25</key>
<value>10</value>
</param>
<param>
- <key>if_gain8</key>
- <value>20</value>
+ <key>ant26</key>
+ <value></value>
</param>
<param>
- <key>bb_gain8</key>
+ <key>bb_gain26</key>
<value>20</value>
</param>
<param>
- <key>ant8</key>
- <value></value>
+ <key>bw26</key>
+ <value>0</value>
</param>
<param>
- <key>bw8</key>
+ <key>corr26</key>
<value>0</value>
</param>
<param>
- <key>freq9</key>
+ <key>freq26</key>
<value>100e6</value>
</param>
<param>
- <key>corr9</key>
- <value>0</value>
+ <key>if_gain26</key>
+ <value>20</value>
</param>
<param>
- <key>gain9</key>
+ <key>gain26</key>
<value>10</value>
</param>
<param>
- <key>if_gain9</key>
- <value>20</value>
+ <key>ant27</key>
+ <value></value>
</param>
<param>
- <key>bb_gain9</key>
+ <key>bb_gain27</key>
<value>20</value>
</param>
<param>
- <key>ant9</key>
- <value></value>
+ <key>bw27</key>
+ <value>0</value>
</param>
<param>
- <key>bw9</key>
+ <key>corr27</key>
<value>0</value>
</param>
<param>
- <key>freq10</key>
+ <key>freq27</key>
<value>100e6</value>
</param>
<param>
- <key>corr10</key>
- <value>0</value>
+ <key>if_gain27</key>
+ <value>20</value>
</param>
<param>
- <key>gain10</key>
+ <key>gain27</key>
<value>10</value>
</param>
<param>
- <key>if_gain10</key>
- <value>20</value>
+ <key>ant28</key>
+ <value></value>
</param>
<param>
- <key>bb_gain10</key>
+ <key>bb_gain28</key>
<value>20</value>
</param>
<param>
- <key>ant10</key>
- <value></value>
+ <key>bw28</key>
+ <value>0</value>
</param>
<param>
- <key>bw10</key>
+ <key>corr28</key>
<value>0</value>
</param>
<param>
- <key>freq11</key>
+ <key>freq28</key>
<value>100e6</value>
</param>
<param>
- <key>corr11</key>
- <value>0</value>
+ <key>if_gain28</key>
+ <value>20</value>
</param>
<param>
- <key>gain11</key>
+ <key>gain28</key>
<value>10</value>
</param>
<param>
- <key>if_gain11</key>
- <value>20</value>
+ <key>ant29</key>
+ <value></value>
</param>
<param>
- <key>bb_gain11</key>
+ <key>bb_gain29</key>
<value>20</value>
</param>
<param>
- <key>ant11</key>
- <value></value>
+ <key>bw29</key>
+ <value>0</value>
</param>
<param>
- <key>bw11</key>
+ <key>corr29</key>
<value>0</value>
</param>
<param>
- <key>freq12</key>
+ <key>freq29</key>
<value>100e6</value>
</param>
<param>
- <key>corr12</key>
- <value>0</value>
+ <key>if_gain29</key>
+ <value>20</value>
</param>
<param>
- <key>gain12</key>
+ <key>gain29</key>
<value>10</value>
</param>
<param>
- <key>if_gain12</key>
- <value>20</value>
+ <key>ant2</key>
+ <value></value>
</param>
<param>
- <key>bb_gain12</key>
+ <key>bb_gain2</key>
<value>20</value>
</param>
<param>
- <key>ant12</key>
- <value></value>
+ <key>bw2</key>
+ <value>0</value>
</param>
<param>
- <key>bw12</key>
+ <key>corr2</key>
<value>0</value>
</param>
<param>
- <key>freq13</key>
+ <key>freq2</key>
<value>100e6</value>
</param>
<param>
- <key>corr13</key>
- <value>0</value>
+ <key>if_gain2</key>
+ <value>20</value>
</param>
<param>
- <key>gain13</key>
+ <key>gain2</key>
<value>10</value>
</param>
<param>
- <key>if_gain13</key>
- <value>20</value>
+ <key>ant30</key>
+ <value></value>
</param>
<param>
- <key>bb_gain13</key>
+ <key>bb_gain30</key>
<value>20</value>
</param>
<param>
- <key>ant13</key>
- <value></value>
+ <key>bw30</key>
+ <value>0</value>
</param>
<param>
- <key>bw13</key>
+ <key>corr30</key>
<value>0</value>
</param>
<param>
- <key>freq14</key>
+ <key>freq30</key>
<value>100e6</value>
</param>
<param>
- <key>corr14</key>
- <value>0</value>
+ <key>if_gain30</key>
+ <value>20</value>
</param>
<param>
- <key>gain14</key>
+ <key>gain30</key>
<value>10</value>
</param>
<param>
- <key>if_gain14</key>
- <value>20</value>
+ <key>ant31</key>
+ <value></value>
</param>
<param>
- <key>bb_gain14</key>
+ <key>bb_gain31</key>
<value>20</value>
</param>
<param>
- <key>ant14</key>
- <value></value>
+ <key>bw31</key>
+ <value>0</value>
</param>
<param>
- <key>bw14</key>
+ <key>corr31</key>
<value>0</value>
</param>
<param>
- <key>freq15</key>
+ <key>freq31</key>
<value>100e6</value>
</param>
<param>
- <key>corr15</key>
- <value>0</value>
+ <key>if_gain31</key>
+ <value>20</value>
</param>
<param>
- <key>gain15</key>
+ <key>gain31</key>
<value>10</value>
</param>
<param>
- <key>if_gain15</key>
+ <key>ant3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain3</key>
<value>20</value>
</param>
<param>
- <key>bb_gain15</key>
+ <key>bw3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq3</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain3</key>
<value>20</value>
</param>
<param>
- <key>ant15</key>
+ <key>gain3</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant4</key>
<value></value>
</param>
<param>
- <key>bw15</key>
+ <key>bb_gain4</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw4</key>
<value>0</value>
</param>
<param>
- <key>freq16</key>
+ <key>corr4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq4</key>
<value>100e6</value>
</param>
<param>
- <key>corr16</key>
- <value>0</value>
+ <key>if_gain4</key>
+ <value>20</value>
</param>
<param>
- <key>gain16</key>
+ <key>gain4</key>
<value>10</value>
</param>
<param>
- <key>if_gain16</key>
+ <key>ant5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain5</key>
<value>20</value>
</param>
<param>
- <key>bb_gain16</key>
+ <key>bw5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq5</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain5</key>
<value>20</value>
</param>
<param>
- <key>ant16</key>
+ <key>gain5</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant6</key>
<value></value>
</param>
<param>
- <key>bw16</key>
+ <key>bb_gain6</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw6</key>
<value>0</value>
</param>
<param>
- <key>freq17</key>
+ <key>corr6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq6</key>
<value>100e6</value>
</param>
<param>
- <key>corr17</key>
- <value>0</value>
+ <key>if_gain6</key>
+ <value>20</value>
</param>
<param>
- <key>gain17</key>
+ <key>gain6</key>
<value>10</value>
</param>
<param>
- <key>if_gain17</key>
+ <key>ant7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain7</key>
<value>20</value>
</param>
<param>
- <key>bb_gain17</key>
+ <key>bw7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq7</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain7</key>
<value>20</value>
</param>
<param>
- <key>ant17</key>
+ <key>gain7</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant8</key>
<value></value>
</param>
<param>
- <key>bw17</key>
+ <key>bb_gain8</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw8</key>
<value>0</value>
</param>
<param>
- <key>freq18</key>
+ <key>corr8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq8</key>
<value>100e6</value>
</param>
<param>
- <key>corr18</key>
- <value>0</value>
+ <key>if_gain8</key>
+ <value>20</value>
</param>
<param>
- <key>gain18</key>
+ <key>gain8</key>
<value>10</value>
</param>
<param>
- <key>if_gain18</key>
+ <key>ant9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain9</key>
<value>20</value>
</param>
<param>
- <key>bb_gain18</key>
+ <key>bw9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq9</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain9</key>
<value>20</value>
</param>
<param>
- <key>ant18</key>
+ <key>gain9</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>comment</key>
<value></value>
</param>
<param>
- <key>bw18</key>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>args</key>
+ <value>bladerf=0,buffers=128,buflen=32768</value>
+ </param>
+ <param>
+ <key>_enabled</key>
<value>0</value>
</param>
<param>
- <key>freq19</key>
- <value>100e6</value>
+ <key>_coordinate</key>
+ <value>(1040, 243)</value>
</param>
<param>
- <key>corr19</key>
+ <key>_rotation</key>
<value>0</value>
</param>
<param>
- <key>gain19</key>
- <value>10</value>
+ <key>id</key>
+ <value>osmosdr_sink_0</value>
</param>
<param>
- <key>if_gain19</key>
- <value>20</value>
+ <key>type</key>
+ <value>fc32</value>
</param>
<param>
- <key>bb_gain19</key>
- <value>20</value>
+ <key>clock_source0</key>
+ <value></value>
</param>
<param>
- <key>ant19</key>
+ <key>time_source0</key>
<value></value>
</param>
<param>
- <key>bw19</key>
+ <key>clock_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>nchan</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_mboards</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>sample_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>sync</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
+ <key>uhd_usrp_sink</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ant0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw0</key>
<value>0</value>
</param>
<param>
- <key>freq20</key>
- <value>100e6</value>
+ <key>center_freq0</key>
+ <value>uhd.tune_request(frequency, ((symbol_rate * (1 + rolloff)) / 2 ) + 1e5)</value>
</param>
<param>
- <key>corr20</key>
+ <key>norm_gain0</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain0</key>
+ <value>60</value>
+ </param>
+ <param>
+ <key>ant10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw10</key>
<value>0</value>
</param>
<param>
- <key>gain20</key>
- <value>10</value>
+ <key>center_freq10</key>
+ <value>0</value>
</param>
<param>
- <key>if_gain20</key>
- <value>20</value>
+ <key>norm_gain10</key>
+ <value>False</value>
</param>
<param>
- <key>bb_gain20</key>
- <value>20</value>
+ <key>gain10</key>
+ <value>0</value>
</param>
<param>
- <key>ant20</key>
+ <key>ant11</key>
<value></value>
</param>
<param>
- <key>bw20</key>
+ <key>bw11</key>
<value>0</value>
</param>
<param>
- <key>freq21</key>
- <value>100e6</value>
+ <key>center_freq11</key>
+ <value>0</value>
</param>
<param>
- <key>corr21</key>
+ <key>norm_gain11</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain11</key>
<value>0</value>
</param>
<param>
- <key>gain21</key>
- <value>10</value>
+ <key>ant12</key>
+ <value></value>
</param>
<param>
- <key>if_gain21</key>
- <value>20</value>
+ <key>bw12</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain21</key>
- <value>20</value>
+ <key>center_freq12</key>
+ <value>0</value>
</param>
<param>
- <key>ant21</key>
+ <key>norm_gain12</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant13</key>
<value></value>
</param>
<param>
- <key>bw21</key>
+ <key>bw13</key>
<value>0</value>
</param>
<param>
- <key>freq22</key>
- <value>100e6</value>
+ <key>center_freq13</key>
+ <value>0</value>
</param>
<param>
- <key>corr22</key>
+ <key>norm_gain13</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain13</key>
<value>0</value>
</param>
<param>
- <key>gain22</key>
- <value>10</value>
+ <key>ant14</key>
+ <value></value>
</param>
<param>
- <key>if_gain22</key>
- <value>20</value>
+ <key>bw14</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain22</key>
- <value>20</value>
+ <key>center_freq14</key>
+ <value>0</value>
</param>
<param>
- <key>ant22</key>
+ <key>norm_gain14</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant15</key>
<value></value>
</param>
<param>
- <key>bw22</key>
+ <key>bw15</key>
<value>0</value>
</param>
<param>
- <key>freq23</key>
- <value>100e6</value>
+ <key>center_freq15</key>
+ <value>0</value>
</param>
<param>
- <key>corr23</key>
+ <key>norm_gain15</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain15</key>
<value>0</value>
</param>
<param>
- <key>gain23</key>
- <value>10</value>
+ <key>ant16</key>
+ <value></value>
</param>
<param>
- <key>if_gain23</key>
- <value>20</value>
+ <key>bw16</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain23</key>
- <value>20</value>
+ <key>center_freq16</key>
+ <value>0</value>
</param>
<param>
- <key>ant23</key>
+ <key>norm_gain16</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant17</key>
<value></value>
</param>
<param>
- <key>bw23</key>
+ <key>bw17</key>
<value>0</value>
</param>
<param>
- <key>freq24</key>
- <value>100e6</value>
+ <key>center_freq17</key>
+ <value>0</value>
</param>
<param>
- <key>corr24</key>
+ <key>norm_gain17</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain17</key>
<value>0</value>
</param>
<param>
- <key>gain24</key>
- <value>10</value>
+ <key>ant18</key>
+ <value></value>
</param>
<param>
- <key>if_gain24</key>
- <value>20</value>
+ <key>bw18</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain24</key>
- <value>20</value>
+ <key>center_freq18</key>
+ <value>0</value>
</param>
<param>
- <key>ant24</key>
+ <key>norm_gain18</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant19</key>
<value></value>
</param>
<param>
- <key>bw24</key>
+ <key>bw19</key>
<value>0</value>
</param>
<param>
- <key>freq25</key>
- <value>100e6</value>
+ <key>center_freq19</key>
+ <value>0</value>
</param>
<param>
- <key>corr25</key>
+ <key>norm_gain19</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain19</key>
<value>0</value>
</param>
<param>
- <key>gain25</key>
- <value>10</value>
+ <key>ant1</key>
+ <value></value>
</param>
<param>
- <key>if_gain25</key>
- <value>20</value>
+ <key>bw1</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain25</key>
- <value>20</value>
+ <key>center_freq1</key>
+ <value>0</value>
</param>
<param>
- <key>ant25</key>
+ <key>norm_gain1</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant20</key>
<value></value>
</param>
<param>
- <key>bw25</key>
+ <key>bw20</key>
<value>0</value>
</param>
<param>
- <key>freq26</key>
- <value>100e6</value>
+ <key>center_freq20</key>
+ <value>0</value>
</param>
<param>
- <key>corr26</key>
+ <key>norm_gain20</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain20</key>
<value>0</value>
</param>
<param>
- <key>gain26</key>
- <value>10</value>
+ <key>ant21</key>
+ <value></value>
</param>
<param>
- <key>if_gain26</key>
- <value>20</value>
+ <key>bw21</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain26</key>
- <value>20</value>
+ <key>center_freq21</key>
+ <value>0</value>
</param>
<param>
- <key>ant26</key>
+ <key>norm_gain21</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant22</key>
<value></value>
</param>
<param>
- <key>bw26</key>
+ <key>bw22</key>
<value>0</value>
</param>
<param>
- <key>freq27</key>
- <value>100e6</value>
+ <key>center_freq22</key>
+ <value>0</value>
</param>
<param>
- <key>corr27</key>
+ <key>norm_gain22</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain22</key>
<value>0</value>
</param>
<param>
- <key>gain27</key>
- <value>10</value>
+ <key>ant23</key>
+ <value></value>
</param>
<param>
- <key>if_gain27</key>
- <value>20</value>
+ <key>bw23</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain27</key>
- <value>20</value>
+ <key>center_freq23</key>
+ <value>0</value>
</param>
<param>
- <key>ant27</key>
+ <key>norm_gain23</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant24</key>
<value></value>
</param>
<param>
- <key>bw27</key>
+ <key>bw24</key>
<value>0</value>
</param>
<param>
- <key>freq28</key>
- <value>100e6</value>
+ <key>center_freq24</key>
+ <value>0</value>
</param>
<param>
- <key>corr28</key>
+ <key>norm_gain24</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain24</key>
<value>0</value>
</param>
<param>
- <key>gain28</key>
- <value>10</value>
+ <key>ant25</key>
+ <value></value>
</param>
<param>
- <key>if_gain28</key>
- <value>20</value>
+ <key>bw25</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain28</key>
- <value>20</value>
+ <key>center_freq25</key>
+ <value>0</value>
</param>
<param>
- <key>ant28</key>
+ <key>norm_gain25</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant26</key>
<value></value>
</param>
<param>
- <key>bw28</key>
+ <key>bw26</key>
<value>0</value>
</param>
<param>
- <key>freq29</key>
- <value>100e6</value>
+ <key>center_freq26</key>
+ <value>0</value>
</param>
<param>
- <key>corr29</key>
+ <key>norm_gain26</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain26</key>
<value>0</value>
</param>
<param>
- <key>gain29</key>
- <value>10</value>
+ <key>ant27</key>
+ <value></value>
</param>
<param>
- <key>if_gain29</key>
- <value>20</value>
+ <key>bw27</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain29</key>
- <value>20</value>
+ <key>center_freq27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain27</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant28</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain28</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain28</key>
+ <value>0</value>
</param>
<param>
<key>ant29</key>
@@ -1596,24 +2272,36 @@
<value>0</value>
</param>
<param>
- <key>freq30</key>
- <value>100e6</value>
+ <key>center_freq29</key>
+ <value>0</value>
</param>
<param>
- <key>corr30</key>
+ <key>norm_gain29</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain29</key>
<value>0</value>
</param>
<param>
- <key>gain30</key>
- <value>10</value>
+ <key>ant2</key>
+ <value></value>
</param>
<param>
- <key>if_gain30</key>
- <value>20</value>
+ <key>bw2</key>
+ <value>0</value>
</param>
<param>
- <key>bb_gain30</key>
- <value>20</value>
+ <key>center_freq2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain2</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain2</key>
+ <value>0</value>
</param>
<param>
<key>ant30</key>
@@ -1624,82 +2312,183 @@
<value>0</value>
</param>
<param>
- <key>freq31</key>
- <value>100e6</value>
+ <key>center_freq30</key>
+ <value>0</value>
</param>
<param>
- <key>corr31</key>
+ <key>norm_gain30</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain30</key>
<value>0</value>
</param>
<param>
+ <key>ant31</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain31</key>
+ <value>False</value>
+ </param>
+ <param>
<key>gain31</key>
- <value>10</value>
+ <value>0</value>
</param>
<param>
- <key>if_gain31</key>
- <value>20</value>
+ <key>ant3</key>
+ <value></value>
</param>
<param>
- <key>bb_gain31</key>
- <value>20</value>
+ <key>bw3</key>
+ <value>0</value>
</param>
<param>
- <key>ant31</key>
+ <key>center_freq3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain3</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant4</key>
<value></value>
</param>
<param>
- <key>bw31</key>
+ <key>bw4</key>
<value>0</value>
</param>
<param>
- <key>alias</key>
+ <key>center_freq4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain4</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant5</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>bw5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain5</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant6</key>
<value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(1000, 203)</value>
+ <key>bw6</key>
+ <value>0</value>
</param>
<param>
- <key>_rotation</key>
+ <key>center_freq6</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>blocks_file_sink</key>
<param>
- <key>id</key>
- <value>blocks_file_sink_0</value>
+ <key>norm_gain6</key>
+ <value>False</value>
</param>
<param>
- <key>_enabled</key>
+ <key>gain6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain7</key>
<value>False</value>
</param>
<param>
- <key>file</key>
- <value>adv.cfile</value>
+ <key>gain7</key>
+ <value>0</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>ant8</key>
+ <value></value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>bw8</key>
+ <value>0</value>
</param>
<param>
- <key>unbuffered</key>
+ <key>center_freq8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain8</key>
<value>False</value>
</param>
<param>
- <key>append</key>
+ <key>gain8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain9</key>
<value>False</value>
</param>
<param>
- <key>alias</key>
+ <key>gain9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>clock_rate</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>comment</key>
<value></value>
</param>
<param>
@@ -1707,163 +2496,270 @@
<value></value>
</param>
<param>
+ <key>dev_addr</key>
+ <value>"send_frame_size=65536,num_send_frames=256,master_clock_rate=" + str(samp_rate*2)</value>
+ </param>
+ <param>
+ <key>dev_args</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(792, 547)</value>
+ <value>(1040, 427)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>dtv_dvb_bbheader_bb</key>
<param>
<key>id</key>
- <value>dtv_dvb_bbheader_bb_0</value>
+ <value>uhd_usrp_sink_0_0</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>type</key>
+ <value>fc32</value>
</param>
<param>
- <key>standard</key>
- <value>STANDARD_DVBS2</value>
+ <key>clock_source0</key>
+ <value></value>
</param>
<param>
- <key>framesize</key>
- <value>FECFRAME_NORMAL</value>
+ <key>sd_spec0</key>
+ <value></value>
</param>
<param>
- <key>rate1</key>
- <value>C1_2</value>
+ <key>time_source0</key>
+ <value></value>
</param>
<param>
- <key>rate2</key>
- <value>C1_3</value>
+ <key>clock_source1</key>
+ <value></value>
</param>
<param>
- <key>rate3</key>
- <value>C9_10</value>
+ <key>sd_spec1</key>
+ <value></value>
</param>
<param>
- <key>rate4</key>
- <value>C1_4</value>
+ <key>time_source1</key>
+ <value></value>
</param>
<param>
- <key>rolloff</key>
- <value>RO_0_20</value>
+ <key>clock_source2</key>
+ <value></value>
</param>
<param>
- <key>mode</key>
- <value>FECFRAME_NORMAL</value>
+ <key>sd_spec2</key>
+ <value></value>
</param>
<param>
- <key>inband</key>
- <value>INBAND_OFF</value>
+ <key>time_source2</key>
+ <value></value>
</param>
<param>
- <key>fecblocks</key>
- <value>168</value>
+ <key>clock_source3</key>
+ <value></value>
</param>
<param>
- <key>tsrate</key>
- <value>4000000</value>
+ <key>sd_spec3</key>
+ <value></value>
</param>
<param>
- <key>alias</key>
+ <key>time_source3</key>
<value></value>
</param>
<param>
- <key>affinity</key>
+ <key>clock_source4</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>sd_spec4</key>
+ <value></value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>time_source4</key>
+ <value></value>
</param>
<param>
- <key>_coordinate</key>
- <value>(400, 27)</value>
+ <key>clock_source5</key>
+ <value></value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>sd_spec5</key>
+ <value></value>
</param>
- </block>
- <block>
- <key>blocks_file_source</key>
<param>
- <key>id</key>
- <value>blocks_file_source_0</value>
+ <key>time_source5</key>
+ <value></value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>clock_source6</key>
+ <value></value>
</param>
<param>
- <key>file</key>
- <value>/run/shm/adv16apsk910.ts</value>
+ <key>sd_spec6</key>
+ <value></value>
</param>
<param>
- <key>type</key>
- <value>byte</value>
+ <key>time_source6</key>
+ <value></value>
</param>
<param>
- <key>repeat</key>
- <value>True</value>
+ <key>clock_source7</key>
+ <value></value>
</param>
<param>
- <key>vlen</key>
+ <key>sd_spec7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>nchan</key>
<value>1</value>
</param>
<param>
+ <key>num_mboards</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>hide_cmd_port</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>stream_args</key>
+ <value></value>
+ </param>
+ <param>
+ <key>stream_chans</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>sync</key>
+ <value></value>
+ </param>
+ <param>
+ <key>len_tag_name</key>
+ <value></value>
+ </param>
+ <param>
+ <key>otw</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_fftsink2</key>
+ <param>
+ <key>avg_alpha</key>
+ <value>0.13333</value>
+ </param>
+ <param>
+ <key>average</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>baseband_freq</key>
+ <value>frequency</value>
+ </param>
+ <param>
<key>alias</key>
<value></value>
</param>
<param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>maxoutbuf</key>
- <value>0</value>
+ <key>fft_size</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>freqvar</key>
+ <value>None</value>
</param>
<param>
<key>_coordinate</key>
- <value>(176, 43)</value>
+ <value>(784, 203)</value>
</param>
<param>
<key>_rotation</key>
<value>0</value>
</param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>wxgui_fftsink2_0</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>peak_hold</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ref_level</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ref_scale</key>
+ <value>2.0</value>
+ </param>
+ <param>
+ <key>fft_rate</key>
+ <value>15</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>FFT Plot</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>win_size</key>
+ <value></value>
+ </param>
+ <param>
+ <key>win</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>y_divs</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>y_per_div</key>
+ <value>10</value>
+ </param>
</block>
<connection>
- <source_block_id>fft_filter_xxx_0</source_block_id>
- <sink_block_id>osmosdr_sink_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>fft_filter_xxx_0</source_block_id>
- <sink_block_id>wxgui_fftsink2_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
- <source_block_id>fft_filter_xxx_0</source_block_id>
- <sink_block_id>blocks_file_sink_0</sink_block_id>
- <source_key>0</source_key>
- <sink_key>0</sink_key>
- </connection>
- <connection>
<source_block_id>blocks_file_source_0</source_block_id>
<sink_block_id>dtv_dvb_bbheader_bb_0</sink_block_id>
<source_key>0</source_key>
@@ -1900,14 +2796,38 @@
<sink_key>0</sink_key>
</connection>
<connection>
+ <source_block_id>dtv_dvbs2_modulator_bc_0</source_block_id>
+ <sink_block_id>dtv_dvbs2_physical_cc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
<source_block_id>dtv_dvbs2_physical_cc_0</source_block_id>
<sink_block_id>fft_filter_xxx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>dtv_dvbs2_modulator_bc_0</source_block_id>
- <sink_block_id>dtv_dvbs2_physical_cc_0</sink_block_id>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>blocks_file_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>osmosdr_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>uhd_usrp_sink_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>wxgui_fftsink2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
diff --git a/gr-dtv/examples/dvbs_tx.grc b/gr-dtv/examples/dvbs_tx.grc
new file mode 100644
index 0000000000..c9dd98a0b9
--- /dev/null
+++ b/gr-dtv/examples/dvbs_tx.grc
@@ -0,0 +1,2853 @@
+<?xml version='1.0' encoding='utf-8'?>
+<?grc format='1' created='3.7.10'?>
+<flow_graph>
+ <timestamp>Wed Jun 18 01:23:58 2014</timestamp>
+ <block>
+ <key>options</key>
+ <param>
+ <key>author</key>
+ <value></value>
+ </param>
+ <param>
+ <key>window_size</key>
+ <value>1280, 1024</value>
+ </param>
+ <param>
+ <key>category</key>
+ <value>Custom</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>description</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 11)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>generate_options</key>
+ <value>wx_gui</value>
+ </param>
+ <param>
+ <key>hier_block_src_path</key>
+ <value>.:</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dvbs_tx</value>
+ </param>
+ <param>
+ <key>max_nouts</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>qt_qss_theme</key>
+ <value></value>
+ </param>
+ <param>
+ <key>realtime_scheduling</key>
+ <value></value>
+ </param>
+ <param>
+ <key>run_command</key>
+ <value>{python} -u {filename}</value>
+ </param>
+ <param>
+ <key>run_options</key>
+ <value>prompt</value>
+ </param>
+ <param>
+ <key>run</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>thread_safe_setters</key>
+ <value></value>
+ </param>
+ <param>
+ <key>title</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 203)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>frequency</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>1280e6</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 267)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>rrc_taps</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>100</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 75)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>symbol_rate * 2</value>
+ </param>
+ </block>
+ <block>
+ <key>variable</key>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(8, 139)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>symbol_rate</value>
+ </param>
+ <param>
+ <key>value</key>
+ <value>8000000</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_file_sink</key>
+ <param>
+ <key>append</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>file</key>
+ <value>adv.bin</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(848, 507)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_file_sink_0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>unbuffered</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_file_source</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>file</key>
+ <value>/run/shm/advdvbs78.ts</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(184, 59)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_file_source_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>repeat</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_pack_k_bits_bb</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(176, 451)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_pack_k_bits_bb_0</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_packed_to_unpacked_xx</key>
+ <param>
+ <key>bits_per_chunk</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>endianness</key>
+ <value>gr.GR_MSB_FIRST</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1080, 59)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_packed_to_unpacked_xx_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>num_ports</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_unpack_k_bits_bb</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(408, 235)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>blocks_unpack_k_bits_bb_0</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_dvbs2_modulator_bc</key>
+ <param>
+ <key>interpolation</key>
+ <value>INTERPOLATION_ON</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>rate</key>
+ <value>C_OTHER</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>constellation</key>
+ <value>MOD_QPSK</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>framesize</key>
+ <value>FECFRAME_NORMAL</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(352, 427)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_dvbs2_modulator_bc_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_dvbt_convolutional_interleaver</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>blocks</key>
+ <value>136</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>M</key>
+ <value>17</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(832, 51)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_dvbt_convolutional_interleaver_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>I</key>
+ <value>12</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_dvbt_energy_dispersal</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>nsize</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(408, 73)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_dvbt_energy_dispersal_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>dtv_dvbt_reed_solomon_enc</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>blocks</key>
+ <value>8</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>gfpoly</key>
+ <value>0x11d</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(600, 19)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>dtv_dvbt_reed_solomon_enc_0</value>
+ </param>
+ <param>
+ <key>k</key>
+ <value>239</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>n</key>
+ <value>255</value>
+ </param>
+ <param>
+ <key>s</key>
+ <value>51</value>
+ </param>
+ <param>
+ <key>m</key>
+ <value>8</value>
+ </param>
+ <param>
+ <key>p</key>
+ <value>2</value>
+ </param>
+ <param>
+ <key>t</key>
+ <value>8</value>
+ </param>
+ </block>
+ <block>
+ <key>fec_puncture_xx</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(600, 219)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>fec_puncture_xx_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>puncpat</key>
+ <value>0b11010101100110</value>
+ </param>
+ <param>
+ <key>puncsize</key>
+ <value>14</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ </block>
+ <block>
+ <key>fft_filter_xxx</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>decim</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(584, 435)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>fft_filter_xxx_0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>nthreads</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>samp_delay</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>firdes.root_raised_cosine(1.0, samp_rate, samp_rate/2, 0.35, rrc_taps)</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>ccc</value>
+ </param>
+ </block>
+ <block>
+ <key>osmosdr_sink</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ant0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain0</key>
+ <value>-10</value>
+ </param>
+ <param>
+ <key>bw0</key>
+ <value>10000000</value>
+ </param>
+ <param>
+ <key>corr0</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq0</key>
+ <value>frequency</value>
+ </param>
+ <param>
+ <key>if_gain0</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>gain0</key>
+ <value>15</value>
+ </param>
+ <param>
+ <key>ant10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain10</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq10</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain10</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain10</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant11</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain11</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq11</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain11</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain11</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant12</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain12</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq12</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain12</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain12</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant13</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain13</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq13</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain13</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain13</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant14</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain14</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq14</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain14</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain14</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant15</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain15</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq15</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain15</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain15</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant16</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain16</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq16</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain16</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain16</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant17</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain17</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq17</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain17</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain17</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant18</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain18</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq18</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain18</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain18</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant19</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain19</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq19</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain19</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain19</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain1</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq1</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain1</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain1</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant20</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain20</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq20</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain20</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain20</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant21</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain21</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq21</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain21</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain21</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant22</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain22</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq22</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain22</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain22</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant23</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain23</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq23</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain23</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain23</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant24</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain24</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq24</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain24</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain24</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant25</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain25</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq25</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain25</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain25</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant26</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain26</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq26</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain26</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain26</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant27</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain27</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq27</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain27</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain27</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant28</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain28</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq28</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain28</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain28</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant29</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain29</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq29</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain29</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain29</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain2</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq2</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain2</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain2</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant30</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain30</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq30</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain30</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain30</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant31</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain31</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq31</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain31</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain31</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain3</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq3</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain3</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain3</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain4</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq4</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain4</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain4</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain5</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq5</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain5</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain5</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain6</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq6</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain6</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain6</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain7</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq7</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain7</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain7</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain8</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq8</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain8</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain8</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>ant9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bb_gain9</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>bw9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>corr9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>freq9</key>
+ <value>100e6</value>
+ </param>
+ <param>
+ <key>if_gain9</key>
+ <value>20</value>
+ </param>
+ <param>
+ <key>gain9</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>args</key>
+ <value>bladerf=0,buffers=128,buflen=32768</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1064, 211)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>osmosdr_sink_0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>fc32</value>
+ </param>
+ <param>
+ <key>clock_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>nchan</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_mboards</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>sample_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>sync</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
+ <key>trellis_encoder_xx</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>blocklength</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>blockwise</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>fsm_args</key>
+ <value>1, 2, (0171, 0133)</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(176, 227)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>trellis_encoder_xx_0</value>
+ </param>
+ <param>
+ <key>init_state</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>maxoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>bb</value>
+ </param>
+ </block>
+ <block>
+ <key>uhd_usrp_sink</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>ant0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw0</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq0</key>
+ <value>uhd.tune_request(frequency, ((symbol_rate * 1.35) / 2 ) + 1e5)</value>
+ </param>
+ <param>
+ <key>norm_gain0</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain0</key>
+ <value>60</value>
+ </param>
+ <param>
+ <key>ant10</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain10</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain10</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant11</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain11</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain11</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant12</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain12</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain12</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant13</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain13</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain13</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant14</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain14</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain14</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant15</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain15</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain15</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant16</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain16</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain16</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant17</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain17</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain17</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant18</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain18</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain18</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant19</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain19</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain19</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain1</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain1</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant20</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain20</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain20</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant21</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain21</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain21</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant22</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain22</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain22</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant23</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain23</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain23</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant24</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain24</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain24</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant25</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain25</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain25</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant26</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain26</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain26</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant27</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain27</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain27</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant28</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain28</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain28</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant29</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain29</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain29</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain2</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain2</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant30</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain30</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain30</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant31</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain31</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain31</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain3</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain3</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain4</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain4</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain5</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain5</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain6</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain6</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain7</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain7</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant8</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain8</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain8</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ant9</key>
+ <value></value>
+ </param>
+ <param>
+ <key>bw9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>center_freq9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>norm_gain9</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>gain9</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>clock_rate</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>dev_addr</key>
+ <value>"send_frame_size=65536,num_send_frames=256,master_clock_rate=" + str(samp_rate*2)</value>
+ </param>
+ <param>
+ <key>dev_args</key>
+ <value>""</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(1064, 403)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>uhd_usrp_sink_0_0</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>fc32</value>
+ </param>
+ <param>
+ <key>clock_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source0</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source1</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source2</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source3</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source4</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source5</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source6</key>
+ <value></value>
+ </param>
+ <param>
+ <key>clock_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>sd_spec7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>time_source7</key>
+ <value></value>
+ </param>
+ <param>
+ <key>nchan</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>num_mboards</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>hide_cmd_port</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>stream_args</key>
+ <value></value>
+ </param>
+ <param>
+ <key>stream_chans</key>
+ <value>[]</value>
+ </param>
+ <param>
+ <key>sync</key>
+ <value></value>
+ </param>
+ <param>
+ <key>len_tag_name</key>
+ <value></value>
+ </param>
+ <param>
+ <key>otw</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
+ <key>wxgui_fftsink2</key>
+ <param>
+ <key>avg_alpha</key>
+ <value>0.13333</value>
+ </param>
+ <param>
+ <key>average</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>baseband_freq</key>
+ <value>frequency</value>
+ </param>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>fft_size</key>
+ <value>1024</value>
+ </param>
+ <param>
+ <key>freqvar</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(848, 195)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
+ <value></value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>wxgui_fftsink2_0</value>
+ </param>
+ <param>
+ <key>notebook</key>
+ <value></value>
+ </param>
+ <param>
+ <key>peak_hold</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>ref_level</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>ref_scale</key>
+ <value>2.0</value>
+ </param>
+ <param>
+ <key>fft_rate</key>
+ <value>15</value>
+ </param>
+ <param>
+ <key>samp_rate</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>title</key>
+ <value>FFT Plot</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>win_size</key>
+ <value></value>
+ </param>
+ <param>
+ <key>win</key>
+ <value>None</value>
+ </param>
+ <param>
+ <key>y_divs</key>
+ <value>10</value>
+ </param>
+ <param>
+ <key>y_per_div</key>
+ <value>10</value>
+ </param>
+ </block>
+ <connection>
+ <source_block_id>blocks_file_source_0</source_block_id>
+ <sink_block_id>dtv_dvbt_energy_dispersal_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_pack_k_bits_bb_0</source_block_id>
+ <sink_block_id>dtv_dvbs2_modulator_bc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>blocks_packed_to_unpacked_xx_0</source_block_id>
+ <sink_block_id>trellis_encoder_xx_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>fec_puncture_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_dvbs2_modulator_bc_0</source_block_id>
+ <sink_block_id>fft_filter_xxx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_dvbt_convolutional_interleaver_0</source_block_id>
+ <sink_block_id>blocks_packed_to_unpacked_xx_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_dvbt_energy_dispersal_0</source_block_id>
+ <sink_block_id>dtv_dvbt_reed_solomon_enc_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>dtv_dvbt_reed_solomon_enc_0</source_block_id>
+ <sink_block_id>dtv_dvbt_convolutional_interleaver_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fec_puncture_xx_0</source_block_id>
+ <sink_block_id>blocks_pack_k_bits_bb_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>blocks_file_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>osmosdr_sink_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>uhd_usrp_sink_0_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>fft_filter_xxx_0</source_block_id>
+ <sink_block_id>wxgui_fftsink2_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>trellis_encoder_xx_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>
+</flow_graph>
diff --git a/gr-dtv/grc/CMakeLists.txt b/gr-dtv/grc/CMakeLists.txt
index 2fed81ab12..a1386c5adf 100644
--- a/gr-dtv/grc/CMakeLists.txt
+++ b/gr-dtv/grc/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright 2014,2015 Free Software Foundation, Inc.
+# Copyright 2014,2015,2016 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -68,6 +68,11 @@ install(FILES
dtv_dvbt_convolutional_deinterleaver.xml
dtv_dvbt_reed_solomon_dec.xml
dtv_dvbt_energy_descramble.xml
+ dtv_catv_transport_framing_enc_bb.xml
+ dtv_catv_reed_solomon_enc_bb.xml
+ dtv_catv_randomizer_bb.xml
+ dtv_catv_frame_sync_enc_bb.xml
+ dtv_catv_trellis_enc_bb.xml
DESTINATION ${GRC_BLOCKS_DIR}
COMPONENT "dtv_python"
)
diff --git a/gr-dtv/grc/dtv_block_tree.xml b/gr-dtv/grc/dtv_block_tree.xml
index 32c8974531..fba33852c0 100644
--- a/gr-dtv/grc/dtv_block_tree.xml
+++ b/gr-dtv/grc/dtv_block_tree.xml
@@ -1,7 +1,7 @@
<?xml version="1.0"?>
<!--
- Copyright 2014,2015 Free Software Foundation, Inc.
+ Copyright 2014,2015,2016 Free Software Foundation, Inc.
This file is part of GNU Radio
@@ -94,5 +94,13 @@
<block>dtv_dvbt_reed_solomon_dec</block>
<block>dtv_dvbt_energy_descramble</block>
</cat>
+ <cat>
+ <name>ITU-T J.83B</name>
+ <block>dtv_catv_transport_framing_enc_bb</block>
+ <block>dtv_catv_reed_solomon_enc_bb</block>
+ <block>dtv_catv_randomizer_bb</block>
+ <block>dtv_catv_frame_sync_enc_bb</block>
+ <block>dtv_catv_trellis_enc_bb</block>
+ </cat>
</cat>
</cat>
diff --git a/gr-dtv/grc/dtv_catv_frame_sync_enc_bb.xml b/gr-dtv/grc/dtv_catv_frame_sync_enc_bb.xml
new file mode 100644
index 0000000000..e7c1392960
--- /dev/null
+++ b/gr-dtv/grc/dtv_catv_frame_sync_enc_bb.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## Frame Sync Encoder
+###################################################
+ -->
+<block>
+ <name>Frame Sync Encoder</name>
+ <key>dtv_catv_frame_sync_enc_bb</key>
+ <import>from gnuradio import dtv</import>
+ <make>dtv.catv_frame_sync_enc_bb($ctrlword)</make>
+ <param>
+ <name>Control Word</name>
+ <key>ctrlword</key>
+ <value>6</value>
+ <type>int</type>
+ </param>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
diff --git a/gr-dtv/grc/dtv_catv_randomizer_bb.xml b/gr-dtv/grc/dtv_catv_randomizer_bb.xml
new file mode 100644
index 0000000000..ca4787d786
--- /dev/null
+++ b/gr-dtv/grc/dtv_catv_randomizer_bb.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## Randomizer
+###################################################
+ -->
+<block>
+ <name>Randomizer</name>
+ <key>dtv_catv_randomizer_bb</key>
+ <import>from gnuradio import dtv</import>
+ <make>dtv.catv_randomizer_bb()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
diff --git a/gr-dtv/grc/dtv_catv_reed_solomon_enc_bb.xml b/gr-dtv/grc/dtv_catv_reed_solomon_enc_bb.xml
new file mode 100644
index 0000000000..a5dfdc2a5a
--- /dev/null
+++ b/gr-dtv/grc/dtv_catv_reed_solomon_enc_bb.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## Reed Solomon Encoder
+###################################################
+ -->
+<block>
+ <name>Reed-Solomon Encoder</name>
+ <key>dtv_catv_reed_solomon_enc_bb</key>
+ <import>from gnuradio import dtv</import>
+ <make>dtv.catv_reed_solomon_enc_bb()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
diff --git a/gr-dtv/grc/dtv_catv_transport_framing_enc_bb.xml b/gr-dtv/grc/dtv_catv_transport_framing_enc_bb.xml
new file mode 100644
index 0000000000..d0b6bf382b
--- /dev/null
+++ b/gr-dtv/grc/dtv_catv_transport_framing_enc_bb.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## Transport Framing Encoder
+###################################################
+ -->
+<block>
+ <name>Transport Framing Encoder</name>
+ <key>dtv_catv_transport_framing_enc_bb</key>
+ <import>from gnuradio import dtv</import>
+ <make>dtv.catv_transport_framing_enc_bb()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
diff --git a/gr-dtv/grc/dtv_catv_trellis_enc_bb.xml b/gr-dtv/grc/dtv_catv_trellis_enc_bb.xml
new file mode 100644
index 0000000000..a96d60c895
--- /dev/null
+++ b/gr-dtv/grc/dtv_catv_trellis_enc_bb.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+## Trellis Encoder
+###################################################
+ -->
+<block>
+ <name>Trellis Encoder</name>
+ <key>dtv_catv_trellis_enc_bb</key>
+ <import>from gnuradio import dtv</import>
+ <make>dtv.catv_trellis_enc_bb()</make>
+ <sink>
+ <name>in</name>
+ <type>byte</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>byte</type>
+ </source>
+</block>
diff --git a/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml b/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
index 1f7fef09a3..8de645d585 100644
--- a/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
+++ b/gr-dtv/grc/dtv_dvbs2_modulator_bc.xml
@@ -8,7 +8,7 @@
<name>DVB-S2X Modulator</name>
<key>dtv_dvbs2_modulator_bc</key>
<import>from gnuradio import dtv</import>
- <make>dtv.dvbs2_modulator_bc($framesize.val, $rate.val, $constellation.val)</make>
+ <make>dtv.dvbs2_modulator_bc($framesize.val, $rate.val, $constellation.val, $interpolation.val)</make>
<param>
<name>FECFRAME size</name>
<key>framesize</key>
@@ -253,6 +253,26 @@
<key>MOD_256APSK</key>
<opt>val:dtv.MOD_256APSK</opt>
</option>
+ <option>
+ <name>64QAM</name>
+ <key>MOD_64QAM</key>
+ <opt>val:dtv.MOD_64QAM</opt>
+ </option>
+ </param>
+ <param>
+ <name>2X Interpolation</name>
+ <key>interpolation</key>
+ <type>enum</type>
+ <option>
+ <name>Off</name>
+ <key>INTERPOLATION_OFF</key>
+ <opt>val:dtv.INTERPOLATION_OFF</opt>
+ </option>
+ <option>
+ <name>On</name>
+ <key>INTERPOLATION_ON</key>
+ <opt>val:dtv.INTERPOLATION_ON</opt>
+ </option>
</param>
<sink>
<name>in</name>
diff --git a/gr-dtv/include/gnuradio/dtv/CMakeLists.txt b/gr-dtv/include/gnuradio/dtv/CMakeLists.txt
index 4232ff7065..620dd55879 100644
--- a/gr-dtv/include/gnuradio/dtv/CMakeLists.txt
+++ b/gr-dtv/include/gnuradio/dtv/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright 2014,2015 Free Software Foundation, Inc.
+# Copyright 2014,2015,2016 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -74,6 +74,11 @@ install(FILES
dvbt_convolutional_deinterleaver.h
dvbt_reed_solomon_dec.h
dvbt_energy_descramble.h
+ catv_transport_framing_enc_bb.h
+ catv_reed_solomon_enc_bb.h
+ catv_randomizer_bb.h
+ catv_frame_sync_enc_bb.h
+ catv_trellis_enc_bb.h
DESTINATION ${GR_INCLUDE_DIR}/gnuradio/dtv
COMPONENT "dtv_devel"
diff --git a/gr-dtv/include/gnuradio/dtv/atsc_equalizer.h b/gr-dtv/include/gnuradio/dtv/atsc_equalizer.h
index 3fe101ac25..17f2e8f768 100644
--- a/gr-dtv/include/gnuradio/dtv/atsc_equalizer.h
+++ b/gr-dtv/include/gnuradio/dtv/atsc_equalizer.h
@@ -45,6 +45,9 @@ namespace gr {
* \brief Make a new instance of gr::dtv::atsc_equalizer.
*/
static sptr make();
+
+ virtual std::vector<float> taps() const = 0;
+ virtual std::vector<float> data() const = 0;
};
} /* namespace dtv */
diff --git a/gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h b/gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h
index 92eb263e5d..c2b7d0defa 100644
--- a/gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h
+++ b/gr-dtv/include/gnuradio/dtv/atsc_rs_decoder.h
@@ -42,6 +42,21 @@ namespace gr {
typedef boost::shared_ptr<atsc_rs_decoder> sptr;
/*!
+ * Returns the number of errors corrected by the decoder.
+ */
+ virtual int num_errors_corrected() const = 0;
+
+ /*!
+ * Returns the number of bad packets rejected by the decoder.
+ */
+ virtual int num_bad_packets() const = 0;
+
+ /*!
+ * Returns the total number of packets seen by the decoder.
+ */
+ virtual int num_packets() const = 0;
+
+ /*!
* \brief Make a new instance of gr::dtv::atsc_rs_decoder.
*/
static sptr make();
diff --git a/gr-dtv/include/gnuradio/dtv/atsc_viterbi_decoder.h b/gr-dtv/include/gnuradio/dtv/atsc_viterbi_decoder.h
index a4c18c39da..8efece4c43 100644
--- a/gr-dtv/include/gnuradio/dtv/atsc_viterbi_decoder.h
+++ b/gr-dtv/include/gnuradio/dtv/atsc_viterbi_decoder.h
@@ -45,6 +45,12 @@ namespace gr {
* \brief Make a new instance of gr::dtv::atsc_viterbi_decoder.
*/
static sptr make();
+
+ /*!
+ * For each decoder, returns the current best state of the
+ * decoding metrics.
+ */
+ virtual std::vector<float> decoder_metrics() const = 0;
};
} /* namespace dtv */
diff --git a/gr-dtv/include/gnuradio/dtv/catv_frame_sync_enc_bb.h b/gr-dtv/include/gnuradio/dtv/catv_frame_sync_enc_bb.h
new file mode 100644
index 0000000000..799a2d3c55
--- /dev/null
+++ b/gr-dtv/include/gnuradio/dtv/catv_frame_sync_enc_bb.h
@@ -0,0 +1,54 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_H
+#define INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_H
+
+#include <gnuradio/dtv/api.h>
+#include <gnuradio/block.h>
+
+namespace gr {
+ namespace dtv {
+
+ /*!
+ * \brief Frame Sync Encoder. Adds a 42-bit frame sync pattern with control word.
+ * \ingroup dtv
+ *
+ * Input: Scrambled FEC Frame packets of 60 * 128 7-bit symbols.\n
+ * Output: Scrambled FEC Frame packets of 60 * 128 7-bit symbols with 42-bit FSYNC word.
+ */
+ class DTV_API catv_frame_sync_enc_bb : virtual public gr::block
+ {
+ public:
+ typedef boost::shared_ptr<catv_frame_sync_enc_bb> sptr;
+
+ /*!
+ * \brief Create an ITU-T J.83B Frame Sync Encoder.
+ *
+ * \param ctrlword convolutional interleaver control word.
+ */
+ static sptr make(int ctrlword);
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_H */
+
diff --git a/gr-dtv/include/gnuradio/dtv/catv_randomizer_bb.h b/gr-dtv/include/gnuradio/dtv/catv_randomizer_bb.h
new file mode 100644
index 0000000000..83230b8167
--- /dev/null
+++ b/gr-dtv/include/gnuradio/dtv/catv_randomizer_bb.h
@@ -0,0 +1,53 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_RANDOMIZER_BB_H
+#define INCLUDED_DTV_CATV_RANDOMIZER_BB_H
+
+#include <gnuradio/dtv/api.h>
+#include <gnuradio/sync_block.h>
+
+namespace gr {
+ namespace dtv {
+
+ /*!
+ * \brief Randomizer, x^3 + x + alpha^3, 7-bit symbols.
+ * \ingroup dtv
+ *
+ * Input: Interleaved MPEG-2 + RS parity bitstream packets of 128 7-bit symbols.\n
+ * Output: Scrambled FEC Frame packets of 60 * 128 7-bit symbols.
+ */
+ class DTV_API catv_randomizer_bb : virtual public gr::sync_block
+ {
+ public:
+ typedef boost::shared_ptr<catv_randomizer_bb> sptr;
+
+ /*!
+ * \brief Create an ITU-T J.83B randomizer.
+ *
+ */
+ static sptr make();
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_RANDOMIZER_BB_H */
+
diff --git a/gr-dtv/include/gnuradio/dtv/catv_reed_solomon_enc_bb.h b/gr-dtv/include/gnuradio/dtv/catv_reed_solomon_enc_bb.h
new file mode 100644
index 0000000000..b661f0da7f
--- /dev/null
+++ b/gr-dtv/include/gnuradio/dtv/catv_reed_solomon_enc_bb.h
@@ -0,0 +1,53 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_H
+#define INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_H
+
+#include <gnuradio/dtv/api.h>
+#include <gnuradio/block.h>
+
+namespace gr {
+ namespace dtv {
+
+ /*!
+ * \brief Reed Solomon Encoder, t=3, (128,122), 7-bit symbols.
+ * \ingroup dtv
+ *
+ * Input: MPEG-2 bitstream packets of 122 7-bit symbols.\n
+ * Output: MPEG-2 + RS parity bitstream packets of 128 7-bit symbols.
+ */
+ class DTV_API catv_reed_solomon_enc_bb : virtual public gr::block
+ {
+ public:
+ typedef boost::shared_ptr<catv_reed_solomon_enc_bb> sptr;
+
+ /*!
+ * \brief Create an ITU-T J.83B Reed Solomon encoder.
+ *
+ */
+ static sptr make();
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_H */
+
diff --git a/gr-dtv/include/gnuradio/dtv/catv_transport_framing_enc_bb.h b/gr-dtv/include/gnuradio/dtv/catv_transport_framing_enc_bb.h
new file mode 100644
index 0000000000..7df100d990
--- /dev/null
+++ b/gr-dtv/include/gnuradio/dtv/catv_transport_framing_enc_bb.h
@@ -0,0 +1,53 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_H
+#define INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_H
+
+#include <gnuradio/dtv/api.h>
+#include <gnuradio/sync_block.h>
+
+namespace gr {
+ namespace dtv {
+
+ /*!
+ * \brief Transport Framing Encoder. Adds a parity checksum to MPEG-2 packets.
+ * \ingroup dtv
+ *
+ * Input: MPEG-2 Transport Stream.\n
+ * Output: MPEG-2 Transport Stream with parity checksum byte.
+ */
+ class DTV_API catv_transport_framing_enc_bb : virtual public gr::sync_block
+ {
+ public:
+ typedef boost::shared_ptr<catv_transport_framing_enc_bb> sptr;
+
+ /*!
+ * \brief Create an ITU-T J.83B Transport Framing Encoder.
+ *
+ */
+ static sptr make();
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_H */
+
diff --git a/gr-dtv/include/gnuradio/dtv/catv_trellis_enc_bb.h b/gr-dtv/include/gnuradio/dtv/catv_trellis_enc_bb.h
new file mode 100644
index 0000000000..aa6cec1703
--- /dev/null
+++ b/gr-dtv/include/gnuradio/dtv/catv_trellis_enc_bb.h
@@ -0,0 +1,53 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_TRELLIS_ENC_BB_H
+#define INCLUDED_DTV_CATV_TRELLIS_ENC_BB_H
+
+#include <gnuradio/dtv/api.h>
+#include <gnuradio/block.h>
+
+namespace gr {
+ namespace dtv {
+
+ /*!
+ * \brief Trellis Encoder. 14/15 code rate.
+ * \ingroup dtv
+ *
+ * Input: Scrambled FEC Frame packets of 60 * 128 7-bit symbols with 42-bit FSYNC word.\n
+ * Output: Four 7-bit symbols (28 bits) Trellis encoded to 30 bits (14/15 code rate).
+ */
+ class DTV_API catv_trellis_enc_bb : virtual public gr::block
+ {
+ public:
+ typedef boost::shared_ptr<catv_trellis_enc_bb> sptr;
+
+ /*!
+ * \brief Create an ITU-T J.83B Trellis Encoder.
+ *
+ */
+ static sptr make();
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_TRELLIS_ENC_BB_H */
+
diff --git a/gr-dtv/include/gnuradio/dtv/dvbs2_config.h b/gr-dtv/include/gnuradio/dtv/dvbs2_config.h
index 919c7de155..079857a8cf 100644
--- a/gr-dtv/include/gnuradio/dtv/dvbs2_config.h
+++ b/gr-dtv/include/gnuradio/dtv/dvbs2_config.h
@@ -38,11 +38,17 @@ namespace gr {
PILOTS_ON,
};
+ enum dvbs2_interpolation_t {
+ INTERPOLATION_OFF = 0,
+ INTERPOLATION_ON,
+ };
+
} // namespace dtv
} // namespace gr
typedef gr::dtv::dvbs2_rolloff_factor_t dvbs2_rolloff_factor_t;
typedef gr::dtv::dvbs2_pilots_t dvbs2_pilots_t;
+typedef gr::dtv::dvbs2_interpolation_t dvbs2_interpolation_t;
#endif /* INCLUDED_DTV_DVBS2_CONFIG_H */
diff --git a/gr-dtv/include/gnuradio/dtv/dvbs2_modulator_bc.h b/gr-dtv/include/gnuradio/dtv/dvbs2_modulator_bc.h
index 68e5403e05..a1f2c9e6fe 100644
--- a/gr-dtv/include/gnuradio/dtv/dvbs2_modulator_bc.h
+++ b/gr-dtv/include/gnuradio/dtv/dvbs2_modulator_bc.h
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2015 Free Software Foundation, Inc.
+ * Copyright 2015,2016 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
#include <gnuradio/dtv/api.h>
#include <gnuradio/dtv/dvb_config.h>
+#include <gnuradio/dtv/dvbs2_config.h>
#include <gnuradio/block.h>
namespace gr {
@@ -46,8 +47,9 @@ namespace gr {
* \param framesize FEC frame size (normal or short).
* \param rate FEC code rate.
* \param constellation DVB-S2 constellation.
+ * \param interpolation 2X zero stuffing interpolation (on/off).
*/
- static sptr make(dvb_framesize_t framesize, dvb_code_rate_t rate, dvb_constellation_t constellation);
+ static sptr make(dvb_framesize_t framesize, dvb_code_rate_t rate, dvb_constellation_t constellation, dvbs2_interpolation_t interpolation);
};
} // namespace dtv
diff --git a/gr-dtv/lib/CMakeLists.txt b/gr-dtv/lib/CMakeLists.txt
index 868205c241..6ae308395d 100644
--- a/gr-dtv/lib/CMakeLists.txt
+++ b/gr-dtv/lib/CMakeLists.txt
@@ -1,4 +1,4 @@
-# Copyright 2014,2015 Free Software Foundation, Inc.
+# Copyright 2014,2015,2016 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -112,6 +112,11 @@ list(APPEND dtv_sources
dvbt/dvbt_convolutional_deinterleaver_impl.cc
dvbt/dvbt_reed_solomon_dec_impl.cc
dvbt/dvbt_energy_descramble_impl.cc
+ catv/catv_transport_framing_enc_bb_impl.cc
+ catv/catv_reed_solomon_enc_bb_impl.cc
+ catv/catv_randomizer_bb_impl.cc
+ catv/catv_frame_sync_enc_bb_impl.cc
+ catv/catv_trellis_enc_bb_impl.cc
)
if(ENABLE_GR_CTRLPORT)
diff --git a/gr-dtv/lib/atsc/atsc_equalizer_impl.cc b/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
index c804be6dc7..de01cea6f2 100644
--- a/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
@@ -28,6 +28,7 @@
#include "atsc_types.h"
#include "atsc_pnXXX_impl.h"
#include <gnuradio/io_signature.h>
+#include <volk/volk.h>
namespace gr {
namespace dtv {
@@ -76,23 +77,42 @@ namespace gr {
init_field_sync_common(training_sequence1, 0);
init_field_sync_common(training_sequence2, 1);
- for (int i = 0; i < NTAPS; i++)
- d_taps[i] = 0.0;
+ d_taps.resize(NTAPS, 0.0f);
d_buff_not_filled = true;
+
+ const int alignment_multiple =
+ volk_get_alignment() / sizeof(float);
+ set_alignment(std::max(1, alignment_multiple));
}
atsc_equalizer_impl::~atsc_equalizer_impl()
{
}
+ std::vector<float>
+ atsc_equalizer_impl::taps() const
+ {
+ return d_taps;
+ }
+
+ std::vector<float>
+ atsc_equalizer_impl::data() const
+ {
+ std::vector<float> ret(&data_mem2[0], &data_mem2[ATSC_DATA_SEGMENT_LENGTH-1]);
+ return ret;
+ }
+
void
- atsc_equalizer_impl::filterN(const float *input_samples, float *output_samples, int nsamples)
+ atsc_equalizer_impl::filterN(const float *input_samples,
+ float *output_samples,
+ int nsamples)
{
for (int j = 0; j < nsamples; j++) {
output_samples[j] = 0;
- for(int i = 0; i < NTAPS; i++)
- output_samples[j] += d_taps[i] * input_samples[j + i];
+ volk_32f_x2_dot_prod_32f(&output_samples[j],
+ &input_samples[j],
+ &d_taps[0], NTAPS);
}
}
@@ -107,14 +127,16 @@ namespace gr {
for(int j = 0; j < nsamples; j++) {
output_samples[j] = 0;
- for( int i = 0; i < NTAPS; i++ )
- output_samples[j] += d_taps[i] * input_samples[j + i];
+ volk_32f_x2_dot_prod_32f(&output_samples[j],
+ &input_samples[j],
+ &d_taps[0], NTAPS);
- double e = output_samples[j] - training_pattern[j];
+ float e = output_samples[j] - training_pattern[j];
// update taps...
- for( int i = 0; i < NTAPS; i++ )
- d_taps[i] -= BETA * e * (double)(input_samples[j + i]);
+ float tmp_taps[NTAPS];
+ volk_32f_s32f_multiply_32f(tmp_taps, &input_samples[j], BETA*e, NTAPS);
+ volk_32f_x2_subtract_32f(&d_taps[0], &d_taps[0], tmp_taps, NTAPS);
}
}
@@ -131,8 +153,8 @@ namespace gr {
int i = 0;
if(d_buff_not_filled) {
- for(int j = 0; j < ATSC_DATA_SEGMENT_LENGTH; j++)
- data_mem[NPRETAPS + j] = in[i].data[j];
+ memcpy(&data_mem[NPRETAPS], in[i].data,
+ ATSC_DATA_SEGMENT_LENGTH*sizeof(float));
d_flags = in[i].pli._flags;
d_segno = in[i].pli._segno;
d_buff_not_filled = false;
@@ -141,8 +163,8 @@ namespace gr {
for (; i < noutput_items; i++) {
- for(int j = 0; j < NTAPS - NPRETAPS; j++)
- data_mem[ATSC_DATA_SEGMENT_LENGTH + NPRETAPS + j] = in[i].data[j];
+ memcpy(&data_mem[ATSC_DATA_SEGMENT_LENGTH + NPRETAPS], in[i].data,
+ (NTAPS - NPRETAPS)*sizeof(float));
if(d_segno == -1) {
if(d_flags & 0x0010) {
@@ -157,19 +179,18 @@ namespace gr {
else {
filterN(data_mem, data_mem2, ATSC_DATA_SEGMENT_LENGTH);
- for(int j = 0; j < ATSC_DATA_SEGMENT_LENGTH; j++)
- out[output_produced].data[j] = data_mem2[j];
+ memcpy(out[output_produced].data, data_mem2,
+ ATSC_DATA_SEGMENT_LENGTH*sizeof(float));
out[output_produced].pli._flags = d_flags;
out[output_produced].pli._segno = d_segno;
output_produced++;
}
- for( int j = 0; j < NPRETAPS; j++ )
- data_mem[j] = data_mem[ATSC_DATA_SEGMENT_LENGTH + j];
-
- for(int j = 0; j < ATSC_DATA_SEGMENT_LENGTH; j++)
- data_mem[NPRETAPS + j] = in[i].data[j];
+ memcpy(data_mem, &data_mem[ATSC_DATA_SEGMENT_LENGTH],
+ NPRETAPS*sizeof(float));
+ memcpy(&data_mem[NPRETAPS], in[i].data,
+ ATSC_DATA_SEGMENT_LENGTH*sizeof(float));
d_flags = in[i].pli._flags;
d_segno = in[i].pli._segno;
@@ -179,5 +200,31 @@ namespace gr {
return output_produced;
}
+ void
+ atsc_equalizer_impl::setup_rpc()
+ {
+#ifdef GR_CTRLPORT
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<atsc_equalizer, std::vector<float> >(
+ alias(), "taps",
+ &atsc_equalizer::taps,
+ pmt::make_f32vector(1,-10),
+ pmt::make_f32vector(1,10),
+ pmt::make_f32vector(1,0),
+ "", "Equalizer Taps", RPC_PRIVLVL_MIN,
+ DISPTIME)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<atsc_equalizer, std::vector<float> >(
+ alias(), "data",
+ &atsc_equalizer::data,
+ pmt::make_f32vector(1,-10),
+ pmt::make_f32vector(1,10),
+ pmt::make_f32vector(1,0),
+ "", "Post-equalizer Data", RPC_PRIVLVL_MIN,
+ DISPTIME)));
+#endif /* GR_CTRLPORT */
+ }
+
} /* namespace dtv */
} /* namespace gr */
diff --git a/gr-dtv/lib/atsc/atsc_equalizer_impl.h b/gr-dtv/lib/atsc/atsc_equalizer_impl.h
index 6ff89ca646..75862f6408 100644
--- a/gr-dtv/lib/atsc/atsc_equalizer_impl.h
+++ b/gr-dtv/lib/atsc/atsc_equalizer_impl.h
@@ -46,7 +46,7 @@ namespace gr {
void adaptN(const float *input_samples, const float *training_pattern,
float *output_samples, int nsamples);
- float d_taps[NTAPS];
+ std::vector<float> d_taps;
float data_mem[ATSC_DATA_SEGMENT_LENGTH + NTAPS]; // Buffer for previous data packet
float data_mem2[ATSC_DATA_SEGMENT_LENGTH];
@@ -59,6 +59,11 @@ namespace gr {
atsc_equalizer_impl();
~atsc_equalizer_impl();
+ void setup_rpc();
+
+ std::vector<float> taps() const;
+ std::vector<float> data() const;
+
virtual int general_work(int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
diff --git a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc
index 7a950e716e..b8ee91a52d 100644
--- a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc
@@ -56,9 +56,9 @@ namespace gr {
{
d_rs = init_rs_char(rs_init_symsize, rs_init_gfpoly, rs_init_fcr, rs_init_prim, rs_init_nroots);
assert (d_rs != 0);
- nerrors_corrrected_count = 0;
- bad_packet_count = 0;
- total_packets = 0;
+ d_nerrors_corrrected_count = 0;
+ d_bad_packet_count = 0;
+ d_total_packets = 0;
}
int atsc_rs_decoder_impl::decode (atsc_mpeg_packet_no_sync &out, const atsc_mpeg_packet_rs_encoded &in)
@@ -89,6 +89,24 @@ namespace gr {
}
int
+ atsc_rs_decoder_impl::num_errors_corrected() const
+ {
+ return d_nerrors_corrrected_count;
+ }
+
+ int
+ atsc_rs_decoder_impl::num_bad_packets() const
+ {
+ return d_bad_packet_count;
+ }
+
+ int
+ atsc_rs_decoder_impl::num_packets() const
+ {
+ return d_total_packets;
+ }
+
+ int
atsc_rs_decoder_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
@@ -102,24 +120,20 @@ namespace gr {
int nerrors_corrrected = decode(out[i], in[i]);
out[i].pli.set_transport_error(nerrors_corrrected == -1);
- if (nerrors_corrrected == -1)
- bad_packet_count++;
- else
- nerrors_corrrected_count += nerrors_corrrected;
+ if (nerrors_corrrected == -1) {
+ d_bad_packet_count++;
+ d_nerrors_corrrected_count += 10; // lower bound estimate; most this RS can fix
+ }
+ else {
+ d_nerrors_corrrected_count += nerrors_corrrected;
+ }
- total_packets++;
+ d_total_packets++;
#if 0
- if (total_packets > 1000) {
- // FIXME: convert to logger
- std::cout << "Error rate: "
- << (float)nerrors_corrrected_count/total_packets
- << "\tPacket error rate: "
- << (float)bad_packet_count/total_packets
- << std::endl;
-
- nerrors_corrrected_count = 0;
- bad_packet_count = 0;
- total_packets = 0;
+ if (d_total_packets > 1000) {
+ GR_LOG_INFO(d_logger, boost::format("Error rate: %1%\tPacket error rate: %2%") \
+ % ((float)d_nerrors_corrrected_count/(ATSC_MPEG_DATA_LENGTH*d_total_packets))
+ % ((float)d_bad_packet_count/d_total_packets));
}
#endif
}
@@ -127,5 +141,42 @@ namespace gr {
return noutput_items;
}
+
+ void
+ atsc_rs_decoder_impl::setup_rpc()
+ {
+#ifdef GR_CTRLPORT
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<atsc_rs_decoder, int >(
+ alias(), "num_errors_corrected",
+ &atsc_rs_decoder::num_errors_corrected,
+ pmt::from_long(0),
+ pmt::from_long(10000000),
+ pmt::from_long(0),
+ "", "Number of errors corrected", RPC_PRIVLVL_MIN,
+ DISPTIME)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<atsc_rs_decoder, int >(
+ alias(), "num_bad_packets",
+ &atsc_rs_decoder::num_bad_packets,
+ pmt::from_long(0),
+ pmt::from_long(10000000),
+ pmt::from_long(0),
+ "", "Number of bad packets", RPC_PRIVLVL_MIN,
+ DISPTIME)));
+
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<atsc_rs_decoder, int >(
+ alias(), "num_packets",
+ &atsc_rs_decoder::num_packets,
+ pmt::from_long(0),
+ pmt::from_long(10000000),
+ pmt::from_long(0),
+ "", "Number of packets", RPC_PRIVLVL_MIN,
+ DISPTIME)));
+#endif /* GR_CTRLPORT */
+ }
+
} /* namespace dtv */
} /* namespace gr */
diff --git a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.h b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.h
index 57460128dc..adbc4879a9 100644
--- a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.h
+++ b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.h
@@ -36,15 +36,22 @@ namespace gr {
class atsc_rs_decoder_impl : public atsc_rs_decoder
{
private:
- int nerrors_corrrected_count;
- int bad_packet_count;
- int total_packets;
+ int d_nerrors_corrrected_count;
+ int d_bad_packet_count;
+ int d_total_packets;
+ int d_total_bits;
void *d_rs;
public:
atsc_rs_decoder_impl();
~atsc_rs_decoder_impl();
+ void setup_rpc();
+
+ int num_errors_corrected() const;
+ int num_bad_packets() const;
+ int num_packets() const;
+
/*!
* Decode RS encoded packet.
* \returns a count of corrected symbols, or -1 if the block was uncorrectible.
diff --git a/gr-dtv/lib/atsc/atsc_single_viterbi.cc b/gr-dtv/lib/atsc/atsc_single_viterbi.cc
index 385940e453..011cc0fe96 100644
--- a/gr-dtv/lib/atsc/atsc_single_viterbi.cc
+++ b/gr-dtv/lib/atsc/atsc_single_viterbi.cc
@@ -28,7 +28,7 @@ namespace gr {
/* was_sent is a table of what symbol we get given what bit pair
was sent and what state we where in [state][pair] */
- const int atsc_single_viterbi::was_sent[4][4] = {
+ const int atsc_single_viterbi::d_was_sent[4][4] = {
{0,2,4,6},
{0,2,4,6},
{1,3,5,7},
@@ -37,7 +37,7 @@ namespace gr {
/* transition_table is a table of what state we were in
given current state and bit pair sent [state][pair] */
- const int atsc_single_viterbi::transition_table[4][4] = {
+ const int atsc_single_viterbi::d_transition_table[4][4] = {
{0,2,0,2},
{2,0,2,0},
{1,3,1,3},
@@ -49,11 +49,12 @@ namespace gr {
{
for (unsigned int i = 0; i<2; i++)
for (unsigned int j = 0; j<4; j++) {
- path_metrics[i][j] = 0;
- traceback[i][j] = 0;
+ d_path_metrics[i][j] = 0;
+ d_traceback[i][j] = 0;
}
- post_coder_state = 0;
- phase = 0;
+ d_post_coder_state = 0;
+ d_phase = 0;
+ d_best_state_metric = 100000;
}
atsc_single_viterbi::atsc_single_viterbi()
@@ -61,17 +62,24 @@ namespace gr {
reset();
}
+ float
+ atsc_single_viterbi::best_state_metric() const
+ {
+ return d_best_state_metric;
+ }
+
char
atsc_single_viterbi::decode(float input)
{
unsigned int best_state = 0;
- float best_state_metric = 100000;
+ //float best_state_metric = 100000;
+ d_best_state_metric = 100000;
/* Precompute distances from input to each possible symbol */
- float distances[8] = { (float)fabs( input + 7 ), (float)fabs( input + 5 ),
- (float)fabs( input + 3 ), (float)fabs( input + 1 ),
- (float)fabs( input - 1 ), (float)fabs( input - 3 ),
- (float)fabs( input - 5 ), (float)fabs( input - 7 ) };
+ float distances[8] = { fabsf( input + 7 ), fabsf( input + 5 ),
+ fabsf( input + 3 ), fabsf( input + 1 ),
+ fabsf( input - 1 ), fabsf( input - 3 ),
+ fabsf( input - 5 ), fabsf( input - 7 ) };
/* We start by iterating over all possible states */
for (unsigned int state = 0; state < 4; state++) {
@@ -79,15 +87,20 @@ namespace gr {
states to the state we are testing, we only need to look at
the 4 paths that can be taken given the 2-bit input */
int min_metric_symb = 0;
- float min_metric = distances[was_sent[state][0]] + path_metrics[phase][transition_table[state][0]];
+ float min_metric = distances[d_was_sent[state][0]] +
+ d_path_metrics[d_phase][d_transition_table[state][0]];
+
for (unsigned int symbol_sent = 1; symbol_sent < 4; symbol_sent++)
- if( (distances[was_sent[state][symbol_sent]] + path_metrics[phase][transition_table[state][symbol_sent]]) < min_metric) {
- min_metric = distances[was_sent[state][symbol_sent]] + path_metrics[phase][transition_table[state][symbol_sent]];
+ if( (distances[d_was_sent[state][symbol_sent]] +
+ d_path_metrics[d_phase][d_transition_table[state][symbol_sent]]) < min_metric) {
+ min_metric = distances[d_was_sent[state][symbol_sent]] +
+ d_path_metrics[d_phase][d_transition_table[state][symbol_sent]];
min_metric_symb = symbol_sent;
}
- path_metrics[phase^1][state] = min_metric;
- traceback[phase^1][state] = (((unsigned long long)min_metric_symb) << 62) | (traceback[phase][transition_table[state][min_metric_symb]] >> 2);
+ d_path_metrics[d_phase^1][state] = min_metric;
+ d_traceback[d_phase^1][state] = (((unsigned long long)min_metric_symb) << 62) |
+ (d_traceback[d_phase][d_transition_table[state][min_metric_symb]] >> 2);
/* If this is the most probable state so far remember it, this
only needs to be checked when we are about to output a path
@@ -98,26 +111,24 @@ namespace gr {
head state path will tend towards the optimal path with a
probability approaching 1 in just 8 or so transitions
*/
- if(min_metric <= best_state_metric) {
- best_state_metric = min_metric;
+ if(min_metric <= d_best_state_metric) {
+ d_best_state_metric = min_metric;
best_state = state;
}
}
- if(best_state_metric > 10000) {
+ if(d_best_state_metric > 10000) {
for(unsigned int state = 0; state < 4; state++)
- path_metrics[phase^1][state] -= best_state_metric;
+ d_path_metrics[d_phase^1][state] -= d_best_state_metric;
}
- phase ^= 1;
+ d_phase ^= 1;
- int y2 = (0x2 & traceback[phase][best_state]) >> 1;
- int x2 = y2 ^ post_coder_state;
- post_coder_state = y2;
+ int y2 = (0x2 & d_traceback[d_phase][best_state]) >> 1;
+ int x2 = y2 ^ d_post_coder_state;
+ d_post_coder_state = y2;
- return ( x2 << 1 ) | (0x1 & traceback[phase][best_state]);
+ return ( x2 << 1 ) | (0x1 & d_traceback[d_phase][best_state]);
}
} /* namespace dtv */
} /* namespace gr */
-
-
diff --git a/gr-dtv/lib/atsc/atsc_single_viterbi.h b/gr-dtv/lib/atsc/atsc_single_viterbi.h
index 3c756c7690..9522e2eb1b 100644
--- a/gr-dtv/lib/atsc/atsc_single_viterbi.h
+++ b/gr-dtv/lib/atsc/atsc_single_viterbi.h
@@ -44,14 +44,17 @@ namespace gr {
//! internal delay of decoder
static int delay () { return TB_LEN - 1; }
- protected:
- static const int transition_table[4][4];
- static const int was_sent[4][4];
+ float best_state_metric() const;
- float path_metrics [2][4];
- unsigned long long traceback [2][4];
- unsigned char phase;
- int post_coder_state;
+ protected:
+ static const int d_transition_table[4][4];
+ static const int d_was_sent[4][4];
+
+ float d_path_metrics [2][4];
+ unsigned long long d_traceback [2][4];
+ unsigned char d_phase;
+ int d_post_coder_state;
+ float d_best_state_metric;
};
} /* namespace dtv */
diff --git a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
index 430eb55a17..2284372dfb 100644
--- a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
@@ -77,6 +77,15 @@ namespace gr {
fifo[i]->reset();
}
+ std::vector<float>
+ atsc_viterbi_decoder_impl::decoder_metrics() const
+ {
+ std::vector<float> metrics(NCODERS);
+ for (int i = 0; i < NCODERS; i++)
+ metrics[i] = viterbi[i].best_state_metric();
+ return metrics;
+ }
+
int
atsc_viterbi_decoder_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
@@ -135,5 +144,21 @@ namespace gr {
return noutput_items;
}
+ void
+ atsc_viterbi_decoder_impl::setup_rpc()
+ {
+#ifdef GR_CTRLPORT
+ add_rpc_variable(
+ rpcbasic_sptr(new rpcbasic_register_get<atsc_viterbi_decoder, std::vector<float> >(
+ alias(), "decoder_metrics",
+ &atsc_viterbi_decoder::decoder_metrics,
+ pmt::make_f32vector(1,0),
+ pmt::make_f32vector(1,100000),
+ pmt::make_f32vector(1,0),
+ "", "Viterbi decoder metrics", RPC_PRIVLVL_MIN,
+ DISPTIME)));
+#endif /* GR_CTRLPORT */
+ }
+
} /* namespace dtv */
} /* namespace gr */
diff --git a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.h b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.h
index b4fbbd1033..ef4faab313 100644
--- a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.h
+++ b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.h
@@ -63,8 +63,12 @@ namespace gr {
atsc_viterbi_decoder_impl();
~atsc_viterbi_decoder_impl();
+ void setup_rpc();
+
void reset();
+ std::vector<float> decoder_metrics() const;
+
virtual int work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
diff --git a/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.cc b/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.cc
new file mode 100644
index 0000000000..87c706b445
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.cc
@@ -0,0 +1,96 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; 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 "catv_frame_sync_enc_bb_impl.h"
+
+namespace gr {
+ namespace dtv {
+
+ catv_frame_sync_enc_bb::sptr
+ catv_frame_sync_enc_bb::make(int ctrlword)
+ {
+ return gnuradio::get_initial_sptr
+ (new catv_frame_sync_enc_bb_impl(ctrlword));
+ }
+
+ /*
+ * The private constructor
+ */
+ catv_frame_sync_enc_bb_impl::catv_frame_sync_enc_bb_impl(int ctrlword)
+ : gr::block("catv_frame_sync_enc_bb",
+ gr::io_signature::make(1, 1, sizeof(unsigned char)),
+ gr::io_signature::make(1, 1, sizeof(unsigned char)))
+ {
+ set_output_multiple(60 * 128 + 6);
+ control_word = ctrlword;
+ }
+
+ /*
+ * Our virtual destructor.
+ */
+ catv_frame_sync_enc_bb_impl::~catv_frame_sync_enc_bb_impl()
+ {
+ }
+
+ void
+ catv_frame_sync_enc_bb_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+ {
+ ninput_items_required[0] = noutput_items / (60 * 128 + 6) * (60 * 128);
+ }
+
+ int
+ catv_frame_sync_enc_bb_impl::general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const unsigned char *in = (const unsigned char *) input_items[0];
+ unsigned char *out = (unsigned char *) output_items[0];
+
+ int i = 0, j = 0;
+ while (i < noutput_items) {
+ memcpy(out + i, in + j, 60 * 128);
+ i += 60 * 128;
+ j += 60 * 128;
+
+ out[i++] = 0x75;
+ out[i++] = 0x2C;
+ out[i++] = 0x0D;
+ out[i++] = 0x6C;
+ out[i++] = control_word << 3;
+ out[i++] = 0x00;
+ }
+
+ // Tell runtime system how many input items we consumed on
+ // each input stream.
+ consume_each (j);
+
+ // Tell runtime system how many output items we produced.
+ return noutput_items;
+ }
+
+ } /* namespace dtv */
+} /* namespace gr */
+
diff --git a/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.h b/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.h
new file mode 100644
index 0000000000..fb924f7a14
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.h
@@ -0,0 +1,50 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_IMPL_H
+#define INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_IMPL_H
+
+#include <gnuradio/dtv/catv_frame_sync_enc_bb.h>
+
+namespace gr {
+ namespace dtv {
+
+ class catv_frame_sync_enc_bb_impl : public catv_frame_sync_enc_bb
+ {
+ private:
+ int control_word;
+
+ public:
+ catv_frame_sync_enc_bb_impl(int ctrlword);
+ ~catv_frame_sync_enc_bb_impl();
+
+ void forecast (int noutput_items, gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_IMPL_H */
+
diff --git a/gr-dtv/lib/catv/catv_randomizer_bb_impl.cc b/gr-dtv/lib/catv/catv_randomizer_bb_impl.cc
new file mode 100644
index 0000000000..698288dcd3
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_randomizer_bb_impl.cc
@@ -0,0 +1,104 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; 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 "catv_randomizer_bb_impl.h"
+
+namespace gr {
+ namespace dtv {
+
+ catv_randomizer_bb::sptr
+ catv_randomizer_bb::make()
+ {
+ return gnuradio::get_initial_sptr
+ (new catv_randomizer_bb_impl());
+ }
+
+ /*
+ * The private constructor
+ */
+ catv_randomizer_bb_impl::catv_randomizer_bb_impl()
+ : gr::sync_block("catv_randomizer_bb",
+ gr::io_signature::make(1, 1, sizeof(unsigned char)),
+ gr::io_signature::make(1, 1, sizeof(unsigned char)))
+ {
+ init_rand();
+
+ offset = 0;
+ max_offset = 60 * 128;
+ }
+
+ /*
+ * Our virtual destructor.
+ */
+ catv_randomizer_bb_impl::~catv_randomizer_bb_impl()
+ {
+ }
+
+ void
+ catv_randomizer_bb_impl::init_rand()
+ {
+ unsigned char c2 = 0x7F, c1 = 0x7F, c0 = 0x7F;
+ unsigned char c2_new, c1_new, c0_new;
+ int n, i;
+
+ for (n = 0; n < 60 * 128; n++) {
+ rseq[n] = c2;
+ c2_new = c1;
+ c1_new = c0 ^ c2;
+ c0_new = c2;
+ for (i = 0; i < 3; i++) {
+ c0_new <<= 1;
+ if (c0_new & 0x80) {
+ c0_new = (c0_new & 0x7F) ^ 0x09;
+ }
+ }
+ c2 = c2_new;
+ c1 = c1_new;
+ c0 = c0_new;
+ }
+ }
+
+ int
+ catv_randomizer_bb_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const unsigned char *in = (const unsigned char *) input_items[0];
+ unsigned char *out = (unsigned char *) output_items[0];
+
+ for (int i = 0; i < noutput_items; i++) {
+ out[i] = in[i] ^ rseq[offset++];
+ if (offset == max_offset) {
+ offset = 0;
+ }
+ }
+
+ // Tell runtime system how many output items we produced.
+ return noutput_items;
+ }
+
+ } /* namespace dtv */
+} /* namespace gr */
+
diff --git a/gr-dtv/lib/catv/catv_randomizer_bb_impl.h b/gr-dtv/lib/catv/catv_randomizer_bb_impl.h
new file mode 100644
index 0000000000..e4e40f8f6e
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_randomizer_bb_impl.h
@@ -0,0 +1,49 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_RANDOMIZER_BB_IMPL_H
+#define INCLUDED_DTV_CATV_RANDOMIZER_BB_IMPL_H
+
+#include <gnuradio/dtv/catv_randomizer_bb.h>
+
+namespace gr {
+ namespace dtv {
+
+ class catv_randomizer_bb_impl : public catv_randomizer_bb
+ {
+ private:
+ unsigned char rseq[60 * 128];
+ int offset, max_offset;
+ void init_rand();
+
+ public:
+ catv_randomizer_bb_impl();
+ ~catv_randomizer_bb_impl();
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_RANDOMIZER_BB_IMPL_H */
+
diff --git a/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.cc b/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.cc
new file mode 100644
index 0000000000..06a1f12c3e
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.cc
@@ -0,0 +1,153 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; 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 "catv_reed_solomon_enc_bb_impl.h"
+
+namespace gr {
+ namespace dtv {
+
+ catv_reed_solomon_enc_bb::sptr
+ catv_reed_solomon_enc_bb::make()
+ {
+ return gnuradio::get_initial_sptr
+ (new catv_reed_solomon_enc_bb_impl());
+ }
+
+ /*
+ * The private constructor
+ */
+ catv_reed_solomon_enc_bb_impl::catv_reed_solomon_enc_bb_impl()
+ : gr::block("catv_reed_solomon_enc_bb",
+ gr::io_signature::make(1, 1, sizeof(unsigned char)),
+ gr::io_signature::make(1, 1, sizeof(unsigned char)))
+ {
+ set_output_multiple(128);
+ init_rs();
+ }
+
+ /*
+ * Our virtual destructor.
+ */
+ catv_reed_solomon_enc_bb_impl::~catv_reed_solomon_enc_bb_impl()
+ {
+ }
+
+ void
+ catv_reed_solomon_enc_bb_impl::init_rs()
+ {
+ unsigned char x;
+ int i, j;
+
+ gf_exp[0] = 1;
+ gf_log[1] = 0;
+
+ x = 1;
+ for (i = 1; i < 127; i++) {
+ x <<= 1;
+ if (x & 0x80) {
+ x = (x & 0x7F) ^ 0x09;
+ }
+ gf_exp[i] = x;
+ gf_log[x] = i;
+ }
+ for (; i < 256; i++) {
+ gf_exp[i] = gf_exp[i - 127];
+ }
+
+ for (i = 0; i < 128; i++) {
+ for (j = 0; j < 128; j++) {
+ if ((i == 0) || (j == 0)) {
+ gf_mul_table[i][j] = 0;
+ } else {
+ gf_mul_table[i][j] = gf_exp[gf_log[i] + gf_log[j]];
+ }
+ }
+ }
+ }
+
+ unsigned char
+ catv_reed_solomon_enc_bb_impl::gf_poly_eval(unsigned char *p, int len, unsigned char x)
+ {
+ unsigned char y = p[0];
+ int i;
+
+ for (i = 1; i < len; i++) {
+ y = gf_mul_table[y][x] ^ p[i];
+ }
+ return y;
+ }
+
+ void
+ catv_reed_solomon_enc_bb_impl::reed_solomon_enc(const unsigned char *message, unsigned char *output)
+ {
+ // Generator polynomial from p.7 of ANSI/SCTE 07 2013
+ unsigned char g[] = {1, gf_exp[52], gf_exp[116], gf_exp[119], gf_exp[61], gf_exp[15]};
+ int i, j;
+
+ memcpy(output, message, 122);
+ memset(output + 122, 0, 6);
+
+ for (i = 0; i < 122; i++) {
+ for (j = 1; j < 6; j++) {
+ output[i + j] ^= gf_mul_table[output[i]][g[j]];
+ }
+ output[i] = message[i];
+ }
+
+ output[127] = gf_poly_eval(output, 128, gf_exp[6]);
+ }
+
+ void
+ catv_reed_solomon_enc_bb_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+ {
+ ninput_items_required[0] = (noutput_items / 128) * 122;
+ }
+
+ int
+ catv_reed_solomon_enc_bb_impl::general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const unsigned char *in = (const unsigned char *) input_items[0];
+ unsigned char *out = (unsigned char *) output_items[0];
+ int j = 0;
+
+ for (int i = 0; i < noutput_items; i += 128) {
+ reed_solomon_enc(in + j, out + i);
+ j += 122;
+ }
+
+ // Tell runtime system how many input items we consumed on
+ // each input stream.
+ consume_each (j);
+
+ // Tell runtime system how many output items we produced.
+ return noutput_items;
+ }
+
+ } /* namespace dtv */
+} /* namespace gr */
+
diff --git a/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.h b/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.h
new file mode 100644
index 0000000000..84e4cb500e
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.h
@@ -0,0 +1,56 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_IMPL_H
+#define INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_IMPL_H
+
+#include <gnuradio/dtv/catv_reed_solomon_enc_bb.h>
+
+namespace gr {
+ namespace dtv {
+
+ class catv_reed_solomon_enc_bb_impl : public catv_reed_solomon_enc_bb
+ {
+ private:
+ unsigned char gf_mul_table[128][128];
+ unsigned char gf_exp[256];
+ unsigned char gf_log[128];
+
+ void init_rs();
+ unsigned char gf_poly_eval(unsigned char *p, int len, unsigned char x);
+ void reed_solomon_enc(const unsigned char *message, unsigned char *output);
+
+ public:
+ catv_reed_solomon_enc_bb_impl();
+ ~catv_reed_solomon_enc_bb_impl();
+
+ void forecast (int noutput_items, gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_IMPL_H */
+
diff --git a/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.cc b/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.cc
new file mode 100644
index 0000000000..4082e8265c
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.cc
@@ -0,0 +1,131 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; 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 "catv_transport_framing_enc_bb_impl.h"
+
+namespace gr {
+ namespace dtv {
+
+ catv_transport_framing_enc_bb::sptr
+ catv_transport_framing_enc_bb::make()
+ {
+ return gnuradio::get_initial_sptr
+ (new catv_transport_framing_enc_bb_impl());
+ }
+
+ /*
+ * The private constructor
+ */
+ catv_transport_framing_enc_bb_impl::catv_transport_framing_enc_bb_impl()
+ : gr::sync_block("catv_transport_framing_enc_bb",
+ gr::io_signature::make(1, 1, sizeof(unsigned char)),
+ gr::io_signature::make(1, 1, sizeof(unsigned char)))
+ {
+ set_output_multiple(188);
+ }
+
+ /*
+ * Our virtual destructor.
+ */
+ catv_transport_framing_enc_bb_impl::~catv_transport_framing_enc_bb_impl()
+ {
+ }
+
+ unsigned char catv_transport_framing_enc_bb_impl::compute_sum(const unsigned char *bytes)
+ {
+ unsigned char i, bit, out, out1, out2, out3;
+
+ unsigned char tapsG = 0xB1; // 10110001
+ unsigned char tapsB = 0x45; // 1000101
+
+ unsigned char register1 = 0;
+ unsigned char register2 = 0;
+ unsigned char register3 = 0;
+
+ unsigned char result = 0x67;
+
+ unsigned char first7[] = {0, 0, 0, 0, 0, 0, 0, 0};
+
+ for (i = 0; i < 8; i++) {
+ bit = (bytes[0] >> (7-i)) & 1;
+ out = (register1 & 1) ^ bit;
+ if (i < 7) {
+ first7[i+1] = out;
+ }
+ register1 >>= 1;
+ if (out == 1) {
+ register1 ^= tapsG;
+ }
+ }
+
+ for (i = 1; i < 187; i++) {
+ register1 = crctable[((register1) ^ BitReverseTable[bytes[i]]) & 0xff];
+ }
+
+ for (i = 0; i < 8; i++) {
+ out1 = register1 & 1;
+ register1 >>= 1;
+ if (out1 == 1) {
+ register1 ^= tapsG;
+ }
+
+ out2 = (register2 & 1) ^ first7[i];
+ register2 >>= 1;
+ if (first7[i] == 1) {
+ register2 ^= tapsB;
+ }
+
+ out3 = (register3 & 1) ^ out1 ^ out2;
+ register3 >>= 1;
+ if ((out1 ^ out2) == 1) {
+ register3 ^= tapsG;
+ }
+
+ result ^= (out3 << (7-i));
+ }
+
+ return result;
+ }
+
+ int
+ catv_transport_framing_enc_bb_impl::work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const unsigned char *in = (const unsigned char *) input_items[0];
+ unsigned char *out = (unsigned char *) output_items[0];
+
+ for (int i = 0; i < noutput_items; i += 188) {
+ memcpy(out + i, in + i + 1, 187);
+ out[i + 187] = compute_sum(in + i + 1);
+ }
+
+ // Tell runtime system how many output items we produced.
+ return noutput_items;
+ }
+
+ } /* namespace dtv */
+} /* namespace gr */
+
diff --git a/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.h b/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.h
new file mode 100644
index 0000000000..fe69bc01f6
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.h
@@ -0,0 +1,84 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_IMPL_H
+#define INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_IMPL_H
+
+#include <gnuradio/dtv/catv_transport_framing_enc_bb.h>
+
+namespace gr {
+ namespace dtv {
+ static const unsigned char crctable[] = {
+ 0x00,0x1b,0x36,0x2d,0x6c,0x77,0x5a,0x41,0xd8,0xc3,0xee,0xf5,0xb4,0xaf,0x82,0x99,
+ 0xd3,0xc8,0xe5,0xfe,0xbf,0xa4,0x89,0x92,0x0b,0x10,0x3d,0x26,0x67,0x7c,0x51,0x4a,
+ 0xc5,0xde,0xf3,0xe8,0xa9,0xb2,0x9f,0x84,0x1d,0x06,0x2b,0x30,0x71,0x6a,0x47,0x5c,
+ 0x16,0x0d,0x20,0x3b,0x7a,0x61,0x4c,0x57,0xce,0xd5,0xf8,0xe3,0xa2,0xb9,0x94,0x8f,
+ 0xe9,0xf2,0xdf,0xc4,0x85,0x9e,0xb3,0xa8,0x31,0x2a,0x07,0x1c,0x5d,0x46,0x6b,0x70,
+ 0x3a,0x21,0x0c,0x17,0x56,0x4d,0x60,0x7b,0xe2,0xf9,0xd4,0xcf,0x8e,0x95,0xb8,0xa3,
+ 0x2c,0x37,0x1a,0x01,0x40,0x5b,0x76,0x6d,0xf4,0xef,0xc2,0xd9,0x98,0x83,0xae,0xb5,
+ 0xff,0xe4,0xc9,0xd2,0x93,0x88,0xa5,0xbe,0x27,0x3c,0x11,0x0a,0x4b,0x50,0x7d,0x66,
+ 0xb1,0xaa,0x87,0x9c,0xdd,0xc6,0xeb,0xf0,0x69,0x72,0x5f,0x44,0x05,0x1e,0x33,0x28,
+ 0x62,0x79,0x54,0x4f,0x0e,0x15,0x38,0x23,0xba,0xa1,0x8c,0x97,0xd6,0xcd,0xe0,0xfb,
+ 0x74,0x6f,0x42,0x59,0x18,0x03,0x2e,0x35,0xac,0xb7,0x9a,0x81,0xc0,0xdb,0xf6,0xed,
+ 0xa7,0xbc,0x91,0x8a,0xcb,0xd0,0xfd,0xe6,0x7f,0x64,0x49,0x52,0x13,0x08,0x25,0x3e,
+ 0x58,0x43,0x6e,0x75,0x34,0x2f,0x02,0x19,0x80,0x9b,0xb6,0xad,0xec,0xf7,0xda,0xc1,
+ 0x8b,0x90,0xbd,0xa6,0xe7,0xfc,0xd1,0xca,0x53,0x48,0x65,0x7e,0x3f,0x24,0x09,0x12,
+ 0x9d,0x86,0xab,0xb0,0xf1,0xea,0xc7,0xdc,0x45,0x5e,0x73,0x68,0x29,0x32,0x1f,0x04,
+ 0x4e,0x55,0x78,0x63,0x22,0x39,0x14,0x0f,0x96,0x8d,0xa0,0xbb,0xfa,0xe1,0xcc,0xd7
+ };
+
+ static const unsigned char BitReverseTable[] = {
+ 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0,
+ 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8,
+ 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4,
+ 0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC,
+ 0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2,
+ 0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA,
+ 0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6,
+ 0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE,
+ 0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1,
+ 0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9,
+ 0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5,
+ 0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD,
+ 0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3,
+ 0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB,
+ 0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7,
+ 0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF
+ };
+
+ class catv_transport_framing_enc_bb_impl : public catv_transport_framing_enc_bb
+ {
+ private:
+ unsigned char compute_sum(const unsigned char *bytes);
+
+ public:
+ catv_transport_framing_enc_bb_impl();
+ ~catv_transport_framing_enc_bb_impl();
+
+ int work(int noutput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_IMPL_H */
+
diff --git a/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.cc b/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.cc
new file mode 100644
index 0000000000..8fdb8722b6
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.cc
@@ -0,0 +1,193 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; 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 "catv_trellis_enc_bb_impl.h"
+
+namespace gr {
+ namespace dtv {
+
+ catv_trellis_enc_bb::sptr
+ catv_trellis_enc_bb::make()
+ {
+ return gnuradio::get_initial_sptr
+ (new catv_trellis_enc_bb_impl());
+ }
+
+ /*
+ * The private constructor
+ */
+ catv_trellis_enc_bb_impl::catv_trellis_enc_bb_impl()
+ : gr::block("catv_trellis_enc_bb",
+ gr::io_signature::make(1, 1, sizeof(unsigned char)),
+ gr::io_signature::make(1, 1, sizeof(unsigned char)))
+ {
+ set_output_multiple(5);
+
+ init_trellis();
+
+ Xq = 0;
+ Yq = 0;
+ XYp = 0;
+ }
+
+ /*
+ * Our virtual destructor.
+ */
+ catv_trellis_enc_bb_impl::~catv_trellis_enc_bb_impl()
+ {
+ }
+
+ void
+ catv_trellis_enc_bb_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+ {
+ ninput_items_required[0] = noutput_items / 5 * 4;
+ }
+
+ void
+ catv_trellis_enc_bb_impl::diff_precoder(unsigned char W, unsigned char Z, unsigned char *Xp, unsigned char *Yp)
+ {
+ unsigned char common, newX, newY;
+
+ common = (Z & (*Xp ^ *Yp));
+ newX = W ^ *Xp ^ common;
+ newY = Z ^ W ^ *Yp ^ common;
+
+ *Xp = newX;
+ *Yp = newY;
+ }
+
+ void
+ catv_trellis_enc_bb_impl::init_trellis()
+ {
+ unsigned char XYp, W, Z, X, Y, Xp, Yp, state, xy, Xq;
+ int i, n;
+
+ for (XYp = 0; XYp < 4; XYp++) {
+ for (W = 0; W < 16; W++) {
+ for (Z = 0; Z < 16; Z++) {
+ X = 0;
+ Y = 0;
+ Xp = (XYp & 0b10) >> 1;
+ Yp = (XYp & 0b01);
+ for (i = 0; i < 4; i++) {
+ diff_precoder((W >> i) & 1, (Z >> i) & 1, &Xp, &Yp);
+ X |= (Xp << i);
+ Y |= (Yp << i);
+ }
+ diff_precoder_table[XYp][W][Z][0] = (Xp << 1) + Yp;
+ diff_precoder_table[XYp][W][Z][1] = X;
+ diff_precoder_table[XYp][W][Z][2] = Y;
+ }
+ }
+ }
+
+ for (i = 0; i < 32; i++) {
+ G1table[i] = (i >> 4) ^ ((i & 0x04) >> 2) ^ (i & 1);
+ G2table[i] = (i >> 4) ^ ((i & 0x08) >> 3) ^ ((i & 0x04) >> 2) ^ ((i & 0x02) >> 1) ^ (i & 1);
+ }
+
+ memset(trellis_table_x, 0, 16*16*6);
+ memset(trellis_table_y, 0, 16*16*6);
+ for (state = 0; state < 16; state++) {
+ for (xy = 0; xy < 16; xy++) {
+ i = 0;
+ Xq = state;
+ for (n = 0; n < 4; n++) {
+ Xq = (Xq << 1) + ((xy >> n) & 1);
+
+ if (n == 3) {
+ trellis_table_x[state][xy][i+1] |= G1table[Xq] << 3;
+ trellis_table_y[state][xy][i+1] |= G1table[Xq];
+ i += 1;
+ }
+ trellis_table_x[state][xy][i+1] |= G2table[Xq] << 3;
+ trellis_table_y[state][xy][i+1] |= G2table[Xq];
+ i += 1;
+
+ Xq &= 0x0F;
+ }
+
+ trellis_table_x[state][xy][0] = Xq;
+ trellis_table_y[state][xy][0] = Xq;
+ }
+ }
+ }
+
+ void
+ catv_trellis_enc_bb_impl::trellis_code(const unsigned char *rs, unsigned char *qs)
+ {
+ unsigned char X, Y;
+ int A, B, n;
+
+ A = (rs[1] << 7) | rs[0];
+ B = (rs[3] << 7) | rs[2];
+
+ memset(qs, 0, 5);
+
+ for (n = 0; n < 5; n++) {
+ qs[n] |= ((A >> (2*n)) & 3) << 4;
+ qs[n] |= ((B >> (2*n)) & 3) << 1;
+ }
+
+ X = diff_precoder_table[XYp][A >> 10][B >> 10][1];
+ Y = diff_precoder_table[XYp][A >> 10][B >> 10][2];
+ XYp = diff_precoder_table[XYp][A >> 10][B >> 10][0];
+
+ for (n = 0; n < 5; n++) {
+ qs[n] |= trellis_table_x[Xq][X][1+n];
+ qs[n] |= trellis_table_y[Yq][Y][1+n];
+ }
+ Xq = trellis_table_x[Xq][X][0];
+ Yq = trellis_table_y[Yq][Y][0];
+ }
+
+ int
+ catv_trellis_enc_bb_impl::general_work (int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items)
+ {
+ const unsigned char *in = (const unsigned char *) input_items[0];
+ unsigned char *out = (unsigned char *) output_items[0];
+
+ int i = 0, j = 0;
+
+ while (i < noutput_items) {
+ trellis_code(in + j, out + i);
+ i += 5;
+ j += 4;
+ }
+
+ // Tell runtime system how many input items we consumed on
+ // each input stream.
+ consume_each (j);
+
+ // Tell runtime system how many output items we produced.
+ return noutput_items;
+ }
+
+ } /* namespace dtv */
+} /* namespace gr */
+
diff --git a/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.h b/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.h
new file mode 100644
index 0000000000..aa7874d929
--- /dev/null
+++ b/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.h
@@ -0,0 +1,60 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2016 Free Software Foundation, Inc.
+ *
+ * This 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.
+ *
+ * This software 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 this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef INCLUDED_DTV_CATV_TRELLIS_ENC_BB_IMPL_H
+#define INCLUDED_DTV_CATV_TRELLIS_ENC_BB_IMPL_H
+
+#include <gnuradio/dtv/catv_trellis_enc_bb.h>
+
+namespace gr {
+ namespace dtv {
+
+ class catv_trellis_enc_bb_impl : public catv_trellis_enc_bb
+ {
+ private:
+ unsigned char diff_precoder_table[4][16][16][3];
+ unsigned char G1table[32];
+ unsigned char G2table[32];
+ unsigned char trellis_table_x[16][16][6];
+ unsigned char trellis_table_y[16][16][6];
+ unsigned char Xq, Yq, XYp;
+
+ void diff_precoder(unsigned char W, unsigned char Z, unsigned char *Xp, unsigned char *Yp);
+ void init_trellis();
+ void trellis_code(const unsigned char *rs, unsigned char *qs);
+
+ public:
+ catv_trellis_enc_bb_impl();
+ ~catv_trellis_enc_bb_impl();
+
+ // Where all the action really happens
+ void forecast (int noutput_items, gr_vector_int &ninput_items_required);
+
+ int general_work(int noutput_items,
+ gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items,
+ gr_vector_void_star &output_items);
+ };
+
+ } // namespace dtv
+} // namespace gr
+
+#endif /* INCLUDED_DTV_CATV_TRELLIS_ENC_BB_IMPL_H */
+
diff --git a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
index c8579d1c1e..d1f3b4aa27 100644
--- a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
+++ b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.cc
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2015 Free Software Foundation, Inc.
+ * Copyright 2015,2016 Free Software Foundation, Inc.
*
* This is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -29,16 +29,16 @@ namespace gr {
namespace dtv {
dvbs2_modulator_bc::sptr
- dvbs2_modulator_bc::make(dvb_framesize_t framesize, dvb_code_rate_t rate, dvb_constellation_t constellation)
+ dvbs2_modulator_bc::make(dvb_framesize_t framesize, dvb_code_rate_t rate, dvb_constellation_t constellation, dvbs2_interpolation_t interpolation)
{
return gnuradio::get_initial_sptr
- (new dvbs2_modulator_bc_impl(framesize, rate, constellation));
+ (new dvbs2_modulator_bc_impl(framesize, rate, constellation, interpolation));
}
/*
* The private constructor
*/
- dvbs2_modulator_bc_impl::dvbs2_modulator_bc_impl(dvb_framesize_t framesize, dvb_code_rate_t rate, dvb_constellation_t constellation)
+ dvbs2_modulator_bc_impl::dvbs2_modulator_bc_impl(dvb_framesize_t framesize, dvb_code_rate_t rate, dvb_constellation_t constellation, dvbs2_interpolation_t interpolation)
: gr::block("dvbs2_modulator_bc",
gr::io_signature::make(1, 1, sizeof(unsigned char)),
gr::io_signature::make(1, 1, sizeof(gr_complex)))
@@ -1660,6 +1660,72 @@ namespace gr {
m_256apsk[255] = gr_complex((r6 * cos(43 * M_PI / 32.0)), (r6 * sin(43 * M_PI / 32.0)));
}
break;
+ case MOD_64QAM:
+ m_64apsk[0] = gr_complex( 1.0, 1.0);
+ m_64apsk[1] = gr_complex( 1.0, -1.0);
+ m_64apsk[2] = gr_complex( 1.0, -3.0);
+ m_64apsk[3] = gr_complex( -3.0, -1.0);
+ m_64apsk[4] = gr_complex( -3.0, 1.0);
+ m_64apsk[5] = gr_complex( 1.0, 3.0);
+ m_64apsk[6] = gr_complex( -3.0, -3.0);
+ m_64apsk[7] = gr_complex( -3.0, 3.0);
+ m_64apsk[8] = gr_complex( -1.0, 1.0);
+ m_64apsk[9] = gr_complex( -1.0, -1.0);
+ m_64apsk[10] = gr_complex( 3.0, 1.0);
+ m_64apsk[11] = gr_complex(-1.0, 3.0);
+ m_64apsk[12] = gr_complex(-1.0, -3.0);
+ m_64apsk[13] = gr_complex( 3.0, -1.0);
+ m_64apsk[14] = gr_complex( 3.0, -3.0);
+ m_64apsk[15] = gr_complex( 3.0, 3.0);
+ m_64apsk[16] = gr_complex( 5.0, 1.0);
+ m_64apsk[17] = gr_complex( 1.0, -5.0);
+ m_64apsk[18] = gr_complex( 1.0, -7.0);
+ m_64apsk[19] = gr_complex(-7.0, -1.0);
+ m_64apsk[20] = gr_complex(-3.0, 5.0);
+ m_64apsk[21] = gr_complex( 5.0, 3.0);
+ m_64apsk[22] = gr_complex(-7.0, -3.0);
+ m_64apsk[23] = gr_complex(-3.0, 7.0);
+ m_64apsk[24] = gr_complex(-1.0, 5.0);
+ m_64apsk[25] = gr_complex(-5.0, -1.0);
+ m_64apsk[26] = gr_complex( 7.0, 1.0);
+ m_64apsk[27] = gr_complex(-1.0, 7.0);
+ m_64apsk[28] = gr_complex(-5.0, -3.0);
+ m_64apsk[29] = gr_complex( 3.0, -5.0);
+ m_64apsk[30] = gr_complex( 3.0, -7.0);
+ m_64apsk[31] = gr_complex( 7.0, 3.0);
+ m_64apsk[32] = gr_complex( 1.0, 5.0);
+ m_64apsk[33] = gr_complex( 5.0, -1.0);
+ m_64apsk[34] = gr_complex( 5.0, -3.0);
+ m_64apsk[35] = gr_complex(-3.0, -5.0);
+ m_64apsk[36] = gr_complex(-7.0, 1.0);
+ m_64apsk[37] = gr_complex( 1.0, 7.0);
+ m_64apsk[38] = gr_complex(-3.0, -7.0);
+ m_64apsk[39] = gr_complex(-7.0, 3.0);
+ m_64apsk[40] = gr_complex(-5.0, 1.0);
+ m_64apsk[41] = gr_complex(-1.0, -5.0);
+ m_64apsk[42] = gr_complex( 3.0, 5.0);
+ m_64apsk[43] = gr_complex(-5.0, 3.0);
+ m_64apsk[44] = gr_complex(-1.0, -7.0);
+ m_64apsk[45] = gr_complex( 7.0, -1.0);
+ m_64apsk[46] = gr_complex( 7.0, -3.0);
+ m_64apsk[47] = gr_complex( 3.0, 7.0);
+ m_64apsk[48] = gr_complex( 5.0, 5.0);
+ m_64apsk[49] = gr_complex( 5.0, -5.0);
+ m_64apsk[50] = gr_complex( 5.0, -7.0);
+ m_64apsk[51] = gr_complex(-7.0, -5.0);
+ m_64apsk[52] = gr_complex(-7.0, 5.0);
+ m_64apsk[53] = gr_complex( 5.0, 7.0);
+ m_64apsk[54] = gr_complex(-7.0, -7.0);
+ m_64apsk[55] = gr_complex(-7.0, 7.0);
+ m_64apsk[56] = gr_complex(-5.0, 5.0);
+ m_64apsk[57] = gr_complex(-5.0, -5.0);
+ m_64apsk[58] = gr_complex( 7.0, 5.0);
+ m_64apsk[59] = gr_complex(-5.0, 7.0);
+ m_64apsk[60] = gr_complex(-5.0, -7.0);
+ m_64apsk[61] = gr_complex( 7.0, -5.0);
+ m_64apsk[62] = gr_complex( 7.0, -7.0);
+ m_64apsk[63] = gr_complex( 7.0, 7.0);
+ break;
default:
m_qpsk[0] = gr_complex((r1 * cos(M_PI / 4.0)), (r1 * sin(M_PI / 4.0)));
m_qpsk[1] = gr_complex((r1 * cos(7 * M_PI / 4.0)), (r1 * sin(7 * M_PI / 4.0)));
@@ -1668,6 +1734,7 @@ namespace gr {
break;
}
signal_constellation = constellation;
+ signal_interpolation = interpolation;
set_output_multiple(2);
}
@@ -1681,7 +1748,12 @@ namespace gr {
void
dvbs2_modulator_bc_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
{
- ninput_items_required[0] = noutput_items;
+ if (signal_interpolation == INTERPOLATION_OFF) {
+ ninput_items_required[0] = noutput_items;
+ }
+ else {
+ ninput_items_required[0] = noutput_items / 2;
+ }
}
int
@@ -1693,67 +1765,145 @@ namespace gr {
const unsigned char *in = (const unsigned char *) input_items[0];
gr_complex *out = (gr_complex *) output_items[0];
int index;
+ gr_complex zero;
- switch (signal_constellation) {
- case MOD_QPSK:
- for (int i = 0; i < noutput_items; i++) {
- index = *in++;
- *out++ = m_qpsk[index & 0x3];
- }
- break;
- case MOD_8PSK:
- case MOD_8APSK:
- for (int i = 0; i < noutput_items; i++) {
- index = *in++;
- *out++ = m_8psk[index & 0x7];
- }
- break;
- case MOD_16APSK:
- case MOD_8_8APSK:
- for (int i = 0; i < noutput_items; i++) {
- index = *in++;
- *out++ = m_16apsk[index & 0xf];
- }
- break;
- case MOD_32APSK:
- case MOD_4_12_16APSK:
- case MOD_4_8_4_16APSK:
- for (int i = 0; i < noutput_items; i++) {
- index = *in++;
- *out++ = m_32apsk[index & 0x1f];
- }
- break;
- case MOD_64APSK:
- case MOD_8_16_20_20APSK:
- case MOD_4_12_20_28APSK:
- for (int i = 0; i < noutput_items; i++) {
- index = *in++;
- *out++ = m_64apsk[index & 0x3f];
- }
- break;
- case MOD_128APSK:
- for (int i = 0; i < noutput_items; i++) {
- index = *in++;
- *out++ = m_128apsk[index & 0x7f];
- }
- break;
- case MOD_256APSK:
- for (int i = 0; i < noutput_items; i++) {
- index = *in++;
- *out++ = m_256apsk[index & 0xff];
- }
- break;
- default:
- for (int i = 0; i < noutput_items; i++) {
- index = *in++;
- *out++ = m_qpsk[index & 0x3];
- }
- break;
+ zero = gr_complex(0.0, 0.0);
+
+ if (signal_interpolation == INTERPOLATION_OFF) {
+ switch (signal_constellation) {
+ case MOD_QPSK:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_qpsk[index & 0x3];
+ }
+ break;
+ case MOD_8PSK:
+ case MOD_8APSK:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_8psk[index & 0x7];
+ }
+ break;
+ case MOD_16APSK:
+ case MOD_8_8APSK:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_16apsk[index & 0xf];
+ }
+ break;
+ case MOD_32APSK:
+ case MOD_4_12_16APSK:
+ case MOD_4_8_4_16APSK:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_32apsk[index & 0x1f];
+ }
+ break;
+ case MOD_64APSK:
+ case MOD_64QAM:
+ case MOD_8_16_20_20APSK:
+ case MOD_4_12_20_28APSK:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_64apsk[index & 0x3f];
+ }
+ break;
+ case MOD_128APSK:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_128apsk[index & 0x7f];
+ }
+ break;
+ case MOD_256APSK:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_256apsk[index & 0xff];
+ }
+ break;
+ default:
+ for (int i = 0; i < noutput_items; i++) {
+ index = *in++;
+ *out++ = m_qpsk[index & 0x3];
+ }
+ break;
+ }
+ }
+ else {
+ switch (signal_constellation) {
+ case MOD_QPSK:
+ for (int i = 0; i < noutput_items / 2; i++) {
+ index = *in++;
+ *out++ = m_qpsk[index & 0x3];
+ *out++ = zero;
+ }
+ break;
+ case MOD_8PSK:
+ case MOD_8APSK:
+ for (int i = 0; i < noutput_items / 2; i++) {
+ index = *in++;
+ *out++ = m_8psk[index & 0x7];
+ *out++ = zero;
+ }
+ break;
+ case MOD_16APSK:
+ case MOD_8_8APSK:
+ for (int i = 0; i < noutput_items / 2; i++) {
+ index = *in++;
+ *out++ = m_16apsk[index & 0xf];
+ *out++ = zero;
+ }
+ break;
+ case MOD_32APSK:
+ case MOD_4_12_16APSK:
+ case MOD_4_8_4_16APSK:
+ for (int i = 0; i < noutput_items / 2; i++) {
+ index = *in++;
+ *out++ = m_32apsk[index & 0x1f];
+ *out++ = zero;
+ }
+ break;
+ case MOD_64APSK:
+ case MOD_64QAM:
+ case MOD_8_16_20_20APSK:
+ case MOD_4_12_20_28APSK:
+ for (int i = 0; i < noutput_items / 2; i++) {
+ index = *in++;
+ *out++ = m_64apsk[index & 0x3f];
+ *out++ = zero;
+ }
+ break;
+ case MOD_128APSK:
+ for (int i = 0; i < noutput_items / 2; i++) {
+ index = *in++;
+ *out++ = m_128apsk[index & 0x7f];
+ *out++ = zero;
+ }
+ break;
+ case MOD_256APSK:
+ for (int i = 0; i < noutput_items / 2; i++) {
+ index = *in++;
+ *out++ = m_256apsk[index & 0xff];
+ *out++ = zero;
+ }
+ break;
+ default:
+ for (int i = 0; i < noutput_items / 2; i++) {
+ index = *in++;
+ *out++ = m_qpsk[index & 0x3];
+ *out++ = zero;
+ }
+ break;
+ }
}
// Tell runtime system how many input items we consumed on
// each input stream.
- consume_each (noutput_items);
+ if (signal_interpolation == INTERPOLATION_OFF) {
+ consume_each (noutput_items);
+ }
+ else {
+ consume_each (noutput_items / 2);
+ }
// Tell runtime system how many output items we produced.
return noutput_items;
diff --git a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h
index 8507878b0e..4fdbb149df 100644
--- a/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h
+++ b/gr-dtv/lib/dvbs2/dvbs2_modulator_bc_impl.h
@@ -31,6 +31,7 @@ namespace gr {
{
private:
int signal_constellation;
+ int signal_interpolation;
gr_complex m_qpsk[4];
gr_complex m_8psk[8];
gr_complex m_16apsk[16];
@@ -40,7 +41,7 @@ namespace gr {
gr_complex m_256apsk[256];
public:
- dvbs2_modulator_bc_impl(dvb_framesize_t framesize, dvb_code_rate_t rate, dvb_constellation_t constellation);
+ dvbs2_modulator_bc_impl(dvb_framesize_t framesize, dvb_code_rate_t rate, dvb_constellation_t constellation, dvbs2_interpolation_t interpolation);
~dvbs2_modulator_bc_impl();
void forecast (int noutput_items, gr_vector_int &ninput_items_required);
diff --git a/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc b/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc
index 84b20f9ad4..abef1d0510 100644
--- a/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc
+++ b/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc
@@ -34,12 +34,12 @@ namespace gr {
namespace dtv {
int
- dvbt_ofdm_sym_acquisition_impl::peak_detect_init(float threshold_factor_rise, float threshold_factor_fall, int look_ahead, float alpha)
+ dvbt_ofdm_sym_acquisition_impl::peak_detect_init(float threshold_factor_rise, float alpha)
{
d_avg_alpha = alpha;
d_threshold_factor_rise = threshold_factor_rise;
- d_threshold_factor_fall = threshold_factor_fall;
- d_avg = 0;
+ d_avg_max = - (float)INFINITY;
+ d_avg_min = (float)INFINITY;
return (0);
}
@@ -47,56 +47,50 @@ namespace gr {
int
dvbt_ofdm_sym_acquisition_impl::peak_detect_process(const float * datain, const int datain_length, int * peak_pos, int * peak_max)
{
- int state = 0;
- float peak_val = -(float)INFINITY; int peak_index = 0; int peak_pos_length = 0;
+ unsigned int peak_index = 0;
+ int peak_pos_length = 0;
- int i = 0;
+ volk_32f_index_max_16u(&peak_index, &datain[0], datain_length);
- while(i < datain_length) {
- if (state == 0) {
- if (datain[i] > d_avg * d_threshold_factor_rise) {
- state = 1;
- }
- else {
- d_avg = d_avg_alpha * datain[i] + (1 - d_avg_alpha) * d_avg;
- i++;
- }
+ peak_pos_length = 1;
+ if (datain_length >= d_fft_length) {
+ float min = datain[(peak_index + d_fft_length / 2) % d_fft_length];
+ if (d_avg_min == (float)INFINITY) {
+ d_avg_min = min;
}
- else if (state == 1) {
- if (datain[i] > peak_val) {
- peak_val = datain[i];
- peak_index = i;
- d_avg = d_avg_alpha * datain[i] + (1 - d_avg_alpha) * d_avg;
- i++;
- }
- else if (datain[i] > d_avg * d_threshold_factor_fall) {
- d_avg = (d_avg_alpha) * datain[i] + (1 - d_avg_alpha) * d_avg;
- i++;
- }
- else {
- peak_pos[peak_pos_length] = peak_index;
- peak_pos_length++;
- state = 0;
- peak_val = - (float)INFINITY;
- }
+ else {
+ d_avg_min = d_avg_alpha * min + (1 - d_avg_alpha) * d_avg_min;
}
}
- // Find peak of peaks
- if (peak_pos_length) {
- float max = datain[peak_pos[0]];
- int maxi = 0;
+ if (d_avg_max == -(float)INFINITY) {
+ // Initialize d_avg_max with the first value.
+ d_avg_max = datain[peak_index];
+ }
+ else if (datain[peak_index] > d_avg_max - d_threshold_factor_rise * (d_avg_max-d_avg_min)) {
+ d_avg_max = d_avg_alpha * datain[peak_index] + (1 - d_avg_alpha) * d_avg_max;
+ }
+ else {
+ peak_pos_length = 0;
+ }
- for (int i = 1; i < peak_pos_length; i++) {
- if (datain[peak_pos[i]] > max) {
- max = datain[peak_pos[i]];
- maxi = i;
- }
+ // We now check whether the peak is in the border of the search interval. This would mean that
+ // the search interval is not correct, and it should be re-set. This happens for instance when the
+ // hardware dropped some samples.
+ // Our definition of "border of the search interval" depends if the search interval is "big" or not.
+ if (datain_length < d_fft_length) {
+ if ((peak_index == 0) || (peak_index == (unsigned int)datain_length - 1)) {
+ peak_pos_length = 0;
+ }
+ }
+ else {
+ if ((peak_index < 5) || (peak_index > (unsigned int)datain_length - 5)) {
+ peak_pos_length = 0;
}
-
- *peak_max = maxi;
}
+ peak_pos[0] = peak_index;
+ *peak_max = 0;
return (peak_pos_length);
}
@@ -119,7 +113,8 @@ namespace gr {
volk_32fc_magnitude_squared_32f(&d_norm[low], &in[low], size);
// Calculate gamma on each point
- low = lookup_stop - d_cp_length + 1;
+ // TODO check these boundaries!!!!!!!
+ low = lookup_stop - (d_cp_length - 1);
size = lookup_start - low + 1;
volk_32fc_x2_multiply_conjugate_32fc(&d_corr[low - d_fft_length], &in[low], &in[low - d_fft_length], size);
@@ -220,6 +215,12 @@ namespace gr {
this->add_item_tag(0, offset, key, value);
}
+ // Derotates the signal
+ void dvbt_ofdm_sym_acquisition_impl::derotate(const gr_complex * in, gr_complex * out)
+ {
+ volk_32fc_x2_multiply_32fc(&out[0], &d_derot[0], &in[0], d_fft_length);
+ }
+
dvbt_ofdm_sym_acquisition::sptr
dvbt_ofdm_sym_acquisition::make(int blocks, int fft_length, int occupied_tones, int cp_length, float snr)
{
@@ -234,11 +235,10 @@ namespace gr {
: block("dvbt_ofdm_sym_acquisition",
io_signature::make(1, 1, sizeof (gr_complex) * blocks),
io_signature::make(1, 1, sizeof (gr_complex) * blocks * fft_length)),
- d_blocks(blocks), d_fft_length(fft_length), d_cp_length(cp_length), d_snr(snr),
- d_index(0), d_phase(0.0), d_phaseinc(0.0), d_cp_found(0), d_count(0), d_nextphaseinc(0), d_nextpos(0), \
- d_sym_acq_count(0),d_sym_acq_timeout(100), d_initial_acquisition(0), \
- d_freq_correction_count(0), d_freq_correction_timeout(0), d_cp_start(0), \
- d_to_consume(0), d_to_out(0)
+ d_blocks(blocks), d_fft_length(fft_length), d_cp_length(cp_length), d_snr(snr), \
+ d_phase(0.0), d_phaseinc(0.0), d_cp_found(0), d_nextphaseinc(0), d_nextpos(0), \
+ d_initial_acquisition(0), d_cp_start(0), \
+ d_to_consume(0), d_to_out(0), d_consumed(0), d_out(0)
{
set_relative_rate(1.0 / (double) (d_cp_length + d_fft_length));
@@ -296,7 +296,7 @@ namespace gr {
exit(1);
}
- peak_detect_init(0.8, 0.9, 30, 0.9);
+ peak_detect_init(0.3, 0.9);
}
/*
@@ -319,7 +319,7 @@ namespace gr {
// make sure we receive at least (symbol_length + fft_length)
for (int i = 0; i < ninputs; i++) {
- ninput_items_required[i] = (2 * d_fft_length + d_cp_length) * noutput_items;
+ ninput_items_required[i] = (d_cp_length + d_fft_length) * (noutput_items + 1);
}
}
@@ -336,45 +336,52 @@ namespace gr {
{
const gr_complex *in = (const gr_complex *) input_items[0];
gr_complex *out = (gr_complex *) output_items[0];
-
- int low, size;
-
- // This is initial acquisition of symbol start
- // TODO - make a FSM
- if (!d_initial_acquisition) {
- d_initial_acquisition = ml_sync(in, 2 * d_fft_length + d_cp_length - 1, d_fft_length + d_cp_length - 1, \
- &d_cp_start, &d_derot[0], &d_to_consume, &d_to_out);
-
- // Send sync_start downstream
- send_sync_start();
- }
-
- // This is fractional frequency correction (pre FFT)
- // It is also called coarse frequency correction
- if (d_initial_acquisition) {
- d_cp_found = ml_sync(in, d_cp_start + 16, d_cp_start, \
- &d_cp_start, &d_derot[0], &d_to_consume, &d_to_out);
+ int low;
+
+ d_consumed = 0;
+ d_out = 0;
+
+ for (int i = 0; i < noutput_items; i++) {
+ // This is initial acquisition of symbol start
+ // TODO - make a FSM
+ if (!d_initial_acquisition) {
+ d_initial_acquisition = ml_sync(&in[d_consumed], 2 * d_fft_length + d_cp_length - 1, d_fft_length + d_cp_length - 1, \
+ &d_cp_start, &d_derot[0], &d_to_consume, &d_to_out);
+ d_cp_found = d_initial_acquisition;
+ }
+ else {
+ // If we are here it means that in the previous iteration we found the CP. We
+ // now thus only search near it.
+ d_cp_found = ml_sync(&in[d_consumed], d_cp_start + 8, std::max(d_cp_start - 8, d_cp_length+d_fft_length - 1), \
+ &d_cp_start, &d_derot[0], &d_to_consume, &d_to_out);
+ if (!d_cp_found) {
+ // We may have not found the CP because the smaller search range was too small (rare, but possible).
+ // We re-try with the whole search range.
+ d_cp_found = ml_sync(&in[d_consumed], 2 * d_fft_length + d_cp_length - 1, d_fft_length + d_cp_length - 1, \
+ &d_cp_start, &d_derot[0], &d_to_consume, &d_to_out );
+ }
+ }
if (d_cp_found) {
- d_freq_correction_count = 0;
-
- // Derotate the signal and out
- low = d_cp_start - d_fft_length + 1;
- size = d_cp_start - (d_cp_start - d_fft_length + 1) + 1;
-
- volk_32fc_x2_multiply_32fc(&out[0], &d_derot[0], &in[low], size);
+ low = d_consumed + d_cp_start - d_fft_length + 1;
+ derotate(&in[low], &out[i * d_fft_length]);
}
else {
- // If we have a number of consecutive misses then we restart acquisition
- if (++d_freq_correction_count > d_freq_correction_timeout) {
- d_initial_acquisition = 0;
- d_freq_correction_count = 0;
-
- // Restart with a half number so that we'll not endup with the same situation
- // This will prevent peak_detect to not detect anything
- d_to_consume = d_to_consume / 2;
- }
+ // Send sync_start downstream
+ send_sync_start();
+ d_initial_acquisition = 0;
+
+ // Restart wit a half number so that we'll not end up with the same situation
+ // This will prevent peak_detect to not detect anything
+ d_to_consume = d_to_consume / 2;
+ d_consumed += d_to_consume;
+ consume_each(d_consumed);
+
+ // Tell runtime system how many output items we produced.
+ return (d_out);
}
+ d_consumed += d_to_consume;
+ d_out += d_to_out;
}
// Tell runtime system how many input items we consumed on
@@ -386,3 +393,4 @@ namespace gr {
}
} /* namespace dtv */
} /* namespace gr */
+
diff --git a/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.h b/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.h
index e7b92cbd41..0964361b1e 100644
--- a/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.h
+++ b/gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.h
@@ -35,8 +35,6 @@ namespace gr {
float d_snr;
float d_rho;
- int d_index;
-
gr_complex * d_conj;
float * d_norm;
gr_complex * d_corr;
@@ -45,37 +43,35 @@ namespace gr {
// For peak detector
float d_threshold_factor_rise;
- float d_threshold_factor_fall;
float d_avg_alpha;
- float d_avg;
+ float d_avg_min;
+ float d_avg_max;
float d_phase;
double d_phaseinc;
int d_cp_found;
- int d_count;
double d_nextphaseinc;
int d_nextpos;
- int d_sym_acq_count;
- int d_sym_acq_timeout;
-
int d_initial_acquisition;
- int d_freq_correction_count;
- int d_freq_correction_timeout;
-
int d_cp_start;
gr_complex * d_derot;
int d_to_consume;
int d_to_out;
+ int d_consumed;
+ int d_out;
int ml_sync(const gr_complex * in, int lookup_start, int lookup_stop, int * cp_pos, gr_complex * derot, int * to_consume, int * to_out);
- int peak_detect_init(float threshold_factor_rise, float threshold_factor_fall, int look_ahead, float alpha);
+ int peak_detect_init(float threshold_factor_rise, float alpha);
int peak_detect_process(const float * datain, const int datain_length, int * peak_pos, int * peak_max);
void send_sync_start();
+
+ void derotate(const gr_complex * in, gr_complex *out);
+
public:
dvbt_ofdm_sym_acquisition_impl(int blocks, int fft_length, int occupied_tones, int cp_length, float snr);
~dvbt_ofdm_sym_acquisition_impl();
@@ -92,3 +88,4 @@ namespace gr {
} // namespace gr
#endif /* INCLUDED_DTV_DVBT_OFDM_SYM_ACQUISITION_IMPL_H */
+
diff --git a/gr-dtv/swig/dtv_swig.i b/gr-dtv/swig/dtv_swig.i
index c2fa312e05..24960bd2be 100644
--- a/gr-dtv/swig/dtv_swig.i
+++ b/gr-dtv/swig/dtv_swig.i
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2014,2015 Free Software Foundation, Inc.
+ * Copyright 2014,2015,2016 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -79,6 +79,11 @@
#include "gnuradio/dtv/dvbt_convolutional_deinterleaver.h"
#include "gnuradio/dtv/dvbt_reed_solomon_dec.h"
#include "gnuradio/dtv/dvbt_energy_descramble.h"
+#include "gnuradio/dtv/catv_transport_framing_enc_bb.h"
+#include "gnuradio/dtv/catv_reed_solomon_enc_bb.h"
+#include "gnuradio/dtv/catv_randomizer_bb.h"
+#include "gnuradio/dtv/catv_frame_sync_enc_bb.h"
+#include "gnuradio/dtv/catv_trellis_enc_bb.h"
%}
%include "gnuradio/dtv/atsc_deinterleaver.h"
@@ -132,6 +137,11 @@
%include "gnuradio/dtv/dvbt_convolutional_deinterleaver.h"
%include "gnuradio/dtv/dvbt_reed_solomon_dec.h"
%include "gnuradio/dtv/dvbt_energy_descramble.h"
+%include "gnuradio/dtv/catv_transport_framing_enc_bb.h"
+%include "gnuradio/dtv/catv_reed_solomon_enc_bb.h"
+%include "gnuradio/dtv/catv_randomizer_bb.h"
+%include "gnuradio/dtv/catv_frame_sync_enc_bb.h"
+%include "gnuradio/dtv/catv_trellis_enc_bb.h"
GR_SWIG_BLOCK_MAGIC2(dtv, atsc_deinterleaver);
GR_SWIG_BLOCK_MAGIC2(dtv, atsc_depad);
@@ -180,3 +190,8 @@ GR_SWIG_BLOCK_MAGIC2(dtv, dvbt_viterbi_decoder);
GR_SWIG_BLOCK_MAGIC2(dtv, dvbt_convolutional_deinterleaver);
GR_SWIG_BLOCK_MAGIC2(dtv, dvbt_reed_solomon_dec);
GR_SWIG_BLOCK_MAGIC2(dtv, dvbt_energy_descramble);
+GR_SWIG_BLOCK_MAGIC2(dtv, catv_transport_framing_enc_bb);
+GR_SWIG_BLOCK_MAGIC2(dtv, catv_reed_solomon_enc_bb);
+GR_SWIG_BLOCK_MAGIC2(dtv, catv_randomizer_bb);
+GR_SWIG_BLOCK_MAGIC2(dtv, catv_frame_sync_enc_bb);
+GR_SWIG_BLOCK_MAGIC2(dtv, catv_trellis_enc_bb);
diff --git a/gr-uhd/apps/uhd_app.py b/gr-uhd/apps/uhd_app.py
index bb4b9a78af..0a2beec21c 100644
--- a/gr-uhd/apps/uhd_app.py
+++ b/gr-uhd/apps/uhd_app.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright 2015 Free Software Foundation, Inc.
+# Copyright 2015-2016 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -141,6 +141,9 @@ class UHDApp(object):
if args.spec:
for mb_idx in xrange(self.usrp.get_num_mboards()):
self.usrp.set_subdev_spec(args.spec, mb_idx)
+ # Set the clock source:
+ if args.clock_source is not None:
+ self.usrp.set_clock_source(args.clock_source)
# Sampling rate:
self.usrp.set_samp_rate(args.samp_rate)
self.samp_rate = self.usrp.get_samp_rate()
@@ -295,5 +298,7 @@ class UHDApp(object):
help="Show asynchronous message notifications from UHD")
group.add_argument("--sync", choices=('default', 'pps', 'auto'),
default='auto', help="Set to 'pps' to sync devices to PPS")
+ group.add_argument("--clock-source",
+ help="Set the clock source; typically 'internal', 'external' or 'gpsdo'")
return parser
diff --git a/gr-uhd/include/gnuradio/uhd/usrp_source.h b/gr-uhd/include/gnuradio/uhd/usrp_source.h
index 19b3feb61f..19201c031c 100644
--- a/gr-uhd/include/gnuradio/uhd/usrp_source.h
+++ b/gr-uhd/include/gnuradio/uhd/usrp_source.h
@@ -96,10 +96,13 @@ namespace gr {
/*!
* \param device_addr the address to identify the hardware
* \param stream_args the IO format and channel specification
+ * \param issue_stream_cmd_on_start enable or disable continuous streaming when flowgraph
+ * starts (default true)
* \return a new USRP source block object
*/
static sptr make(const ::uhd::device_addr_t &device_addr,
- const ::uhd::stream_args_t &stream_args);
+ const ::uhd::stream_args_t &stream_args,
+ const bool issue_stream_cmd_on_start = true);
/*!
* Set the start time for incoming samples.
diff --git a/gr-uhd/lib/usrp_sink_impl.cc b/gr-uhd/lib/usrp_sink_impl.cc
index 64d25bde30..666f09cbf5 100644
--- a/gr-uhd/lib/usrp_sink_impl.cc
+++ b/gr-uhd/lib/usrp_sink_impl.cc
@@ -321,7 +321,8 @@ namespace gr {
{
_update_stream_args(stream_args);
#ifdef GR_UHD_USE_STREAM_API
- _tx_stream.reset();
+ if(_tx_stream)
+ _tx_stream.reset();
#else
throw std::runtime_error("not implemented in this version");
#endif
@@ -609,7 +610,8 @@ namespace gr {
_nitems_to_send = 0;
#ifdef GR_UHD_USE_STREAM_API
- _tx_stream->send(gr_vector_const_void_star(_nchan), 0, _metadata, 1.0);
+ if(_tx_stream)
+ _tx_stream->send(gr_vector_const_void_star(_nchan), 0, _metadata, 1.0);
#else
_dev->get_device()->send
(gr_vector_const_void_star(_nchan), 0, _metadata,
diff --git a/gr-uhd/lib/usrp_source_impl.cc b/gr-uhd/lib/usrp_source_impl.cc
index e174e11334..7ad2280955 100644
--- a/gr-uhd/lib/usrp_source_impl.cc
+++ b/gr-uhd/lib/usrp_source_impl.cc
@@ -53,20 +53,23 @@ namespace gr {
usrp_source::sptr
usrp_source::make(const ::uhd::device_addr_t &device_addr,
- const ::uhd::stream_args_t &stream_args)
+ const ::uhd::stream_args_t &stream_args,
+ const bool issue_stream_cmd_on_start)
{
check_abi();
return usrp_source::sptr
- (new usrp_source_impl(device_addr, stream_args_ensure(stream_args)));
+ (new usrp_source_impl(device_addr, stream_args_ensure(stream_args), issue_stream_cmd_on_start));
}
usrp_source_impl::usrp_source_impl(const ::uhd::device_addr_t &device_addr,
- const ::uhd::stream_args_t &stream_args):
+ const ::uhd::stream_args_t &stream_args,
+ const bool issue_stream_cmd_on_start):
usrp_block("gr uhd usrp source",
io_signature::make(0, 0, 0),
args_to_io_sig(stream_args)),
usrp_block_impl(device_addr, stream_args, ""),
- _tag_now(false)
+ _tag_now(false),
+ _issue_stream_cmd_on_start(issue_stream_cmd_on_start)
{
std::stringstream str;
str << name() << unique_id();
@@ -348,7 +351,8 @@ namespace gr {
{
_update_stream_args(stream_args);
#ifdef GR_UHD_USE_STREAM_API
- _rx_stream.reset();
+ if(_rx_stream)
+ _rx_stream.reset();
#else
throw std::runtime_error("not implemented in this version");
#endif
@@ -381,18 +385,20 @@ namespace gr {
_samps_per_packet = _rx_stream->get_max_num_samps();
}
#endif
- //setup a stream command that starts streaming slightly in the future
- static const double reasonable_delay = 0.1; //order of magnitude over RTT
- ::uhd::stream_cmd_t stream_cmd(::uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
- stream_cmd.stream_now = _stream_now;
- if(_start_time_set) {
- _start_time_set = false; //cleared for next run
- stream_cmd.time_spec = _start_time;
- }
- else {
- stream_cmd.time_spec = get_time_now() + ::uhd::time_spec_t(reasonable_delay);
+ if(_issue_stream_cmd_on_start){
+ //setup a stream command that starts streaming slightly in the future
+ static const double reasonable_delay = 0.1; //order of magnitude over RTT
+ ::uhd::stream_cmd_t stream_cmd(::uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
+ stream_cmd.stream_now = _stream_now;
+ if(_start_time_set) {
+ _start_time_set = false; //cleared for next run
+ stream_cmd.time_spec = _start_time;
+ }
+ else {
+ stream_cmd.time_spec = get_time_now() + ::uhd::time_spec_t(reasonable_delay);
+ }
+ this->issue_stream_cmd(stream_cmd);
}
- this->issue_stream_cmd(stream_cmd);
_tag_now = true;
return true;
}
@@ -409,7 +415,12 @@ namespace gr {
while(true) {
#ifdef GR_UHD_USE_STREAM_API
const size_t bpi = ::uhd::convert::get_bytes_per_item(_stream_args.cpu_format);
- _rx_stream->recv(outputs, nbytes/bpi, _metadata, 0.0);
+ if(_rx_stream)
+ // get the remaining samples out of the buffers
+ _rx_stream->recv(outputs, nbytes/bpi, _metadata, 0.0);
+ else
+ // no rx streamer -- nothing to flush
+ break;
#else
_dev->get_device()->recv
(outputs, nbytes/_type->size, _metadata, *_type,
diff --git a/gr-uhd/lib/usrp_source_impl.h b/gr-uhd/lib/usrp_source_impl.h
index 98af816c02..b43df4dab3 100644
--- a/gr-uhd/lib/usrp_source_impl.h
+++ b/gr-uhd/lib/usrp_source_impl.h
@@ -55,7 +55,8 @@ namespace gr {
{
public:
usrp_source_impl(const ::uhd::device_addr_t &device_addr,
- const ::uhd::stream_args_t &stream_args);
+ const ::uhd::stream_args_t &stream_args,
+ const bool issue_stream_cmd_on_start = true);
~usrp_source_impl();
// Get Commands
@@ -119,6 +120,7 @@ namespace gr {
bool _tag_now;
::uhd::rx_metadata_t _metadata;
pmt::pmt_t _id;
+ bool _issue_stream_cmd_on_start;
//tag shadows
double _samp_rate;
diff --git a/grc/gui/ActionHandler.py b/grc/gui/ActionHandler.py
index 7766a0a853..0f227d08f5 100644
--- a/grc/gui/ActionHandler.py
+++ b/grc/gui/ActionHandler.py
@@ -34,7 +34,7 @@ from .ParserErrorsDialog import ParserErrorsDialog
from .MainWindow import MainWindow
from .PropsDialog import PropsDialog
from .FileDialogs import (OpenFlowGraphFileDialog, SaveFlowGraphFileDialog,
- SaveReportsFileDialog, SaveImageFileDialog,
+ SaveReportsFileDialog, SaveScreenShotDialog,
OpenQSSFileDialog)
from .Constants import DEFAULT_CANVAS_SIZE, IMAGE_FILE_EXTENSION, GR_PREFIX
@@ -521,9 +521,9 @@ class ActionHandler:
self.main_window.tool_bar.refresh_submenus()
self.main_window.menu_bar.refresh_submenus()
elif action == Actions.FLOW_GRAPH_SCREEN_CAPTURE:
- file_path = SaveImageFileDialog(self.get_page().get_file_path()).run()
+ file_path, background_transparent = SaveScreenShotDialog(self.get_page().get_file_path()).run()
if file_path is not None:
- pixbuf = self.get_flow_graph().get_drawing_area().get_pixbuf()
+ pixbuf = self.get_flow_graph().get_drawing_area().get_screenshot(background_transparent)
pixbuf.save(file_path, IMAGE_FILE_EXTENSION[1:])
##################################################
# Gen/Exec/Stop
diff --git a/grc/gui/Actions.py b/grc/gui/Actions.py
index 9b32b3e601..d53375f291 100644
--- a/grc/gui/Actions.py
+++ b/grc/gui/Actions.py
@@ -386,7 +386,7 @@ FLOW_GRAPH_KILL = Action(
keypresses=(gtk.keysyms.F7, NO_MODS_MASK),
)
FLOW_GRAPH_SCREEN_CAPTURE = Action(
- label='Sc_reen Capture',
+ label='Screen Ca_pture',
tooltip='Create a screen capture of the flow graph',
stock_id=gtk.STOCK_PRINT,
keypresses=(gtk.keysyms.Print, NO_MODS_MASK),
diff --git a/grc/gui/BlockTreeWindow.py b/grc/gui/BlockTreeWindow.py
index 6b3ebf7807..f6968198d2 100644
--- a/grc/gui/BlockTreeWindow.py
+++ b/grc/gui/BlockTreeWindow.py
@@ -139,7 +139,7 @@ class BlockTreeWindow(gtk.VBox):
sub_category = category[:i+1]
if sub_category not in categories:
iter = treestore.insert_before(categories[sub_category[:-1]], None)
- treestore.set_value(iter, NAME_INDEX, '[ %s ]'%cat_name)
+ treestore.set_value(iter, NAME_INDEX, cat_name)
treestore.set_value(iter, KEY_INDEX, '')
treestore.set_value(iter, DOC_INDEX, Utils.parse_template(CAT_MARKUP_TMPL, cat=cat_name))
categories[sub_category] = iter
diff --git a/grc/gui/Colors.py b/grc/gui/Colors.py
index 52c95e8edf..050b363cdd 100644
--- a/grc/gui/Colors.py
+++ b/grc/gui/Colors.py
@@ -33,8 +33,9 @@ try:
PARAM_ENTRY_TEXT_COLOR = get_color('black')
ENTRYENUM_CUSTOM_COLOR = get_color('#EEEEEE')
#flow graph color constants
- FLOWGRAPH_BACKGROUND_COLOR = get_color('#FFF9FF')
+ FLOWGRAPH_BACKGROUND_COLOR = get_color('#FFFFFF')
COMMENT_BACKGROUND_COLOR = get_color('#F3F3F3')
+ FLOWGRAPH_EDGE_COLOR = COMMENT_BACKGROUND_COLOR
#block color constants
BLOCK_ENABLED_COLOR = get_color('#F1ECFF')
BLOCK_DISABLED_COLOR = get_color('#CCCCCC')
diff --git a/grc/gui/DrawingArea.py b/grc/gui/DrawingArea.py
index 4412129809..6a1df27a8c 100644
--- a/grc/gui/DrawingArea.py
+++ b/grc/gui/DrawingArea.py
@@ -20,7 +20,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
import pygtk
pygtk.require('2.0')
import gtk
+
from Constants import MIN_WINDOW_WIDTH, MIN_WINDOW_HEIGHT, DND_TARGETS
+import Colors
+
class DrawingArea(gtk.DrawingArea):
"""
@@ -68,13 +71,21 @@ class DrawingArea(gtk.DrawingArea):
self.set_flags(gtk.CAN_FOCUS) # self.set_can_focus(True)
self.connect('focus-out-event', self._handle_focus_lost_event)
- def new_pixmap(self, width, height): return gtk.gdk.Pixmap(self.window, width, height, -1)
- def get_pixbuf(self):
- width, height = self._pixmap.get_size()
- pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, 0, 8, width, height)
- pixbuf.get_from_drawable(self._pixmap, self._pixmap.get_colormap(), 0, 0, 0, 0, width, height)
+ def new_pixmap(self, width, height):
+ return gtk.gdk.Pixmap(self.window, width, height, -1)
+
+ def get_screenshot(self, transparent_bg=False):
+ pixmap = self._pixmap
+ W, H = pixmap.get_size()
+ pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, 0, 8, W, H)
+ pixbuf.fill(0xFF + Colors.FLOWGRAPH_BACKGROUND_COLOR.pixel << 8)
+ pixbuf.get_from_drawable(pixmap, pixmap.get_colormap(), 0, 0, 0, 0, W-1, H-1)
+ if transparent_bg:
+ bgc = Colors.FLOWGRAPH_BACKGROUND_COLOR
+ pixbuf = pixbuf.add_alpha(True, bgc.red, bgc.green, bgc.blue)
return pixbuf
+
##########################################################################
## Handlers
##########################################################################
@@ -149,6 +160,12 @@ class DrawingArea(gtk.DrawingArea):
gc = self.window.new_gc()
self._flow_graph.draw(gc, self._pixmap)
self.window.draw_drawable(gc, self._pixmap, 0, 0, 0, 0, -1, -1)
+ # draw a light grey line on the bottom and right end of the canvas.
+ # this is useful when the theme uses the same panel bg color as the canvas
+ W, H = self._pixmap.get_size()
+ gc.set_foreground(Colors.FLOWGRAPH_EDGE_COLOR)
+ self.window.draw_line(gc, 0, H-1, W, H-1)
+ self.window.draw_line(gc, W-1, 0, W-1, H)
def _handle_focus_lost_event(self, widget, event):
# don't clear selection while context menu is active
diff --git a/grc/gui/FileDialogs.py b/grc/gui/FileDialogs.py
index 730ac6fba0..4b5770ad21 100644
--- a/grc/gui/FileDialogs.py
+++ b/grc/gui/FileDialogs.py
@@ -210,3 +210,18 @@ class SaveFlowGraphFileDialog(FileDialog): type = SAVE_FLOW_GRAPH
class OpenQSSFileDialog(FileDialog): type = OPEN_QSS_THEME
class SaveReportsFileDialog(FileDialog): type = SAVE_REPORTS
class SaveImageFileDialog(FileDialog): type = SAVE_IMAGE
+
+
+class SaveScreenShotDialog(SaveImageFileDialog):
+
+ def __init__(self, current_file_path=''):
+ SaveImageFileDialog.__init__(self, current_file_path)
+ self._button = button = gtk.CheckButton('_Background transparent')
+ self._button.set_active(Preferences.screen_shot_background_transparent())
+ self.set_extra_widget(button)
+
+ def run(self):
+ filename = SaveImageFileDialog.run(self)
+ bg_transparent = self._button.get_active()
+ Preferences.screen_shot_background_transparent(bg_transparent)
+ return filename, bg_transparent
diff --git a/grc/gui/Preferences.py b/grc/gui/Preferences.py
index 3ebee24345..ad2206ca29 100644
--- a/grc/gui/Preferences.py
+++ b/grc/gui/Preferences.py
@@ -150,3 +150,7 @@ def blocks_window_position(pos=None):
def xterm_missing(cmd=None):
return entry('xterm_missing', cmd, default='INVALID_XTERM_SETTING')
+
+
+def screen_shot_background_transparent(transparent=None):
+ return entry('screen_shot_background_transparent', transparent, default=False)