summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnuradio-core/src/lib/general/gr_keep_m_in_n.cc46
-rw-r--r--gnuradio-core/src/lib/general/gr_keep_m_in_n.h11
-rw-r--r--gnuradio-core/src/lib/general/gr_pack_k_bits_bb.cc2
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_keep_m_in_n.py58
-rwxr-xr-xgnuradio-core/src/python/gnuradio/gr/qa_pack_k_bits.py67
-rw-r--r--grc/blocks/gr_keep_m_in_n.xml6
6 files changed, 167 insertions, 23 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);
}
}
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_keep_m_in_n.py b/gnuradio-core/src/python/gnuradio/gr/qa_keep_m_in_n.py
new file mode 100755
index 000000000..922671d02
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/gr/qa_keep_m_in_n.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+#
+# Copyright 2008,2010 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 this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+from gnuradio import gr, gr_unittest
+import sys
+import random
+
+class test_keep_m_in_n(gr_unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_001(self):
+ self.maxDiff = None;
+ tb = gr.top_block()
+ src = gr.vector_source_b( range(0,100) )
+
+ # itemsize, M, N, offset
+ km2 = gr.keep_m_in_n( 1, 1, 2, 0 );
+ km3 = gr.keep_m_in_n( 1, 1, 3, 1 );
+ km7 = gr.keep_m_in_n( 1, 1, 7, 2 );
+ snk2 = gr.vector_sink_b();
+ snk3 = gr.vector_sink_b();
+ snk7 = gr.vector_sink_b();
+ tb.connect(src,km2,snk2);
+ tb.connect(src,km3,snk3);
+ tb.connect(src,km7,snk7);
+ tb.run();
+
+ self.assertEqual(range(0,100,2), list(snk2.data()));
+ self.assertEqual(range(1,100,3), list(snk3.data()));
+ self.assertEqual(range(2,100,7), list(snk7.data()));
+
+
+if __name__ == '__main__':
+ gr_unittest.run(test_keep_m_in_n, "test_keep_m_in_n.xml")
+
diff --git a/gnuradio-core/src/python/gnuradio/gr/qa_pack_k_bits.py b/gnuradio-core/src/python/gnuradio/gr/qa_pack_k_bits.py
new file mode 100755
index 000000000..25fc5e9fc
--- /dev/null
+++ b/gnuradio-core/src/python/gnuradio/gr/qa_pack_k_bits.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+#
+# Copyright 2006,2010 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.
+#
+
+from gnuradio import gr, gr_unittest
+import random
+
+class test_pack(gr_unittest.TestCase):
+
+ def setUp(self):
+ self.tb = gr.top_block ()
+
+ def tearDown(self):
+ self.tb = None
+
+ def test_001(self):
+ src_data = (1,0,1,1,0,1,1,0)
+ expected_results = (1,0,1,1,0,1,1,0)
+ src = gr.vector_source_b(src_data,False)
+ op = gr.pack_k_bits_bb(1)
+ dst = gr.vector_sink_b()
+ self.tb.connect(src, op, dst)
+ self.tb.run()
+ self.assertEqual(expected_results, dst.data())
+
+ def test_002(self):
+ src_data = (1,0,1,1,0,0,0,1)
+ expected_results = ( 2, 3, 0, 1)
+ src = gr.vector_source_b(src_data,False)
+ op = gr.pack_k_bits_bb(2)
+ dst = gr.vector_sink_b()
+ self.tb.connect(src, op, dst)
+ self.tb.run()
+ #self.assertEqual(expected_results, dst.data())
+ self.assertEqual(expected_results, dst.data())
+
+ def test_003(self):
+ src_data = expected_results = map(lambda x: random.randint(0,3), range(10));
+ src = gr.vector_source_b( src_data );
+ pack = gr.pack_k_bits_bb(2);
+ unpack = gr.unpack_k_bits_bb(2);
+ snk = gr.vector_sink_b();
+ self.tb.connect(src,unpack,pack,snk);
+ self.tb.run()
+ self.assertEqual(list(expected_results), list(snk.data()));
+
+if __name__ == '__main__':
+ gr_unittest.run(test_pack, "test_pack.xml")
+
diff --git a/grc/blocks/gr_keep_m_in_n.xml b/grc/blocks/gr_keep_m_in_n.xml
index a63ef47a6..35a156176 100644
--- a/grc/blocks/gr_keep_m_in_n.xml
+++ b/grc/blocks/gr_keep_m_in_n.xml
@@ -10,6 +10,8 @@
<import>from gnuradio import gr</import>
<make>gr.keep_m_in_n($type.size, $m, $n, $offset)</make>
<callback>set_offset($offset)</callback>
+ <callback>set_m($m)</callback>
+ <callback>set_n($n)</callback>
<param>
<name>Type</name>
<key>type</key>
@@ -64,11 +66,11 @@
<sink>
<name>in</name>
<type>$type</type>
- <vlen>$n</vlen>
+ <vlen>1</vlen>
</sink>
<source>
<name>out</name>
<type>$type</type>
- <vlen>$m</vlen>
+ <vlen>1</vlen>
</source>
</block>