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