summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnuradio-runtime/lib/CMakeLists.txt1
-rw-r--r--gnuradio-runtime/lib/math/fast_atan2f.cc8
-rw-r--r--gnuradio-runtime/lib/math/qa_fast_atan2f.cc51
-rw-r--r--gnuradio-runtime/lib/math/qa_fast_atan2f.h39
-rw-r--r--gnuradio-runtime/lib/qa_runtime.cc2
-rw-r--r--gr-blocks/grc/blocks_tagged_stream_mux.xml9
-rw-r--r--gr-blocks/include/gnuradio/blocks/tagged_stream_mux.h8
-rw-r--r--gr-blocks/lib/pdu_to_tagged_stream_impl.cc2
-rw-r--r--gr-blocks/lib/tagged_stream_mux_impl.cc14
-rw-r--r--gr-blocks/lib/tagged_stream_mux_impl.h5
-rwxr-xr-xgr-blocks/python/blocks/qa_tagged_stream_mux.py34
-rw-r--r--gr-digital/examples/ofdm/ofdm_loopback.grc637
-rw-r--r--gr-digital/examples/ofdm/tx_ofdm.grc473
-rw-r--r--gr-digital/include/gnuradio/digital/ofdm_carrier_allocator_cvc.h6
-rw-r--r--gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc9
-rw-r--r--gr-digital/python/digital/ofdm_txrx.py27
-rwxr-xr-xgr-digital/python/digital/qa_ofdm_carrier_allocator_cvc.py51
-rwxr-xr-xgr-digital/python/digital/qa_ofdm_txrx.py28
18 files changed, 796 insertions, 608 deletions
diff --git a/gnuradio-runtime/lib/CMakeLists.txt b/gnuradio-runtime/lib/CMakeLists.txt
index a7b2638c21..cd7f0c7549 100644
--- a/gnuradio-runtime/lib/CMakeLists.txt
+++ b/gnuradio-runtime/lib/CMakeLists.txt
@@ -213,6 +213,7 @@ list(APPEND test_gnuradio_runtime_sources
math/qa_fxpt_vco.cc
math/qa_math.cc
math/qa_sincos.cc
+ math/qa_fast_atan2f.cc
qa_buffer.cc
qa_io_signature.cc
qa_circular_file.cc
diff --git a/gnuradio-runtime/lib/math/fast_atan2f.cc b/gnuradio-runtime/lib/math/fast_atan2f.cc
index 3555cf50ec..3c4967d9ab 100644
--- a/gnuradio-runtime/lib/math/fast_atan2f.cc
+++ b/gnuradio-runtime/lib/math/fast_atan2f.cc
@@ -128,13 +128,13 @@ namespace gr {
float alpha, angle, base_angle;
int index;
- /* don't divide by zero! */ // FIXME could get hosed with -0.0
- if((y == 0.0) && (x == 0.0))
- return 0.0;
-
/* normalize to +/- 45 degree range */
y_abs = fabsf(y);
x_abs = fabsf(x);
+ /* don't divide by zero! */
+ if((y_abs < 1.5E-5) && (x_abs < 1.5E-5))
+ return 0.0;
+
//z = (y_abs < x_abs ? y_abs / x_abs : x_abs / y_abs);
if(y_abs < x_abs)
z = y_abs / x_abs;
diff --git a/gnuradio-runtime/lib/math/qa_fast_atan2f.cc b/gnuradio-runtime/lib/math/qa_fast_atan2f.cc
new file mode 100644
index 0000000000..119fb8fe77
--- /dev/null
+++ b/gnuradio-runtime/lib/math/qa_fast_atan2f.cc
@@ -0,0 +1,51 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2013 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qa_fast_atan2f.h>
+#include <gnuradio/math.h>
+#include <cppunit/TestAssert.h>
+#include <cmath>
+
+void
+qa_fast_atan2f::t1()
+{
+ static const unsigned int N = 100;
+ float c_atan2;
+ float gr_atan2f;
+
+ for(float i = -N/2; i < N/2; i++) {
+ for(float j =-N/2; i < N/2; i++) {
+ float x = i/10.0;
+ float y = j/10.0;
+ c_atan2 = atan2(x, y);
+
+ gr_atan2f = gr::fast_atan2f(x, y);
+
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(c_atan2, gr_atan2f, 0.0001);
+ }
+ }
+}
+
diff --git a/gnuradio-runtime/lib/math/qa_fast_atan2f.h b/gnuradio-runtime/lib/math/qa_fast_atan2f.h
new file mode 100644
index 0000000000..80e714cd1e
--- /dev/null
+++ b/gnuradio-runtime/lib/math/qa_fast_atan2f.h
@@ -0,0 +1,39 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2013 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _QA_FAST_ATAN2F_H_
+#define _QA_FAST_ATAN2F_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/TestCase.h>
+
+class qa_fast_atan2f : public CppUnit::TestCase
+{
+ CPPUNIT_TEST_SUITE(qa_fast_atan2f);
+ CPPUNIT_TEST(t1);
+ CPPUNIT_TEST_SUITE_END();
+
+private:
+ void t1();
+};
+
+#endif /* _QA_FAST_ATAN2F_H_ */
diff --git a/gnuradio-runtime/lib/qa_runtime.cc b/gnuradio-runtime/lib/qa_runtime.cc
index dbf7e5bb9a..886ef0d476 100644
--- a/gnuradio-runtime/lib/qa_runtime.cc
+++ b/gnuradio-runtime/lib/qa_runtime.cc
@@ -40,6 +40,7 @@
#include <qa_math.h>
#include <qa_vmcircbuf.h>
#include <qa_sincos.h>
+#include <qa_fast_atan2f.h>
CppUnit::TestSuite *
qa_runtime::suite()
@@ -56,6 +57,7 @@ qa_runtime::suite()
s->addTest(qa_math::suite());
s->addTest(qa_vmcircbuf::suite());
s->addTest(qa_sincos::suite());
+ s->addTest(qa_fast_atan2f::suite());
return s;
}
diff --git a/gr-blocks/grc/blocks_tagged_stream_mux.xml b/gr-blocks/grc/blocks_tagged_stream_mux.xml
index 98c4b6dfb5..221a2ed7f9 100644
--- a/gr-blocks/grc/blocks_tagged_stream_mux.xml
+++ b/gr-blocks/grc/blocks_tagged_stream_mux.xml
@@ -2,7 +2,7 @@
<name>Tagged Stream Mux</name>
<key>blocks_tagged_stream_mux</key>
<import>from gnuradio import blocks</import>
- <make>blocks.tagged_stream_mux($type.size*$vlen, $lengthtagname)</make>
+ <make>blocks.tagged_stream_mux($type.size*$vlen, $lengthtagname, $tag_preserve_head_pos)</make>
<param>
<name>IO Type</name>
<key>type</key>
@@ -49,6 +49,13 @@
<value>1</value>
<type>int</type>
</param>
+ <param>
+ <name>Tags: Preserve head position on input</name>
+ <key>tag_preserve_head_pos</key>
+ <value>0</value>
+ <type>int</type>
+ <hide>part</hide>
+ </param>
<sink>
<name>in</name>
<type>$type</type>
diff --git a/gr-blocks/include/gnuradio/blocks/tagged_stream_mux.h b/gr-blocks/include/gnuradio/blocks/tagged_stream_mux.h
index 73a02f9e1d..19879b67a9 100644
--- a/gr-blocks/include/gnuradio/blocks/tagged_stream_mux.h
+++ b/gr-blocks/include/gnuradio/blocks/tagged_stream_mux.h
@@ -41,6 +41,11 @@ namespace gr {
*
* All other tags are propagated as expected, i.e. they stay associated
* with the same input item.
+ * There are cases when this behaviour is undesirable. One special case
+ * is when a tag at the first element (the head item) of one input port
+ * must stay on the head item of the output port. To achieve this,
+ * set \p tag_preserve_head_pos to the port that will receive these special
+ * tags.
*/
class BLOCKS_API tagged_stream_mux : virtual public tagged_stream_block
{
@@ -52,8 +57,9 @@ namespace gr {
*
* \param itemsize Items size (number of bytes per item)
* \param lengthtagname Length tag key
+ * \param tag_preserve_head_pos Preserves the head position of tags on this input port
*/
- static sptr make(size_t itemsize, const std::string &lengthtagname);
+ static sptr make(size_t itemsize, const std::string &lengthtagname, unsigned int tag_preserve_head_pos=0);
};
} // namespace blocks
diff --git a/gr-blocks/lib/pdu_to_tagged_stream_impl.cc b/gr-blocks/lib/pdu_to_tagged_stream_impl.cc
index 509c1fabb3..cf6b870d74 100644
--- a/gr-blocks/lib/pdu_to_tagged_stream_impl.cc
+++ b/gr-blocks/lib/pdu_to_tagged_stream_impl.cc
@@ -60,7 +60,7 @@ namespace gr {
if (d_remain.size() > 0) {
nout = std::min((size_t)d_remain.size()/d_itemsize, (size_t)noutput_items);
memcpy(out, &d_remain[0], nout*d_itemsize);
- d_remain.erase(d_remain.begin(), d_remain.begin()+nout);
+ d_remain.erase(d_remain.begin(), d_remain.begin()+nout*d_itemsize);
noutput_items -= nout;
out += nout*d_itemsize;
}
diff --git a/gr-blocks/lib/tagged_stream_mux_impl.cc b/gr-blocks/lib/tagged_stream_mux_impl.cc
index 78b573016e..c49c14c36e 100644
--- a/gr-blocks/lib/tagged_stream_mux_impl.cc
+++ b/gr-blocks/lib/tagged_stream_mux_impl.cc
@@ -31,17 +31,18 @@ namespace gr {
namespace blocks {
tagged_stream_mux::sptr
- tagged_stream_mux::make(size_t itemsize, const std::string &lengthtagname)
+ tagged_stream_mux::make(size_t itemsize, const std::string &lengthtagname, unsigned int tag_preserve_head_pos)
{
- return gnuradio::get_initial_sptr (new tagged_stream_mux_impl(itemsize, lengthtagname));
+ return gnuradio::get_initial_sptr (new tagged_stream_mux_impl(itemsize, lengthtagname, tag_preserve_head_pos));
}
- tagged_stream_mux_impl::tagged_stream_mux_impl(size_t itemsize, const std::string &lengthtagname)
+ tagged_stream_mux_impl::tagged_stream_mux_impl(size_t itemsize, const std::string &lengthtagname, unsigned int tag_preserve_head_pos)
: tagged_stream_block("tagged_stream_mux",
io_signature::make(1, -1, itemsize),
io_signature::make(1, 1, itemsize),
lengthtagname),
- d_itemsize(itemsize)
+ d_itemsize(itemsize),
+ d_tag_preserve_head_pos(tag_preserve_head_pos)
{
set_tag_propagation_policy(TPP_DONT);
}
@@ -77,7 +78,10 @@ namespace gr {
std::vector<tag_t> tags;
get_tags_in_range(tags, i, nitems_read(i), nitems_read(i)+ninput_items[i]);
for (unsigned int j = 0; j < tags.size(); j++) {
- const uint64_t offset = tags[j].offset - nitems_read(i) + nitems_written(0) + n_produced;
+ uint64_t offset = tags[j].offset - nitems_read(i) + nitems_written(0) + n_produced;
+ if (i == d_tag_preserve_head_pos && tags[j].offset == nitems_read(i)) {
+ offset -= n_produced;
+ }
add_item_tag(0, offset, tags[j].key, tags[j].value);
}
memcpy((void *) out, (const void *) in, ninput_items[i] * d_itemsize);
diff --git a/gr-blocks/lib/tagged_stream_mux_impl.h b/gr-blocks/lib/tagged_stream_mux_impl.h
index dd7eaf6352..3a61956a07 100644
--- a/gr-blocks/lib/tagged_stream_mux_impl.h
+++ b/gr-blocks/lib/tagged_stream_mux_impl.h
@@ -33,12 +33,13 @@ namespace gr {
{
private:
size_t d_itemsize;
+ unsigned int d_tag_preserve_head_pos;
protected:
- int calculate_output_stream_length(const std::vector<int> &ninput_items);
+ int calculate_output_stream_length(const gr_vector_int &ninput_items);
public:
- tagged_stream_mux_impl(size_t itemsize, const std::string &lengthtagname);
+ tagged_stream_mux_impl(size_t itemsize, const std::string &lengthtagname, unsigned int d_tag_preserve_head_pos);
~tagged_stream_mux_impl();
int work(int noutput_items,
diff --git a/gr-blocks/python/blocks/qa_tagged_stream_mux.py b/gr-blocks/python/blocks/qa_tagged_stream_mux.py
index 675d685aaa..749fda3c32 100755
--- a/gr-blocks/python/blocks/qa_tagged_stream_mux.py
+++ b/gr-blocks/python/blocks/qa_tagged_stream_mux.py
@@ -104,6 +104,40 @@ class qa_tagged_stream_mux (gr_unittest.TestCase):
]
self.assertEqual(tags, tags_expected)
+ def test_preserve_tag_head_pos(self):
+ """ Test the 'preserve head position' function.
+ This will add a 'special' tag to item 0 on stream 1.
+ It should be on item 0 of the output stream. """
+ special_tag = gr.tag_t()
+ special_tag.key = pmt.string_to_symbol('spam')
+ special_tag.offset = 0
+ special_tag.value = pmt.to_pmt('eggs')
+ len_tag_key = "length"
+ packet_len_1 = 5
+ packet_len_2 = 3
+ mux = blocks.tagged_stream_mux(gr.sizeof_float, len_tag_key, 1)
+ sink = blocks.vector_sink_f()
+ self.tb.connect(
+ blocks.vector_source_f(range(packet_len_1)),
+ blocks.stream_to_tagged_stream(gr.sizeof_float, 1, packet_len_1, len_tag_key),
+ (mux, 0)
+ )
+ self.tb.connect(
+ blocks.vector_source_f(range(packet_len_2), False, 1, (special_tag,)),
+ blocks.stream_to_tagged_stream(gr.sizeof_float, 1, packet_len_2, len_tag_key),
+ (mux, 1)
+ )
+ self.tb.connect(mux, sink)
+ self.tb.run()
+ self.assertEqual(sink.data(), tuple(range(packet_len_1) + range(packet_len_2)))
+ tags = [gr.tag_to_python(x) for x in sink.tags()]
+ tags = sorted([(x.offset, x.key, x.value) for x in tags])
+ tags_expected = [
+ (0, 'length', packet_len_1 + packet_len_2),
+ (0, 'spam', 'eggs'),
+ ]
+ self.assertEqual(tags, tags_expected)
+
if __name__ == '__main__':
gr_unittest.run(qa_tagged_stream_mux, "qa_tagged_stream_mux.xml")
diff --git a/gr-digital/examples/ofdm/ofdm_loopback.grc b/gr-digital/examples/ofdm/ofdm_loopback.grc
index ad8e4a3ef7..a2c93145c4 100644
--- a/gr-digital/examples/ofdm/ofdm_loopback.grc
+++ b/gr-digital/examples/ofdm/ofdm_loopback.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Tue Aug 27 15:09:37 2013</timestamp>
+ <timestamp>Sun Nov 3 19:13:00 2013</timestamp>
<block>
<key>options</key>
<param>
@@ -64,7 +64,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>tx_signal</value>
+ <value>samp_rate</value>
</param>
<param>
<key>_enabled</key>
@@ -72,34 +72,11 @@
</param>
<param>
<key>value</key>
- <value>[numpy.sin(2 * numpy.pi * 1.0/8 * x) for x in range(packet_len)]</value>
+ <value>100000</value>
</param>
<param>
<key>_coordinate</key>
- <value>(176, -1)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>variable</key>
- <param>
- <key>id</key>
- <value>packet_len</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>value</key>
- <value>8*2</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(258, 64)</value>
+ <value>(493, 7)</value>
</param>
<param>
<key>_rotation</key>
@@ -122,7 +99,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(464, 0)</value>
+ <value>(403, 8)</value>
</param>
<param>
<key>_rotation</key>
@@ -145,7 +122,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(345, 0)</value>
+ <value>(283, 6)</value>
</param>
<param>
<key>_rotation</key>
@@ -153,22 +130,22 @@
</param>
</block>
<block>
- <key>import</key>
+ <key>variable</key>
<param>
<key>id</key>
- <value>import_0</value>
+ <value>packet_len</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>import</key>
- <value>import numpy</value>
+ <key>value</key>
+ <value>50</value>
</param>
<param>
<key>_coordinate</key>
- <value>(536, -1)</value>
+ <value>(182, 6)</value>
</param>
<param>
<key>_rotation</key>
@@ -176,47 +153,32 @@
</param>
</block>
<block>
- <key>import</key>
+ <key>blocks_vector_source_x</key>
<param>
<key>id</key>
- <value>import_0_0</value>
+ <value>blocks_vector_source_x_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>import</key>
- <value>from gnuradio.digital.utils import tagged_streams</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(633, -1)</value>
+ <key>type</key>
+ <value>byte</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>vector</key>
+ <value>range(packet_len)</value>
</param>
- </block>
- <block>
- <key>blocks_vector_to_stream</key>
<param>
- <key>id</key>
- <value>blocks_vector_to_stream_0</value>
+ <key>tags</key>
+ <value>()</value>
</param>
<param>
- <key>_enabled</key>
+ <key>repeat</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>byte</value>
- </param>
- <param>
- <key>num_items</key>
- <value>4</value>
- </param>
- <param>
<key>vlen</key>
<value>1</value>
</param>
@@ -230,7 +192,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(261, 140)</value>
+ <value>(5, 124)</value>
</param>
<param>
<key>_rotation</key>
@@ -238,10 +200,10 @@
</param>
</block>
<block>
- <key>blocks_tag_debug</key>
+ <key>wxgui_fftsink2</key>
<param>
<key>id</key>
- <value>blocks_tag_debug_0</value>
+ <value>wxgui_fftsink2_0</value>
</param>
<param>
<key>_enabled</key>
@@ -249,82 +211,59 @@
</param>
<param>
<key>type</key>
- <value>byte</value>
- </param>
- <param>
- <key>name</key>
- <value>Rx Packets</value>
- </param>
- <param>
- <key>num_inputs</key>
- <value>1</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>display</key>
- <value>True</value>
+ <value>complex</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>title</key>
+ <value>Rx Spectrum</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(345, 424)</value>
+ <key>samp_rate</key>
+ <value>100e3</value>
</param>
<param>
- <key>_rotation</key>
+ <key>baseband_freq</key>
<value>0</value>
</param>
- </block>
- <block>
- <key>wxgui_scopesink2</key>
- <param>
- <key>id</key>
- <value>wxgui_scopesink2_0</value>
- </param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>y_per_div</key>
+ <value>10</value>
</param>
<param>
- <key>type</key>
- <value>float</value>
+ <key>y_divs</key>
+ <value>10</value>
</param>
<param>
- <key>title</key>
- <value>Scope Plot</value>
+ <key>ref_level</key>
+ <value>0</value>
</param>
<param>
- <key>samp_rate</key>
- <value>1.0</value>
+ <key>ref_scale</key>
+ <value>2.0</value>
</param>
<param>
- <key>v_scale</key>
- <value>0</value>
+ <key>fft_size</key>
+ <value>1024</value>
</param>
<param>
- <key>v_offset</key>
- <value>0</value>
+ <key>fft_rate</key>
+ <value>15</value>
</param>
<param>
- <key>t_scale</key>
- <value>0</value>
+ <key>peak_hold</key>
+ <value>False</value>
</param>
<param>
- <key>ac_couple</key>
+ <key>average</key>
<value>False</value>
</param>
<param>
- <key>xy_mode</key>
- <value>False</value>
+ <key>avg_alpha</key>
+ <value>0</value>
</param>
<param>
- <key>num_inputs</key>
- <value>1</value>
+ <key>win</key>
+ <value>None</value>
</param>
<param>
<key>win_size</key>
@@ -339,12 +278,8 @@
<value></value>
</param>
<param>
- <key>trig_mode</key>
- <value>wxgui.TRIG_MODE_AUTO</value>
- </param>
- <param>
- <key>y_axis_label</key>
- <value>Counts</value>
+ <key>freqvar</key>
+ <value>None</value>
</param>
<param>
<key>affinity</key>
@@ -352,7 +287,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(550, 323)</value>
+ <value>(51, 500)</value>
</param>
<param>
<key>_rotation</key>
@@ -360,10 +295,10 @@
</param>
</block>
<block>
- <key>blocks_stream_to_vector</key>
+ <key>blocks_tag_debug</key>
<param>
<key>id</key>
- <value>blocks_stream_to_vector_0</value>
+ <value>blocks_tag_debug_0</value>
</param>
<param>
<key>_enabled</key>
@@ -374,24 +309,28 @@
<value>byte</value>
</param>
<param>
- <key>num_items</key>
- <value>4</value>
+ <key>name</key>
+ <value>Rx Packets</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>1</value>
</param>
<param>
<key>vlen</key>
<value>1</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>display</key>
+ <value>True</value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(348, 347)</value>
+ <value>(325, 483)</value>
</param>
<param>
<key>_rotation</key>
@@ -399,54 +338,42 @@
</param>
</block>
<block>
- <key>variable_slider</key>
+ <key>blocks_stream_to_tagged_stream</key>
<param>
<key>id</key>
- <value>noise_voltage</value>
+ <value>blocks_stream_to_tagged_stream_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>label</key>
- <value>Noise Amplitude</value>
- </param>
- <param>
- <key>value</key>
- <value>0.01</value>
- </param>
- <param>
- <key>min</key>
- <value>0</value>
+ <key>type</key>
+ <value>byte</value>
</param>
<param>
- <key>max</key>
+ <key>vlen</key>
<value>1</value>
</param>
<param>
- <key>num_steps</key>
- <value>100</value>
- </param>
- <param>
- <key>style</key>
- <value>wx.SL_HORIZONTAL</value>
+ <key>packet_len</key>
+ <value>packet_len</value>
</param>
<param>
- <key>converver</key>
- <value>float_converter</value>
+ <key>len_tag_key</key>
+ <value>len_tag_key</value>
</param>
<param>
- <key>grid_pos</key>
+ <key>affinity</key>
<value></value>
</param>
<param>
- <key>notebook</key>
- <value></value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(707, 496)</value>
+ <value>(282, 132)</value>
</param>
<param>
<key>_rotation</key>
@@ -454,94 +381,101 @@
</param>
</block>
<block>
- <key>wxgui_fftsink2</key>
+ <key>digital_ofdm_rx</key>
<param>
<key>id</key>
- <value>wxgui_fftsink2_0</value>
+ <value>digital_ofdm_rx_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>fft_len</key>
+ <value>fft_len</value>
</param>
<param>
- <key>title</key>
- <value>Rx Spectrum</value>
+ <key>cp_len</key>
+ <value>fft_len/4</value>
</param>
<param>
- <key>samp_rate</key>
- <value>100e3</value>
+ <key>packet_len_key</key>
+ <value>"rx_len"</value>
</param>
<param>
- <key>baseband_freq</key>
- <value>0</value>
+ <key>occupied_carriers</key>
+ <value>()</value>
</param>
<param>
- <key>y_per_div</key>
- <value>10</value>
+ <key>pilot_carriers</key>
+ <value>()</value>
</param>
<param>
- <key>y_divs</key>
- <value>10</value>
+ <key>pilot_symbols</key>
+ <value>()</value>
</param>
<param>
- <key>ref_level</key>
- <value>0</value>
+ <key>sync_word1</key>
+ <value>()</value>
</param>
<param>
- <key>ref_scale</key>
- <value>2.0</value>
+ <key>sync_word2</key>
+ <value>()</value>
</param>
<param>
- <key>fft_size</key>
- <value>1024</value>
+ <key>header_mod</key>
+ <value>"BPSK"</value>
</param>
<param>
- <key>fft_rate</key>
- <value>15</value>
+ <key>payload_mod</key>
+ <value>"QPSK"</value>
</param>
<param>
- <key>peak_hold</key>
+ <key>scramble_bits</key>
<value>False</value>
</param>
<param>
- <key>average</key>
+ <key>log</key>
<value>False</value>
</param>
<param>
- <key>avg_alpha</key>
- <value>0</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>win</key>
- <value>None</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>win_size</key>
- <value></value>
+ <key>_coordinate</key>
+ <value>(52, 374)</value>
</param>
<param>
- <key>grid_pos</key>
- <value></value>
+ <key>_rotation</key>
+ <value>0</value>
</param>
+ </block>
+ <block>
+ <key>blocks_uchar_to_float</key>
<param>
- <key>notebook</key>
- <value></value>
+ <key>id</key>
+ <value>blocks_uchar_to_float_0</value>
</param>
<param>
- <key>freqvar</key>
- <value>None</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
<key>_coordinate</key>
- <value>(71, 441)</value>
+ <value>(326, 408)</value>
</param>
<param>
<key>_rotation</key>
@@ -549,167 +483,145 @@
</param>
</block>
<block>
- <key>variable_slider</key>
+ <key>wxgui_scopesink2</key>
<param>
<key>id</key>
- <value>freq_offset</value>
+ <value>wxgui_scopesink2_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>label</key>
- <value>Frequency Offset (Multiples of Sub-carrier spacing)</value>
- </param>
- <param>
- <key>value</key>
- <value>0</value>
- </param>
- <param>
- <key>min</key>
- <value>-3</value>
+ <key>type</key>
+ <value>float</value>
</param>
<param>
- <key>max</key>
- <value>3</value>
+ <key>title</key>
+ <value>Scope Plot</value>
</param>
<param>
- <key>num_steps</key>
- <value>100</value>
+ <key>samp_rate</key>
+ <value>1.0</value>
</param>
<param>
- <key>style</key>
- <value>wx.SL_HORIZONTAL</value>
+ <key>v_scale</key>
+ <value>0</value>
</param>
<param>
- <key>converver</key>
- <value>float_converter</value>
+ <key>v_offset</key>
+ <value>0</value>
</param>
<param>
- <key>grid_pos</key>
- <value></value>
+ <key>t_scale</key>
+ <value>0</value>
</param>
<param>
- <key>notebook</key>
- <value></value>
+ <key>ac_couple</key>
+ <value>False</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(708, 321)</value>
+ <key>xy_mode</key>
+ <value>False</value>
</param>
<param>
- <key>_rotation</key>
- <value>0</value>
+ <key>num_inputs</key>
+ <value>1</value>
</param>
- </block>
- <block>
- <key>blocks_tag_gate</key>
<param>
- <key>id</key>
- <value>blocks_tag_gate_0</value>
+ <key>win_size</key>
+ <value></value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>grid_pos</key>
+ <value></value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
+ <key>notebook</key>
+ <value></value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>trig_mode</key>
+ <value>wxgui.TRIG_MODE_AUTO</value>
</param>
<param>
- <key>propagate_tags</key>
- <value>False</value>
+ <key>y_axis_label</key>
+ <value>Counts</value>
</param>
<param>
<key>affinity</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
<key>_coordinate</key>
- <value>(523, 243)</value>
+ <value>(530, 382)</value>
</param>
<param>
<key>_rotation</key>
- <value>180</value>
+ <value>0</value>
</param>
</block>
<block>
- <key>blocks_throttle</key>
+ <key>digital_ofdm_tx</key>
<param>
<key>id</key>
- <value>blocks_throttle_0</value>
+ <value>digital_ofdm_tx_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>samples_per_second</key>
- <value>100e3</value>
+ <key>fft_len</key>
+ <value>fft_len</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>cp_len</key>
+ <value>fft_len/4</value>
</param>
<param>
- <key>affinity</key>
- <value></value>
+ <key>packet_len_key</key>
+ <value>len_tag_key</value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>occupied_carriers</key>
+ <value>()</value>
</param>
<param>
- <key>_coordinate</key>
- <value>(267, 243)</value>
+ <key>pilot_carriers</key>
+ <value>()</value>
</param>
<param>
- <key>_rotation</key>
- <value>180</value>
+ <key>pilot_symbols</key>
+ <value>()</value>
</param>
- </block>
- <block>
- <key>blocks_vector_source_x</key>
<param>
- <key>id</key>
- <value>blocks_vector_source_x_0</value>
+ <key>sync_word1</key>
+ <value>()</value>
</param>
<param>
- <key>_enabled</key>
- <value>True</value>
+ <key>sync_word2</key>
+ <value>()</value>
</param>
<param>
- <key>type</key>
- <value>float</value>
+ <key>header_mod</key>
+ <value>"BPSK"</value>
</param>
<param>
- <key>vector</key>
- <value>tx_signal</value>
+ <key>payload_mod</key>
+ <value>"QPSK"</value>
</param>
<param>
- <key>tags</key>
- <value>tagged_streams.make_lengthtags((packet_len*gr.sizeof_float,), (0,), tagname=len_tag_key)</value>
+ <key>rolloff</key>
+ <value>0</value>
</param>
<param>
- <key>repeat</key>
- <value>True</value>
+ <key>scramble_bits</key>
+ <value>False</value>
</param>
<param>
- <key>vlen</key>
- <value>1</value>
+ <key>log</key>
+ <value>False</value>
</param>
<param>
<key>affinity</key>
@@ -721,7 +633,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(3, 124)</value>
+ <value>(557, 94)</value>
</param>
<param>
<key>_rotation</key>
@@ -759,6 +671,10 @@
<value>0</value>
</param>
<param>
+ <key>block_tags</key>
+ <value>True</value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
@@ -768,82 +684,101 @@
</param>
<param>
<key>_coordinate</key>
- <value>(764, 93)</value>
+ <value>(453, 244)</value>
</param>
<param>
<key>_rotation</key>
- <value>0</value>
+ <value>180</value>
</param>
</block>
<block>
- <key>digital_ofdm_rx</key>
+ <key>blocks_throttle</key>
<param>
<key>id</key>
- <value>digital_ofdm_rx_0</value>
+ <value>blocks_throttle_0</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>fft_len</key>
- <value>fft_len</value>
+ <key>type</key>
+ <value>complex</value>
</param>
<param>
- <key>cp_len</key>
- <value>fft_len/4</value>
+ <key>samples_per_second</key>
+ <value>samp_rate</value>
</param>
<param>
- <key>packet_len_key</key>
- <value>"rx_len"</value>
+ <key>vlen</key>
+ <value>1</value>
</param>
<param>
- <key>occupied_carriers</key>
- <value>()</value>
+ <key>affinity</key>
+ <value></value>
</param>
<param>
- <key>pilot_carriers</key>
- <value>()</value>
+ <key>minoutbuf</key>
+ <value>0</value>
</param>
<param>
- <key>pilot_symbols</key>
- <value>()</value>
+ <key>_coordinate</key>
+ <value>(177, 281)</value>
</param>
<param>
- <key>sync_word1</key>
- <value>()</value>
+ <key>_rotation</key>
+ <value>180</value>
</param>
+ </block>
+ <block>
+ <key>variable_slider</key>
<param>
- <key>sync_word2</key>
- <value>()</value>
+ <key>id</key>
+ <value>freq_offset</value>
</param>
<param>
- <key>header_mod</key>
- <value>"BPSK"</value>
+ <key>_enabled</key>
+ <value>True</value>
</param>
<param>
- <key>payload_mod</key>
- <value>"QPSK"</value>
+ <key>label</key>
+ <value>Frequency Offset (Multiples of Sub-carrier spacing)</value>
</param>
<param>
- <key>scramble_bits</key>
- <value>False</value>
+ <key>value</key>
+ <value>0</value>
</param>
<param>
- <key>log</key>
- <value>False</value>
+ <key>min</key>
+ <value>-3</value>
</param>
<param>
- <key>affinity</key>
+ <key>max</key>
+ <value>3</value>
+ </param>
+ <param>
+ <key>num_steps</key>
+ <value>100</value>
+ </param>
+ <param>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
+ </param>
+ <param>
+ <key>converver</key>
+ <value>float_converter</value>
+ </param>
+ <param>
+ <key>grid_pos</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>notebook</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(71, 315)</value>
+ <value>(466, 508)</value>
</param>
<param>
<key>_rotation</key>
@@ -851,78 +786,54 @@
</param>
</block>
<block>
- <key>digital_ofdm_tx</key>
+ <key>variable_slider</key>
<param>
<key>id</key>
- <value>digital_ofdm_tx_0</value>
+ <value>noise_voltage</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>fft_len</key>
- <value>fft_len</value>
- </param>
- <param>
- <key>cp_len</key>
- <value>fft_len/4</value>
- </param>
- <param>
- <key>packet_len_key</key>
- <value>len_tag_key</value>
- </param>
- <param>
- <key>occupied_carriers</key>
- <value>()</value>
- </param>
- <param>
- <key>pilot_carriers</key>
- <value>()</value>
- </param>
- <param>
- <key>pilot_symbols</key>
- <value>()</value>
- </param>
- <param>
- <key>sync_word1</key>
- <value>()</value>
+ <key>label</key>
+ <value>Noise Amplitude</value>
</param>
<param>
- <key>sync_word2</key>
- <value>()</value>
+ <key>value</key>
+ <value>0.01</value>
</param>
<param>
- <key>header_mod</key>
- <value>"BPSK"</value>
+ <key>min</key>
+ <value>0</value>
</param>
<param>
- <key>payload_mod</key>
- <value>"QPSK"</value>
+ <key>max</key>
+ <value>1</value>
</param>
<param>
- <key>rolloff</key>
- <value>0</value>
+ <key>num_steps</key>
+ <value>100</value>
</param>
<param>
- <key>scramble_bits</key>
- <value>False</value>
+ <key>style</key>
+ <value>wx.SL_HORIZONTAL</value>
</param>
<param>
- <key>log</key>
- <value>False</value>
+ <key>converver</key>
+ <value>float_converter</value>
</param>
<param>
- <key>affinity</key>
+ <key>grid_pos</key>
<value></value>
</param>
<param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>notebook</key>
+ <value></value>
</param>
<param>
<key>_coordinate</key>
- <value>(488, 77)</value>
+ <value>(653, 505)</value>
</param>
<param>
<key>_rotation</key>
@@ -930,32 +841,32 @@
</param>
</block>
<connection>
- <source_block_id>blocks_vector_source_x_0</source_block_id>
- <sink_block_id>blocks_vector_to_stream_0</sink_block_id>
+ <source_block_id>digital_ofdm_tx_0</source_block_id>
+ <sink_block_id>channels_channel_model_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_vector_to_stream_0</source_block_id>
- <sink_block_id>digital_ofdm_tx_0</sink_block_id>
+ <source_block_id>blocks_throttle_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>digital_ofdm_tx_0</source_block_id>
- <sink_block_id>channels_channel_model_0</sink_block_id>
+ <source_block_id>blocks_throttle_0</source_block_id>
+ <sink_block_id>digital_ofdm_rx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>channels_channel_model_0</source_block_id>
- <sink_block_id>blocks_tag_gate_0</sink_block_id>
+ <source_block_id>blocks_vector_source_x_0</source_block_id>
+ <sink_block_id>blocks_stream_to_tagged_stream_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>wxgui_scopesink2_0</sink_block_id>
+ <source_block_id>blocks_stream_to_tagged_stream_0</source_block_id>
+ <sink_block_id>digital_ofdm_tx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
@@ -967,24 +878,18 @@
</connection>
<connection>
<source_block_id>digital_ofdm_rx_0</source_block_id>
- <sink_block_id>blocks_stream_to_vector_0</sink_block_id>
+ <sink_block_id>blocks_uchar_to_float_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_throttle_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>blocks_throttle_0</source_block_id>
- <sink_block_id>digital_ofdm_rx_0</sink_block_id>
+ <source_block_id>blocks_uchar_to_float_0</source_block_id>
+ <sink_block_id>wxgui_scopesink2_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_tag_gate_0</source_block_id>
+ <source_block_id>channels_channel_model_0</source_block_id>
<sink_block_id>blocks_throttle_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
diff --git a/gr-digital/examples/ofdm/tx_ofdm.grc b/gr-digital/examples/ofdm/tx_ofdm.grc
index c2995d919e..80d7f7f9e4 100644
--- a/gr-digital/examples/ofdm/tx_ofdm.grc
+++ b/gr-digital/examples/ofdm/tx_ofdm.grc
@@ -1,6 +1,6 @@
<?xml version='1.0' encoding='ASCII'?>
<flow_graph>
- <timestamp>Sun Oct 27 16:23:43 2013</timestamp>
+ <timestamp>Sun Nov 3 18:45:28 2013</timestamp>
<block>
<key>options</key>
<param>
@@ -64,7 +64,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>length_tag_key</value>
+ <value>sync_word1</value>
</param>
<param>
<key>_enabled</key>
@@ -72,11 +72,11 @@
</param>
<param>
<key>value</key>
- <value>"packet_len"</value>
+ <value>[0., 0., 0., 0., 0., 0., 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., -1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., -1.41421356, 0., -1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 0., 0., 0., 0., 0.]</value>
</param>
<param>
<key>_coordinate</key>
- <value>(352, 0)</value>
+ <value>(352, 128)</value>
</param>
<param>
<key>_rotation</key>
@@ -87,7 +87,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>samp_rate</value>
+ <value>sync_word2</value>
</param>
<param>
<key>_enabled</key>
@@ -95,11 +95,11 @@
</param>
<param>
<key>value</key>
- <value>100000</value>
+ <value>[0, 0, 0, 0, 0, 0, -1, -1, -1, -1, 1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 0, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 0, 0, 0, 0, 0] </value>
</param>
<param>
<key>_coordinate</key>
- <value>(255, 0)</value>
+ <value>(496, 128)</value>
</param>
<param>
<key>_rotation</key>
@@ -110,7 +110,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>rolloff</value>
+ <value>pilot_symbols</value>
</param>
<param>
<key>_enabled</key>
@@ -118,11 +118,11 @@
</param>
<param>
<key>value</key>
- <value>0</value>
+ <value>((1, 1, 1, -1,),)</value>
</param>
<param>
<key>_coordinate</key>
- <value>(898, -1)</value>
+ <value>(601, 64)</value>
</param>
<param>
<key>_rotation</key>
@@ -133,7 +133,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>payload_mod</value>
+ <value>occupied_carriers</value>
</param>
<param>
<key>_enabled</key>
@@ -141,11 +141,11 @@
</param>
<param>
<key>value</key>
- <value>digital.constellation_qpsk()</value>
+ <value>(range(-26, -21) + range(-20, -7) + range(-6, 0) + range(1, 7) + range(8, 21) + range(22, 27),)</value>
</param>
<param>
<key>_coordinate</key>
- <value>(734, 0)</value>
+ <value>(329, 64)</value>
</param>
<param>
<key>_rotation</key>
@@ -156,7 +156,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>header_mod</value>
+ <value>pilot_carriers</value>
</param>
<param>
<key>_enabled</key>
@@ -164,11 +164,11 @@
</param>
<param>
<key>value</key>
- <value>digital.constellation_bpsk()</value>
+ <value>((-21, -7, 7, 21,),)</value>
</param>
<param>
<key>_coordinate</key>
- <value>(567, 0)</value>
+ <value>(480, 64)</value>
</param>
<param>
<key>_rotation</key>
@@ -179,7 +179,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>packet_len</value>
+ <value>header_formatter</value>
</param>
<param>
<key>_enabled</key>
@@ -187,11 +187,11 @@
</param>
<param>
<key>value</key>
- <value>96</value>
+ <value>digital.packet_header_ofdm(occupied_carriers, 1, length_tag_key)</value>
</param>
<param>
<key>_coordinate</key>
- <value>(476, 0)</value>
+ <value>(708, 64)</value>
</param>
<param>
<key>_rotation</key>
@@ -225,7 +225,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>header_formatter</value>
+ <value>packet_len</value>
</param>
<param>
<key>_enabled</key>
@@ -233,11 +233,11 @@
</param>
<param>
<key>value</key>
- <value>digital.packet_header_ofdm(occupied_carriers, 1, length_tag_key)</value>
+ <value>96</value>
</param>
<param>
<key>_coordinate</key>
- <value>(708, 64)</value>
+ <value>(476, 0)</value>
</param>
<param>
<key>_rotation</key>
@@ -248,7 +248,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>pilot_carriers</value>
+ <value>header_mod</value>
</param>
<param>
<key>_enabled</key>
@@ -256,11 +256,11 @@
</param>
<param>
<key>value</key>
- <value>((-21, -7, 7, 21,),)</value>
+ <value>digital.constellation_bpsk()</value>
</param>
<param>
<key>_coordinate</key>
- <value>(480, 64)</value>
+ <value>(567, 0)</value>
</param>
<param>
<key>_rotation</key>
@@ -271,7 +271,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>occupied_carriers</value>
+ <value>payload_mod</value>
</param>
<param>
<key>_enabled</key>
@@ -279,11 +279,11 @@
</param>
<param>
<key>value</key>
- <value>(range(-26, -21) + range(-20, -7) + range(-6, 0) + range(1, 7) + range(8, 21) + range(22, 27),)</value>
+ <value>digital.constellation_qpsk()</value>
</param>
<param>
<key>_coordinate</key>
- <value>(329, 64)</value>
+ <value>(734, 0)</value>
</param>
<param>
<key>_rotation</key>
@@ -294,7 +294,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>pilot_symbols</value>
+ <value>rolloff</value>
</param>
<param>
<key>_enabled</key>
@@ -302,11 +302,11 @@
</param>
<param>
<key>value</key>
- <value>((1, 1, 1, -1,),)</value>
+ <value>0</value>
</param>
<param>
<key>_coordinate</key>
- <value>(601, 64)</value>
+ <value>(898, -1)</value>
</param>
<param>
<key>_rotation</key>
@@ -317,7 +317,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>sync_word2</value>
+ <value>samp_rate</value>
</param>
<param>
<key>_enabled</key>
@@ -325,11 +325,11 @@
</param>
<param>
<key>value</key>
- <value>[0, 0, 0, 0, 0, 0, -1, -1, -1, -1, 1, 1, -1, -1, -1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, -1, 1, -1, 0, 1, -1, 1, 1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1, -1, 1, -1, 1, -1, -1, -1, -1, 0, 0, 0, 0, 0] </value>
+ <value>100000</value>
</param>
<param>
<key>_coordinate</key>
- <value>(496, 128)</value>
+ <value>(255, 0)</value>
</param>
<param>
<key>_rotation</key>
@@ -340,7 +340,7 @@
<key>variable</key>
<param>
<key>id</key>
- <value>sync_word1</value>
+ <value>length_tag_key</value>
</param>
<param>
<key>_enabled</key>
@@ -348,11 +348,11 @@
</param>
<param>
<key>value</key>
- <value>[0., 0., 0., 0., 0., 0., 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., -1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., -1.41421356, 0., -1.41421356, 0., -1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 1.41421356, 0., -1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 1.41421356, 0., 0., 0., 0., 0., 0.]</value>
+ <value>"packet_len"</value>
</param>
<param>
<key>_coordinate</key>
- <value>(352, 128)</value>
+ <value>(352, 0)</value>
</param>
<param>
<key>_rotation</key>
@@ -801,6 +801,10 @@
<value>1</value>
</param>
<param>
+ <key>tag_preserve_head_pos</key>
+ <value>0</value>
+ </param>
+ <param>
<key>affinity</key>
<value></value>
</param>
@@ -1086,111 +1090,6 @@
</param>
</block>
<block>
- <key>blocks_tag_debug</key>
- <param>
- <key>id</key>
- <value>blocks_tag_debug_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>byte</value>
- </param>
- <param>
- <key>name</key>
- <value>Rx'd Packets</value>
- </param>
- <param>
- <key>num_inputs</key>
- <value>1</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>display</key>
- <value>True</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(437, 872)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>blocks_throttle</key>
- <param>
- <key>id</key>
- <value>blocks_throttle_0</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>type</key>
- <value>complex</value>
- </param>
- <param>
- <key>samples_per_second</key>
- <value>samp_rate</value>
- </param>
- <param>
- <key>vlen</key>
- <value>1</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(558, 747)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
- <key>virtual_source</key>
- <param>
- <key>id</key>
- <value>virtual_source_1</value>
- </param>
- <param>
- <key>_enabled</key>
- <value>True</value>
- </param>
- <param>
- <key>stream_id</key>
- <value>Tx Signal</value>
- </param>
- <param>
- <key>_coordinate</key>
- <value>(5, 879)</value>
- </param>
- <param>
- <key>_rotation</key>
- <value>0</value>
- </param>
- </block>
- <block>
<key>digital_crc32_bb</key>
<param>
<key>id</key>
@@ -1277,74 +1176,22 @@
</param>
</block>
<block>
- <key>digital_ofdm_rx</key>
+ <key>virtual_source</key>
<param>
<key>id</key>
- <value>digital_ofdm_rx_0</value>
+ <value>virtual_source_1</value>
</param>
<param>
<key>_enabled</key>
<value>True</value>
</param>
<param>
- <key>fft_len</key>
- <value>fft_len</value>
- </param>
- <param>
- <key>cp_len</key>
- <value>fft_len/4</value>
- </param>
- <param>
- <key>packet_len_key</key>
- <value>"length"</value>
- </param>
- <param>
- <key>occupied_carriers</key>
- <value>occupied_carriers</value>
- </param>
- <param>
- <key>pilot_carriers</key>
- <value>pilot_carriers</value>
- </param>
- <param>
- <key>pilot_symbols</key>
- <value>pilot_symbols</value>
- </param>
- <param>
- <key>sync_word1</key>
- <value>sync_word1</value>
- </param>
- <param>
- <key>sync_word2</key>
- <value>sync_word2</value>
- </param>
- <param>
- <key>header_mod</key>
- <value>"BPSK"</value>
- </param>
- <param>
- <key>payload_mod</key>
- <value>"QPSK"</value>
- </param>
- <param>
- <key>scramble_bits</key>
- <value>False</value>
- </param>
- <param>
- <key>log</key>
- <value>False</value>
- </param>
- <param>
- <key>affinity</key>
- <value></value>
- </param>
- <param>
- <key>minoutbuf</key>
- <value>0</value>
+ <key>stream_id</key>
+ <value>Tx Signal</value>
</param>
<param>
<key>_coordinate</key>
- <value>(193, 802)</value>
+ <value>(0, 894)</value>
</param>
<param>
<key>_rotation</key>
@@ -1367,7 +1214,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(771, 698)</value>
+ <value>(990, 646)</value>
</param>
<param>
<key>_rotation</key>
@@ -1446,7 +1293,7 @@
</param>
<param>
<key>_coordinate</key>
- <value>(773, 768)</value>
+ <value>(992, 716)</value>
</param>
<param>
<key>_rotation</key>
@@ -1541,7 +1388,215 @@
</param>
<param>
<key>_coordinate</key>
- <value>(775, 862)</value>
+ <value>(994, 810)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>digital_ofdm_rx</key>
+ <param>
+ <key>id</key>
+ <value>digital_ofdm_rx_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>fft_len</key>
+ <value>fft_len</value>
+ </param>
+ <param>
+ <key>cp_len</key>
+ <value>fft_len/4</value>
+ </param>
+ <param>
+ <key>packet_len_key</key>
+ <value>"length"</value>
+ </param>
+ <param>
+ <key>occupied_carriers</key>
+ <value>occupied_carriers</value>
+ </param>
+ <param>
+ <key>pilot_carriers</key>
+ <value>pilot_carriers</value>
+ </param>
+ <param>
+ <key>pilot_symbols</key>
+ <value>pilot_symbols</value>
+ </param>
+ <param>
+ <key>sync_word1</key>
+ <value>sync_word1</value>
+ </param>
+ <param>
+ <key>sync_word2</key>
+ <value>sync_word2</value>
+ </param>
+ <param>
+ <key>header_mod</key>
+ <value>"BPSK"</value>
+ </param>
+ <param>
+ <key>payload_mod</key>
+ <value>"QPSK"</value>
+ </param>
+ <param>
+ <key>scramble_bits</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>log</key>
+ <value>False</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(439, 823)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>channels_channel_model</key>
+ <param>
+ <key>id</key>
+ <value>channels_channel_model_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>noise_voltage</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>freq_offset</key>
+ <value>0.0</value>
+ </param>
+ <param>
+ <key>epsilon</key>
+ <value>1.0</value>
+ </param>
+ <param>
+ <key>taps</key>
+ <value>1.0 + 1.0j</value>
+ </param>
+ <param>
+ <key>seed</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>block_tags</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(193, 858)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_tag_debug</key>
+ <param>
+ <key>id</key>
+ <value>blocks_tag_debug_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>byte</value>
+ </param>
+ <param>
+ <key>name</key>
+ <value>Rx'd Packets</value>
+ </param>
+ <param>
+ <key>num_inputs</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>display</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(689, 889)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ </block>
+ <block>
+ <key>blocks_throttle</key>
+ <param>
+ <key>id</key>
+ <value>blocks_throttle_0</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>type</key>
+ <value>complex</value>
+ </param>
+ <param>
+ <key>samples_per_second</key>
+ <value>samp_rate</value>
+ </param>
+ <param>
+ <key>vlen</key>
+ <value>1</value>
+ </param>
+ <param>
+ <key>affinity</key>
+ <value></value>
+ </param>
+ <param>
+ <key>minoutbuf</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(559, 747)</value>
</param>
<param>
<key>_rotation</key>
@@ -1669,20 +1724,26 @@
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>digital_ofdm_rx_0</source_block_id>
- <sink_block_id>blocks_tag_debug_0</sink_block_id>
+ <source_block_id>blocks_throttle_0</source_block_id>
+ <sink_block_id>virtual_sink_1</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
<source_block_id>virtual_source_1</source_block_id>
+ <sink_block_id>channels_channel_model_0</sink_block_id>
+ <source_key>0</source_key>
+ <sink_key>0</sink_key>
+ </connection>
+ <connection>
+ <source_block_id>channels_channel_model_0</source_block_id>
<sink_block_id>digital_ofdm_rx_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
<connection>
- <source_block_id>blocks_throttle_0</source_block_id>
- <sink_block_id>virtual_sink_1</sink_block_id>
+ <source_block_id>digital_ofdm_rx_0</source_block_id>
+ <sink_block_id>blocks_tag_debug_0</sink_block_id>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
diff --git a/gr-digital/include/gnuradio/digital/ofdm_carrier_allocator_cvc.h b/gr-digital/include/gnuradio/digital/ofdm_carrier_allocator_cvc.h
index 26b11fceb4..1ea90a67d5 100644
--- a/gr-digital/include/gnuradio/digital/ofdm_carrier_allocator_cvc.h
+++ b/gr-digital/include/gnuradio/digital/ofdm_carrier_allocator_cvc.h
@@ -56,6 +56,12 @@ namespace gr {
* with negative numbers, or with indexes larger than \p fft_len/2. Index -1 and index
* \p fft_len-1 both identify the carrier below the DC carrier.
*
+ * Tags are propagated such that a tag on an incoming complex symbol is mapped to the
+ * corresponding OFDM symbol. There is one exception: If a tag is on the first OFDM
+ * symbol, it is assumed that this tag should stay there, so it is moved to the front
+ * even if a sync word is included (any other tags will never be attached to the
+ * sync word). This allows tags to control the transmit timing to pass through in the
+ * correct position.
*/
class DIGITAL_API ofdm_carrier_allocator_cvc : virtual public tagged_stream_block
{
diff --git a/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc b/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc
index 467718e424..171fd95934 100644
--- a/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc
+++ b/gr-digital/lib/ofdm_carrier_allocator_cvc_impl.cc
@@ -150,7 +150,7 @@ namespace gr {
}
// Copy data symbols
- long n_ofdm_symbols = 0;
+ long n_ofdm_symbols = 0; // Number of output items
int curr_set = 0;
int symbols_to_allocate = d_occupied_carriers[0].size();
int symbols_allocated = 0;
@@ -162,9 +162,12 @@ namespace gr {
nitems_read(0)+std::min(i+symbols_to_allocate, (int) ninput_items[0])
);
for (unsigned t = 0; t < tags.size(); t++) {
- add_item_tag(0, nitems_written(0)+n_ofdm_symbols,
+ add_item_tag(
+ 0,
+ nitems_written(0) + n_ofdm_symbols + (n_ofdm_symbols == 0 ? 0 : d_sync_words.size()),
tags[t].key,
- tags[t].value);
+ tags[t].value
+ );
}
n_ofdm_symbols++;
}
diff --git a/gr-digital/python/digital/ofdm_txrx.py b/gr-digital/python/digital/ofdm_txrx.py
index 06e375e3d6..b04c42cbfa 100644
--- a/gr-digital/python/digital/ofdm_txrx.py
+++ b/gr-digital/python/digital/ofdm_txrx.py
@@ -194,7 +194,11 @@ class ofdm_tx(gr.hier_block2):
scramble_header=scramble_bits
)
header_gen = digital.packet_headergenerator_bb(formatter_object.base(), self.packet_length_tag_key)
- header_payload_mux = blocks.tagged_stream_mux(gr.sizeof_gr_complex*1, self.packet_length_tag_key)
+ header_payload_mux = blocks.tagged_stream_mux(
+ itemsize=gr.sizeof_gr_complex*1,
+ lengthtagname=self.packet_length_tag_key,
+ tag_preserve_head_pos=1 # Head tags on the payload stream stay on the head
+ )
self.connect(
self,
crc,
@@ -212,17 +216,18 @@ class ofdm_tx(gr.hier_block2):
self.scramble_seed,
7,
0, # Don't reset after fixed length (let the reset tag do that)
- bits_per_byte=bps_payload,
+ bits_per_byte=8, # This is before unpacking
reset_tag_key=self.packet_length_tag_key
)
+ payload_unpack = blocks.repack_bits_bb(
+ 8, # Unpack 8 bits per byte
+ bps_payload,
+ self.packet_length_tag_key
+ )
self.connect(
crc,
payload_scrambler,
- blocks.repack_bits_bb(
- 8, # Unpack 8 bits per byte
- bps_payload,
- self.packet_length_tag_key
- ),
+ payload_unpack,
payload_mod,
(header_payload_mux, 1)
)
@@ -418,10 +423,10 @@ class ofdm_rx(gr.hier_block2):
self.scramble_seed,
7,
0, # Don't reset after fixed length
- bits_per_byte=bps_payload,
+ bits_per_byte=8, # This is after packing
reset_tag_key=self.packet_length_tag_key
)
- repack = blocks.repack_bits_bb(bps_payload, 8, self.packet_length_tag_key, True)
+ payload_pack = blocks.repack_bits_bb(bps_payload, 8, self.packet_length_tag_key, True)
self.crc = digital.crc32_bb(True, self.packet_length_tag_key)
self.connect(
(hpd, 1),
@@ -429,7 +434,7 @@ class ofdm_rx(gr.hier_block2):
payload_eq,
payload_serializer,
payload_demod,
- repack,
+ payload_pack,
self.payload_descrambler,
self.crc,
self
@@ -440,7 +445,7 @@ class ofdm_rx(gr.hier_block2):
self.connect(payload_eq, blocks.file_sink(gr.sizeof_gr_complex*fft_len, 'post-payload-eq.dat'))
self.connect(payload_serializer, blocks.file_sink(gr.sizeof_gr_complex, 'post-payload-serializer.dat'))
self.connect(payload_demod, blocks.file_sink(1, 'post-payload-demod.dat'))
- self.connect(repack, blocks.file_sink(1, 'post-payload-repack.dat'))
+ self.connect(payload_pack, blocks.file_sink(1, 'post-payload-pack.dat'))
self.connect(crc, blocks.file_sink(1, 'post-payload-crc.dat'))
diff --git a/gr-digital/python/digital/qa_ofdm_carrier_allocator_cvc.py b/gr-digital/python/digital/qa_ofdm_carrier_allocator_cvc.py
index 5c95e6e335..b1732fa94a 100755
--- a/gr-digital/python/digital/qa_ofdm_carrier_allocator_cvc.py
+++ b/gr-digital/python/digital/qa_ofdm_carrier_allocator_cvc.py
@@ -113,6 +113,55 @@ class qa_digital_carrier_allocator_cvc (gr_unittest.TestCase):
self.tb.run ()
self.assertEqual(sink.data(), expected_result)
+ def test_002_t (self):
+ """
+ once again, but this time add a sync word
+ """
+ fft_len = 6
+ sync_word = (0,) * fft_len
+ tx_symbols = (1, 2, 3, 4, 5, 6)
+ pilot_symbols = ((1j,),)
+ occupied_carriers = ((-1, 1, 2),)
+ pilot_carriers = ((3,),)
+ expected_result = sync_word + (1j, 0, 1, 0, 2, 3) + (1j, 0, 4, 0, 5, 6)
+ tag_name = "len"
+ tag = gr.tag_t()
+ tag.offset = 0
+ tag.key = pmt.string_to_symbol(tag_name)
+ tag.value = pmt.from_long(len(tx_symbols))
+ special_tag1 = gr.tag_t()
+ special_tag1.offset = 0
+ special_tag1.key = pmt.string_to_symbol("spam")
+ special_tag1.value = pmt.to_pmt(23)
+ special_tag2 = gr.tag_t()
+ special_tag2.offset = 4
+ special_tag2.key = pmt.string_to_symbol("eggs")
+ special_tag2.value = pmt.to_pmt(42)
+ src = blocks.vector_source_c(
+ tx_symbols, False, 1,
+ (tag, special_tag1, special_tag2)
+ )
+ alloc = digital.ofdm_carrier_allocator_cvc(
+ fft_len,
+ occupied_carriers,
+ pilot_carriers,
+ pilot_symbols,
+ sync_words=(sync_word,),
+ len_tag_key=tag_name
+ )
+ sink = blocks.vector_sink_c(fft_len)
+ self.tb.connect(src, alloc, sink)
+ self.tb.run ()
+ self.assertEqual(sink.data(), expected_result)
+ tags = [gr.tag_to_python(x) for x in sink.tags()]
+ tags = sorted([(x.offset, x.key, x.value) for x in tags])
+ tags_expected = [
+ (0, 'len', 3),
+ (0, 'spam', 23),
+ (2, 'eggs', 42),
+ ]
+ self.assertEqual(tags, tags_expected)
+
def test_003_t (self):
"""
more advanced:
@@ -156,7 +205,7 @@ class qa_digital_carrier_allocator_cvc (gr_unittest.TestCase):
testtag4.offset = 2*len(tx_symbols)-1 # Last OFDM symbol of packet 2
testtag4.key = pmt.string_to_symbol('tag4')
testtag4.value = pmt.from_long(0)
- src = blocks.vector_source_c(tx_symbols * 2, False, 1,
+ src = blocks.vector_source_c(tx_symbols * 2, False, 1,
(tag1, tag2, testtag1, testtag2, testtag3, testtag4))
alloc = digital.ofdm_carrier_allocator_cvc(fft_len,
occupied_carriers,
diff --git a/gr-digital/python/digital/qa_ofdm_txrx.py b/gr-digital/python/digital/qa_ofdm_txrx.py
index 6f5bd2ed10..ac267d2389 100755
--- a/gr-digital/python/digital/qa_ofdm_txrx.py
+++ b/gr-digital/python/digital/qa_ofdm_txrx.py
@@ -23,7 +23,11 @@
import random
import numpy
-from gnuradio import gr, gr_unittest, digital, blocks, channels
+import pmt
+from gnuradio import gr, gr_unittest
+from gnuradio import digital
+from gnuradio import blocks
+from gnuradio import channels
from gnuradio.digital.ofdm_txrx import ofdm_tx, ofdm_rx
from gnuradio.digital.utils import tagged_streams
@@ -31,10 +35,10 @@ from gnuradio.digital.utils import tagged_streams
LOG_DEBUG_INFO=False
class ofdm_tx_fg (gr.top_block):
- def __init__(self, data, len_tag_key, scramble_bits=False):
+ def __init__(self, data, len_tag_key, scramble_bits=False, additional_tags=[]):
gr.top_block.__init__(self, "ofdm_tx")
tx_data, tags = tagged_streams.packets_to_vectors((data,), len_tag_key)
- src = blocks.vector_source_b(data, False, 1, tags)
+ src = blocks.vector_source_b(data, False, 1, tags + additional_tags)
self.tx = ofdm_tx(packet_length_tag_key=len_tag_key, debug_log=LOG_DEBUG_INFO, scramble_bits=scramble_bits)
self.sink = blocks.vector_sink_c()
self.connect(src, self.tx, self.sink)
@@ -69,16 +73,26 @@ class test_ofdm_txrx (gr_unittest.TestCase):
def test_001_tx (self):
""" Just make sure the Tx works in general """
+ # This tag gets put onto the first item of the transmit data,
+ # it should be transmitted first, too
+ timing_tag = gr.tag_t()
+ timing_tag.offset = 0
+ timing_tag.key = pmt.string_to_symbol('tx_timing')
+ timing_tag.value = pmt.to_pmt('now')
len_tag_key = 'frame_len'
n_bytes = 52
n_samples_expected = (numpy.ceil(1.0 * (n_bytes + 4) / 6) + 3) * 80
test_data = [random.randint(0, 255) for x in range(n_bytes)]
- tx_data, tags = tagged_streams.packets_to_vectors((test_data,), len_tag_key)
- src = blocks.vector_source_b(test_data, False, 1, tags)
- tx = ofdm_tx(packet_length_tag_key=len_tag_key)
- tx_fg = ofdm_tx_fg(test_data, len_tag_key)
+ tx_fg = ofdm_tx_fg(test_data, len_tag_key, additional_tags=[timing_tag,])
tx_fg.run()
self.assertEqual(len(tx_fg.get_tx_samples()), n_samples_expected)
+ tags_rx = [gr.tag_to_python(x) for x in tx_fg.sink.tags()]
+ tags_rx = sorted([(x.offset, x.key, x.value) for x in tags_rx])
+ tags_expected = [
+ (0, 'frame_len', n_samples_expected),
+ (0, 'tx_timing', 'now'),
+ ]
+ self.assertEqual(tags_rx, tags_expected)
def test_002_rx_only_noise(self):
""" Run the RX with only noise, check it doesn't crash