diff options
author | Tom Rondeau | 2012-06-10 22:54:40 -0400 |
---|---|---|
committer | Tom Rondeau | 2012-06-10 22:54:40 -0400 |
commit | 3e4f9b9fbf26eee0da87ebdd230df4aae232837f (patch) | |
tree | 89cfe5fee00496674594c6251906584c3ff949cd /gnuradio-core/src/lib | |
parent | 9dc190127f3cc6f4688feaac514a0b887c531740 (diff) | |
parent | c8c5158133fb7a20413e42f59632930758561ad9 (diff) | |
download | gnuradio-3e4f9b9fbf26eee0da87ebdd230df4aae232837f.tar.gz gnuradio-3e4f9b9fbf26eee0da87ebdd230df4aae232837f.tar.bz2 gnuradio-3e4f9b9fbf26eee0da87ebdd230df4aae232837f.zip |
Merge branch 'master-mods' of git://github.com/osh/gnuradio-1 into master-mods
Diffstat (limited to 'gnuradio-core/src/lib')
-rw-r--r-- | gnuradio-core/src/lib/general/gr_keep_m_in_n.cc | 46 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_keep_m_in_n.h | 11 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_pack_k_bits_bb.cc | 2 |
3 files changed, 38 insertions, 21 deletions
diff --git a/gnuradio-core/src/lib/general/gr_keep_m_in_n.cc b/gnuradio-core/src/lib/general/gr_keep_m_in_n.cc index 56f5931fd..0da69a126 100644 --- a/gnuradio-core/src/lib/general/gr_keep_m_in_n.cc +++ b/gnuradio-core/src/lib/general/gr_keep_m_in_n.cc @@ -44,43 +44,55 @@ gr_make_keep_m_in_n(size_t item_size, int m, int n, int offset) * we take m items out of each n */ gr_keep_m_in_n::gr_keep_m_in_n(size_t item_size, int m, int n, int offset) - : gr_sync_block ("keep_m_in_n", - gr_make_io_signature(1, 1, n*item_size), - gr_make_io_signature(1, 1, m*item_size)), + : gr_block("keep_m_in_n", + gr_make_io_signature(1, 1, item_size), + gr_make_io_signature(1, 1, item_size)), d_n(n), d_m(m), - d_offset(offset) + d_offset(offset), + d_itemsize(item_size) { // sanity checking assert(d_m > 0); assert(d_n > 0); assert(d_m <= d_n); assert(d_offset <= (d_n-d_m)); + + set_output_multiple(m); } -void gr_keep_m_in_n::set_offset(int offset) +void +gr_keep_m_in_n::forecast(int noutput_items, gr_vector_int &ninput_items_required) { - d_offset = offset; + ninput_items_required[0] = d_n*(noutput_items/d_m); } +void +gr_keep_m_in_n::set_offset(int offset) +{ + d_offset = offset; +} int -gr_keep_m_in_n::work(int noutput_items, - gr_vector_const_void_star &input_items, - gr_vector_void_star &output_items) +gr_keep_m_in_n::general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) { uint8_t* out = (uint8_t*)output_items[0]; const uint8_t* in = (const uint8_t*)input_items[0]; - int in_item( input_signature()->sizeof_stream_item(0) ); - int out_item( output_signature()->sizeof_stream_item(0) ); - int single_size = in_item/d_n; - // iterate over data blocks of size {n, input : m, output} - for(int i = 0; i < noutput_items; i++) { - memcpy(&out[out_item*i], &in[in_item*i + single_size*d_offset], out_item); + int blks = std::min(noutput_items/d_m, ninput_items[0]/d_n); + for(int i=0; i<blks; i++) { + // set up copy pointers + const uint8_t* iptr = &in[(i*d_n + d_offset)*d_itemsize]; + uint8_t* optr = &out[i*d_m*d_itemsize]; + // perform copy + memcpy( optr, iptr, d_m*d_itemsize ); } - - return noutput_items; + + consume_each(d_n); + return d_m; } diff --git a/gnuradio-core/src/lib/general/gr_keep_m_in_n.h b/gnuradio-core/src/lib/general/gr_keep_m_in_n.h index e627ca0ea..711c704f5 100644 --- a/gnuradio-core/src/lib/general/gr_keep_m_in_n.h +++ b/gnuradio-core/src/lib/general/gr_keep_m_in_n.h @@ -24,7 +24,7 @@ #define INCLUDED_GR_KEEP_M_IN_N_H #include <gr_core_api.h> -#include <gr_sync_block.h> +#include <gr_block.h> class gr_keep_m_in_n; typedef boost::shared_ptr<gr_keep_m_in_n> gr_keep_m_in_n_sptr; @@ -37,7 +37,7 @@ gr_make_keep_m_in_n (size_t item_size, int m, int n, int offset); * \brief decimate a stream, keeping one item out of every n. * \ingroup slicedice_blk */ -class GR_CORE_API gr_keep_m_in_n : public gr_sync_block +class GR_CORE_API gr_keep_m_in_n : public gr_block { friend GR_CORE_API gr_keep_m_in_n_sptr gr_make_keep_m_in_n (size_t item_size, int m, int n, int offset); @@ -46,16 +46,21 @@ class GR_CORE_API gr_keep_m_in_n : public gr_sync_block int d_m; int d_count; int d_offset; + int d_itemsize; protected: gr_keep_m_in_n (size_t item_size, int m, int n, int offset); + void forecast (int noutput_items, gr_vector_int &ninput_items_required); public: - int work (int noutput_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); void set_offset(int offset); + void set_n(int n){ d_n = n; } + void set_m(int m){ d_m = m; } }; diff --git a/gnuradio-core/src/lib/general/gr_pack_k_bits_bb.cc b/gnuradio-core/src/lib/general/gr_pack_k_bits_bb.cc index bd51c2ec5..0a366a4cc 100644 --- a/gnuradio-core/src/lib/general/gr_pack_k_bits_bb.cc +++ b/gnuradio-core/src/lib/general/gr_pack_k_bits_bb.cc @@ -61,7 +61,7 @@ gr_pack_k_bits_bb::work(int noutput_items, for(int i = 0; i < noutput_items; i++) { out[i] = 0x00; for(unsigned int j = 0; j < d_k; j++) { - out[i] |= (0x01 & in[i*d_k+j])<<j; + out[i] |= (0x01 & in[i*d_k+j])<<(d_k-j-1); } } |