diff options
author | Nicholas McCarthy <namccart@gmail.com> | 2014-03-24 18:29:44 -0400 |
---|---|---|
committer | Tom Rondeau <tom@trondeau.com> | 2014-05-17 17:45:11 -0400 |
commit | 9cd145e6c3cd2ca4c2a67e104d227424d09db49c (patch) | |
tree | 928a56752ab89c34d89dd8ea39be3d417d03365f | |
parent | 5a589c53de55d27bbafa6f1051109e15f65f5ed1 (diff) |
block interleave/deinterleave with statefull deinterleave
-rw-r--r-- | gr-blocks/grc/blocks_deinterleave.xml | 9 | ||||
-rw-r--r-- | gr-blocks/grc/blocks_interleave.xml | 9 | ||||
-rw-r--r-- | gr-blocks/include/gnuradio/blocks/deinterleave.h | 6 | ||||
-rw-r--r-- | gr-blocks/include/gnuradio/blocks/interleave.h | 6 | ||||
-rw-r--r-- | gr-blocks/lib/deinterleave_impl.cc | 53 | ||||
-rw-r--r-- | gr-blocks/lib/deinterleave_impl.h | 15 | ||||
-rw-r--r-- | gr-blocks/lib/interleave_impl.cc | 78 | ||||
-rw-r--r-- | gr-blocks/lib/interleave_impl.h | 16 |
8 files changed, 126 insertions, 66 deletions
diff --git a/gr-blocks/grc/blocks_deinterleave.xml b/gr-blocks/grc/blocks_deinterleave.xml index e3970bd326..6af6d3c17a 100644 --- a/gr-blocks/grc/blocks_deinterleave.xml +++ b/gr-blocks/grc/blocks_deinterleave.xml @@ -8,7 +8,7 @@ <name>Deinterleave</name> <key>blocks_deinterleave</key> <import>from gnuradio import blocks</import> - <make>blocks.deinterleave($type.size*$vlen)</make> + <make>blocks.deinterleave($type.size*$vlen, $blocksize)</make> <param> <name>IO Type</name> <key>type</key> @@ -45,6 +45,13 @@ <value>2</value> <type>int</type> </param> + <param> + <name>Block Size</name> + <key>blocksize</key> + <value>1</value> + <type>int</type> + <hide>part</hide> + </param> <param> <name>Vec Length</name> <key>vlen</key> diff --git a/gr-blocks/grc/blocks_interleave.xml b/gr-blocks/grc/blocks_interleave.xml index f01a3be6d5..675693bf19 100644 --- a/gr-blocks/grc/blocks_interleave.xml +++ b/gr-blocks/grc/blocks_interleave.xml @@ -8,7 +8,7 @@ <name>Interleave</name> <key>blocks_interleave</key> <import>from gnuradio import blocks</import> - <make>blocks.interleave($type.size*$vlen)</make> + <make>blocks.interleave($type.size*$vlen, $blocksize)</make> <param> <name>IO Type</name> <key>type</key> @@ -45,6 +45,13 @@ <value>2</value> <type>int</type> </param> + <param> + <name>Block Size</name> + <key>blocksize</key> + <value>1</value> + <type>int</type> + <hide>part</hide> + </param> <param> <name>Vec Length</name> <key>vlen</key> diff --git a/gr-blocks/include/gnuradio/blocks/deinterleave.h b/gr-blocks/include/gnuradio/blocks/deinterleave.h index 45452089e5..a79649fd73 100644 --- a/gr-blocks/include/gnuradio/blocks/deinterleave.h +++ b/gr-blocks/include/gnuradio/blocks/deinterleave.h @@ -24,7 +24,7 @@ #define INCLUDED_BLOCKS_DEINTERLEAVE_H #include <gnuradio/blocks/api.h> -#include <gnuradio/sync_decimator.h> +#include <gnuradio/block.h> namespace gr { namespace blocks { @@ -33,7 +33,7 @@ namespace gr { * \brief deinterleave a single input into N outputs * \ingroup stream_operators_blk */ - class BLOCKS_API deinterleave : virtual public sync_decimator + class BLOCKS_API deinterleave : virtual public block { public: // gr::blocks::deinterleave::sptr @@ -44,7 +44,7 @@ namespace gr { * * \param itemsize stream itemsize */ - static sptr make(size_t itemsize); + static sptr make(size_t itemsize, unsigned int blocksize = 1); }; } /* namespace blocks */ diff --git a/gr-blocks/include/gnuradio/blocks/interleave.h b/gr-blocks/include/gnuradio/blocks/interleave.h index 7c28d54c53..811c3e3a29 100644 --- a/gr-blocks/include/gnuradio/blocks/interleave.h +++ b/gr-blocks/include/gnuradio/blocks/interleave.h @@ -24,7 +24,7 @@ #define INCLUDED_BLOCKS_INTERLEAVE_H #include <gnuradio/blocks/api.h> -#include <gnuradio/sync_interpolator.h> +#include <gnuradio/block.h> namespace gr { namespace blocks { @@ -33,7 +33,7 @@ namespace gr { * \brief interleave N inputs into a single output * \ingroup stream_operators_blk */ - class BLOCKS_API interleave : virtual public sync_interpolator + class BLOCKS_API interleave : virtual public block { public: // gr::blocks::interleave::sptr @@ -44,7 +44,7 @@ namespace gr { * * \param itemsize stream itemsize */ - static sptr make(size_t itemsize); + static sptr make(size_t itemsize, unsigned int blocksize = 1); }; } /* namespace blocks */ diff --git a/gr-blocks/lib/deinterleave_impl.cc b/gr-blocks/lib/deinterleave_impl.cc index 6866cc7acb..5e1cc5221d 100644 --- a/gr-blocks/lib/deinterleave_impl.cc +++ b/gr-blocks/lib/deinterleave_impl.cc @@ -30,47 +30,44 @@ namespace gr { namespace blocks { - deinterleave::sptr deinterleave::make(size_t itemsize) + deinterleave::sptr deinterleave::make(size_t itemsize, unsigned int blocksize) { - return gnuradio::get_initial_sptr(new deinterleave_impl(itemsize)); + return gnuradio::get_initial_sptr(new deinterleave_impl(itemsize, blocksize)); } - - deinterleave_impl::deinterleave_impl(size_t itemsize) - : sync_decimator("deinterleave", - io_signature::make (1, 1, itemsize), - io_signature::make (1, io_signature::IO_INFINITE, itemsize), - 1), - d_itemsize(itemsize) + + deinterleave_impl::deinterleave_impl(size_t itemsize, unsigned int blocksize) + : block("deinterleave", + io_signature::make (1, 1, itemsize), + io_signature::make (1, io_signature::IO_INFINITE, itemsize)), + d_itemsize(itemsize), d_blocksize(blocksize), d_current_output(0) { + set_output_multiple(blocksize); } bool deinterleave_impl::check_topology(int ninputs, int noutputs) { - set_decimation(noutputs); + set_relative_rate((double)noutputs); + d_noutputs = noutputs; return true; } - + int - deinterleave_impl::work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) + deinterleave_impl::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) { - size_t nchan = output_items.size(); - size_t itemsize = d_itemsize; - const char *in = (const char *)input_items[0]; - char **out = (char **)&output_items[0]; + const char *in = (const char*)input_items[0]; + char **out = (char**)&output_items[0]; - for (int i = 0; i < noutput_items; i++){ - for (unsigned int n = 0; n < nchan; n++){ - memcpy(out[n], in, itemsize); - out[n] += itemsize; - in += itemsize; - } - } - - return noutput_items; + memcpy(out[d_current_output], in, d_itemsize * d_blocksize); + consume_each(d_blocksize); + produce(d_current_output, d_blocksize); + d_current_output = (d_current_output + 1) % d_noutputs; + return WORK_CALLED_PRODUCE; } - + + } /* namespace blocks */ } /* namespace gr */ diff --git a/gr-blocks/lib/deinterleave_impl.h b/gr-blocks/lib/deinterleave_impl.h index d4d9392e8a..a7a9e0a8fa 100644 --- a/gr-blocks/lib/deinterleave_impl.h +++ b/gr-blocks/lib/deinterleave_impl.h @@ -30,16 +30,23 @@ namespace gr { class BLOCKS_API deinterleave_impl : public deinterleave { + size_t d_itemsize; + unsigned int d_blocksize; + unsigned int d_current_output; + unsigned int d_noutputs; + public: - deinterleave_impl(size_t itemsize); + deinterleave_impl(size_t itemsize, unsigned int blocksize); bool check_topology(int ninputs, int noutputs); - int work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items); + int general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; } /* namespace blocks */ diff --git a/gr-blocks/lib/interleave_impl.cc b/gr-blocks/lib/interleave_impl.cc index 1f68cfc512..22d6488f7a 100644 --- a/gr-blocks/lib/interleave_impl.cc +++ b/gr-blocks/lib/interleave_impl.cc @@ -29,48 +29,76 @@ namespace gr { namespace blocks { - - interleave::sptr interleave::make(size_t itemsize) + + interleave::sptr interleave::make(size_t itemsize, unsigned int blocksize) { - return gnuradio::get_initial_sptr(new interleave_impl(itemsize)); + return gnuradio::get_initial_sptr(new interleave_impl(itemsize, blocksize)); } - - interleave_impl::interleave_impl(size_t itemsize) - : sync_interpolator("interleave", - io_signature::make (1, io_signature::IO_INFINITE, itemsize), - io_signature::make (1, 1, itemsize), - 1), - d_itemsize(itemsize) + + interleave_impl::interleave_impl(size_t itemsize, unsigned int blocksize) + : block("interleave", + io_signature::make (1, io_signature::IO_INFINITE, itemsize), + io_signature::make (1, 1, itemsize)), + d_itemsize(itemsize), d_blocksize(blocksize) { + set_fixed_rate(true); + set_output_multiple(d_blocksize); } bool interleave_impl::check_topology(int ninputs, int noutputs) { - set_interpolation(ninputs); + set_relative_rate((double)ninputs); + d_ninputs = ninputs; + set_output_multiple(d_blocksize * d_ninputs); return true; } + + + int + interleave_impl::fixed_rate_ninput_to_noutput(int ninput) + { + return ninput * d_ninputs; + } int - interleave_impl::work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) + interleave_impl::fixed_rate_noutput_to_ninput(int noutput) { - size_t nchan = input_items.size(); - size_t itemsize = d_itemsize; - const char **in = (const char **)&input_items[0]; - char *out = (char *)output_items[0]; - - for (int i = 0; i < noutput_items; i += nchan) { - for (unsigned int n = 0; n < nchan; n++) { - memcpy (out, in[n], itemsize); - out += itemsize; - in[n] += itemsize; - } + return (int) ((noutput / d_ninputs) + .5); + } + + void + interleave_impl::forecast(int noutput_items, + gr_vector_int& ninput_items_required) + { + for(unsigned int i = 0; i < ninput_items_required.size(); ++i) { + ninput_items_required[i] = (int) ((noutput_items / ninput_items_required.size()) + .5); } + } + int + interleave_impl::general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) + { + size_t noutput_blocks = (size_t) ((noutput_items/d_blocksize) + .5); + const char **in = (const char**)&input_items[0]; + char *out = (char*)output_items[0]; + + for (unsigned int i = 0; i < noutput_blocks; i += d_ninputs) { + for (unsigned int n = 0; n < d_ninputs; n++){ + memcpy(out, in[n], d_itemsize * d_blocksize); + out += d_itemsize * d_blocksize; + in[n] += d_itemsize * d_blocksize; + } + } + consume_each((int)((noutput_items/d_ninputs) + .5)); return noutput_items; } + + + } /* namespace blocks */ } /* namespace gr */ diff --git a/gr-blocks/lib/interleave_impl.h b/gr-blocks/lib/interleave_impl.h index 962747c8b5..c74127fca5 100644 --- a/gr-blocks/lib/interleave_impl.h +++ b/gr-blocks/lib/interleave_impl.h @@ -31,12 +31,26 @@ namespace gr { class BLOCKS_API interleave_impl : public interleave { size_t d_itemsize; + unsigned int d_blocksize; + unsigned int d_ninputs; public: - interleave_impl(size_t itemsize); + interleave_impl(size_t itemsize, unsigned int blocksize); bool check_topology(int ninputs, int noutputs); + int fixed_rate_ninput_to_noutput(int ninput); + + int fixed_rate_noutput_to_ninput(int noutput); + + void forecast(int noutput_items, + gr_vector_int& ninput_items_required); + + int general_work(int noutput_items, + gr_vector_int& ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + int work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items); |