mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 15:23:04 +00:00 
			
		
		
		
	Extend GPS L1 CA Pull-in test to support external signal file. Add GNUPlot interface function to disable the screen output
This commit is contained in:
		| @@ -218,6 +218,7 @@ public: | ||||
|         const std::string &labely = "y", | ||||
|         const std::string &labelz = "z"); | ||||
|  | ||||
|  | ||||
|     /// destructor: needed to delete temporary files | ||||
|     ~Gnuplot(); | ||||
|  | ||||
| @@ -246,6 +247,9 @@ public: | ||||
|     /// sets terminal type to terminal_std | ||||
|     Gnuplot &showonscreen();  // window output is set by default (win/x11/aqua) | ||||
|  | ||||
|     /// sets terminal type to unknown (disable the screen output) | ||||
|     Gnuplot &disablescreen(); | ||||
|  | ||||
|     /// saves a gnuplot session to a postscript file, filename without extension | ||||
|     Gnuplot &savetops(const std::string &filename = "gnuplot_output"); | ||||
|  | ||||
| @@ -1195,6 +1199,17 @@ Gnuplot &Gnuplot::set_smooth(const std::string &stylestr) | ||||
| } | ||||
|  | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // | ||||
| // Disable screen output | ||||
| // | ||||
| Gnuplot &Gnuplot::disablescreen() | ||||
| { | ||||
|     cmd("set output"); | ||||
|     cmd("set terminal unknown"); | ||||
|     return *this; | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------------ | ||||
| // | ||||
| // sets terminal type to windows / x11 | ||||
|   | ||||
| @@ -44,6 +44,7 @@ | ||||
| #include "GPS_L1_CA.h" | ||||
| #include "gnss_block_factory.h" | ||||
| #include "tracking_interface.h" | ||||
| #include "gps_l1_ca_pcps_acquisition_fine_doppler.h" | ||||
| #include "in_memory_configuration.h" | ||||
| #include "tracking_true_obs_reader.h" | ||||
| #include "tracking_dump_reader.h" | ||||
| @@ -52,7 +53,59 @@ | ||||
| #include "test_flags.h" | ||||
| #include "tracking_tests_flags.h" | ||||
|  | ||||
| // ######## GNURADIO BLOCK MESSAGE RECEVER ######### | ||||
|  | ||||
| // ######## GNURADIO ACQUISITION BLOCK MESSAGE RECEVER ######### | ||||
| class Acquisition_msg_rx; | ||||
|  | ||||
| typedef boost::shared_ptr<Acquisition_msg_rx> Acquisition_msg_rx_sptr; | ||||
|  | ||||
| Acquisition_msg_rx_sptr Acquisition_msg_rx_make(); | ||||
|  | ||||
|  | ||||
| class Acquisition_msg_rx : public gr::block | ||||
| { | ||||
| private: | ||||
|     friend Acquisition_msg_rx_sptr Acquisition_msg_rx_make(); | ||||
|     void msg_handler_events(pmt::pmt_t msg); | ||||
|     Acquisition_msg_rx(); | ||||
|  | ||||
| public: | ||||
|     int rx_message; | ||||
|     ~Acquisition_msg_rx();  //!< Default destructor | ||||
| }; | ||||
|  | ||||
|  | ||||
| Acquisition_msg_rx_sptr Acquisition_msg_rx_make() | ||||
| { | ||||
|     return Acquisition_msg_rx_sptr(new Acquisition_msg_rx()); | ||||
| } | ||||
|  | ||||
|  | ||||
| void Acquisition_msg_rx::msg_handler_events(pmt::pmt_t msg) | ||||
| { | ||||
|     try | ||||
|         { | ||||
|             long int message = pmt::to_long(msg); | ||||
|             rx_message = message; | ||||
|         } | ||||
|     catch (boost::bad_any_cast& e) | ||||
|         { | ||||
|             LOG(WARNING) << "msg_handler_acquisition Bad cast!\n"; | ||||
|             rx_message = 0; | ||||
|         } | ||||
| } | ||||
|  | ||||
|  | ||||
| Acquisition_msg_rx::Acquisition_msg_rx() : gr::block("Acquisition_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0)) | ||||
| { | ||||
|     this->message_port_register_in(pmt::mp("events")); | ||||
|     this->set_msg_handler(pmt::mp("events"), boost::bind(&Acquisition_msg_rx::msg_handler_events, this, _1)); | ||||
|     rx_message = 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| Acquisition_msg_rx::~Acquisition_msg_rx() {} | ||||
| // ######## GNURADIO TRACKING BLOCK MESSAGE RECEVER ######### | ||||
| class GpsL1CADllPllTrackingPullInTest_msg_rx; | ||||
|  | ||||
| typedef boost::shared_ptr<GpsL1CADllPllTrackingPullInTest_msg_rx> GpsL1CADllPllTrackingPullInTest_msg_rx_sptr; | ||||
| @@ -88,7 +141,7 @@ void GpsL1CADllPllTrackingPullInTest_msg_rx::msg_handler_events(pmt::pmt_t msg) | ||||
|         } | ||||
|     catch (boost::bad_any_cast& e) | ||||
|         { | ||||
|             LOG(WARNING) << "msg_handler_telemetry Bad any cast!"; | ||||
|             LOG(WARNING) << "msg_handler_tracking Bad cast!"; | ||||
|             rx_message = 0; | ||||
|         } | ||||
| } | ||||
| @@ -126,6 +179,10 @@ public: | ||||
|     std::string filename_rinex_obs = FLAGS_filename_rinex_obs; | ||||
|     std::string filename_raw_data = FLAGS_filename_raw_data; | ||||
|  | ||||
|     std::map<int, double> doppler_measurements_map; | ||||
|     std::map<int, double> code_delay_measurements_map; | ||||
|     std::map<int, unsigned long int> acq_samplestamp_map; | ||||
|  | ||||
|     int configure_generator(double CN0_dBHz, int file_idx); | ||||
|     int generate_signal(); | ||||
|     std::vector<double> check_results_doppler(arma::vec& true_time_s, | ||||
| @@ -165,6 +222,7 @@ public: | ||||
|         double DLL_narrow_bw_hz, | ||||
|         int extend_correlation_symbols); | ||||
|  | ||||
|     bool acquire_GPS_L1CA_signal(int SV_ID); | ||||
|     gr::top_block_sptr top_block; | ||||
|     std::shared_ptr<GNSSBlockFactory> factory; | ||||
|     std::shared_ptr<InMemoryConfiguration> config; | ||||
| @@ -259,12 +317,120 @@ void GpsL1CADllPllTrackingPullInTest::configure_receiver( | ||||
| } | ||||
|  | ||||
|  | ||||
| bool GpsL1CADllPllTrackingPullInTest::acquire_GPS_L1CA_signal(int SV_ID) | ||||
| { | ||||
|     // 1. Setup GNU Radio flowgraph (file_source -> Acquisition_10m) | ||||
|     gr::top_block_sptr top_block; | ||||
|     top_block = gr::make_top_block("Acquisition test"); | ||||
|  | ||||
|     // Satellite signal definition | ||||
|     Gnss_Synchro tmp_gnss_synchro; | ||||
|     tmp_gnss_synchro.Channel_ID = 0; | ||||
|     tmp_gnss_synchro.System = 'G'; | ||||
|     std::string signal = "1C"; | ||||
|     signal.copy(tmp_gnss_synchro.Signal, 2, 0); | ||||
|     tmp_gnss_synchro.PRN = SV_ID; | ||||
|  | ||||
|     config = std::make_shared<InMemoryConfiguration>(); | ||||
|     config->set_property("GNSS-SDR.internal_fs_sps", std::to_string(baseband_sampling_freq)); | ||||
|  | ||||
|     GNSSBlockFactory block_factory; | ||||
|     GpsL1CaPcpsAcquisitionFineDoppler* acquisition; | ||||
|     acquisition = new GpsL1CaPcpsAcquisitionFineDoppler(config.get(), "Acquisition", 1, 1); | ||||
|  | ||||
|     acquisition->set_channel(1); | ||||
|     acquisition->set_gnss_synchro(&tmp_gnss_synchro); | ||||
|     acquisition->set_threshold(config->property("Acquisition.threshold", 0.05)); | ||||
|     acquisition->set_doppler_max(config->property("Acquisition.doppler_max", 10000)); | ||||
|     acquisition->set_doppler_step(config->property("Acquisition.doppler_step", 250)); | ||||
|  | ||||
|     boost::shared_ptr<Acquisition_msg_rx> msg_rx; | ||||
|     try | ||||
|         { | ||||
|             msg_rx = Acquisition_msg_rx_make(); | ||||
|         } | ||||
|     catch (const std::exception& e) | ||||
|         { | ||||
|             std::cout << "Failure connecting the message port system: " << e.what() << std::endl; | ||||
|             exit(0); | ||||
|         } | ||||
|  | ||||
|     gr::blocks::file_source::sptr file_source; | ||||
|     std::string file = FLAGS_filename_raw_data; | ||||
|     const char* file_name = file.c_str(); | ||||
|     file_source = gr::blocks::file_source::make(sizeof(int8_t), file_name, false); | ||||
|     gr::blocks::interleaved_char_to_complex::sptr gr_interleaved_char_to_complex = gr::blocks::interleaved_char_to_complex::make(); | ||||
|     gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro)); | ||||
|     top_block->connect(file_source, 0, gr_interleaved_char_to_complex, 0); | ||||
|     top_block->connect(gr_interleaved_char_to_complex, 0, acquisition->get_left_block(), 0); | ||||
|     top_block->msg_connect(acquisition->get_left_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); | ||||
|  | ||||
|     // 5. Run the flowgraph | ||||
|     // Get visible GPS satellites (positive acquisitions with Doppler measurements) | ||||
|     // record startup time | ||||
|     std::chrono::time_point<std::chrono::system_clock> start, end; | ||||
|     std::chrono::duration<double> elapsed_seconds; | ||||
|     start = std::chrono::system_clock::now(); | ||||
|  | ||||
|     bool start_msg = true; | ||||
|  | ||||
|     doppler_measurements_map.clear(); | ||||
|     code_delay_measurements_map.clear(); | ||||
|     acq_samplestamp_map.clear(); | ||||
|  | ||||
|     for (unsigned int PRN = 1; PRN < 33; PRN++) | ||||
|         { | ||||
|             tmp_gnss_synchro.PRN = PRN; | ||||
|             acquisition->set_gnss_synchro(&tmp_gnss_synchro); | ||||
|             acquisition->init(); | ||||
|             acquisition->set_local_code(); | ||||
|             acquisition->reset(); | ||||
|             msg_rx->rx_message = 0; | ||||
|             top_block->run(); | ||||
|             if (start_msg == true) | ||||
|                 { | ||||
|                     std::cout << "Reading external signal file: " << FLAGS_filename_raw_data << std::endl; | ||||
|                     std::cout << "Searching for GPS Satellites in L1 band..." << std::endl; | ||||
|                     std::cout << "["; | ||||
|                     start_msg = false; | ||||
|                 } | ||||
|             while (msg_rx->rx_message == 0) | ||||
|                 { | ||||
|                     usleep(100000); | ||||
|                 } | ||||
|             if (msg_rx->rx_message == 1) | ||||
|                 { | ||||
|                     std::cout << " " << PRN << " "; | ||||
|                     doppler_measurements_map.insert(std::pair<int, double>(PRN, tmp_gnss_synchro.Acq_doppler_hz)); | ||||
|                     code_delay_measurements_map.insert(std::pair<int, double>(PRN, tmp_gnss_synchro.Acq_delay_samples)); | ||||
|                     acq_samplestamp_map.insert(std::pair<int, double>(PRN, tmp_gnss_synchro.Acq_samplestamp_samples)); | ||||
|                 } | ||||
|             else | ||||
|                 { | ||||
|                     std::cout << " . "; | ||||
|                 } | ||||
|             top_block->stop(); | ||||
|             file_source->seek(0, 0); | ||||
|             std::cout.flush(); | ||||
|         } | ||||
|     std::cout << "]" << std::endl; | ||||
|  | ||||
|     // report the elapsed time | ||||
|     end = std::chrono::system_clock::now(); | ||||
|     elapsed_seconds = end - start; | ||||
|     std::cout << "Total signal acquisition run time " | ||||
|               << elapsed_seconds.count() | ||||
|               << " [seconds]" << std::endl; | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
| { | ||||
|     //************************************************* | ||||
|     //***** STEP 2: Prepare the parameters sweep ****** | ||||
|     //***** STEP 1: Prepare the parameters sweep ****** | ||||
|     //************************************************* | ||||
|     std::vector<double> acq_doppler_error_hz_values; | ||||
|     std::vector<double> | ||||
|         acq_doppler_error_hz_values; | ||||
|     std::vector<std::vector<double>> acq_delay_error_chips_values;  //vector of vector | ||||
|  | ||||
|     for (double doppler_hz = FLAGS_Acq_Doppler_error_hz_start; doppler_hz >= FLAGS_Acq_Doppler_error_hz_stop; doppler_hz = doppler_hz + FLAGS_Acq_Doppler_error_hz_step) | ||||
| @@ -280,10 +446,12 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|         } | ||||
|  | ||||
|  | ||||
|     //********************************************* | ||||
|     //***** STEP 3: Generate the input signal ***** | ||||
|     //********************************************* | ||||
|     //*********************************************************** | ||||
|     //***** STEP 2: Generate the input signal (if required) ***** | ||||
|     //*********************************************************** | ||||
|     std::vector<double> generator_CN0_values; | ||||
|     if (FLAGS_enable_external_signal_file) | ||||
|         { | ||||
|             if (FLAGS_CN0_dBHz_start == FLAGS_CN0_dBHz_stop) | ||||
|                 { | ||||
|                     generator_CN0_values.push_back(FLAGS_CN0_dBHz_start); | ||||
| @@ -295,11 +463,19 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|                             generator_CN0_values.push_back(cn0); | ||||
|                         } | ||||
|                 } | ||||
|         } | ||||
|     else | ||||
|         { | ||||
|             generator_CN0_values.push_back(999);  // an external input signal capture is selected, no CN0 information available | ||||
|         } | ||||
|  | ||||
|     // use generator or use an external capture file | ||||
|     if (FLAGS_enable_external_signal_file) | ||||
|         { | ||||
|             //todo: create and configure an acquisition block and perform an acquisition to obtain the synchronization parameters | ||||
|             //create and configure an acquisition block and perform an acquisition to obtain the synchronization parameters | ||||
|             ASSERT_EQ(acquire_GPS_L1CA_signal(FLAGS_test_satellite_PRN), true); | ||||
|             EXPECT_TRUE(doppler_measurements_map.find(FLAGS_test_satellite_PRN) != doppler_measurements_map.end()) | ||||
|                 << "Error: satellite SV: " << FLAGS_test_satellite_PRN << " is not acquired"; | ||||
|         } | ||||
|     else | ||||
|         { | ||||
| @@ -326,6 +502,10 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|     //***** Obtain the initial signal sinchronization parameters (emulating an acquisition) **** | ||||
|     //****************************************************************************************** | ||||
|     int test_satellite_PRN = 0; | ||||
|     double true_acq_doppler_hz = 0.0; | ||||
|     double true_acq_delay_samples = 0.0; | ||||
|     unsigned long int acq_samplestamp_samples = 0; | ||||
|  | ||||
|     tracking_true_obs_reader true_obs_data; | ||||
|     if (!FLAGS_enable_external_signal_file) | ||||
|         { | ||||
| @@ -341,14 +521,21 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|                 << "Maybe sat PRN #" + std::to_string(FLAGS_test_satellite_PRN) + | ||||
|                        " is not available?"; | ||||
|             std::cout << "Testing satellite PRN=" << test_satellite_PRN << std::endl; | ||||
|             std::cout << "True Initial Doppler [Hz]=" << true_obs_data.doppler_l1_hz << " rue Initial code delay [Chips]=" << true_obs_data.prn_delay_chips << std::endl; | ||||
|             std::cout << "True Initial Doppler " << true_obs_data.doppler_l1_hz << "[Hz], true Initial code delay [Chips]=" << true_obs_data.prn_delay_chips << "[Chips]" << std::endl; | ||||
|             true_acq_doppler_hz = true_obs_data.doppler_l1_hz; | ||||
|             true_acq_delay_samples = (GPS_L1_CA_CODE_LENGTH_CHIPS - true_obs_data.prn_delay_chips / GPS_L1_CA_CODE_LENGTH_CHIPS) * static_cast<double>(baseband_sampling_freq) * GPS_L1_CA_CODE_PERIOD; | ||||
|             acq_samplestamp_samples = 0; | ||||
|         } | ||||
|     else | ||||
|         { | ||||
|             //todo: Simulate a perfect acquisition for the external capture file | ||||
|             true_acq_doppler_hz = doppler_measurements_map.find(FLAGS_test_satellite_PRN)->second; | ||||
|             true_acq_delay_samples = code_delay_measurements_map.find(FLAGS_test_satellite_PRN)->second; | ||||
|             acq_samplestamp_samples = 0;  //acq_samplestamp_map.find(FLAGS_test_satellite_PRN)->second; | ||||
|             std::cout << "Estimated Initial Doppler " << true_acq_doppler_hz << "[Hz], estimated Initial code delay " << true_acq_delay_samples << " [Samples]" << std::endl; | ||||
|         } | ||||
|     //CN0 LOOP | ||||
|     std::vector<std::vector<double>> pull_in_results_v_v; | ||||
|  | ||||
|     for (unsigned int current_cn0_idx = 0; current_cn0_idx < generator_CN0_values.size(); current_cn0_idx++) | ||||
|         { | ||||
|             std::vector<double> pull_in_results_v; | ||||
| @@ -356,23 +543,18 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|                 { | ||||
|                     for (unsigned int current_acq_code_error_idx = 0; current_acq_code_error_idx < acq_delay_error_chips_values.at(current_acq_doppler_error_idx).size(); current_acq_code_error_idx++) | ||||
|                         { | ||||
|                             gnss_synchro.Acq_samplestamp_samples = acq_samplestamp_samples; | ||||
|                             //simulate a Doppler error in acquisition | ||||
|                             double acq_doppler_hz = true_obs_data.doppler_l1_hz + acq_doppler_error_hz_values.at(current_acq_doppler_error_idx); | ||||
|                             gnss_synchro.Acq_doppler_hz = true_acq_doppler_hz + acq_doppler_error_hz_values.at(current_acq_doppler_error_idx); | ||||
|                             //simulate Code Delay error in acquisition | ||||
|                             double acq_delay_samples; | ||||
|                             acq_delay_samples = (GPS_L1_CA_CODE_LENGTH_CHIPS - true_obs_data.prn_delay_chips / GPS_L1_CA_CODE_LENGTH_CHIPS) * static_cast<double>(baseband_sampling_freq) * GPS_L1_CA_CODE_PERIOD; | ||||
|                             acq_delay_samples += (acq_delay_error_chips_values.at(current_acq_doppler_error_idx).at(current_acq_code_error_idx) / GPS_L1_CA_CODE_RATE_HZ) * static_cast<double>(baseband_sampling_freq); | ||||
|                             gnss_synchro.Acq_delay_samples = true_acq_delay_samples + (acq_delay_error_chips_values.at(current_acq_doppler_error_idx).at(current_acq_code_error_idx) / GPS_L1_CA_CODE_RATE_HZ) * static_cast<double>(baseband_sampling_freq); | ||||
|  | ||||
|                             //create flowgraph | ||||
|                             top_block = gr::make_top_block("Tracking test"); | ||||
|                             std::shared_ptr<GNSSBlockInterface> trk_ = factory->GetBlock(config, "Tracking_1C", implementation, 1, 1); | ||||
|                             std::shared_ptr<TrackingInterface> tracking = std::dynamic_pointer_cast<TrackingInterface>(trk_); | ||||
|  | ||||
|                             boost::shared_ptr<GpsL1CADllPllTrackingPullInTest_msg_rx> msg_rx = GpsL1CADllPllTrackingPullInTest_msg_rx_make(); | ||||
|  | ||||
|                             gnss_synchro.Acq_delay_samples = acq_delay_samples; | ||||
|                             gnss_synchro.Acq_doppler_hz = acq_doppler_hz; | ||||
|                             gnss_synchro.Acq_samplestamp_samples = 0; | ||||
|  | ||||
|                             ASSERT_NO_THROW({ | ||||
|                                 tracking->set_channel(gnss_synchro.Channel_ID); | ||||
| @@ -386,8 +568,16 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|                                 tracking->connect(top_block); | ||||
|                             }) << "Failure connecting tracking to the top_block."; | ||||
|  | ||||
|                             std::string file; | ||||
|                             ASSERT_NO_THROW({ | ||||
|                                 std::string file = "./" + filename_raw_data + std::to_string(current_cn0_idx); | ||||
|                                 if (!FLAGS_enable_external_signal_file) | ||||
|                                     { | ||||
|                                         file = "./" + filename_raw_data + std::to_string(current_cn0_idx); | ||||
|                                     } | ||||
|                                 else | ||||
|                                     { | ||||
|                                         file = FLAGS_filename_raw_data; | ||||
|                                     } | ||||
|                                 const char* file_name = file.c_str(); | ||||
|                                 gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(int8_t), file_name, false); | ||||
|                                 gr::blocks::interleaved_char_to_complex::sptr gr_interleaved_char_to_complex = gr::blocks::interleaved_char_to_complex::make(); | ||||
| @@ -396,6 +586,8 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|                                 top_block->connect(gr_interleaved_char_to_complex, 0, tracking->get_left_block(), 0); | ||||
|                                 top_block->connect(tracking->get_right_block(), 0, sink, 0); | ||||
|                                 top_block->msg_connect(tracking->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events")); | ||||
|  | ||||
|                                 file_source->seek(acq_samplestamp_samples, 0); | ||||
|                             }) << "Failure connecting the blocks of tracking test."; | ||||
|  | ||||
|  | ||||
| @@ -479,11 +671,19 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|                                                     Gnuplot::set_GNUPlotPath(gnuplot_path); | ||||
|                                                     unsigned int decimate = static_cast<unsigned int>(FLAGS_plot_decimate); | ||||
|  | ||||
|                                                     if (FLAGS_plot_detail_level >= 2) | ||||
|                                                     if (FLAGS_plot_detail_level >= 2 and FLAGS_show_plots) | ||||
|                                                         { | ||||
|                                                             Gnuplot g1("linespoints"); | ||||
|                                                             if (FLAGS_show_plots) g1.showonscreen();  // window output | ||||
|                                                             g1.set_title(std::to_string(generator_CN0_values.at(current_cn0_idx)) + " dB-Hz, " + "PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " Hz" + "GPS L1 C/A (PRN #" + std::to_string(FLAGS_test_satellite_PRN) + ")"); | ||||
|                                                             g1.showonscreen();  // window output | ||||
|                                                             if (!FLAGS_enable_external_signal_file) | ||||
|                                                                 { | ||||
|                                                                     g1.set_title(std::to_string(generator_CN0_values.at(current_cn0_idx)) + " dB-Hz, " + "PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " [Hz], GPS L1 C/A (PRN #" + std::to_string(FLAGS_test_satellite_PRN) + ")"); | ||||
|                                                                 } | ||||
|                                                             else | ||||
|                                                                 { | ||||
|                                                                     g1.set_title("D_e=" + std::to_string(acq_doppler_error_hz_values.at(current_acq_doppler_error_idx)) + " [Hz] " + "T_e= " + std::to_string(acq_delay_error_chips_values.at(current_acq_doppler_error_idx).at(current_acq_code_error_idx)) + " [Chips], PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " [Hz], GPS L1 C/A (PRN #" + std::to_string(FLAGS_test_satellite_PRN) + ")"); | ||||
|                                                                 } | ||||
|  | ||||
|                                                             g1.set_grid(); | ||||
|                                                             g1.set_xlabel("Time [s]"); | ||||
|                                                             g1.set_ylabel("Correlators' output"); | ||||
| @@ -496,8 +696,16 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|                                                             //g1.savetopdf("Correlators_outputs" + std::to_string(generator_CN0_values.at(current_cn0_idx)), 18); | ||||
|  | ||||
|                                                             Gnuplot g2("points"); | ||||
|                                                             if (FLAGS_show_plots) g2.showonscreen();  // window output | ||||
|                                                             g2.set_title(std::to_string(generator_CN0_values.at(current_cn0_idx)) + " dB-Hz Constellation " + "PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " Hz" + "GPS L1 C/A (PRN #" + std::to_string(FLAGS_test_satellite_PRN) + ")"); | ||||
|                                                             g2.showonscreen();  // window output | ||||
|                                                             if (!FLAGS_enable_external_signal_file) | ||||
|                                                                 { | ||||
|                                                                     g2.set_title(std::to_string(generator_CN0_values.at(current_cn0_idx)) + " dB-Hz Constellation " + "PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " [Hz], GPS L1 C/A (PRN #" + std::to_string(FLAGS_test_satellite_PRN) + ")"); | ||||
|                                                                 } | ||||
|                                                             else | ||||
|                                                                 { | ||||
|                                                                     g2.set_title("D_e=" + std::to_string(acq_doppler_error_hz_values.at(current_acq_doppler_error_idx)) + " [Hz] " + "T_e= " + std::to_string(acq_delay_error_chips_values.at(current_acq_doppler_error_idx).at(current_acq_code_error_idx)) + " [Chips], PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " [Hz], GPS L1 C/A (PRN #" + std::to_string(FLAGS_test_satellite_PRN) + ")"); | ||||
|                                                                 } | ||||
|  | ||||
|                                                             g2.set_grid(); | ||||
|                                                             g2.set_xlabel("Inphase"); | ||||
|                                                             g2.set_ylabel("Quadrature"); | ||||
| @@ -507,7 +715,14 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|                                                             //g2.savetopdf("Constellation", 18); | ||||
|  | ||||
|                                                             Gnuplot g3("linespoints"); | ||||
|                                                             if (!FLAGS_enable_external_signal_file) | ||||
|                                                                 { | ||||
|                                                                     g3.set_title(std::to_string(generator_CN0_values.at(current_cn0_idx)) + " dB-Hz, GPS L1 C/A tracking CN0 output (PRN #" + std::to_string(FLAGS_test_satellite_PRN) + ")"); | ||||
|                                                                 } | ||||
|                                                             else | ||||
|                                                                 { | ||||
|                                                                     g3.set_title("D_e=" + std::to_string(acq_doppler_error_hz_values.at(current_acq_doppler_error_idx)) + " [Hz] " + "T_e= " + std::to_string(acq_delay_error_chips_values.at(current_acq_doppler_error_idx).at(current_acq_code_error_idx)) + " [Chips] PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " [Hz], GPS L1 C/A (PRN #" + std::to_string(FLAGS_test_satellite_PRN) + ")"); | ||||
|                                                                 } | ||||
|                                                             g3.set_grid(); | ||||
|                                                             g3.set_xlabel("Time [s]"); | ||||
|                                                             g3.set_ylabel("Reported CN0 [dB-Hz]"); | ||||
| @@ -519,7 +734,7 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|                                                             g3.set_legend(); | ||||
|                                                             //g3.savetops("CN0_output"); | ||||
|                                                             //g3.savetopdf("CN0_output", 18); | ||||
|                                                             if (FLAGS_show_plots) g3.showonscreen();  // window output | ||||
|                                                             g3.showonscreen();  // window output | ||||
|                                                         } | ||||
|                                                 } | ||||
|                                             catch (const GnuplotException& ge) | ||||
| @@ -553,21 +768,45 @@ TEST_F(GpsL1CADllPllTrackingPullInTest, ValidationOfResults) | ||||
|             pull_in_result_mesh = pull_in_results_v_v.at(current_cn0_idx); | ||||
|             //plot grid | ||||
|             Gnuplot g4("points palette pointsize 2 pointtype 7"); | ||||
|             if (FLAGS_show_plots) | ||||
|                 { | ||||
|                     g4.showonscreen();  // window output | ||||
|                 } | ||||
|             else | ||||
|                 { | ||||
|                     g4.disablescreen(); | ||||
|                 } | ||||
|             g4.cmd("set palette defined ( 0 \"black\", 1 \"green\" )"); | ||||
|             g4.cmd("set key off"); | ||||
|             g4.cmd("set view map"); | ||||
|             std::string title("Tracking Pull-in result grid at CN0:" + std::to_string(static_cast<int>(round(generator_CN0_values.at(current_cn0_idx)))) + " dB-Hz, PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " Hz."); | ||||
|             std::string title; | ||||
|             if (!FLAGS_enable_external_signal_file) | ||||
|                 { | ||||
|                     title = std::string("Tracking Pull-in result grid at CN0:" + std::to_string(static_cast<int>(round(generator_CN0_values.at(current_cn0_idx)))) + " [dB-Hz], PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " [Hz]."); | ||||
|                 } | ||||
|             else | ||||
|                 { | ||||
|                     title = std::string("Tracking Pull-in result grid, PLL/DLL BW: " + std::to_string(FLAGS_PLL_bw_hz_start) + "," + std::to_string(FLAGS_DLL_bw_hz_start) + " [Hz], GPS L1 C/A (PRN #" + std::to_string(FLAGS_test_satellite_PRN) + ")"); | ||||
|                 } | ||||
|  | ||||
|             g4.set_title(title); | ||||
|             g4.set_grid(); | ||||
|             g4.set_xlabel("Acquisition Doppler error [Hz]"); | ||||
|             g4.set_ylabel("Acquisition Code Delay error [Chips]"); | ||||
|  | ||||
|             g4.cmd("set cbrange[0:1]"); | ||||
|             g4.plot_xyz(doppler_error_mesh, | ||||
|                 code_delay_error_mesh, | ||||
|                 pull_in_result_mesh); | ||||
|             g4.set_legend(); | ||||
|             if (!FLAGS_enable_external_signal_file) | ||||
|                 { | ||||
|                     g4.savetops("trk_pull_in_grid_" + std::to_string(static_cast<int>(round(generator_CN0_values.at(current_cn0_idx))))); | ||||
|                     g4.savetopdf("trk_pull_in_grid_" + std::to_string(static_cast<int>(round(generator_CN0_values.at(current_cn0_idx)))), 12); | ||||
|             if (FLAGS_show_plots) g4.showonscreen();  // window output | ||||
|                 } | ||||
|             else | ||||
|                 { | ||||
|                     g4.savetops("trk_pull_in_grid_" + FLAGS_filename_raw_data); | ||||
|                     g4.savetopdf("trk_pull_in_grid_" + FLAGS_filename_raw_data, 12); | ||||
|                 } | ||||
|         } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Javier Arribas
					Javier Arribas