Skip to content

Commit

Permalink
blocks: added gr::blocks::short_to_float
Browse files Browse the repository at this point in the history
  • Loading branch information
jmcorgan committed Jun 28, 2012
1 parent c128e5a commit 9482c89
Show file tree
Hide file tree
Showing 9 changed files with 242 additions and 0 deletions.
1 change: 1 addition & 0 deletions gr-blocks/grc/blocks_block_tree.xml
Expand Up @@ -56,5 +56,6 @@
<block>blocks_int_to_float</block>
<block>blocks_interleaved_short_to_complex</block>
<block>blocks_short_to_char</block>
<block>blocks_short_to_float</block>
</cat>
</cat>
35 changes: 35 additions & 0 deletions gr-blocks/grc/blocks_short_to_float.xml
@@ -0,0 +1,35 @@
<?xml version="1.0"?>
<!--
###################################################
##Short to Float:
###################################################
-->
<block>
<name>Short To Float</name>
<key>blocks_short_to_float</key>
<import>from gnuradio import blocks</import>
<make>blocks.short_to_float($vlen, $scale)</make>
<callback>set_scale($scale)</callback>
<param>
<name>Vec Length</name>
<key>vlen</key>
<value>1</value>
<type>int</type>
</param>
<param>
<name>Scale</name>
<key>scale</key>
<value>1</value>
<type>real</type>
</param>
<sink>
<name>in</name>
<type>short</type>
<vlen>$vlen</vlen>
</sink>
<source>
<name>out</name>
<type>float</type>
<vlen>$vlen</vlen>
</source>
</block>
1 change: 1 addition & 0 deletions gr-blocks/include/blocks/CMakeLists.txt
Expand Up @@ -105,6 +105,7 @@ install(FILES
multiply_const_cc.h
multiply_const_ff.h
short_to_char.h
short_to_float.h
DESTINATION ${GR_INCLUDE_DIR}/gnuradio/blocks
COMPONENT "blocks_devel"
)
62 changes: 62 additions & 0 deletions gr-blocks/include/blocks/short_to_float.h
@@ -0,0 +1,62 @@
/* -*- 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_SHORT_TO_FLOAT_H
#define INCLUDED_BLOCKS_SHORT_TO_FLOAT_H

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

namespace gr {
namespace blocks {

/*!
* \brief Convert stream of shorts to a stream of floats
* \ingroup converter_blk
*
* \param vlen vector length of data streams.
* \param scale a scalar divider to change the output signal scale.
*/
class BLOCKS_API short_to_float : virtual public gr_sync_block
{
public:

// gr::blocks::short_to_float_ff::sptr
typedef boost::shared_ptr<short_to_float> sptr;

static sptr make(size_t vlen=1, float scale=1.0);

/*!
* Get the scalar divider value.
*/
virtual float scale() const = 0;

/*!
* Set the scalar divider value.
*/
virtual void set_scale(float scale) = 0;
};

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

#endif /* INCLUDED_BLOCKS_SHORT_TO_FLOAT_H */
1 change: 1 addition & 0 deletions gr-blocks/lib/CMakeLists.txt
Expand Up @@ -142,6 +142,7 @@ list(APPEND gr_blocks_sources
multiply_const_cc_impl.cc
multiply_const_ff_impl.cc
short_to_char_impl.cc
short_to_float_impl.cc
)

