From f635b5714f21fe6f55df2bf5b0e52db244518b35 Mon Sep 17 00:00:00 2001 From: Antonio Ramos Date: Wed, 31 Jan 2018 10:46:41 +0100 Subject: [PATCH 1/3] Add fractional resampler --- .../resampler/adapters/CMakeLists.txt | 7 +- .../fractional_resampler_conditioner.cc | 124 ++++++++++++++++++ .../fractional_resampler_conditioner.h | 89 +++++++++++++ src/core/receiver/gnss_block_factory.cc | 8 ++ 4 files changed, 226 insertions(+), 2 deletions(-) create mode 100644 src/algorithms/resampler/adapters/fractional_resampler_conditioner.cc create mode 100644 src/algorithms/resampler/adapters/fractional_resampler_conditioner.h diff --git a/src/algorithms/resampler/adapters/CMakeLists.txt b/src/algorithms/resampler/adapters/CMakeLists.txt index f78d51464..ebfd9b918 100644 --- a/src/algorithms/resampler/adapters/CMakeLists.txt +++ b/src/algorithms/resampler/adapters/CMakeLists.txt @@ -1,4 +1,4 @@ -# Copyright (C) 2012-2015 (see AUTHORS file for a list of contributors) +# Copyright (C) 2012-2018 (see AUTHORS file for a list of contributors) # # This file is part of GNSS-SDR. # @@ -16,7 +16,10 @@ # along with GNSS-SDR. If not, see . # -set(RESAMPLER_ADAPTER_SOURCES direct_resampler_conditioner.cc ) +set(RESAMPLER_ADAPTER_SOURCES + direct_resampler_conditioner.cc + fractional_resampler_conditioner.cc +) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/src/algorithms/resampler/adapters/fractional_resampler_conditioner.cc b/src/algorithms/resampler/adapters/fractional_resampler_conditioner.cc new file mode 100644 index 000000000..f35e2dec5 --- /dev/null +++ b/src/algorithms/resampler/adapters/fractional_resampler_conditioner.cc @@ -0,0 +1,124 @@ +/*! + * \file fractional_resampler_conditioner.cc + * \brief Implementation of an adapter of a fractional resampler conditioner block + * to a SignalConditionerInterface + * \author Antonio Ramos, 2018. antonio.ramos(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2018 (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 "fractional_resampler_conditioner.h" +#include +#include +#include +#include +#include "configuration_interface.h" + +using google::LogMessage; + +FractionalResamplerConditioner::FractionalResamplerConditioner( + ConfigurationInterface* configuration, std::string role, + unsigned int in_stream, unsigned int out_stream) : + role_(role), in_stream_(in_stream), out_stream_(out_stream) +{ + std::string default_item_type = "gr_complex"; + std::string default_dump_file = "./data/signal_conditioner.dat"; + double fs_in_deprecated, fs_in; + fs_in_deprecated = configuration->property("GNSS-SDR.internal_fs_hz", 2048000.0); + fs_in = configuration->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated); + sample_freq_in_ = configuration->property(role_ + ".sample_freq_in", 4000000.0); + sample_freq_out_ = configuration->property(role_ + ".sample_freq_out", fs_in); + if(std::fabs(fs_in - sample_freq_out_) > std::numeric_limits::epsilon()) + { + std::string aux_warn = "CONFIGURATION WARNING: Parameters GNSS-SDR.internal_fs_sps and " + + role_ + ".sample_freq_out are not set to the same value!" ; + LOG(WARNING) << aux_warn; + std::cout << aux_warn << std::endl; + } + item_type_ = configuration->property(role + ".item_type", default_item_type); + dump_ = configuration->property(role + ".dump", false); + DLOG(INFO) << "dump_ is " << dump_; + dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); + + if (item_type_.compare("gr_complex") == 0) + { + item_size_ = sizeof(gr_complex); + resampler_ = gr::filter::fractional_resampler_cc::make(0.0, sample_freq_in_ / sample_freq_out_); + DLOG(INFO) << "sample_freq_in " << sample_freq_in_; + DLOG(INFO) << "sample_freq_out" << sample_freq_out_; + DLOG(INFO) << "Item size " << item_size_; + DLOG(INFO) << "resampler(" << resampler_->unique_id() << ")"; + } + else + { + LOG(WARNING) << item_type_ << " unrecognized item type for resampler"; + item_size_ = sizeof(gr_complex); + } + if (dump_) + { + DLOG(INFO) << "Dumping output into file " << dump_filename_; + file_sink_ = gr::blocks::file_sink::make(item_size_, dump_filename_.c_str()); + DLOG(INFO) << "file_sink(" << file_sink_->unique_id() << ")"; + } +} + + +FractionalResamplerConditioner::~FractionalResamplerConditioner() {} + + + +void FractionalResamplerConditioner::connect(gr::top_block_sptr top_block) +{ + if (dump_) + { + top_block->connect(resampler_, 0, file_sink_, 0); + DLOG(INFO) << "connected resampler to file sink"; + } + else + { + DLOG(INFO) << "nothing to connect internally"; + } +} + + +void FractionalResamplerConditioner::disconnect(gr::top_block_sptr top_block) +{ + if (dump_) + { + top_block->disconnect(resampler_, 0, file_sink_, 0); + } +} + + +gr::basic_block_sptr FractionalResamplerConditioner::get_left_block() +{ + return resampler_; +} + + +gr::basic_block_sptr FractionalResamplerConditioner::get_right_block() +{ + return resampler_; +} diff --git a/src/algorithms/resampler/adapters/fractional_resampler_conditioner.h b/src/algorithms/resampler/adapters/fractional_resampler_conditioner.h new file mode 100644 index 000000000..32d99da70 --- /dev/null +++ b/src/algorithms/resampler/adapters/fractional_resampler_conditioner.h @@ -0,0 +1,89 @@ +/*! + * \file fractional_resampler_conditioner.h + * \brief Interface of an adapter of a fractional resampler conditioner block + * to a SignalConditionerInterface + * \author Antonio Ramos, 2018. antonio.ramos(at)cttc.es + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2018 (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_FRACTIONAL_RESAMPLER_CONDITIONER_H_ +#define GNSS_SDR_FRACTIONAL_RESAMPLER_CONDITIONER_H_ + +#include +#include +#include "gnss_block_interface.h" + +class ConfigurationInterface; + +/*! + * \brief Interface of an adapter of a fractional resampler conditioner block + * to a SignalConditionerInterface + */ +class FractionalResamplerConditioner: public GNSSBlockInterface +{ +public: + FractionalResamplerConditioner(ConfigurationInterface* configuration, + std::string role, unsigned int in_stream, + unsigned int out_stream); + + virtual ~FractionalResamplerConditioner(); + + inline std::string role() override + { + return role_; + } + + inline std::string implementation() override + { + return "Fractional_Resampler"; + } + + inline size_t item_size() override + { + return item_size_; + } + + void connect(gr::top_block_sptr top_block) override; + void disconnect(gr::top_block_sptr top_block) override; + gr::basic_block_sptr get_left_block() override; + gr::basic_block_sptr get_right_block() override; + +private: + std::string role_; + unsigned int in_stream_; + unsigned int out_stream_; + std::string item_type_; + size_t item_size_; + bool dump_; + std::string dump_filename_; + double sample_freq_in_; + double sample_freq_out_; + gr::filter::fractional_resampler_cc::sptr resampler_; + gr::block_sptr file_sink_; +}; + +#endif /*GNSS_SDR_FRACTIONAL_RESAMPLER_CONDITIONER_H_*/ diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc index ac72a0549..d2d074d39 100644 --- a/src/core/receiver/gnss_block_factory.cc +++ b/src/core/receiver/gnss_block_factory.cc @@ -62,6 +62,7 @@ #include "ishort_to_cshort.h" #include "ishort_to_complex.h" #include "direct_resampler_conditioner.h" +#include "fractional_resampler_conditioner.h" #include "fir_filter.h" #include "freq_xlating_fir_filter.h" #include "beamformer_filter.h" @@ -1170,6 +1171,13 @@ std::unique_ptr GNSSBlockFactory::GetBlock( block = std::move(block_); } + else if (implementation.compare("Fractional_Resampler") == 0) + { + std::unique_ptr block_(new FractionalResamplerConditioner(configuration.get(), role, + in_streams, out_streams)); + block = std::move(block_); + } + // ACQUISITION BLOCKS --------------------------------------------------------- else if (implementation.compare("GPS_L1_CA_PCPS_Acquisition") == 0) { From 149ceaa36677bc0598d7d8e3a18a96e3fef9f516 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 1 Feb 2018 15:15:03 +0100 Subject: [PATCH 2/3] Fix compilation in GNU Radio 3.8 --- cmake/Modules/FindGnuradio.cmake | 17 +++++++++++++++-- .../resampler/adapters/CMakeLists.txt | 8 +++++++- .../fractional_resampler_conditioner.cc | 4 ++++ src/core/receiver/CMakeLists.txt | 4 ++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/cmake/Modules/FindGnuradio.cmake b/cmake/Modules/FindGnuradio.cmake index 44ae95722..8b540bee0 100644 --- a/cmake/Modules/FindGnuradio.cmake +++ b/cmake/Modules/FindGnuradio.cmake @@ -5,7 +5,7 @@ INCLUDE(FindPkgConfig) INCLUDE(FindPackageHandleStandardArgs) -# if GR_REQUIRED_COMPONENTS is not defined, it will be set to the following list +# if GR_REQUIRED_COMPONENTS is not defined, it will be set to the following list if(NOT GR_REQUIRED_COMPONENTS) set(GR_REQUIRED_COMPONENTS RUNTIME ANALOG BLOCKS DIGITAL FFT FILTER PMT FEC TRELLIS UHD) endif() @@ -164,4 +164,17 @@ if(NOT PC_GNURADIO_RUNTIME_VERSION) if(GNURADIO_VERSION_GREATER_THAN_373) set(PC_GNURADIO_RUNTIME_VERSION "3.7.4+") endif(GNURADIO_VERSION_GREATER_THAN_373) -endif(NOT PC_GNURADIO_RUNTIME_VERSION) \ No newline at end of file + + find_file(GNURADIO_VERSION_GREATER_THAN_38 + NAMES gnuradio/filter/mmse_resampler_cc.h + HINTS $ENV{GNURADIO_RUNTIME_DIR}/include + ${CMAKE_INSTALL_PREFIX}/include + ${GNURADIO_INSTALL_PREFIX}/include + PATHS /usr/local/include + /usr/include + ${GNURADIO_INSTALL_PREFIX}/include + ) + if(GNURADIO_VERSION_GREATER_THAN_38) + set(PC_GNURADIO_RUNTIME_VERSION "3.8.0+") + endif(GNURADIO_VERSION_GREATER_THAN_38) +endif(NOT PC_GNURADIO_RUNTIME_VERSION) diff --git a/src/algorithms/resampler/adapters/CMakeLists.txt b/src/algorithms/resampler/adapters/CMakeLists.txt index ebfd9b918..15bbff019 100644 --- a/src/algorithms/resampler/adapters/CMakeLists.txt +++ b/src/algorithms/resampler/adapters/CMakeLists.txt @@ -16,7 +16,7 @@ # along with GNSS-SDR. If not, see . # -set(RESAMPLER_ADAPTER_SOURCES +set(RESAMPLER_ADAPTER_SOURCES direct_resampler_conditioner.cc fractional_resampler_conditioner.cc ) @@ -31,6 +31,12 @@ include_directories( ${VOLK_INCLUDE_DIRS} ) + +if(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.11" ) + add_definitions( -DGR_GREATER_38=1 ) +endif(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.11" ) + + file(GLOB RESAMPLER_ADAPTER_HEADERS "*.h") list(SORT RESAMPLER_ADAPTER_HEADERS) add_library(resampler_adapters ${RESAMPLER_ADAPTER_SOURCES} ${RESAMPLER_ADAPTER_HEADERS}) diff --git a/src/algorithms/resampler/adapters/fractional_resampler_conditioner.cc b/src/algorithms/resampler/adapters/fractional_resampler_conditioner.cc index f35e2dec5..87850629b 100644 --- a/src/algorithms/resampler/adapters/fractional_resampler_conditioner.cc +++ b/src/algorithms/resampler/adapters/fractional_resampler_conditioner.cc @@ -65,7 +65,11 @@ FractionalResamplerConditioner::FractionalResamplerConditioner( if (item_type_.compare("gr_complex") == 0) { item_size_ = sizeof(gr_complex); + #ifdef GR_GREATER_38 + resampler_ = gr::filter::mmse_resampler_cc::make(0.0, sample_freq_in_ / sample_freq_out_); + #else resampler_ = gr::filter::fractional_resampler_cc::make(0.0, sample_freq_in_ / sample_freq_out_); + #endif DLOG(INFO) << "sample_freq_in " << sample_freq_in_; DLOG(INFO) << "sample_freq_out" << sample_freq_out_; DLOG(INFO) << "Item size " << item_size_; diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt index 623a0dc39..7f981c472 100644 --- a/src/core/receiver/CMakeLists.txt +++ b/src/core/receiver/CMakeLists.txt @@ -92,6 +92,10 @@ endif(ENABLE_FMCOMMS2) add_definitions(-DGNSSSDR_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}") +if(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.11" ) + add_definitions( -DGR_GREATER_38=1 ) +endif(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.11" ) + include_directories( ${CMAKE_CURRENT_SOURCE_DIR} From 3988a68592c656a0a24272ed29a70c43159a0b28 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 1 Feb 2018 16:39:45 +0100 Subject: [PATCH 3/3] Fix compilation in GNU Radio 3.7.12.git --- src/algorithms/resampler/adapters/CMakeLists.txt | 4 ++-- .../resampler/adapters/fractional_resampler_conditioner.h | 8 ++++++++ src/core/receiver/CMakeLists.txt | 4 ++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/algorithms/resampler/adapters/CMakeLists.txt b/src/algorithms/resampler/adapters/CMakeLists.txt index 15bbff019..1a506dbe6 100644 --- a/src/algorithms/resampler/adapters/CMakeLists.txt +++ b/src/algorithms/resampler/adapters/CMakeLists.txt @@ -32,9 +32,9 @@ include_directories( ) -if(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.11" ) +if(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.13" ) add_definitions( -DGR_GREATER_38=1 ) -endif(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.11" ) +endif(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.13" ) file(GLOB RESAMPLER_ADAPTER_HEADERS "*.h") diff --git a/src/algorithms/resampler/adapters/fractional_resampler_conditioner.h b/src/algorithms/resampler/adapters/fractional_resampler_conditioner.h index 32d99da70..080d9c985 100644 --- a/src/algorithms/resampler/adapters/fractional_resampler_conditioner.h +++ b/src/algorithms/resampler/adapters/fractional_resampler_conditioner.h @@ -34,7 +34,11 @@ #define GNSS_SDR_FRACTIONAL_RESAMPLER_CONDITIONER_H_ #include +#ifdef GR_GREATER_38 +#include +#else #include +#endif #include "gnss_block_interface.h" class ConfigurationInterface; @@ -82,7 +86,11 @@ private: std::string dump_filename_; double sample_freq_in_; double sample_freq_out_; + #ifdef GR_GREATER_38 + gr::filter::mmse_resampler_cc::sptr resampler_; + #else gr::filter::fractional_resampler_cc::sptr resampler_; + #endif gr::block_sptr file_sink_; }; diff --git a/src/core/receiver/CMakeLists.txt b/src/core/receiver/CMakeLists.txt index 7f981c472..aa96cb4dd 100644 --- a/src/core/receiver/CMakeLists.txt +++ b/src/core/receiver/CMakeLists.txt @@ -92,9 +92,9 @@ endif(ENABLE_FMCOMMS2) add_definitions(-DGNSSSDR_INSTALL_DIR="${CMAKE_INSTALL_PREFIX}") -if(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.11" ) +if(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.13" ) add_definitions( -DGR_GREATER_38=1 ) -endif(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.11" ) +endif(${PC_GNURADIO_RUNTIME_VERSION} VERSION_GREATER "3.7.13" ) include_directories(