summaryrefslogtreecommitdiff
path: root/gr-blocks/lib
diff options
context:
space:
mode:
Diffstat (limited to 'gr-blocks/lib')
-rw-r--r--gr-blocks/lib/deinterleave_impl.cc53
-rw-r--r--gr-blocks/lib/deinterleave_impl.h15
-rw-r--r--gr-blocks/lib/interleave_impl.cc78
-rw-r--r--gr-blocks/lib/interleave_impl.h16
4 files changed, 104 insertions, 58 deletions
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);