[hamradio-commits] [gnss-sdr] 52/126: Linear regressor implemented in observables

Carles Fernandez carles_fernandez-guest at moszumanska.debian.org
Sat Dec 26 18:38:01 UTC 2015


This is an automated email from the git hooks/post-receive script.

carles_fernandez-guest pushed a commit to branch next
in repository gnss-sdr.

commit 15c4882af917919f466b2c73731c903bb2382c5a
Author: Javier Arribas <javiarribas at gmail.com>
Date:   Tue Nov 24 13:37:01 2015 +0100

    Linear regressor implemented in observables
---
 conf/gnss-sdr_Hybrid_byte_sim.conf                 |  2 +-
 .../gnuradio_blocks/gps_l1_ca_observables_cc.cc    | 51 +++++++++++++++++++---
 .../gps_l1_ca_telemetry_decoder_cc.cc              | 15 ++++++-
 .../gps_l1_ca_telemetry_decoder_cc.h               |  1 +
 .../gps_l1_ca_dll_pll_artemisa_tracking_cc.cc      | 10 +++--
 5 files changed, 69 insertions(+), 10 deletions(-)

diff --git a/conf/gnss-sdr_Hybrid_byte_sim.conf b/conf/gnss-sdr_Hybrid_byte_sim.conf
index 186d73a..1ebb882 100644
--- a/conf/gnss-sdr_Hybrid_byte_sim.conf
+++ b/conf/gnss-sdr_Hybrid_byte_sim.conf
@@ -158,7 +158,7 @@ Resampler.sample_freq_out=2600000
 
 ;######### CHANNELS GLOBAL CONFIG ############
 ;#count: Number of available GPS satellite channels.
-Channels_1C.count=6
+Channels_1C.count=10
 ;#count: Number of available Galileo satellite channels.
 Channels_1B.count=0
 ;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver
diff --git a/src/algorithms/observables/gnuradio_blocks/gps_l1_ca_observables_cc.cc b/src/algorithms/observables/gnuradio_blocks/gps_l1_ca_observables_cc.cc
index d11b06c..5e7cc38 100644
--- a/src/algorithms/observables/gnuradio_blocks/gps_l1_ca_observables_cc.cc
+++ b/src/algorithms/observables/gnuradio_blocks/gps_l1_ca_observables_cc.cc
@@ -220,14 +220,55 @@ int gps_l1_ca_observables_cc::general_work (int noutput_items, gr_vector_int &ni
 					desired_symbol_TOW[0]=symbol_TOW_vec_s[GPS_L1_CA_HISTORY_DEEP-1]+delta_rx_time_ms/1000.0;
 					//std::cout<<"desired_symbol_TOW="<<desired_symbol_TOW[0]<<std::endl;
 
-					arma::interp1(symbol_TOW_vec_s,dopper_vec_hz,desired_symbol_TOW,dopper_vec_interp_hz);
-					arma::interp1(symbol_TOW_vec_s,acc_phase_vec_rads,desired_symbol_TOW,acc_phase_vec_interp_rads);
-
+//					arma::interp1(symbol_TOW_vec_s,dopper_vec_hz,desired_symbol_TOW,dopper_vec_interp_hz);
+//					arma::interp1(symbol_TOW_vec_s,acc_phase_vec_rads,desired_symbol_TOW,acc_phase_vec_interp_rads);
+
+					// linear regression
+					arma::mat A=arma::ones<arma::mat> (GPS_L1_CA_HISTORY_DEEP,2);
+					A.col(1)=symbol_TOW_vec_s;
+					arma::mat coef_acc_phase(1,2);
+					coef_acc_phase=arma::pinv(A.t()*A)*A.t()*acc_phase_vec_rads;
+					arma::mat coef_doppler(1,2);
+					coef_doppler=arma::pinv(A.t()*A)*A.t()*dopper_vec_hz;
+					arma::vec acc_phase_lin;
+					arma::vec carrier_doppler_lin;
+					acc_phase_lin=coef_acc_phase[0]+coef_acc_phase[1]*desired_symbol_TOW[0];
+					carrier_doppler_lin=coef_doppler[0]+coef_doppler[1]*desired_symbol_TOW[0];
 					//std::cout<<"acc_phase_vec_interp_rads="<<acc_phase_vec_interp_rads[0]<<std::endl;
 					//std::cout<<"dopper_vec_interp_hz="<<dopper_vec_interp_hz[0]<<std::endl;
 
-					current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_phase_rads =acc_phase_vec_interp_rads[0];
-					current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_Doppler_hz =dopper_vec_interp_hz[0];
+//					if (std::isnan(acc_phase_vec_interp_rads[0]) != true and  std::isnan(dopper_vec_interp_hz[0]) != true)
+//					{
+						current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_phase_rads =acc_phase_lin[0];
+						current_gnss_synchro[gnss_synchro_iter->second.Channel_ID].Carrier_Doppler_hz =carrier_doppler_lin[0];
+//					}else{
+//						std::cout<<"NaN detected in interpolation output, desired_symbol_TOW[0]= "<<desired_symbol_TOW[0]<<std::endl;
+//						std::cout<<"symbol_TOW_vec_s[0]="<<symbol_TOW_vec_s[0]<<std::endl;
+//						std::cout<<"symbol_TOW_vec_s[GPS_L1_CA_HISTORY_DEEP-1]="<<symbol_TOW_vec_s[GPS_L1_CA_HISTORY_DEEP-1]<<std::endl;
+//
+//						for (int n=0;n<symbol_TOW_vec_s.size();n++)
+//						{
+//							if (std::isnan(symbol_TOW_vec_s[n])==true)
+//							{
+//								std::cout<<"NaN detected in symbol_TOW_vec_s index "<<n<<std::endl;
+//								//std::cout<<"symbol_TOW_vec_s="<<symbol_TOW_vec_s<<std::endl;
+//								//std::cout<<"acc_phase_vec_rads="<<acc_phase_vec_rads<<std::endl;
+//							}
+//							if (std::isnan(dopper_vec_hz[n])==true)
+//							{
+//								std::cout<<"NaN detected in dopper_vec_hz index "<<n<<std::endl;
+//								//std::cout<<"symbol_TOW_vec_s="<<symbol_TOW_vec_s<<std::endl;
+//								//std::cout<<"acc_phase_vec_rads="<<acc_phase_vec_rads<<std::endl;
+//							}
+//							if (std::isnan(acc_phase_vec_rads[n])==true)
+//							{
+//								std::cout<<"NaN detected in acc_phase_vec_rads index "<<n<<std::endl;
+//								//std::cout<<"symbol_TOW_vec_s="<<symbol_TOW_vec_s<<std::endl;
+//								//std::cout<<"acc_phase_vec_rads="<<acc_phase_vec_rads<<std::endl;
+//							}
+//						}
+//
+//					}
                 }
 
             }
diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
index 09c34a9..cfc0e75 100644
--- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
+++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
@@ -135,6 +135,7 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(
     d_decimation_output_factor = 1;
     d_channel = 0;
     Prn_timestamp_at_preamble_ms = 0.0;
+    flag_PLL_180_deg_phase_locked=false;
     //set_history(d_samples_per_bit*8); // At least a history of 8 bits are needed to correlate with the preamble
 }
 
@@ -224,6 +225,13 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
                             if (!d_flag_frame_sync)
                                 {
                                     d_flag_frame_sync = true;
+                                    if (corr_value<0)
+                                    {
+                                    	flag_PLL_180_deg_phase_locked=true; //PLL is locked to opposite phase!
+                                    	std::cout<<"PLL in opposite phase for Sat "<<this->d_satellite.get_PRN()<<std::endl;
+                                    }else{
+                                    	flag_PLL_180_deg_phase_locked=false;
+                                    }
                                     LOG(INFO) <<" Frame sync SAT " << this->d_satellite << " with preamble start at " << d_preamble_time_seconds << " [s]";
                                 }
                         }
@@ -331,8 +339,13 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
     current_synchro_data.Flag_valid_word = (d_flag_frame_sync == true and d_flag_parity == true and flag_TOW_set == true);
     current_synchro_data.Flag_preamble = d_flag_preamble;
     current_synchro_data.Prn_timestamp_ms = in[0][0].Tracking_timestamp_secs * 1000.0;
-
     current_synchro_data.Prn_timestamp_at_preamble_ms = Prn_timestamp_at_preamble_ms;
+
+    if (flag_PLL_180_deg_phase_locked==true)
+    {
+    	//correct the accumulated phase for the costas loop phase shift, if required
+    	current_synchro_data.Carrier_phase_rads+=GPS_PI;
+    }
     if(d_dump == true)
         {
             // MULTIPLEXED FILE RECORDING - Record results to file
diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h
index beae778..10f305c 100644
--- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h
+++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.h
@@ -150,6 +150,7 @@ private:
 
     double Prn_timestamp_at_preamble_ms;
     bool flag_TOW_set;
+    bool flag_PLL_180_deg_phase_locked;
 
     std::string d_dump_filename;
     std::ofstream d_dump_file;
diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_artemisa_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_artemisa_tracking_cc.cc
index 282ba21..9cc70d1 100644
--- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_artemisa_tracking_cc.cc
+++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_artemisa_tracking_cc.cc
@@ -345,18 +345,22 @@ int gps_l1_ca_dll_pll_artemisa_tracking_cc::general_work (int noutput_items, gr_
             //carrier phase accumulator for (K) doppler estimation
             //d_acc_carrier_phase_cycles -= (d_carrier_doppler_hz*INTEGRATION_TIME);
             old_d_acc_carrier_phase_cycles=d_acc_carrier_phase_cycles;
-            d_acc_carrier_phase_cycles -= static_cast<double>(d_carrier_doppler_hz)*INTEGRATION_TIME;
+            d_acc_carrier_phase_cycles += static_cast<double>(d_carrier_doppler_hz)*d_current_prn_length_samples/static_cast<double>(d_fs_in);//INTEGRATION_TIME;
             // PLL to DLL assistance [Secs/Ti]
             d_pll_to_dll_assist_secs_Ti = (d_carrier_doppler_hz*GPS_L1_CA_CODE_PERIOD)/GPS_L1_FREQ_HZ;
             // code frequency (include code Doppler estimation here)
-            d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ;
+            d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ);//GPS_L1_CA_CODE_RATE_HZ;
 
             // ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT #######################
             // keep alignment parameters for the next input buffer
+            double T_chip_seconds;
+            double T_prn_seconds;
             double T_prn_samples;
             double K_blk_samples;
             // Compute the next buffer length based in the new period of the PRN sequence and the code phase error estimation
-            T_prn_samples = GPS_L1_CA_CODE_PERIOD * static_cast<double>(d_fs_in);
+            T_chip_seconds = 1 / static_cast<double>(d_code_freq_chips);
+            T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS;
+            T_prn_samples = T_prn_seconds * static_cast<double>(d_fs_in);
             K_blk_samples = T_prn_samples + d_rem_code_phase_samples - static_cast<double>(dll_code_error_secs_Ti) * static_cast<double>(d_fs_in);
             d_current_prn_length_samples = round(K_blk_samples); //round to a discrete samples
             old_d_rem_code_phase_samples=d_rem_code_phase_samples;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-hamradio/gnss-sdr.git



More information about the pkg-hamradio-commits mailing list