Skip to content

Commit

Permalink
blocks: added gr::blocks::float_to_uchar
Browse files Browse the repository at this point in the history
  • Loading branch information
jmcorgan committed Jun 26, 2012
1 parent 86f15ba commit 0b7655a
Show file tree
Hide file tree
Showing 11 changed files with 269 additions and 0 deletions.
1 change: 1 addition & 0 deletions gr-blocks/grc/blocks_block_tree.xml
Expand Up @@ -52,5 +52,6 @@
<block>blocks_float_to_complex</block>
<block>blocks_float_to_int</block>
<block>blocks_float_to_short</block>
<block>blocks_float_to_uchar</block>
</cat>
</cat>
20 changes: 20 additions & 0 deletions gr-blocks/grc/blocks_float_uchar.xml
@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<!--
###################################################
##Float to Unsigned Char:
###################################################
-->
<block>
<name>Float To UChar</name>
<key>blocks_float_to_uchar</key>
<import>from gnuradio import blocks</import>
<make>blocks.float_to_uchar()</make>
<sink>
<name>in</name>
<type>float</type>
</sink>
<source>
<name>out</name>
<type>byte</type>
</source>
</block>
1 change: 1 addition & 0 deletions gr-blocks/include/blocks/CMakeLists.txt
Expand Up @@ -97,6 +97,7 @@ install(FILES
float_to_complex.h
float_to_int.h
float_to_short.h
float_to_uchar.h
multiply_cc.h
multiply_ff.h
multiply_const_cc.h
Expand Down
49 changes: 49 additions & 0 deletions gr-blocks/include/blocks/float_to_uchar.h
@@ -0,0 +1,49 @@
/* -*- c++ -*- */
/*
* Copyright 2012 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 INCLUDED_BLOCKS_FLOAT_TO_UCHAR_H
#define INCLUDED_BLOCKS_FLOAT_TO_UCHAR_H

#include <blocks/api.h>
#include <gr_sync_block.h>

namespace gr {
namespace blocks {

/*!
* \brief Convert stream of floats to a stream of unsigned chars
* \ingroup converter_blk
*/
class BLOCKS_API float_to_uchar : virtual public gr_sync_block
{
public:

// gr::blocks::float_to_uchar_ff::sptr
typedef boost::shared_ptr<float_to_uchar> sptr;

static sptr make();
};

} /* namespace blocks */
} /* namespace gr */

#endif /* INCLUDED_BLOCKS_FLOAT_TO_UCHAR_H */
2 changes: 2 additions & 0 deletions gr-blocks/lib/CMakeLists.txt
Expand Up @@ -132,6 +132,8 @@ list(APPEND gr_blocks_sources
float_array_to_int.cc
float_to_int_impl.cc
float_to_short_impl.cc
float_array_to_uchar.cc
float_to_uchar_impl.cc
multiply_cc_impl.cc
multiply_ff_impl.cc
multiply_const_cc_impl.cc
Expand Down
45 changes: 45 additions & 0 deletions gr-blocks/lib/float_array_to_uchar.cc
@@ -0,0 +1,45 @@
/* -*- c++ -*- */
/*
* Copyright 2002,2012 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

#define _ISOC9X_SOURCE
#include <float_array_to_uchar.h>
#include <math.h>

static const int MIN_UCHAR = 0;
static const int MAX_UCHAR = 255;

void
float_array_to_uchar(const float *in, unsigned char *out, int nsamples)
{
for (int i = 0; i < nsamples; i++){
long int r = (long int) rint (in[i]);
if (r < MIN_UCHAR)
r = MIN_UCHAR;
else if (r > MAX_UCHAR)
r = MAX_UCHAR;
out[i] = r;
}
}
33 changes: 33 additions & 0 deletions gr-blocks/lib/float_array_to_uchar.h
@@ -0,0 +1,33 @@
/* -*- c++ -*- */
/*
* Copyright 2002,2012 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 INCLUDED_FLOAT_ARRAY_TO_UCHAR_H
#define INCLUDED_FLOAT_ARRAY_TO_UCHAR_H

#include <blocks/api.h>

/*!
* convert array of floats to unsigned chars with rounding and saturation.
*/
BLOCKS_API void float_array_to_uchar (const float *in, unsigned char *out, int nsamples);

#endif /* INCLUDED_FLOAT_ARRAY_TO_UCHAR_H */
60 changes: 60 additions & 0 deletions gr-blocks/lib/float_to_uchar_impl.cc
@@ -0,0 +1,60 @@
/* -*- c++ -*- */
/*
* Copyright 2012 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 "float_to_uchar_impl.h"
#include "float_array_to_uchar.h"
#include <gr_io_signature.h>

namespace gr {
namespace blocks {

float_to_uchar::sptr float_to_uchar::make()
{
return gnuradio::get_initial_sptr(new float_to_uchar_impl());
}

float_to_uchar_impl::float_to_uchar_impl()
: gr_sync_block("float_to_uchar",
gr_make_io_signature (1, 1, sizeof(float)),
gr_make_io_signature (1, 1, sizeof(unsigned char)))
{
}

int
float_to_uchar_impl::work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
const float *in = (const float *)input_items[0];
unsigned char *out = (unsigned char *)output_items[0];

float_array_to_uchar(in, out, noutput_items);

return noutput_items;
}

} /* namespace blocks */
}/* namespace gr */
45 changes: 45 additions & 0 deletions gr-blocks/lib/float_to_uchar_impl.h
@@ -0,0 +1,45 @@
/* -*- c++ -*- */
/*
* Copyright 2012 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 INCLUDED_FLOAT_TO_UCHAR_IMPL_H
#define INCLUDED_FLOAT_TO_UCHAR_IMPL_H

#include <blocks/float_to_uchar.h>

namespace gr {
namespace blocks {

class BLOCKS_API float_to_uchar_impl : public float_to_uchar
{
public:
float_to_uchar_impl();

int work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
};

} /* namespace blocks */
} /* namespace gr */


