From fba6e2eaf729d15fbfb61743ea989f9dfcd37395 Mon Sep 17 00:00:00 2001 From: Marc Majoral Date: Fri, 17 Dec 2021 11:45:02 +0100 Subject: [PATCH 1/6] set the tolerance of the doppler error to Acquisition.doppler_step in the acquisition performance test --- .../acquisition/acq_performance_test.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc index ef7fb777c..75807b28a 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc @@ -991,7 +991,7 @@ TEST_F(AcquisitionPerformanceTest, ROC) for (int i = 0; i < num_clean_executions - 1; i++) { - if (abs(clean_delay_estimation_error(i)) < 0.5 and abs(clean_doppler_estimation_error(i)) < static_cast(config->property("Acquisition.doppler_step", 1)) / 2.0) + if (abs(clean_delay_estimation_error(i)) < 0.5 and abs(clean_doppler_estimation_error(i)) < static_cast(config->property("Acquisition.doppler_step", 1))) { correctly_detected = correctly_detected + 1.0; } From 36754cc63ff370e41a93cbcaaeeedea73a1d7e50 Mon Sep 17 00:00:00 2001 From: Marc Majoral Date: Fri, 17 Dec 2021 15:40:46 +0100 Subject: [PATCH 2/6] fixed the calculation of the number of measurements of the acquisition performance test --- .../acquisition/acq_performance_test.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc index 75807b28a..fc2c9e2fc 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc @@ -282,7 +282,8 @@ protected: num_thresholds = pfa_vector.size(); - int aux2 = ((generated_signal_duration_s * 900 - (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells)) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells)); + // the gnss simulator does not dump the trk observables for the last 100 ms of generated signal + int aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells) - 1); if ((FLAGS_acq_test_num_meas > 0) and (FLAGS_acq_test_num_meas < aux2)) { num_of_measurements = static_cast(FLAGS_acq_test_num_meas); @@ -369,6 +370,8 @@ protected: std::string signal_id; private: + static const uint32_t ms_per_s = 1000; + std::string generator_binary; std::string p1; std::string p2; From 1877d7d4e5ffc9f8b8e58ff32e2854d73f26d2ae Mon Sep 17 00:00:00 2001 From: Marc Majoral <=> Date: Tue, 21 Dec 2021 12:39:41 +0100 Subject: [PATCH 3/6] take into account bit_transition_flag for the calculation of the number of measurements --- .../acquisition/acq_performance_test.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc index fc2c9e2fc..e3bd0268f 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc @@ -283,7 +283,15 @@ protected: num_thresholds = pfa_vector.size(); // the gnss simulator does not dump the trk observables for the last 100 ms of generated signal - int aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells) - 1); + int aux2; + if (FLAGS_acq_test_bit_transition_flag) + { + aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * 2.0) - 1); + } + else + { + aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells) - 1); + } if ((FLAGS_acq_test_num_meas > 0) and (FLAGS_acq_test_num_meas < aux2)) { num_of_measurements = static_cast(FLAGS_acq_test_num_meas); From 26964a365af440213194f1c3bfba1ae5bff201e8 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 28 Dec 2021 13:59:57 +0100 Subject: [PATCH 4/6] Fix program termination when usign extended intergration times Reorder private data members, initialize them in constructor list --- docs/CHANGELOG.md | 14 +- .../adapters/file_source_base.cc | 154 ++++++++++++------ .../signal_source/adapters/file_source_base.h | 31 ++-- 3 files changed, 130 insertions(+), 69 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1a3b673d8..54e188f73 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -98,12 +98,14 @@ All notable changes to GNSS-SDR will be documented in this file. - Added a new output parameter `Flag_PLL_180_deg_phase_locked` in the monitor output that indicates if the PLL got locked at 180 degrees, so the symbol sign is reversed. -- Fix bug in the satellite selection algorithm for configurations with a large - number of channels. The maximum number of channels per signal is now limited - to the number of available satellites per system minus one. The number of - channels performing concurrent acquisition, `Channels.in_acquisition`, cannot - be larger than the total number of channels. The program will stop if those - requirements are not met in the configuration file. +- Fixed a bug in the satellite selection algorithm for configurations with a + large number of channels. The maximum number of channels per signal is now + limited to the number of available satellites per system minus one. The number + of channels performing concurrent acquisition, `Channels.in_acquisition`, + cannot be larger than the total number of channels. The program will stop if + those requirements are not met in the configuration file. +- Fixed program termination when using `File_Signal_Source` and extended + integration times. See the definitions of concepts and metrics at https://gnss-sdr.org/design-forces/ diff --git a/src/algorithms/signal_source/adapters/file_source_base.cc b/src/algorithms/signal_source/adapters/file_source_base.cc index f499318b1..55da2791c 100644 --- a/src/algorithms/signal_source/adapters/file_source_base.cc +++ b/src/algorithms/signal_source/adapters/file_source_base.cc @@ -15,15 +15,25 @@ */ #include "file_source_base.h" +#include "Beidou_B1I.h" +#include "Beidou_B3I.h" +#include "GPS_L1_CA.h" +#include "GPS_L2C.h" +#include "GPS_L5.h" +#include "Galileo_E1.h" +#include "Galileo_E5a.h" +#include "Galileo_E5b.h" +#include "Galileo_E6.h" #include "configuration_interface.h" #include "gnss_sdr_filesystem.h" #include "gnss_sdr_flags.h" #include "gnss_sdr_string_literals.h" #include "gnss_sdr_valve.h" #include -#include // ceil, floor -#include -#include // move +#include // for std::max +#include // for ceil, floor +#include // for std::cout, std:cerr +#include // for std::move using namespace std::string_literals; @@ -31,31 +41,58 @@ using namespace std::string_literals; FileSourceBase::FileSourceBase(ConfigurationInterface const* configuration, std::string const& role, std::string impl, Concurrent_Queue* queue, std::string default_item_type) - : SignalSourceBase(configuration, role, std::move(impl)), filename_(configuration->property(role + ".filename"s, "../data/example_capture.dat"s)), - - file_source_(), // NOLINT - - item_type_(configuration->property(role + ".item_type"s, default_item_type)), // NOLINT - item_size_(0), - is_complex_(false), - - // apparently, MacOS (LLVM) finds 0UL ambiguous with bool, int64_t, uint64_t, int32_t, int16_t, uint16_t,... float, double - header_size_(configuration->property(role + ".header_size"s, uint64_t(0))), - seconds_to_skip_(configuration->property(role + ".seconds_to_skip"s, 0.0)), - repeat_(configuration->property(role + ".repeat"s, false)), - - samples_(configuration->property(role + ".samples"s, uint64_t(0))), - sampling_frequency_(configuration->property(role + ".sampling_frequency"s, int64_t(0))), - valve_(), // NOLINT + : SignalSourceBase(configuration, role, std::move(impl)), queue_(queue), - - enable_throttle_control_(configuration->property(role + ".enable_throttle_control"s, false)), - throttle_(), // NOLINT - - dump_(configuration->property(role + ".dump"s, false)), - dump_filename_(configuration->property(role + ".dump_filename"s, "../data/my_capture.dat"s)), - sink_() // NOLINT + role_(role), + filename_(configuration->property(role_ + ".filename"s, "../data/example_capture.dat"s)), + dump_filename_(configuration->property(role_ + ".dump_filename"s, "../data/my_capture.dat"s)), + item_type_(configuration->property(role_ + ".item_type"s, std::move(default_item_type))), + item_size_(0), + header_size_(configuration->property(role_ + ".header_size"s, uint64_t(0))), + samples_(configuration->property(role_ + ".samples"s, uint64_t(0))), + sampling_frequency_(configuration->property(role_ + ".sampling_frequency"s, int64_t(0))), + minimum_tail_s_(0.1), + seconds_to_skip_(configuration->property(role_ + ".seconds_to_skip"s, 0.0)), + is_complex_(false), + repeat_(configuration->property(role_ + ".repeat"s, false)), + enable_throttle_control_(configuration->property(role_ + ".enable_throttle_control"s, false)), + dump_(configuration->property(role_ + ".dump"s, false)) { + minimum_tail_s_ = std::max(configuration->property("Acquisition_1C.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_2S.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_L5.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_1B.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_5X.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_7X.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_E6.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_B1.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_B3.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_1G.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Acquisition_2G.coherent_integration_time_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + + minimum_tail_s_ = std::max(configuration->property("Tracking_1C.extend_correlation_symbols", 0.0) * GPS_L1_CA_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_2S.extend_correlation_symbols", 0.0) * GPS_L2_M_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_L5.extend_correlation_symbols", 0.0) * GPS_L5I_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_1B.extend_correlation_symbols", 0.0) * GALILEO_E1_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_5X.extend_correlation_symbols", 0.0) * GALILEO_E5A_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_7X.extend_correlation_symbols", 0.0) * GALILEO_E5B_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_E6.extend_correlation_symbols", 0.0) * GALILEO_E6_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_B1.extend_correlation_symbols", 0.0) * BEIDOU_B1I_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_B3.extend_correlation_symbols", 0.0) * BEIDOU_B3I_CODE_PERIOD_S * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_1G.extend_correlation_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + minimum_tail_s_ = std::max(configuration->property("Tracking_2G.extend_correlation_ms", 0.0) * 0.001 * 2.0, minimum_tail_s_); + + if (repeat()) + { + minimum_tail_s_ = 0.0; + if (seconds_to_skip_ != 0.0) + { + seconds_to_skip_ = 0.0; + std::cout << "Warning: since " << role_ << ".repeat is set to true, " + << role_ << ".seconds_to_skip parameter will be ignored.\n"; + } + } + // override value with commandline flag, if present if (FLAGS_signal_source != "-") { @@ -67,9 +104,9 @@ FileSourceBase::FileSourceBase(ConfigurationInterface const* configuration, std: } if (sampling_frequency_ == 0) { - std::cerr << "Warning: parameter " << role << ".sampling_frequency is not set, this could lead to wrong results.\n" - << " Please set the " << role << ".sampling_frequency parameter in your configuration file.\n" - << " If not set, " << role << ".sampling_frequency=" << configuration->property("GNSS-SDR.internal_fs_sps"s, int64_t(0)) + std::cerr << "Warning: parameter " << role_ << ".sampling_frequency is not set, this could lead to wrong results.\n" + << " Please set the " << role_ << ".sampling_frequency parameter in your configuration file.\n" + << " If not set, " << role_ << ".sampling_frequency=" << configuration->property("GNSS-SDR.internal_fs_sps"s, int64_t(0)) << " will be assumed.\n"; sampling_frequency_ = configuration->property("GNSS-SDR.internal_fs_sps"s, int64_t(0)); } @@ -348,39 +385,62 @@ size_t FileSourceBase::computeSamplesInFile() const { auto n_samples = static_cast(samples()); + // this could throw, but the existence of the file has been proven before we get here. + const auto size = fs::file_size(filename()); + + const auto to_skip = samplesToSkip(); + + /*! + * BUG workaround: The GNU Radio 3.7 file source does not stop the receiver after reaching the End of File. + * A possible solution is to compute the file length in samples using file size, excluding at least + * the last 2 milliseconds, and enable always the valve block + */ + const auto tail = static_cast(std::ceil(minimum_tail_s_ * sampling_frequency())); + + if (tail > size) + { + std::cout << "Warning: file " << filename() << " has " << size << " samples (it is too short).\n"; + return 1; + } + if (to_skip + tail > size) + { + std::cout << "Warning: " << role_ << ".seconds_to_skip is larger than file duration.\n"; + return 1; + } + // if configured with 0 samples (read the whole file), figure out how many samples are in the file, and go from there if (n_samples == 0) { - // this could throw, but the existence of the file has been proven before we get here. - auto size = fs::file_size(filename()); - // if there is some kind of compression/encoding, figure out the uncompressed number of samples n_samples = std::floor(packetsPerSample() * size / item_size()); - auto to_skip = samplesToSkip(); - - /*! - * BUG workaround: The GNU Radio file source does not stop the receiver after reaching the End of File. - * A possible solution is to compute the file length in samples using file size, excluding at least - * the last 2 milliseconds, and enable always the valve block - */ - auto tail = static_cast(std::ceil(0.002 * sampling_frequency())); - DLOG(INFO) << "Total samples in the file= " << n_samples; std::cout << "Processing file " << filename() << ", which contains " << n_samples << " samples (" << size << " bytes)\n"; if (n_samples > (to_skip + tail)) { - // process all the samples available in the file excluding up to the last 2 ms + // process all the samples available in the file excluding the hearder and the tail n_samples -= to_skip + tail; } else { - // this will terminate the program - LOG(FATAL) << "Skipping " << to_skip << " samples from the front and truncating 2ms (" << tail << " samples)\n" - << "is greater than the number of samples in the file (" << n_samples << ")"; + std::cout << "Warning: Skipping " << to_skip << " samples from the front and truncating " << tail << " samples\n" + << "is greater than the number of samples in the file (" << size << ")\n"; + return 1; } } + else + { + if (n_samples > size - to_skip - tail) + { + std::cout << "Warning: file " << filename() << " has " << size - to_skip + << " samples, but " << role_ << ".samples has been set to " << n_samples << ".\n" + << " Setting " << role_ << ".samples to " << size - to_skip - tail + << " (" << to_skip << " samples skipped at header and " << tail << " samples skipped at the tail).\n"; + n_samples = size - to_skip - tail; + } + std::cout << "Processing " << n_samples << " samples from file " << filename() << '\n'; + } return n_samples; } @@ -421,7 +481,7 @@ gr::blocks::file_source::sptr FileSourceBase::create_file_source() if (samples_to_skip > 0) { LOG(INFO) << "Skipping " << samples_to_skip << " samples of the input file"; - if (not file_source_->seek(samples_to_skip, SEEK_SET)) + if (!file_source_->seek(samples_to_skip, SEEK_SET)) { LOG(ERROR) << "Error skipping bytes!"; } @@ -435,7 +495,7 @@ gr::blocks::file_source::sptr FileSourceBase::create_file_source() << "[" << filename() << "]\n" << "\n" << "Please modify your configuration file\n" - << "and point SignalSource.filename to a valid raw data file. Then:\n" + << "and point " << role_ << ".filename to a valid raw data file. Then:\n" << "$ gnss-sdr --config_file=/path/to/my_GNSS_SDR_configuration.conf\n" << "Examples of configuration files available at:\n" << GNSSSDR_INSTALL_DIR "/share/gnss-sdr/conf/\n" diff --git a/src/algorithms/signal_source/adapters/file_source_base.h b/src/algorithms/signal_source/adapters/file_source_base.h index d6bbf83b8..5933d3520 100644 --- a/src/algorithms/signal_source/adapters/file_source_base.h +++ b/src/algorithms/signal_source/adapters/file_source_base.h @@ -152,16 +152,9 @@ protected: virtual void post_disconnect_hook(gr::top_block_sptr top_block); private: - std::string filename_; gr::blocks::file_source::sptr file_source_; - - std::string item_type_; - size_t item_size_; - bool is_complex_; // a misnomer; if I/Q are interleaved as integer values - - size_t header_size_; // length (in samples) of the header (if any) - double seconds_to_skip_; - bool repeat_; + gr::blocks::throttle::sptr throttle_; + gr::blocks::file_sink::sptr sink_; // The valve allows only the configured number of samples through, then it closes. @@ -169,17 +162,23 @@ private: // class has two choices: construct the valve in the ctor, or hold onto the pointer, possibly // beyond its lifetime. Fortunately, the queue is only used to create the valve, so the // likelihood of holding a stale pointer is mitigated - uint64_t samples_; - int64_t sampling_frequency_; // why is this signed gnss_shared_ptr valve_; Concurrent_Queue* queue_; - bool enable_throttle_control_; - gr::blocks::throttle::sptr throttle_; - - bool dump_; + std::string role_; + std::string filename_; std::string dump_filename_; - gr::blocks::file_sink::sptr sink_; + std::string item_type_; + size_t item_size_; + size_t header_size_; // length (in samples) of the header (if any) + uint64_t samples_; + int64_t sampling_frequency_; // why is this signed + double minimum_tail_s_; + double seconds_to_skip_; + bool is_complex_; // a misnomer; if I/Q are interleaved as integer values + bool repeat_; + bool enable_throttle_control_; + bool dump_; }; /** \} */ From 05a7d2413ddbdcfb6d6d655cd9eac9993c3021ae Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 28 Dec 2021 19:14:18 +0100 Subject: [PATCH 5/6] Prefer initialization to assignment in constructors in some signal sources --- .../adapters/ad9361_fpga_signal_source.cc | 144 +++++++----------- .../adapters/ad9361_fpga_signal_source.h | 46 +++--- .../adapters/fmcomms2_signal_source.cc | 86 +++++------ .../adapters/fmcomms2_signal_source.h | 10 +- .../adapters/limesdr_signal_source.cc | 44 +++--- .../adapters/limesdr_signal_source.h | 5 +- .../adapters/osmosdr_signal_source.cc | 37 ++--- .../adapters/plutosdr_signal_source.cc | 49 +++--- .../adapters/plutosdr_signal_source.h | 1 + 9 files changed, 191 insertions(+), 231 deletions(-) diff --git a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc index 029f82e5c..c78e6da94 100644 --- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc +++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.cc @@ -1,8 +1,11 @@ /*! * \file ad9361_fpga_signal_source.cc - * \brief signal source for Analog Devices front-end AD9361 connected directly to FPGA accelerators. - * This source implements only the AD9361 control. It is NOT compatible with conventional SDR acquisition and tracking blocks. - * Please use the fmcomms2 source if conventional SDR acquisition and tracking is selected in the configuration file. + * \brief signal source for Analog Devices front-end AD9361 connected directly + * to FPGA accelerators. + * This source implements only the AD9361 control. It is NOT compatible with + * conventional SDR acquisition and tracking blocks. + * Please use the fmcomms2 source if conventional SDR acquisition and tracking + * is selected in the configuration file. * \authors
    *
  • Javier Arribas, jarribas(at)cttc.es *
  • Marc Majoral, mmajoral(at)cttc.es @@ -30,19 +33,16 @@ #include "uio_fpga.h" #include #include -#include // for max -#include // for std::this_thread -#include // for abs -#include // for exceptions +#include // for std::max +#include // for std::chrono +#include // for std::floor +#include // for std::exception #include // for open, O_WRONLY #include // for std::ifstream #include // for std::setprecision -#include // for cout -#include // for string manipulation -#include // for std::chrono +#include // for std::cout #include // for write -#include -#include +#include // fr std::vector using namespace std::string_literals; @@ -50,32 +50,53 @@ using namespace std::string_literals; Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *configuration, const std::string &role, unsigned int in_stream, unsigned int out_stream, Concurrent_Queue *queue __attribute__((unused))) - : SignalSourceBase(configuration, role, "Ad9361_Fpga_Signal_Source"s), in_stream_(in_stream), out_stream_(out_stream), queue_(queue) + : SignalSourceBase(configuration, role, "Ad9361_Fpga_Signal_Source"s), + queue_(queue), + gain_mode_rx1_(configuration->property(role + ".gain_mode_rx1", default_gain_mode)), + gain_mode_rx2_(configuration->property(role + ".gain_mode_rx2", default_gain_mode)), + rf_port_select_(configuration->property(role + ".rf_port_select", default_rf_port_select)), + filter_filename_(configuration->property(role + ".filter_filename", filter_file_)), + rf_gain_rx1_(configuration->property(role + ".gain_rx1", default_manual_gain_rx1)), + rf_gain_rx2_(configuration->property(role + ".gain_rx1", default_manual_gain_rx2)), + freq_(configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ))), + sample_rate_(configuration->property(role + ".sampling_frequency", default_bandwidth)), + bandwidth_(configuration->property(role + ".bandwidth", default_bandwidth)), + samples_to_skip_(0), + samples_(configuration->property(role + ".samples", static_cast(0))), + Fpass_(configuration->property(role + ".Fpass", static_cast(0.0))), + Fstop_(configuration->property(role + ".Fstop", static_cast(0.0))), + num_freq_bands_(2), + dma_buff_offset_pos_(0), + scale_dds_dbfs_(configuration->property(role + ".scale_dds_dbfs", -3.0)), + phase_dds_deg_(configuration->property(role + ".phase_dds_deg", 0.0)), + tx_attenuation_db_(configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db)), + freq_dds_tx_hz_(configuration->property(role + ".freq_dds_tx_hz", uint64_t(10000))), + freq_rf_tx_hz_(configuration->property(role + ".freq_rf_tx_hz", static_cast(GPS_L1_FREQ_HZ - GPS_L5_FREQ_HZ - freq_dds_tx_hz_))), + tx_bandwidth_(configuration->property(role + ".tx_bandwidth", static_cast(500000))), + item_size_(sizeof(int8_t)), + in_stream_(in_stream), + out_stream_(out_stream), + switch_position_(configuration->property(role + ".switch_position", 0)), + enable_dds_lo_(configuration->property(role + ".enable_dds_lo", false)), + filter_auto_(configuration->property(role + ".filter_auto", false)), + quadrature_(configuration->property(role + ".quadrature", true)), + rf_dc_(configuration->property(role + ".rf_dc", true)), + bb_dc_(configuration->property(role + ".bb_dc", true)), + rx1_enable_(configuration->property(role + ".rx1_enable", true)), + rx2_enable_(configuration->property(role + ".rx2_enable", true)), + enable_DMA_(false), + enable_dynamic_bit_selection_(configuration->property(role + ".enable_dynamic_bit_selection", true)), + enable_ovf_check_buffer_monitor_active_(false), + dump_(configuration->property(role + ".dump", false)), + rf_shutdown_(configuration->property(role + ".rf_shutdown", FLAGS_rf_shutdown)), + repeat_(configuration->property(role + ".repeat", false)) { - // initialize the variables that are used in real-time mode + const int l1_band = configuration->property("Channels_1C.count", 0) + + configuration->property("Channels_1B.count", 0); + + const double seconds_to_skip = configuration->property(role + ".seconds_to_skip", 0.0); + const size_t header_size = configuration->property(role + ".header_size", 0); - const std::string default_gain_mode("slow_attack"); - const double default_tx_attenuation_db = -10.0; - const double default_manual_gain_rx1 = 64.0; - const double default_manual_gain_rx2 = 64.0; - const uint64_t default_bandwidth = 12500000; - const std::string default_rf_port_select("A_BALANCED"); - freq_ = configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ)); - sample_rate_ = configuration->property(role + ".sampling_frequency", static_cast(12500000)); - bandwidth_ = configuration->property(role + ".bandwidth", default_bandwidth); - quadrature_ = configuration->property(role + ".quadrature", true); - rf_dc_ = configuration->property(role + ".rf_dc", true); - bb_dc_ = configuration->property(role + ".bb_dc", true); - rx1_enable_ = configuration->property(role + ".rx1_enable", true); - rx2_enable_ = configuration->property(role + ".rx2_enable", true); - gain_mode_rx1_ = configuration->property(role + ".gain_mode_rx1", default_gain_mode); - gain_mode_rx2_ = configuration->property(role + ".gain_mode_rx2", default_gain_mode); - rf_gain_rx1_ = configuration->property(role + ".gain_rx1", default_manual_gain_rx1); - rf_gain_rx2_ = configuration->property(role + ".gain_rx2", default_manual_gain_rx2); - rf_port_select_ = configuration->property(role + ".rf_port_select", default_rf_port_select); - filter_file_ = configuration->property(role + ".filter_file", std::string("")); - filter_filename_ = configuration->property(role + ".filter_filename", filter_file_); - filter_auto_ = configuration->property(role + ".filter_auto", false); if (filter_auto_) { filter_source_ = configuration->property(role + ".filter_source", std::string("Auto")); @@ -84,29 +105,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con { filter_source_ = configuration->property(role + ".filter_source", std::string("Off")); } - Fpass_ = configuration->property(role + ".Fpass", static_cast(0.0)); - Fstop_ = configuration->property(role + ".Fstop", static_cast(0.0)); - enable_dds_lo_ = configuration->property(role + ".enable_dds_lo", false); - freq_dds_tx_hz_ = configuration->property(role + ".freq_dds_tx_hz", static_cast(10000)); - freq_rf_tx_hz_ = configuration->property(role + ".freq_rf_tx_hz", static_cast(GPS_L1_FREQ_HZ - GPS_L5_FREQ_HZ - freq_dds_tx_hz_)); - scale_dds_dbfs_ = configuration->property(role + ".scale_dds_dbfs", -3.0); - tx_attenuation_db_ = configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db); - tx_bandwidth_ = configuration->property(role + ".tx_bandwidth", static_cast(500000)); - phase_dds_deg_ = configuration->property(role + ".phase_dds_deg", 0.0); - - rf_shutdown_ = configuration->property(role + ".rf_shutdown", FLAGS_rf_shutdown); - - // initialize the variables that are used in post-processing mode - - enable_DMA_ = false; - - const int l1_band = configuration->property("Channels_1C.count", 0) + - configuration->property("Channels_1B.count", 0); - - const double default_seconds_to_skip = 0.0; - - const std::string empty_string; - filename0 = configuration->property(role + ".filename", empty_string); // override value with commandline flag, if present if (FLAGS_signal_source != "-") @@ -118,16 +116,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con filename0 = FLAGS_s; } - if (filename0.empty()) - { - filename0 = configuration->property(role + ".filename0", empty_string); - filename1 = configuration->property(role + ".filename1", empty_string); - } - - // by default the DMA transfers samples corresponding to two frequency bands to the FPGA - num_freq_bands_ = 2; - dma_buff_offset_pos_ = 0; - // if only one input file is specified in the configuration file then: // if there is at least one channel assigned to frequency band 1 then the DMA transfers the samples to the L1 frequency band channels // otherwise the DMA transfers the samples to the L2/L5 frequency band channels @@ -145,15 +133,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con dma_buff_offset_pos_ = 2; } - samples_ = configuration->property(role + ".samples", static_cast(0)); - - const double seconds_to_skip = configuration->property(role + ".seconds_to_skip", default_seconds_to_skip); - const size_t header_size = configuration->property(role + ".header_size", 0); - std::string item_type = "ibyte"; // for now only the ibyte format is supported - item_size_ = sizeof(int8_t); - repeat_ = configuration->property(role + ".repeat", false); - - samples_to_skip_ = 0; if (seconds_to_skip > 0) { samples_to_skip_ = static_cast(seconds_to_skip * sample_rate_) * 2; @@ -163,10 +142,7 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con samples_to_skip_ += header_size; } - // check the switch status (determines real-time mode or post-processing mode) - std::string device_io_name; // Switch UIO device file - // find the uio device file corresponding to the switch. if (find_uio_dev_file_name(device_io_name, switch_device_name, 0) < 0) { @@ -175,7 +151,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con return; } - switch_position_ = configuration->property(role + ".switch_position", 0); if (switch_position_ != 0 && switch_position_ != 2) { std::cout << "SignalSource.switch_position configuration parameter must be either 0: read from file(s) via DMA, or 2: read from AD9361\n"; @@ -272,7 +247,7 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con } DLOG(INFO) << "Samples " << samples_; DLOG(INFO) << "Sampling frequency " << sample_rate_; - DLOG(INFO) << "Item type " << item_type; + DLOG(INFO) << "Item type " << std::string("ibyte"); DLOG(INFO) << "Item size " << item_size_; DLOG(INFO) << "Repeat " << repeat_; } @@ -429,7 +404,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con std::string device_io_name_buffer_monitor; - dump_ = configuration->property(role + ".dump", false); std::string dump_filename = configuration->property(role + ".dump_filename", default_dump_filename); // find the uio device file corresponding to the buffer monitor @@ -445,7 +419,6 @@ Ad9361FpgaSignalSource::Ad9361FpgaSignalSource(const ConfigurationInterface *con } // dynamic bits selection - enable_dynamic_bit_selection_ = configuration->property(role + ".enable_dynamic_bit_selection", true); if (enable_dynamic_bit_selection_) { std::string device_io_name_dyn_bit_sel_0; @@ -616,7 +589,6 @@ void Ad9361FpgaSignalSource::run_DMA_process(const std::string &filename0, const } } - // rx signal vectors std::vector input_samples(sample_block_size * 2); // complex samples std::vector input_samples_dma(sample_block_size * 4); // complex samples, two frequency bands diff --git a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h index e352c4d3b..9aa53ef31 100644 --- a/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h +++ b/src/algorithms/signal_source/adapters/ad9361_fpga_signal_source.h @@ -1,8 +1,11 @@ /*! * \file ad9361_fpga_signal_source.h - * \brief signal source for Analog Devices front-end AD9361 connected directly to FPGA accelerators. - * This source implements only the AD9361 control. It is NOT compatible with conventional SDR acquisition and tracking blocks. - * Please use the fmcomms2 source if conventional SDR acquisition and tracking is selected in the configuration file. + * \brief signal source for Analog Devices front-end AD9361 connected directly + * to FPGA accelerators. + * This source implements only the AD9361 control. It is NOT compatible with + * conventional SDR acquisition and tracking blocks. + * Please use the fmcomms2 source if conventional SDR acquisition and tracking + * is selected in the configuration file. * * ----------------------------------------------------------------------------- * @@ -62,10 +65,17 @@ public: gr::basic_block_sptr get_right_block() override; private: - const std::string switch_device_name = "AXIS_Switch_v1_0_0"; // Switch UIO device name - const std::string dyn_bit_sel_device_name = "dynamic_bits_selector"; // Switch dhnamic bit selector device name - const std::string buffer_monitor_device_name = "buffer_monitor"; // buffer monitor device name + const std::string switch_device_name = std::string("AXIS_Switch_v1_0_0"); // Switch UIO device name + const std::string dyn_bit_sel_device_name = std::string("dynamic_bits_selector"); // Switch dhnamic bit selector device name + const std::string buffer_monitor_device_name = std::string("buffer_monitor"); // buffer monitor device name const std::string default_dump_filename = std::string("FPGA_buffer_monitor_dump.dat"); + const std::string default_rf_port_select = std::string("A_BALANCED"); + const std::string default_gain_mode = std::string("slow_attack"); + const double default_tx_attenuation_db = -10.0; + const double default_manual_gain_rx1 = 64.0; + const double default_manual_gain_rx2 = 64.0; + const uint64_t default_bandwidth = 12500000; + // perform dynamic bit selection every 500 ms by default const uint32_t Gain_control_period_ms = 500; // check buffer overflow and perform buffer monitoring every 1s by default @@ -95,6 +105,12 @@ private: std::shared_ptr dynamic_bit_selection_fpga; std::shared_ptr buffer_monitor_fpga; + std::mutex dma_mutex; + std::mutex dynamic_bit_selection_mutex; + std::mutex buffer_monitor_mutex; + + Concurrent_Queue *queue_; + // Front-end settings std::string gain_mode_rx1_; std::string gain_mode_rx2_; @@ -105,24 +121,24 @@ private: std::string filename0; std::string filename1; - std::mutex dma_mutex; - std::mutex dynamic_bit_selection_mutex; - std::mutex buffer_monitor_mutex; - double rf_gain_rx1_; double rf_gain_rx2_; uint64_t freq_; // frequency of local oscillator uint64_t sample_rate_; uint64_t bandwidth_; + uint64_t samples_to_skip_; + int64_t samples_; float Fpass_; float Fstop_; + uint32_t num_freq_bands_; + uint32_t dma_buff_offset_pos_; // DDS configuration for LO generation for external mixer double scale_dds_dbfs_; double phase_dds_deg_; double tx_attenuation_db_; - uint64_t freq_rf_tx_hz_; uint64_t freq_dds_tx_hz_; + uint64_t freq_rf_tx_hz_; uint64_t tx_bandwidth_; size_t item_size_; uint32_t in_stream_; @@ -141,15 +157,7 @@ private: bool enable_ovf_check_buffer_monitor_active_; bool dump_; bool rf_shutdown_; - - // post-processing mode - int64_t samples_; - uint64_t samples_to_skip_; bool repeat_; - uint32_t num_freq_bands_; - uint32_t dma_buff_offset_pos_; - - Concurrent_Queue *queue_; }; diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc index 5b97b0bb9..c68ce03aa 100644 --- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc +++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.cc @@ -28,7 +28,6 @@ #include // for max #include #include -#include #include using namespace std::string_literals; @@ -36,30 +35,44 @@ using namespace std::string_literals; Fmcomms2SignalSource::Fmcomms2SignalSource(const ConfigurationInterface *configuration, const std::string &role, unsigned int in_stream, unsigned int out_stream, Concurrent_Queue *queue) - : SignalSourceBase(configuration, role, "Fmcomms2_Signal_Source"s), in_stream_(in_stream), out_stream_(out_stream) + : SignalSourceBase(configuration, role, "Fmcomms2_Signal_Source"s), + item_type_(configuration->property(role + ".item_type", std::string("gr_complex"))), + dump_filename_(configuration->property(role + ".dump_filename", std::string("./data/signal_source.dat"))), + uri_(configuration->property(role + ".device_address", std::string("192.168.2.1"))), + gain_mode_rx1_(configuration->property(role + ".gain_mode_rx1", default_gain_mode)), + gain_mode_rx2_(configuration->property(role + ".gain_mode_rx2", default_gain_mode)), + rf_port_select_(configuration->property(role + ".rf_port_select", std::string("A_BALANCED"))), + filter_file_(configuration->property(role + ".filter_file", std::string(""))), + filter_filename_(configuration->property(role + ".filter_filename", filter_file_)), + samples_(configuration->property(role + ".samples", static_cast(0))), + item_size_(sizeof(gr_complex)), + rf_gain_rx1_(configuration->property(role + ".gain_rx1", 64.0)), + rf_gain_rx2_(configuration->property(role + ".gain_rx2", 64.0)), + freq_(configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ))), + sample_rate_(configuration->property(role + ".sampling_frequency", static_cast(2600000))), + bandwidth_(configuration->property(role + ".bandwidth", static_cast(2000000))), + buffer_size_(configuration->property(role + ".buffer_size", 0xA0000)), + Fpass_(configuration->property(role + ".Fpass", 0.0)), + Fstop_(configuration->property(role + ".Fstop", 0.0)), + in_stream_(in_stream), + out_stream_(out_stream), + RF_channels_(configuration->property(role + ".RF_channels", 1)), + scale_dds_dbfs_(configuration->property(role + ".scale_dds_dbfs", 0.0)), + phase_dds_deg_(configuration->property(role + ".phase_dds_deg", 0.0)), + tx_attenuation_db_(configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db)), + freq_dds_tx_hz_(configuration->property(role + ".freq_dds_tx_hz", static_cast(10000))), + freq_rf_tx_hz_(configuration->property(role + ".freq_rf_tx_hz", static_cast(GPS_L1_FREQ_HZ - GPS_L2_FREQ_HZ - freq_dds_tx_hz_))), + tx_bandwidth_(configuration->property(role + ".tx_bandwidth", static_cast(500000))), + enable_dds_lo_(configuration->property(role + ".enable_dds_lo", false)), + rx1_en_(configuration->property(role + ".rx1_enable", true)), + rx2_en_(configuration->property(role + ".rx2_enable", false)), + quadrature_(configuration->property(role + ".quadrature", true)), + rf_dc_(configuration->property(role + ".rf_dc", true)), + bb_dc_(configuration->property(role + ".bb_dc", true)), + filter_auto_(configuration->property(role + ".filter_auto", false)), + rf_shutdown_(configuration->property(role + ".rf_shutdown", FLAGS_rf_shutdown)), + dump_(configuration->property(role + ".dump", false)) { - const std::string default_item_type("gr_complex"); - const std::string default_dump_file("./data/signal_source.dat"); - const std::string default_gain_mode("slow_attack"); - const double default_tx_attenuation_db = -10.0; - uri_ = configuration->property(role + ".device_address", std::string("192.168.2.1")); - freq_ = configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ)); - sample_rate_ = configuration->property(role + ".sampling_frequency", static_cast(2600000)); - bandwidth_ = configuration->property(role + ".bandwidth", static_cast(2000000)); - rx1_en_ = configuration->property(role + ".rx1_enable", true); - rx2_en_ = configuration->property(role + ".rx2_enable", false); - buffer_size_ = configuration->property(role + ".buffer_size", 0xA0000); - quadrature_ = configuration->property(role + ".quadrature", true); - rf_dc_ = configuration->property(role + ".rf_dc", true); - bb_dc_ = configuration->property(role + ".bb_dc", true); - RF_channels_ = configuration->property(role + ".RF_channels", 1); - gain_mode_rx1_ = configuration->property(role + ".gain_mode_rx1", default_gain_mode); - gain_mode_rx2_ = configuration->property(role + ".gain_mode_rx2", default_gain_mode); - rf_gain_rx1_ = configuration->property(role + ".gain_rx1", 64.0); - rf_gain_rx2_ = configuration->property(role + ".gain_rx2", 64.0); - rf_port_select_ = configuration->property(role + ".rf_port_select", std::string("A_BALANCED")); - filter_file_ = configuration->property(role + ".filter_file", std::string("")); - filter_auto_ = configuration->property(role + ".filter_auto", false); if (filter_auto_) { filter_source_ = configuration->property(role + ".filter_source", std::string("Auto")); @@ -68,27 +81,6 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(const ConfigurationInterface *configu { filter_source_ = configuration->property(role + ".filter_source", std::string("Off")); } - filter_filename_ = configuration->property(role + ".filter_filename", filter_file_); - Fpass_ = configuration->property(role + ".Fpass", 0.0); - Fstop_ = configuration->property(role + ".Fstop", 0.0); - - item_type_ = configuration->property(role + ".item_type", default_item_type); - samples_ = configuration->property(role + ".samples", static_cast(0)); - dump_ = configuration->property(role + ".dump", false); - dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); - - // AD9361 Local Oscillator generation for dual band operation - enable_dds_lo_ = configuration->property(role + ".enable_dds_lo", false); - freq_dds_tx_hz_ = configuration->property(role + ".freq_dds_tx_hz", static_cast(10000)); - freq_rf_tx_hz_ = configuration->property(role + ".freq_rf_tx_hz", static_cast(GPS_L1_FREQ_HZ - GPS_L2_FREQ_HZ - freq_dds_tx_hz_)); - scale_dds_dbfs_ = configuration->property(role + ".scale_dds_dbfs", 0.0); - phase_dds_deg_ = configuration->property(role + ".phase_dds_deg", 0.0); - tx_attenuation_db_ = configuration->property(role + ".tx_attenuation_db", default_tx_attenuation_db); - tx_bandwidth_ = configuration->property(role + ".tx_bandwidth", static_cast(500000)); - - rf_shutdown_ = configuration->property(role + ".rf_shutdown", FLAGS_rf_shutdown); - - item_size_ = sizeof(gr_complex); // some basic checks if ((rf_port_select_ != "A_BALANCED") && (rf_port_select_ != "B_BALANCED") && (rf_port_select_ != "A_N") && (rf_port_select_ != "B_N") && (rf_port_select_ != "B_P") && (rf_port_select_ != "C_N") && (rf_port_select_ != "C_P") && (rf_port_select_ != "TX_MONITOR1") && (rf_port_select_ != "TX_MONITOR2") && (rf_port_select_ != "TX_MONITOR1_2")) @@ -181,6 +173,10 @@ Fmcomms2SignalSource::Fmcomms2SignalSource(const ConfigurationInterface *configu { LOG(FATAL) << "Configuration error: both rx1 and rx2 are enabled but RF_channels=1 !"; } + else if (!rx1_en_ && !rx2_en_) + { + LOG(FATAL) << "Configuration error: both rx1 and rx2 are disabled."; + } else { #if GNURADIO_API_IIO diff --git a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h index 5bdd6993d..4bfc78cda 100644 --- a/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h +++ b/src/algorithms/signal_source/adapters/fmcomms2_signal_source.h @@ -61,6 +61,9 @@ public: gr::basic_block_sptr get_right_block() override; private: + const std::string default_gain_mode = std::string("slow_attack"); + const double default_tx_attenuation_db = -10.0; + #if GNURADIO_API_IIO #if GR_IIO_TEMPLATIZED_API gr::iio::fmcomms2_source::sptr fmcomms2_source_f32c_; @@ -88,9 +91,6 @@ private: int64_t samples_; size_t item_size_; - unsigned int in_stream_; - unsigned int out_stream_; - double rf_gain_rx1_; double rf_gain_rx2_; uint64_t freq_; // frequency of local oscilator @@ -99,14 +99,16 @@ private: uint64_t buffer_size_; // reception buffer float Fpass_; float Fstop_; + unsigned int in_stream_; + unsigned int out_stream_; int RF_channels_; // DDS configuration for LO generation for external mixer double scale_dds_dbfs_; double phase_dds_deg_; double tx_attenuation_db_; - uint64_t freq_rf_tx_hz_; uint64_t freq_dds_tx_hz_; + uint64_t freq_rf_tx_hz_; uint64_t tx_bandwidth_; bool enable_dds_lo_; diff --git a/src/algorithms/signal_source/adapters/limesdr_signal_source.cc b/src/algorithms/signal_source/adapters/limesdr_signal_source.cc index 1912f4dbb..28b57716d 100644 --- a/src/algorithms/signal_source/adapters/limesdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/limesdr_signal_source.cc @@ -16,12 +16,12 @@ #include "limesdr_signal_source.h" #include "configuration_interface.h" +#include "gnss_frequencies.h" #include "gnss_sdr_string_literals.h" #include "gnss_sdr_valve.h" #include #include #include -#include using namespace std::string_literals; @@ -31,33 +31,25 @@ LimesdrSignalSource::LimesdrSignalSource(const ConfigurationInterface* configura unsigned int out_stream, Concurrent_Queue* queue) : SignalSourceBase(configuration, role, "Limesdr_Signal_Source"s), + item_type_(configuration->property(role + ".item_type", std::string("gr_complex"))), + dump_filename_(configuration->property(role + ".dump_filename", std::string("./data/signal_source.dat"))), + limesdr_serial_(configuration->property(role + ".limesdr_serial", std::string())), + limesdr_file_(configuration->property(role + ".limesdr_file", std::string())), + sample_rate_(configuration->property(role + ".sampling_frequency", 2.0e6)), + freq_(configuration->property(role + ".freq", FREQ1)), + gain_(configuration->property(role + ".gain", 40.0)), + analog_bw_hz_(configuration->property(role + ".analog_bw", sample_rate_ / 2.0)), // LPF analog filters in I,Q branches + digital_bw_hz_(configuration->property(role + ".digital_bw", 0.0)), // disable by default + ext_clock_MHz_(configuration->property(role + ".ext_clock_MHz", 0.0)), // external clock: 0.0 MHz will enable the internal clock + samples_(configuration->property(role + ".samples", int64_t(0))), in_stream_(in_stream), - out_stream_(out_stream) + out_stream_(out_stream), + limechannel_mode_(configuration->property(role + ".limechannel_mode", 0)), + antenna_(configuration->property(role + ".antenna", 255)), + channel_(configuration->property(role + ".channel", 0)), + PPS_mode_(configuration->property(role + ".PPS_mode", false)), + dump_(configuration->property(role + ".dump", false)) { - // DUMP PARAMETERS - const std::string empty; - const std::string default_dump_file("./data/signal_source.dat"); - const std::string default_item_type("gr_complex"); - samples_ = configuration->property(role + ".samples", static_cast(0)); - dump_ = configuration->property(role + ".dump", false); - dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); - - // Driver parameters - channel_ = configuration->property(role + ".channel", 0); - freq_ = configuration->property(role + ".freq", 1575420000); - gain_ = configuration->property(role + ".gain", 40.0); - sample_rate_ = configuration->property(role + ".sampling_frequency", 2.0e6); - // todo: check if bw is within limits - analog_bw_hz_ = configuration->property(role + ".analog_bw", sample_rate_ / 2); // LPF analog filters in I,Q branches - digital_bw_hz_ = configuration->property(role + ".digital_bw", 0); // disable by default - item_type_ = configuration->property(role + ".item_type", default_item_type); - limesdr_serial_ = configuration->property(role + ".limesdr_serial", std::string()); - limesdr_file_ = configuration->property(role + ".limesdr_file", std::string()); - antenna_ = configuration->property(role + ".antenna", 255); - - PPS_mode_ = configuration->property(role + ".PPS_mode", false); - ext_clock_MHz_ = configuration->property(role + ".ext_clock_MHz", 0.0); // external clock: 0.0 MHz will enable the internal clock - limechannel_mode_ = configuration->property(role + ".limechannel_mode", 0); if ((limechannel_mode_ < 0) || (limechannel_mode_ > 2)) { std::cerr << "ERROR: source_impl::source_impl(): ChannelMode must be A(0), B(1) or (A+B) MIMO(2)\n"; diff --git a/src/algorithms/signal_source/adapters/limesdr_signal_source.h b/src/algorithms/signal_source/adapters/limesdr_signal_source.h index 6f87fa55b..cf059111d 100644 --- a/src/algorithms/signal_source/adapters/limesdr_signal_source.h +++ b/src/algorithms/signal_source/adapters/limesdr_signal_source.h @@ -63,13 +63,10 @@ private: gnss_shared_ptr valve_; gr::blocks::file_sink::sptr file_sink_; - std::string role_; std::string item_type_; std::string dump_filename_; std::string limesdr_serial_; std::string limesdr_file_; - int antenna_; - int channel_; // Front-end settings double sample_rate_; @@ -85,6 +82,8 @@ private: unsigned int out_stream_; int limechannel_mode_; + int antenna_; + int channel_; bool PPS_mode_; bool dump_; diff --git a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc index 8db9bc0ee..bacc63f88 100644 --- a/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/osmosdr_signal_source.cc @@ -23,7 +23,6 @@ #include #include #include -#include using namespace std::string_literals; @@ -32,28 +31,22 @@ using namespace std::string_literals; OsmosdrSignalSource::OsmosdrSignalSource(const ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, Concurrent_Queue* queue) - : SignalSourceBase(configuration, role, "Osmosdr_Signal_Source"s), in_stream_(in_stream), out_stream_(out_stream) + : SignalSourceBase(configuration, role, "Osmosdr_Signal_Source"s), + item_type_(configuration->property(role + ".item_type", std::string("gr_complex"))), + dump_filename_(configuration->property(role + ".dump_filename", std::string("./data/signal_source.dat"))), + osmosdr_args_(configuration->property(role + ".osmosdr_args", std::string())), + antenna_(configuration->property(role + ".antenna", std::string())), + sample_rate_(configuration->property(role + ".sampling_frequency", 2.0e6)), + freq_(configuration->property(role + ".freq", GPS_L1_FREQ_HZ)), + gain_(configuration->property(role + ".gain", 40.0)), + if_gain_(configuration->property(role + ".if_gain", 40.0)), + rf_gain_(configuration->property(role + ".rf_gain", 40.0)), + samples_(configuration->property(role + ".samples", static_cast(0))), + in_stream_(in_stream), + out_stream_(out_stream), + AGC_enabled_(configuration->property(role + ".AGC_enabled", true)), + dump_(configuration->property(role + ".dump", false)) { - // DUMP PARAMETERS - const std::string empty; - const std::string default_dump_file("./data/signal_source.dat"); - const std::string default_item_type("gr_complex"); - samples_ = configuration->property(role + ".samples", static_cast(0)); - dump_ = configuration->property(role + ".dump", false); - dump_filename_ = configuration->property(role + ".dump_filename", - default_dump_file); - - // OSMOSDR Driver parameters - AGC_enabled_ = configuration->property(role + ".AGC_enabled", true); - freq_ = configuration->property(role + ".freq", GPS_L1_FREQ_HZ); - gain_ = configuration->property(role + ".gain", 40.0); - rf_gain_ = configuration->property(role + ".rf_gain", 40.0); - if_gain_ = configuration->property(role + ".if_gain", 40.0); - sample_rate_ = configuration->property(role + ".sampling_frequency", 2.0e6); - item_type_ = configuration->property(role + ".item_type", default_item_type); - osmosdr_args_ = configuration->property(role + ".osmosdr_args", std::string()); - antenna_ = configuration->property(role + ".antenna", empty); - if (item_type_ == "short") { item_size_ = sizeof(int16_t); diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc index 0343f8154..fd69989f7 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.cc @@ -22,7 +22,6 @@ #include "gnss_sdr_valve.h" #include #include -#include using namespace std::string_literals; @@ -31,23 +30,30 @@ using namespace std::string_literals; PlutosdrSignalSource::PlutosdrSignalSource(const ConfigurationInterface* configuration, const std::string& role, unsigned int in_stream, unsigned int out_stream, Concurrent_Queue* queue) - : SignalSourceBase(configuration, role, "Plutosdr_Signal_Source"s), in_stream_(in_stream), out_stream_(out_stream) + : SignalSourceBase(configuration, role, "Plutosdr_Signal_Source"s), + dump_filename_(configuration->property(role + ".dump_filename", std::string("./data/signal_source.dat"))), + uri_(configuration->property(role + ".device_address", std::string("192.168.2.1"))), + gain_mode_(configuration->property(role + ".gain_mode", default_gain_mode)), + filter_file_(configuration->property(role + ".filter_file", std::string(""))), + filter_filename_(configuration->property(role + ".filter_filename", filter_file_)), + item_type_(configuration->property(role + ".item_type", std::string("gr_complex"))), + rf_gain_(configuration->property(role + ".gain", 50.0)), + samples_(configuration->property(role + ".samples", static_cast(0))), + freq_(configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ))), + sample_rate_(configuration->property(role + ".sampling_frequency", static_cast(3000000))), + bandwidth_(configuration->property(role + ".bandwidth", static_cast(2000000))), + buffer_size_(configuration->property(role + ".buffer_size", 0xA0000)), + item_size_(sizeof(gr_complex)), + Fpass_(configuration->property(role + ".Fpass", 0.0)), + Fstop_(configuration->property(role + ".Fstop", 0.0)), + in_stream_(in_stream), + out_stream_(out_stream), + quadrature_(configuration->property(role + ".quadrature", true)), + rf_dc_(configuration->property(role + ".rf_dc", true)), + bb_dc_(configuration->property(role + ".bb_dc", true)), + filter_auto_(configuration->property(role + ".filter_auto", false)), + dump_(configuration->property(role + ".dump", false)) { - const std::string default_item_type("gr_complex"); - const std::string default_dump_file("./data/signal_source.dat"); - const std::string default_gain_mode("slow_attack"); - uri_ = configuration->property(role + ".device_address", std::string("192.168.2.1")); - freq_ = configuration->property(role + ".freq", static_cast(GPS_L1_FREQ_HZ)); - sample_rate_ = configuration->property(role + ".sampling_frequency", static_cast(3000000)); - bandwidth_ = configuration->property(role + ".bandwidth", static_cast(2000000)); - buffer_size_ = configuration->property(role + ".buffer_size", 0xA0000); - quadrature_ = configuration->property(role + ".quadrature", true); - rf_dc_ = configuration->property(role + ".rf_dc", true); - bb_dc_ = configuration->property(role + ".bb_dc", true); - gain_mode_ = configuration->property(role + ".gain_mode", default_gain_mode); - rf_gain_ = configuration->property(role + ".gain", 50.0); - filter_file_ = configuration->property(role + ".filter_file", std::string("")); - filter_auto_ = configuration->property(role + ".filter_auto", false); if (filter_auto_) { filter_source_ = configuration->property(role + ".filter_source", std::string("Auto")); @@ -56,13 +62,6 @@ PlutosdrSignalSource::PlutosdrSignalSource(const ConfigurationInterface* configu { filter_source_ = configuration->property(role + ".filter_source", std::string("Off")); } - filter_filename_ = configuration->property(role + ".filter_filename", filter_file_); - Fpass_ = configuration->property(role + ".Fpass", 0.0); - Fstop_ = configuration->property(role + ".Fstop", 0.0); - item_type_ = configuration->property(role + ".item_type", default_item_type); - samples_ = configuration->property(role + ".samples", static_cast(0)); - dump_ = configuration->property(role + ".dump", false); - dump_filename_ = configuration->property(role + ".dump_filename", default_dump_file); if (item_type_ != "gr_complex") { @@ -117,8 +116,6 @@ PlutosdrSignalSource::PlutosdrSignalSource(const ConfigurationInterface* configu LOG(WARNING) << "Invalid configuration value for bandwidth parameter. Set to bandwidth=2000000"; } - item_size_ = sizeof(gr_complex); - std::cout << "device address: " << uri_ << '\n'; std::cout << "frequency : " << freq_ << " Hz\n"; std::cout << "sample rate: " << sample_rate_ << " Sps\n"; diff --git a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h index c9d85a1d0..96e6702ae 100644 --- a/src/algorithms/signal_source/adapters/plutosdr_signal_source.h +++ b/src/algorithms/signal_source/adapters/plutosdr_signal_source.h @@ -66,6 +66,7 @@ public: gr::basic_block_sptr get_right_block() override; private: + const std::string default_gain_mode = std::string("slow_attack"); #if GR_IIO_TEMPLATIZED_API gr::iio::fmcomms2_source::sptr plutosdr_source_; #else From f2f02e5ba67c660cc5e2e3223f8e071d9456eb01 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Tue, 28 Dec 2021 19:15:43 +0100 Subject: [PATCH 6/6] Fix counting of valid acquisitions --- .../acquisition/acq_performance_test.cc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc index e3bd0268f..327ffade0 100644 --- a/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc +++ b/src/tests/unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc @@ -266,7 +266,7 @@ protected: pfa_vector.push_back(FLAGS_acq_test_pfa_init * std::pow(10, aux)); aux = aux + 1.0; } - pfa_vector.push_back(1.0); + pfa_vector.push_back(0.999); } else { @@ -292,7 +292,7 @@ protected: { aux2 = floor((generated_signal_duration_s * ms_per_s - 100) / (FLAGS_acq_test_coherent_time_ms * FLAGS_acq_test_max_dwells) - 1); } - if ((FLAGS_acq_test_num_meas > 0) and (FLAGS_acq_test_num_meas < aux2)) + if ((FLAGS_acq_test_num_meas > 0) && (FLAGS_acq_test_num_meas < aux2)) { num_of_measurements = static_cast(FLAGS_acq_test_num_meas); } @@ -947,7 +947,7 @@ TEST_F(AcquisitionPerformanceTest, ROC) // Cut measurements without reference for (int i = 0; i < num_executions; i++) { - if (!std::isnan(doppler_estimation_error(i)) and !std::isnan(delay_estimation_error(i))) + if (!std::isnan(doppler_estimation_error(i)) && !std::isnan(delay_estimation_error(i))) { num_clean_executions++; } @@ -957,7 +957,7 @@ TEST_F(AcquisitionPerformanceTest, ROC) num_clean_executions = 0; for (int i = 0; i < num_executions; i++) { - if (!std::isnan(doppler_estimation_error(i)) and !std::isnan(delay_estimation_error(i))) + if (!std::isnan(doppler_estimation_error(i)) && !std::isnan(delay_estimation_error(i))) { clean_doppler_estimation_error(num_clean_executions) = doppler_estimation_error(i); clean_delay_estimation_error(num_clean_executions) = delay_estimation_error(i); @@ -999,10 +999,9 @@ TEST_F(AcquisitionPerformanceTest, ROC) { arma::vec correct_acq = arma::zeros(num_executions, 1); double correctly_detected = 0.0; - for (int i = 0; i < num_clean_executions - 1; i++) - + for (int i = 0; i < num_clean_executions; i++) { - if (abs(clean_delay_estimation_error(i)) < 0.5 and abs(clean_doppler_estimation_error(i)) < static_cast(config->property("Acquisition.doppler_step", 1))) + if (abs(clean_delay_estimation_error(i)) < 0.5 && abs(clean_doppler_estimation_error(i)) < static_cast(config->property("Acquisition.doppler_step", 1))) { correctly_detected = correctly_detected + 1.0; } @@ -1038,7 +1037,7 @@ TEST_F(AcquisitionPerformanceTest, ROC) float sum_pd = static_cast(std::accumulate(meas_Pd_.begin(), meas_Pd_.end(), 0.0)); float sum_pd_correct = static_cast(std::accumulate(meas_Pd_correct_.begin(), meas_Pd_correct_.end(), 0.0)); float sum_pfa = static_cast(std::accumulate(meas_Pfa_.begin(), meas_Pfa_.end(), 0.0)); - if (!meas_Pd_.empty() and !meas_Pfa_.empty()) + if (!meas_Pd_.empty() && !meas_Pfa_.empty()) { Pd[cn0_index][pfa_iter] = sum_pd / static_cast(meas_Pd_.size()); Pfa[cn0_index][pfa_iter] = sum_pfa / static_cast(meas_Pfa_.size());