list(APPEND blocks_libs
Expand Down
68 changes: 68 additions & 0 deletions gr-blocks/lib/short_to_float_impl.cc
@@ -0,0 +1,68 @@
/* -*- 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 "short_to_float_impl.h"
#include <gr_io_signature.h>
#include <volk/volk.h>

namespace gr {
namespace blocks {

short_to_float::sptr short_to_float::make(size_t vlen, float scale)
{
return gnuradio::get_initial_sptr(new short_to_float_impl(vlen, scale));
}

short_to_float_impl::short_to_float_impl(size_t vlen, float scale)
: gr_sync_block("short_to_float",
gr_make_io_signature (1, 1, sizeof(short)*vlen),
gr_make_io_signature (1, 1, sizeof(float)*vlen)),
d_vlen(vlen), d_scale(scale)
{
const int alignment_multiple =
volk_get_alignment() / sizeof(float);
set_alignment(std::max(1, alignment_multiple));
}

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

if(is_unaligned()) {
volk_16i_s32f_convert_32f_u(out, in, d_scale, d_vlen*noutput_items);
}
else {
volk_16i_s32f_convert_32f_a(out, in, d_scale, d_vlen*noutput_items);
}
return noutput_items;
}

} /* namespace blocks */
}/* namespace gr */
51 changes: 51 additions & 0 deletions gr-blocks/lib/short_to_float_impl.h
@@ -0,0 +1,51 @@
/* -*- 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_SHORT_TO_FLOAT_IMPL_H
#define INCLUDED_SHORT_TO_FLOAT_IMPL_H

#include <blocks/short_to_float.h>

namespace gr {
namespace blocks {

class BLOCKS_API short_to_float_impl : public short_to_float
{
size_t d_vlen;
float d_scale;

public:
short_to_float_impl(size_t vlen, float scale);

virtual float scale() const { return d_scale; }
virtual void set_scale(float scale) { d_scale = scale; }

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

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


#endif /* INCLUDED_SHORT_TO_FLOAT_IMPL_H */
20 changes: 20 additions & 0 deletions gr-blocks/python/qa_type_conversions.py
Expand Up @@ -281,6 +281,26 @@ def test_short_to_char(self):
self.tb.run()
self.assertEqual(expected_data, dst.data())

def test_short_to_float_identity(self):
src_data = (1, 2, 3, 4, 5)
expected_data = (1.0, 2.0, 3.0, 4.0, 5.0)
src = gr.vector_source_s(src_data)
op = blocks_swig.short_to_float()
dst = gr.vector_sink_f()
self.tb.connect(src, op, dst)
self.tb.run()
self.assertEqual(expected_data, dst.data())

def test_short_to_float_scale(self):
src_data = (5, 10, 15, 20, 25)
expected_data = (1.0, 2.0, 3.0, 4.0, 5.0)
src = gr.vector_source_s(src_data)
op = blocks_swig.short_to_float(1, 5)
dst = gr.vector_sink_f()
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 @@ -73,6 +73,7 @@
#include "blocks/multiply_const_vff.h"
#include "blocks/multiply_const_vcc.h"
#include "blocks/short_to_char.h"
#include "blocks/short_to_float.h"
#include "blocks/sub_ff.h"
#include "blocks/sub_ss.h"
#include "blocks/sub_ii.h"
Expand Down Expand Up @@ -124,6 +125,7 @@
%include "blocks/multiply_const_vff.h"
%include "blocks/multiply_const_vcc.h"
%include "blocks/short_to_char.h"
%include "blocks/short_to_float.h"
%include "blocks/sub_ff.h"
%include "blocks/sub_ss.h"
%include "blocks/sub_ii.h"
Expand Down Expand Up @@ -174,6 +176,7 @@ GR_SWIG_BLOCK_MAGIC2(blocks, multiply_const_vii);
GR_SWIG_BLOCK_MAGIC2(blocks, multiply_const_vff);
GR_SWIG_BLOCK_MAGIC2(blocks, multiply_const_vcc);
GR_SWIG_BLOCK_MAGIC2(blocks, short_to_char);
GR_SWIG_BLOCK_MAGIC2(blocks, short_to_float);
GR_SWIG_BLOCK_MAGIC2(blocks, sub_ff);
GR_SWIG_BLOCK_MAGIC2(blocks, sub_ss);
GR_SWIG_BLOCK_MAGIC2(blocks, sub_ii);
Expand Down

0 comments on commit 9482c89

Please sign in to comment.