#endif /* INCLUDED_FLOAT_TO_UCHAR_IMPL_H */
10 changes: 10 additions & 0 deletions gr-blocks/python/qa_type_conversions.py
Expand Up @@ -231,6 +231,16 @@ def test_float_to_short_scale(self):
self.tb.run()
self.assertEqual(expected_data, dst.data())

def test_float_to_uchar(self):
src_data = (1.0, -2.0, 3.0, -4.0, 256.0)
expected_data = (1, 0, 3, 0, 255)
src = gr.vector_source_f(src_data)
op = blocks_swig.float_to_uchar()
dst = gr.vector_sink_b()
self.tb.connect(src, op, dst)
self.tb.run()
self.assertEqual(expected_data, dst.data())


if __name__ == '__main__':
gr_unittest.run(test_type_conversions, "test_type_conversions.xml")
3 changes: 3 additions & 0 deletions gr-blocks/swig/blocks_swig.i
Expand Up @@ -57,6 +57,7 @@
#include "blocks/float_to_complex.h"
#include "blocks/float_to_int.h"
#include "blocks/float_to_short.h"
#include "blocks/float_to_uchar.h"
#include "blocks/multiply_ss.h"
#include "blocks/multiply_ii.h"
#include "blocks/multiply_ff.h"
Expand Down Expand Up @@ -104,6 +105,7 @@
%include "blocks/float_to_complex.h"
%include "blocks/float_to_int.h"
%include "blocks/float_to_short.h"
%include "blocks/float_to_uchar.h"
%include "blocks/multiply_ss.h"
%include "blocks/multiply_ii.h"
%include "blocks/multiply_ff.h"
Expand Down Expand Up @@ -150,6 +152,7 @@ GR_SWIG_BLOCK_MAGIC2(blocks, float_to_char);
GR_SWIG_BLOCK_MAGIC2(blocks, float_to_complex);
GR_SWIG_BLOCK_MAGIC2(blocks, float_to_int);
GR_SWIG_BLOCK_MAGIC2(blocks, float_to_short);
GR_SWIG_BLOCK_MAGIC2(blocks, float_to_uchar);
GR_SWIG_BLOCK_MAGIC2(blocks, multiply_ss);
GR_SWIG_BLOCK_MAGIC2(blocks, multiply_ii);
GR_SWIG_BLOCK_MAGIC2(blocks, multiply_ff);
Expand Down

0 comments on commit 0b7655a

Please sign in to comment.