diff --git a/src/algorithms/input_filter/gnuradio_blocks/CMakeLists.txt b/src/algorithms/input_filter/gnuradio_blocks/CMakeLists.txt index 3da599a6b..b81a4a7a2 100644 --- a/src/algorithms/input_filter/gnuradio_blocks/CMakeLists.txt +++ b/src/algorithms/input_filter/gnuradio_blocks/CMakeLists.txt @@ -21,6 +21,8 @@ set(INPUT_FILTER_GR_BLOCKS_SOURCES beamformer.cc complex_byte_to_float_x2.cc byte_x2_to_complex_byte.cc + cshort_to_float_x2.cc + short_x2_to_cshort.cc ) include_directories( @@ -34,4 +36,4 @@ include_directories( file(GLOB INPUT_FILTER_GR_BLOCKS_HEADERS "*.h") add_library(input_filter_gr_blocks ${INPUT_FILTER_GR_BLOCKS_SOURCES} ${INPUT_FILTER_GR_BLOCKS_HEADERS}) source_group(Headers FILES ${INPUT_FILTER_GR_BLOCKS_HEADERS}) -target_link_libraries(input_filter_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_LIBRARIES}) \ No newline at end of file +target_link_libraries(input_filter_gr_blocks ${GNURADIO_RUNTIME_LIBRARIES} ${VOLK_LIBRARIES}) diff --git a/src/algorithms/input_filter/gnuradio_blocks/byte_x2_to_complex_byte.cc b/src/algorithms/input_filter/gnuradio_blocks/byte_x2_to_complex_byte.cc index 11b3b449c..b9cae5a15 100644 --- a/src/algorithms/input_filter/gnuradio_blocks/byte_x2_to_complex_byte.cc +++ b/src/algorithms/input_filter/gnuradio_blocks/byte_x2_to_complex_byte.cc @@ -1,6 +1,6 @@ /*! * \file byte_x2_to_complex_byte.cc - * \brief * \brief Adapts two signed char streams into a std::complex stream + * \brief Adapts two signed char streams into a std::complex stream * \author Carles Fernandez Prades, cfernandez(at)cttc.es * * ------------------------------------------------------------------------- @@ -60,7 +60,7 @@ int byte_x2_to_complex_byte::work(int noutput_items, // This could be put into a volk kernel signed char real_part; signed char imag_part; - for(unsigned int number = 0; number < 2 * noutput_items; number++) + for(int number = 0; number < noutput_items; number++) { // lv_cmake(r, i) defined at volk/volk_complex.h real_part = *in0++; diff --git a/src/algorithms/input_filter/gnuradio_blocks/cshort_to_float_x2.cc b/src/algorithms/input_filter/gnuradio_blocks/cshort_to_float_x2.cc new file mode 100644 index 000000000..861f1c010 --- /dev/null +++ b/src/algorithms/input_filter/gnuradio_blocks/cshort_to_float_x2.cc @@ -0,0 +1,63 @@ +/*! + * \file cshort_to_float_x2.cc + * \brief Adapts a std::complex stream into two float streams + * \author Carles Fernandez Prades, cfernandez(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR 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 of the License, or + * (at your option) any later version. + * + * GNSS-SDR 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 GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#include "cshort_to_float_x2.h" +#include +#include + + +cshort_to_float_x2_sptr make_cshort_to_float_x2() +{ + return cshort_to_float_x2_sptr(new cshort_to_float_x2()); +} + + + +cshort_to_float_x2::cshort_to_float_x2() : sync_block("cshort_to_float_x2", + gr::io_signature::make (1, 1, sizeof(lv_16sc_t)), // lv_8sc_t is a Volk's typedef for std::complex + gr::io_signature::make (2, 2, sizeof(float))) +{ + const int alignment_multiple = volk_get_alignment() / sizeof(lv_16sc_t); + set_alignment(std::max(1, alignment_multiple)); +} + + +int cshort_to_float_x2::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + const lv_16sc_t *in = (const lv_16sc_t *) input_items[0]; + float *out0 = (float*) output_items[0]; + float *out1 = (float*) output_items[1]; + const float scalar = 1; + volk_16ic_s32f_deinterleave_32f_x2(out0, out1, in, scalar, noutput_items); + return noutput_items; +} diff --git a/src/algorithms/input_filter/gnuradio_blocks/cshort_to_float_x2.h b/src/algorithms/input_filter/gnuradio_blocks/cshort_to_float_x2.h new file mode 100644 index 000000000..ef5b333ae --- /dev/null +++ b/src/algorithms/input_filter/gnuradio_blocks/cshort_to_float_x2.h @@ -0,0 +1,61 @@ +/*! + * \file cshort_to_float_x2.h + * \brief Adapts a std::complex stream into two float streams + * \author Carles Fernandez Prades, cfernandez(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR 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 of the License, or + * (at your option) any later version. + * + * GNSS-SDR 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 GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_CSHORT_TO_FLOAT_X2_H_ +#define GNSS_SDR_CSHORT_TO_FLOAT_X2_H_ + + +#include +#include +#include + +class cshort_to_float_x2; + +typedef boost::shared_ptr cshort_to_float_x2_sptr; + +cshort_to_float_x2_sptr make_cshort_to_float_x2(); + +/*! + * \brief This class adapts a std::complex stream + * into two 32-bits (float) streams + */ +class cshort_to_float_x2 : public gr::sync_block +{ +private: + friend cshort_to_float_x2_sptr make_cshort_to_float_x2(); +public: + cshort_to_float_x2(); + + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif diff --git a/src/algorithms/input_filter/gnuradio_blocks/short_x2_to_cshort.cc b/src/algorithms/input_filter/gnuradio_blocks/short_x2_to_cshort.cc new file mode 100644 index 000000000..e55b1ac27 --- /dev/null +++ b/src/algorithms/input_filter/gnuradio_blocks/short_x2_to_cshort.cc @@ -0,0 +1,72 @@ +/*! + * \file short_x2_to_cshort.cc + * \brief Adapts two short streams into a std::complex stream + * \author Carles Fernandez Prades, cfernandez(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR 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 of the License, or + * (at your option) any later version. + * + * GNSS-SDR 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 GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + + +#include "short_x2_to_cshort.h" +#include +#include + + +short_x2_to_cshort_sptr make_short_x2_to_cshort() +{ + return short_x2_to_cshort_sptr(new short_x2_to_cshort()); +} + + + +short_x2_to_cshort::short_x2_to_cshort() : sync_block("short_x2_to_cshort", + gr::io_signature::make (2, 2, sizeof(short)), + gr::io_signature::make (1, 1, sizeof(lv_16sc_t))) // lv_8sc_t is a Volk's typedef for std::complex +{ + const int alignment_multiple = volk_get_alignment() / sizeof(lv_16sc_t); + set_alignment(std::max(1, alignment_multiple)); +} + + +int short_x2_to_cshort::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) +{ + const short *in0 = (const short *) input_items[0]; + const short *in1 = (const short *) input_items[1]; + lv_16sc_t *out = (lv_16sc_t *) output_items[0]; + // This could be put into a volk kernel + short real_part; + short imag_part; + for(int number = 0; number < noutput_items; number++) + { + // lv_cmake(r, i) defined at volk/volk_complex.h + real_part = *in0++; + imag_part = *in1++; + *out++ = lv_cmake(real_part, imag_part); + } + + return noutput_items; +} diff --git a/src/algorithms/input_filter/gnuradio_blocks/short_x2_to_cshort.h b/src/algorithms/input_filter/gnuradio_blocks/short_x2_to_cshort.h new file mode 100644 index 000000000..5794d6007 --- /dev/null +++ b/src/algorithms/input_filter/gnuradio_blocks/short_x2_to_cshort.h @@ -0,0 +1,60 @@ +/*! + * \file short_x2_to_cshort.h + * \brief Adapts two short streams into a std::complex stream + * \author Carles Fernandez Prades, cfernandez(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2015 (see AUTHORS file for a list of contributors) + * + * GNSS-SDR is a software defined Global Navigation + * Satellite Systems receiver + * + * This file is part of GNSS-SDR. + * + * GNSS-SDR 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 of the License, or + * (at your option) any later version. + * + * GNSS-SDR 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 GNSS-SDR. If not, see . + * + * ------------------------------------------------------------------------- + */ + +#ifndef GNSS_SDR_SHORT_X2_TO_CSHORT_H_ +#define GNSS_SDR_SHORT_X2_TO_CSHORT_H_ + + +#include +#include +#include + +class short_x2_to_cshort; + +typedef boost::shared_ptr short_x2_to_cshort_sptr; + +short_x2_to_cshort_sptr make_short_x2_to_cshort(); + +/*! + * \brief This class adapts two short streams into a std::complex stream + */ +class short_x2_to_cshort : public gr::sync_block +{ +private: + friend short_x2_to_cshort_sptr make_short_x2_to_cshort(); +public: + short_x2_to_cshort(); + + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); +}; + +#endif