2011-11-22 17:21:54 +00:00
/*!
* \ file gps_l1_ca_dll_fll_pll_tracking_cc . cc
2011-12-28 21:36:45 +00:00
* \ brief Implementation of a code DLL + carrier FLL / PLL tracking block
2011-11-22 17:21:54 +00:00
* \ author Javier Arribas , 2011. jarribas ( at ) cttc . es
*
2011-12-28 21:36:45 +00:00
* This file implements the code Delay Locked Loop ( DLL ) + carrier
* Phase Locked Loop ( PLL ) helped with a carrier Frequency Locked Loop ( FLL )
* according to the algorithms described in :
* E . D . Kaplan and C . Hegarty , Understanding GPS . Principles and
2011-11-22 17:21:54 +00:00
* Applications , Second Edition , Artech House Publishers , 2005.
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*
* Copyright ( C ) 2010 - 2011 ( see AUTHORS file for a list of contributors )
*
* GNSS - SDR is a software defined Global Navigation
* Satellite Systems receiver
*
* This file is part of GNSS - SDR .
*
* GNSS - SDR is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* at your option ) any later version .
*
* GNSS - SDR is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with GNSS - SDR . If not , see < http : //www.gnu.org/licenses/>.
*
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*/
2012-01-27 18:01:17 +00:00
# include "gnss_synchro.h"
2011-11-22 17:21:54 +00:00
# include "gps_l1_ca_dll_fll_pll_tracking_cc.h"
# include "gps_sdr_signal_processing.h"
# include "GPS_L1_CA.h"
# include "tracking_discriminators.h"
# include "CN_estimators.h"
# include "tracking_FLL_PLL_filter.h"
# include "control_message_factory.h"
2012-01-16 18:27:31 +00:00
# include "gnss_flowgraph.h"
2011-11-22 17:21:54 +00:00
# include <boost/lexical_cast.hpp>
# include <iostream>
# include <sstream>
# include <cmath>
# include "math.h"
# include <gnuradio/gr_io_signature.h>
# include <glog/log_severity.h>
# include <glog/logging.h>
2012-01-20 16:37:16 +00:00
2011-11-22 17:21:54 +00:00
/*!
* \ todo Include in definition header file
*/
# define CN0_ESTIMATION_SAMPLES 10
- Major changes:
- The executable file and the default configuration file is now changed from "./install/mercurio" and "./conf/mercurio.conf" to "./install/gnss-sdr" and "./conf/gnss-sdr.conf", respectively.
- Configuration file structure changed to define in a single entry the internal sampling frequency (after the signal conditioner). NOTICE that this change affects the all the adapters (acquisition, tracking, telemetry_decoder, observables, and PVT). All the adapters are now modified to work with this feature.
- Moved several in-line GPS L1 CA parameters (a.k.a magic numbers..) to ./src/core/system_parameters/GPS_L1_CA.h definition file.
- Tracking blocks now uses DOUBLE values in their outputs.
- Observables and PVT now are separated. PVT and their associated libraries are moved to ./src/algorithms/PVT
- Temporarily disabled the RINEX output (I am working on that!)
- GNSS-SDR screen output now gives extended debug information of the receiver status and events. In the future, this output will be redirected to a log file.
- Bug fixes:
- FILE_SIGNAL_SOURCE now works correctly when the user configures GNSS-SDR to process the entire file.
- GPS_L1_CA_DLL_PLL now computes correctly the PRN start values.
- GPS_L1_CA_DLL_FLL_PLL now computes correctly the PRN start values.
- Several modifications in GPS_L1_CA_Telemetry_Decoder, GPS_L1_CA_Observables, and GPS_L1_CA_PVT modules to fix the GPS position computation.
- New features
- Tracking blocks perform a signal integrity check against NaN outliers before the correlation process.
- Tracking and PVT binary dump options are now documented and we provide MATLAB libraries and sample files to read it. Available in ./utils/matlab" and "./utils/matlab/libs"
- Observables output rate can be configured. This option enables the GPS L1 CA PVT computation at a maximum rate of 1ms.
- GPS_L1_CA_PVT now can perform a moving average Latitude, Longitude, and Altitude output for each of the Observables output. It is configurable using the configuration file.
- Added Google Earth compatible Keyhole Markup Language (KML) output writer class (./src/algorithms/PVT/libs/kml_printer.h and ./src/algorithms/PVT/libs/kml_printer.cc ). You can see the receiver position directly using Google Earth.
- We provide a master configuration file which includes an in-line documentation with all the new (and old) options. It can be found in ./conf/master.conf
git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@84 64b25241-fba3-4117-9849-534c7e92360d
2011-12-07 17:59:34 +00:00
# define MINIMUM_VALID_CN0 25
# define MAXIMUM_LOCK_FAIL_COUNTER 200
2011-11-22 17:21:54 +00:00
using google : : LogMessage ;
gps_l1_ca_dll_fll_pll_tracking_cc_sptr
2012-01-27 18:01:17 +00:00
gps_l1_ca_dll_fll_pll_make_tracking_cc (
long if_freq ,
long fs_in ,
unsigned
int vector_length ,
gr_msg_queue_sptr queue ,
bool dump , std : : string dump_filename ,
int order ,
float fll_bw_hz ,
float pll_bw_hz ,
float dll_bw_hz ,
float early_late_space_chips )
2012-01-13 00:49:24 +00:00
{
2011-11-22 17:21:54 +00:00
2012-01-27 18:01:17 +00:00
return gps_l1_ca_dll_fll_pll_tracking_cc_sptr ( new Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc ( if_freq ,
2012-01-13 00:49:24 +00:00
fs_in , vector_length , queue , dump , dump_filename , order , fll_bw_hz , pll_bw_hz , dll_bw_hz ,
early_late_space_chips ) ) ;
2011-11-22 17:21:54 +00:00
}
2012-01-13 00:49:24 +00:00
void Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : forecast ( int noutput_items , gr_vector_int & ninput_items_required )
{
2012-01-13 01:28:42 +00:00
ninput_items_required [ 0 ] = d_vector_length * 2 ; //set the required available samples in each call
2011-11-22 17:21:54 +00:00
}
2012-01-13 00:49:24 +00:00
2012-01-27 18:01:17 +00:00
Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc (
long if_freq ,
long fs_in ,
unsigned int vector_length ,
gr_msg_queue_sptr queue ,
bool dump ,
std : : string dump_filename ,
int order ,
float fll_bw_hz ,
float pll_bw_hz ,
float dll_bw_hz ,
2012-01-13 00:49:24 +00:00
float early_late_space_chips ) :
gr_block ( " Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc " , gr_make_io_signature ( 1 , 1 , sizeof ( gr_complex ) ) ,
2012-01-27 18:01:17 +00:00
gr_make_io_signature ( 1 , 1 , sizeof ( Gnss_Synchro ) ) )
2012-01-13 00:49:24 +00:00
{
// initialize internal vars
d_queue = queue ;
d_dump = dump ;
2012-01-27 18:01:17 +00:00
d_acquisition_gnss_synchro = NULL ;
2012-01-13 00:49:24 +00:00
d_if_freq = if_freq ;
d_fs_in = fs_in ;
d_vector_length = vector_length ;
d_early_late_spc_chips = early_late_space_chips ; // Define early-late offset (in chips)
2012-01-16 18:27:31 +00:00
d_dump_filename = dump_filename ;
2011-11-22 17:21:54 +00:00
2012-01-13 00:49:24 +00:00
// Initialize tracking variables ==========================================
d_carrier_loop_filter . set_params ( fll_bw_hz , pll_bw_hz , order ) ;
2011-11-22 17:21:54 +00:00
// Get space for a vector with the C/A code replica sampled 1x/chip
2012-01-23 00:52:05 +00:00
d_ca_code = new gr_complex [ ( int ) GPS_L1_CA_CODE_LENGTH_CHIPS + 2 ] ;
2012-01-20 16:37:16 +00:00
2011-11-22 17:21:54 +00:00
// Get space for the resampled early / prompt / late local replicas
2012-01-20 16:37:16 +00:00
//d_early_code = new gr_complex[d_vector_length*2];
//d_prompt_code = new gr_complex[d_vector_length*2];
//d_late_code = new gr_complex[d_vector_length*2];
2011-11-22 17:21:54 +00:00
// space for carrier wipeoff LO vector
2012-01-20 16:37:16 +00:00
//d_carr_sign = new gr_complex[d_vector_length*2];
2012-01-23 00:52:05 +00:00
/* If an array is partitioned for more than one thread to operate on,
* having the sub - array boundaries unaligned to cache lines could lead
* to performance degradation . Here we allocate memory
* ( gr_comlex array of size 2 * d_vector_length ) aligned to cache of 16 bytes
*/
// todo: do something if posix_memalign fails
if ( posix_memalign ( ( void * * ) & d_early_code , 16 , d_vector_length * sizeof ( gr_complex ) * 2 ) = = 0 ) { } ;
if ( posix_memalign ( ( void * * ) & d_late_code , 16 , d_vector_length * sizeof ( gr_complex ) * 2 ) = = 0 ) { } ;
if ( posix_memalign ( ( void * * ) & d_prompt_code , 16 , d_vector_length * sizeof ( gr_complex ) * 2 ) = = 0 ) { } ;
if ( posix_memalign ( ( void * * ) & d_carr_sign , 16 , d_vector_length * sizeof ( gr_complex ) * 2 ) = = 0 ) { } ;
2011-11-22 17:21:54 +00:00
// sample synchronization
2012-01-13 00:49:24 +00:00
d_sample_counter = 0 ;
d_sample_counter_seconds = 0 ;
d_acq_sample_stamp = 0 ;
d_last_seg = 0 ; // this is for debug output only
2011-11-22 17:21:54 +00:00
2012-01-13 00:49:24 +00:00
d_enable_tracking = false ;
2011-11-22 17:21:54 +00:00
2012-01-13 00:49:24 +00:00
d_current_prn_length_samples = ( int ) d_vector_length ;
2011-11-22 17:21:54 +00:00
// CN0 estimation and lock detector buffers
2012-01-13 00:49:24 +00:00
d_cn0_estimation_counter = 0 ;
d_Prompt_buffer = new gr_complex [ CN0_ESTIMATION_SAMPLES ] ;
d_carrier_lock_test = 1 ;
d_CN0_SNV_dB_Hz = 0 ;
d_carrier_lock_fail_counter = 0 ;
d_carrier_lock_threshold = 5 ;
2011-11-22 17:21:54 +00:00
}
2012-01-13 00:49:24 +00:00
2012-01-13 01:06:28 +00:00
void Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : start_tracking ( )
{
2012-01-07 05:21:11 +00:00
/*
* correct the code phase according to the delay between acq and trk
*/
2012-01-27 18:01:17 +00:00
d_acq_code_phase_samples = d_acquisition_gnss_synchro - > Acq_delay_samples ;
d_acq_carrier_doppler_hz = d_acquisition_gnss_synchro - > Acq_doppler_hz ;
d_acq_sample_stamp = d_acquisition_gnss_synchro - > Acq_samplestamp_samples ;
2012-01-07 05:21:11 +00:00
unsigned long int acq_trk_diff_samples ;
float acq_trk_diff_seconds ;
2012-01-13 01:28:42 +00:00
acq_trk_diff_samples = d_sample_counter - d_acq_sample_stamp ; //-d_vector_length;
acq_trk_diff_seconds = ( float ) acq_trk_diff_samples / ( float ) d_fs_in ;
2012-01-07 05:21:11 +00:00
//doppler effect
// Fd=(C/(C+Vr))*F
float radial_velocity ;
2012-01-13 01:28:42 +00:00
radial_velocity = ( GPS_L1_FREQ_HZ + d_acq_carrier_doppler_hz ) / GPS_L1_FREQ_HZ ;
2012-01-07 05:21:11 +00:00
// new chip and prn sequence periods based on acq Doppler
float T_chip_mod_seconds ;
float T_prn_mod_seconds ;
float T_prn_mod_samples ;
2012-01-13 01:28:42 +00:00
d_code_freq_hz = radial_velocity * GPS_L1_CA_CODE_RATE_HZ ;
T_chip_mod_seconds = 1 / d_code_freq_hz ;
T_prn_mod_seconds = T_chip_mod_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS ;
T_prn_mod_samples = T_prn_mod_seconds * ( float ) d_fs_in ;
d_next_prn_length_samples = round ( T_prn_mod_samples ) ;
float T_prn_true_seconds = GPS_L1_CA_CODE_LENGTH_CHIPS / GPS_L1_CA_CODE_RATE_HZ ;
float T_prn_true_samples = T_prn_true_seconds * ( float ) d_fs_in ;
- Major changes:
- The executable file and the default configuration file is now changed from "./install/mercurio" and "./conf/mercurio.conf" to "./install/gnss-sdr" and "./conf/gnss-sdr.conf", respectively.
- Configuration file structure changed to define in a single entry the internal sampling frequency (after the signal conditioner). NOTICE that this change affects the all the adapters (acquisition, tracking, telemetry_decoder, observables, and PVT). All the adapters are now modified to work with this feature.
- Moved several in-line GPS L1 CA parameters (a.k.a magic numbers..) to ./src/core/system_parameters/GPS_L1_CA.h definition file.
- Tracking blocks now uses DOUBLE values in their outputs.
- Observables and PVT now are separated. PVT and their associated libraries are moved to ./src/algorithms/PVT
- Temporarily disabled the RINEX output (I am working on that!)
- GNSS-SDR screen output now gives extended debug information of the receiver status and events. In the future, this output will be redirected to a log file.
- Bug fixes:
- FILE_SIGNAL_SOURCE now works correctly when the user configures GNSS-SDR to process the entire file.
- GPS_L1_CA_DLL_PLL now computes correctly the PRN start values.
- GPS_L1_CA_DLL_FLL_PLL now computes correctly the PRN start values.
- Several modifications in GPS_L1_CA_Telemetry_Decoder, GPS_L1_CA_Observables, and GPS_L1_CA_PVT modules to fix the GPS position computation.
- New features
- Tracking blocks perform a signal integrity check against NaN outliers before the correlation process.
- Tracking and PVT binary dump options are now documented and we provide MATLAB libraries and sample files to read it. Available in ./utils/matlab" and "./utils/matlab/libs"
- Observables output rate can be configured. This option enables the GPS L1 CA PVT computation at a maximum rate of 1ms.
- GPS_L1_CA_PVT now can perform a moving average Latitude, Longitude, and Altitude output for each of the Observables output. It is configurable using the configuration file.
- Added Google Earth compatible Keyhole Markup Language (KML) output writer class (./src/algorithms/PVT/libs/kml_printer.h and ./src/algorithms/PVT/libs/kml_printer.cc ). You can see the receiver position directly using Google Earth.
- We provide a master configuration file which includes an in-line documentation with all the new (and old) options. It can be found in ./conf/master.conf
git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@84 64b25241-fba3-4117-9849-534c7e92360d
2011-12-07 17:59:34 +00:00
float T_prn_diff_seconds ;
2012-01-13 01:28:42 +00:00
T_prn_diff_seconds = T_prn_true_seconds - T_prn_mod_seconds ;
- Major changes:
- The executable file and the default configuration file is now changed from "./install/mercurio" and "./conf/mercurio.conf" to "./install/gnss-sdr" and "./conf/gnss-sdr.conf", respectively.
- Configuration file structure changed to define in a single entry the internal sampling frequency (after the signal conditioner). NOTICE that this change affects the all the adapters (acquisition, tracking, telemetry_decoder, observables, and PVT). All the adapters are now modified to work with this feature.
- Moved several in-line GPS L1 CA parameters (a.k.a magic numbers..) to ./src/core/system_parameters/GPS_L1_CA.h definition file.
- Tracking blocks now uses DOUBLE values in their outputs.
- Observables and PVT now are separated. PVT and their associated libraries are moved to ./src/algorithms/PVT
- Temporarily disabled the RINEX output (I am working on that!)
- GNSS-SDR screen output now gives extended debug information of the receiver status and events. In the future, this output will be redirected to a log file.
- Bug fixes:
- FILE_SIGNAL_SOURCE now works correctly when the user configures GNSS-SDR to process the entire file.
- GPS_L1_CA_DLL_PLL now computes correctly the PRN start values.
- GPS_L1_CA_DLL_FLL_PLL now computes correctly the PRN start values.
- Several modifications in GPS_L1_CA_Telemetry_Decoder, GPS_L1_CA_Observables, and GPS_L1_CA_PVT modules to fix the GPS position computation.
- New features
- Tracking blocks perform a signal integrity check against NaN outliers before the correlation process.
- Tracking and PVT binary dump options are now documented and we provide MATLAB libraries and sample files to read it. Available in ./utils/matlab" and "./utils/matlab/libs"
- Observables output rate can be configured. This option enables the GPS L1 CA PVT computation at a maximum rate of 1ms.
- GPS_L1_CA_PVT now can perform a moving average Latitude, Longitude, and Altitude output for each of the Observables output. It is configurable using the configuration file.
- Added Google Earth compatible Keyhole Markup Language (KML) output writer class (./src/algorithms/PVT/libs/kml_printer.h and ./src/algorithms/PVT/libs/kml_printer.cc ). You can see the receiver position directly using Google Earth.
- We provide a master configuration file which includes an in-line documentation with all the new (and old) options. It can be found in ./conf/master.conf
git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@84 64b25241-fba3-4117-9849-534c7e92360d
2011-12-07 17:59:34 +00:00
float N_prn_diff ;
2012-01-13 01:28:42 +00:00
N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds ;
float corrected_acq_phase_samples , delay_correction_samples ;
corrected_acq_phase_samples = fmod ( ( d_acq_code_phase_samples + T_prn_diff_seconds * N_prn_diff * ( float ) d_fs_in ) , T_prn_true_samples ) ;
- Major changes:
- The executable file and the default configuration file is now changed from "./install/mercurio" and "./conf/mercurio.conf" to "./install/gnss-sdr" and "./conf/gnss-sdr.conf", respectively.
- Configuration file structure changed to define in a single entry the internal sampling frequency (after the signal conditioner). NOTICE that this change affects the all the adapters (acquisition, tracking, telemetry_decoder, observables, and PVT). All the adapters are now modified to work with this feature.
- Moved several in-line GPS L1 CA parameters (a.k.a magic numbers..) to ./src/core/system_parameters/GPS_L1_CA.h definition file.
- Tracking blocks now uses DOUBLE values in their outputs.
- Observables and PVT now are separated. PVT and their associated libraries are moved to ./src/algorithms/PVT
- Temporarily disabled the RINEX output (I am working on that!)
- GNSS-SDR screen output now gives extended debug information of the receiver status and events. In the future, this output will be redirected to a log file.
- Bug fixes:
- FILE_SIGNAL_SOURCE now works correctly when the user configures GNSS-SDR to process the entire file.
- GPS_L1_CA_DLL_PLL now computes correctly the PRN start values.
- GPS_L1_CA_DLL_FLL_PLL now computes correctly the PRN start values.
- Several modifications in GPS_L1_CA_Telemetry_Decoder, GPS_L1_CA_Observables, and GPS_L1_CA_PVT modules to fix the GPS position computation.
- New features
- Tracking blocks perform a signal integrity check against NaN outliers before the correlation process.
- Tracking and PVT binary dump options are now documented and we provide MATLAB libraries and sample files to read it. Available in ./utils/matlab" and "./utils/matlab/libs"
- Observables output rate can be configured. This option enables the GPS L1 CA PVT computation at a maximum rate of 1ms.
- GPS_L1_CA_PVT now can perform a moving average Latitude, Longitude, and Altitude output for each of the Observables output. It is configurable using the configuration file.
- Added Google Earth compatible Keyhole Markup Language (KML) output writer class (./src/algorithms/PVT/libs/kml_printer.h and ./src/algorithms/PVT/libs/kml_printer.cc ). You can see the receiver position directly using Google Earth.
- We provide a master configuration file which includes an in-line documentation with all the new (and old) options. It can be found in ./conf/master.conf
git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@84 64b25241-fba3-4117-9849-534c7e92360d
2011-12-07 17:59:34 +00:00
2012-01-13 01:28:42 +00:00
if ( corrected_acq_phase_samples < 0 )
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:28:42 +00:00
corrected_acq_phase_samples = T_prn_mod_samples + corrected_acq_phase_samples ;
2012-01-07 05:21:11 +00:00
}
2012-01-13 01:28:42 +00:00
delay_correction_samples = d_acq_code_phase_samples - corrected_acq_phase_samples ;
d_acq_code_phase_samples = corrected_acq_phase_samples ;
2012-01-07 05:21:11 +00:00
2012-01-13 01:28:42 +00:00
d_carrier_doppler_hz = d_acq_carrier_doppler_hz ;
2012-01-07 05:21:11 +00:00
// DLL/PLL filter initialization
d_carrier_loop_filter . initialize ( d_acq_carrier_doppler_hz ) ;
2012-01-13 01:28:42 +00:00
d_FLL_wait = 1 ;
2012-01-07 05:21:11 +00:00
// generate local reference ALWAYS starting at chip 1 (1 sample per chip)
2012-01-27 18:01:17 +00:00
code_gen_conplex ( & d_ca_code [ 1 ] , d_acquisition_gnss_synchro - > PRN , 0 ) ;
2012-01-16 18:27:31 +00:00
2012-01-13 01:28:42 +00:00
d_ca_code [ 0 ] = d_ca_code [ ( int ) GPS_L1_CA_CODE_LENGTH_CHIPS ] ;
d_ca_code [ ( int ) GPS_L1_CA_CODE_LENGTH_CHIPS + 1 ] = d_ca_code [ 1 ] ;
d_carrier_lock_fail_counter = 0 ;
d_Prompt_prev = 0 ;
d_rem_code_phase_samples = 0 ;
d_rem_carr_phase = 0 ;
d_FLL_discriminator_hz = 0 ;
d_rem_code_phase_samples = 0 ;
d_next_rem_code_phase_samples = 0 ;
d_acc_carrier_phase_rad = 0 ;
2011-11-22 17:21:54 +00:00
2012-01-07 05:21:11 +00:00
d_code_phase_samples = d_acq_code_phase_samples ;
- Major changes:
- The executable file and the default configuration file is now changed from "./install/mercurio" and "./conf/mercurio.conf" to "./install/gnss-sdr" and "./conf/gnss-sdr.conf", respectively.
- Configuration file structure changed to define in a single entry the internal sampling frequency (after the signal conditioner). NOTICE that this change affects the all the adapters (acquisition, tracking, telemetry_decoder, observables, and PVT). All the adapters are now modified to work with this feature.
- Moved several in-line GPS L1 CA parameters (a.k.a magic numbers..) to ./src/core/system_parameters/GPS_L1_CA.h definition file.
- Tracking blocks now uses DOUBLE values in their outputs.
- Observables and PVT now are separated. PVT and their associated libraries are moved to ./src/algorithms/PVT
- Temporarily disabled the RINEX output (I am working on that!)
- GNSS-SDR screen output now gives extended debug information of the receiver status and events. In the future, this output will be redirected to a log file.
- Bug fixes:
- FILE_SIGNAL_SOURCE now works correctly when the user configures GNSS-SDR to process the entire file.
- GPS_L1_CA_DLL_PLL now computes correctly the PRN start values.
- GPS_L1_CA_DLL_FLL_PLL now computes correctly the PRN start values.
- Several modifications in GPS_L1_CA_Telemetry_Decoder, GPS_L1_CA_Observables, and GPS_L1_CA_PVT modules to fix the GPS position computation.
- New features
- Tracking blocks perform a signal integrity check against NaN outliers before the correlation process.
- Tracking and PVT binary dump options are now documented and we provide MATLAB libraries and sample files to read it. Available in ./utils/matlab" and "./utils/matlab/libs"
- Observables output rate can be configured. This option enables the GPS L1 CA PVT computation at a maximum rate of 1ms.
- GPS_L1_CA_PVT now can perform a moving average Latitude, Longitude, and Altitude output for each of the Observables output. It is configurable using the configuration file.
- Added Google Earth compatible Keyhole Markup Language (KML) output writer class (./src/algorithms/PVT/libs/kml_printer.h and ./src/algorithms/PVT/libs/kml_printer.cc ). You can see the receiver position directly using Google Earth.
- We provide a master configuration file which includes an in-line documentation with all the new (and old) options. It can be found in ./conf/master.conf
git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@84 64b25241-fba3-4117-9849-534c7e92360d
2011-12-07 17:59:34 +00:00
2012-01-07 05:21:11 +00:00
// DEBUG OUTPUT
2012-01-27 18:01:17 +00:00
std : : cout < < " Tracking start on channel " < < d_channel < < " for satellite " < < d_acquisition_gnss_synchro - > System < < " " < < d_acquisition_gnss_synchro - > PRN < < std : : endl ;
DLOG ( INFO ) < < " Start tracking for satellite " < < d_acquisition_gnss_synchro - > System < < " " < < d_acquisition_gnss_synchro - > PRN < < " received " ;
2011-11-22 17:21:54 +00:00
2012-01-07 05:21:11 +00:00
// enable tracking
2012-01-13 01:28:42 +00:00
d_pull_in = true ;
d_enable_tracking = true ;
2011-11-22 17:21:54 +00:00
2012-01-23 00:52:05 +00:00
std : : cout < < " PULL-IN Doppler [Hz]= " < < d_carrier_doppler_hz
< < " Code Phase correction [samples]= " < < delay_correction_samples
< < " PULL-IN Code Phase [samples]= " < < d_acq_code_phase_samples < < std : : endl ;
2011-11-22 17:21:54 +00:00
}
2012-01-13 01:06:28 +00:00
2012-01-13 00:49:24 +00:00
void Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : update_local_code ( )
2011-11-22 17:21:54 +00:00
{
2012-01-07 05:21:11 +00:00
float tcode_chips ;
float rem_code_phase_chips ;
float code_phase_step_chips ;
int associated_chip_index ;
2012-01-13 01:28:42 +00:00
int code_length_chips = ( int ) GPS_L1_CA_CODE_LENGTH_CHIPS ;
code_phase_step_chips = d_code_freq_hz / ( ( float ) d_fs_in ) ;
rem_code_phase_chips = d_rem_code_phase_samples * ( d_code_freq_hz / d_fs_in ) ;
2012-01-07 05:21:11 +00:00
// unified loop for E, P, L code vectors
2012-01-13 01:28:42 +00:00
tcode_chips = - rem_code_phase_chips ;
for ( int i = 0 ; i < d_current_prn_length_samples ; i + + )
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:28:42 +00:00
associated_chip_index = 1 + round ( fmod ( tcode_chips - d_early_late_spc_chips , code_length_chips ) ) ;
2012-01-07 05:21:11 +00:00
d_early_code [ i ] = d_ca_code [ associated_chip_index ] ;
2012-01-13 01:28:42 +00:00
associated_chip_index = 1 + round ( fmod ( tcode_chips , code_length_chips ) ) ;
2012-01-07 05:21:11 +00:00
d_prompt_code [ i ] = d_ca_code [ associated_chip_index ] ;
2012-01-13 01:28:42 +00:00
associated_chip_index = 1 + round ( fmod ( tcode_chips + d_early_late_spc_chips , code_length_chips ) ) ;
2012-01-07 05:21:11 +00:00
d_late_code [ i ] = d_ca_code [ associated_chip_index ] ;
2012-01-16 18:27:31 +00:00
tcode_chips = tcode_chips + code_phase_step_chips ;
2012-01-07 05:21:11 +00:00
}
//d_code_phase_samples=d_code_phase_samples+(float)d_fs_in*GPS_L1_CA_CODE_LENGTH_CHIPS*(1/d_code_freq_hz-1/GPS_L1_CA_CODE_RATE_HZ);
2011-11-22 17:21:54 +00:00
}
2012-01-13 01:06:28 +00:00
2012-01-13 00:49:24 +00:00
void Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : update_local_carrier ( )
2011-11-22 17:21:54 +00:00
{
float phase , phase_step ;
2012-01-13 01:28:42 +00:00
phase_step = ( float ) TWO_PI * d_carrier_doppler_hz / ( float ) d_fs_in ;
phase = d_rem_carr_phase ;
for ( int i = 0 ; i < d_current_prn_length_samples ; i + + )
{
d_carr_sign [ i ] = gr_complex ( cos ( phase ) , sin ( phase ) ) ;
2012-01-07 05:21:11 +00:00
phase + = phase_step ;
2012-01-13 01:28:42 +00:00
}
d_rem_carr_phase = fmod ( phase , TWO_PI ) ;
2012-01-20 16:37:16 +00:00
d_acc_carrier_phase_rad = d_acc_carrier_phase_rad + phase ;
2011-11-22 17:21:54 +00:00
}
2012-01-13 01:06:28 +00:00
2012-01-13 01:28:42 +00:00
Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : ~ Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc ( )
{
2012-01-07 05:21:11 +00:00
d_dump_file . close ( ) ;
- Major changes:
- The executable file and the default configuration file is now changed from "./install/mercurio" and "./conf/mercurio.conf" to "./install/gnss-sdr" and "./conf/gnss-sdr.conf", respectively.
- Configuration file structure changed to define in a single entry the internal sampling frequency (after the signal conditioner). NOTICE that this change affects the all the adapters (acquisition, tracking, telemetry_decoder, observables, and PVT). All the adapters are now modified to work with this feature.
- Moved several in-line GPS L1 CA parameters (a.k.a magic numbers..) to ./src/core/system_parameters/GPS_L1_CA.h definition file.
- Tracking blocks now uses DOUBLE values in their outputs.
- Observables and PVT now are separated. PVT and their associated libraries are moved to ./src/algorithms/PVT
- Temporarily disabled the RINEX output (I am working on that!)
- GNSS-SDR screen output now gives extended debug information of the receiver status and events. In the future, this output will be redirected to a log file.
- Bug fixes:
- FILE_SIGNAL_SOURCE now works correctly when the user configures GNSS-SDR to process the entire file.
- GPS_L1_CA_DLL_PLL now computes correctly the PRN start values.
- GPS_L1_CA_DLL_FLL_PLL now computes correctly the PRN start values.
- Several modifications in GPS_L1_CA_Telemetry_Decoder, GPS_L1_CA_Observables, and GPS_L1_CA_PVT modules to fix the GPS position computation.
- New features
- Tracking blocks perform a signal integrity check against NaN outliers before the correlation process.
- Tracking and PVT binary dump options are now documented and we provide MATLAB libraries and sample files to read it. Available in ./utils/matlab" and "./utils/matlab/libs"
- Observables output rate can be configured. This option enables the GPS L1 CA PVT computation at a maximum rate of 1ms.
- GPS_L1_CA_PVT now can perform a moving average Latitude, Longitude, and Altitude output for each of the Observables output. It is configurable using the configuration file.
- Added Google Earth compatible Keyhole Markup Language (KML) output writer class (./src/algorithms/PVT/libs/kml_printer.h and ./src/algorithms/PVT/libs/kml_printer.cc ). You can see the receiver position directly using Google Earth.
- We provide a master configuration file which includes an in-line documentation with all the new (and old) options. It can be found in ./conf/master.conf
git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@84 64b25241-fba3-4117-9849-534c7e92360d
2011-12-07 17:59:34 +00:00
delete [ ] d_ca_code ;
2012-01-20 16:37:16 +00:00
free ( d_prompt_code ) ;
free ( d_late_code ) ;
free ( d_early_code ) ;
free ( d_carr_sign ) ;
- Major changes:
- The executable file and the default configuration file is now changed from "./install/mercurio" and "./conf/mercurio.conf" to "./install/gnss-sdr" and "./conf/gnss-sdr.conf", respectively.
- Configuration file structure changed to define in a single entry the internal sampling frequency (after the signal conditioner). NOTICE that this change affects the all the adapters (acquisition, tracking, telemetry_decoder, observables, and PVT). All the adapters are now modified to work with this feature.
- Moved several in-line GPS L1 CA parameters (a.k.a magic numbers..) to ./src/core/system_parameters/GPS_L1_CA.h definition file.
- Tracking blocks now uses DOUBLE values in their outputs.
- Observables and PVT now are separated. PVT and their associated libraries are moved to ./src/algorithms/PVT
- Temporarily disabled the RINEX output (I am working on that!)
- GNSS-SDR screen output now gives extended debug information of the receiver status and events. In the future, this output will be redirected to a log file.
- Bug fixes:
- FILE_SIGNAL_SOURCE now works correctly when the user configures GNSS-SDR to process the entire file.
- GPS_L1_CA_DLL_PLL now computes correctly the PRN start values.
- GPS_L1_CA_DLL_FLL_PLL now computes correctly the PRN start values.
- Several modifications in GPS_L1_CA_Telemetry_Decoder, GPS_L1_CA_Observables, and GPS_L1_CA_PVT modules to fix the GPS position computation.
- New features
- Tracking blocks perform a signal integrity check against NaN outliers before the correlation process.
- Tracking and PVT binary dump options are now documented and we provide MATLAB libraries and sample files to read it. Available in ./utils/matlab" and "./utils/matlab/libs"
- Observables output rate can be configured. This option enables the GPS L1 CA PVT computation at a maximum rate of 1ms.
- GPS_L1_CA_PVT now can perform a moving average Latitude, Longitude, and Altitude output for each of the Observables output. It is configurable using the configuration file.
- Added Google Earth compatible Keyhole Markup Language (KML) output writer class (./src/algorithms/PVT/libs/kml_printer.h and ./src/algorithms/PVT/libs/kml_printer.cc ). You can see the receiver position directly using Google Earth.
- We provide a master configuration file which includes an in-line documentation with all the new (and old) options. It can be found in ./conf/master.conf
git-svn-id: https://svn.code.sf.net/p/gnss-sdr/code/trunk@84 64b25241-fba3-4117-9849-534c7e92360d
2011-12-07 17:59:34 +00:00
delete [ ] d_Prompt_buffer ;
2011-11-22 17:21:54 +00:00
}
2012-01-13 01:28:42 +00:00
2011-12-28 21:36:45 +00:00
/* Tracking signal processing
2011-11-22 17:21:54 +00:00
* Notice that this is a class derived from gr_sync_decimator , so each of the ninput_items has vector_length samples
*/
2012-01-13 00:49:24 +00:00
int Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : general_work ( int noutput_items , gr_vector_int & ninput_items ,
2012-01-13 01:06:28 +00:00
gr_vector_const_void_star & input_items , gr_vector_void_star & output_items )
{
2012-01-27 18:01:17 +00:00
2012-01-13 01:06:28 +00:00
float code_error_chips = 0 ;
float correlation_time_s = 0 ;
float PLL_discriminator_hz = 0 ;
float carr_nco_hz = 0 ;
2012-01-07 05:21:11 +00:00
2012-01-13 01:06:28 +00:00
d_Prompt_prev = d_Prompt ; // for the FLL discriminator
d_Early = gr_complex ( 0 , 0 ) ;
d_Prompt = gr_complex ( 0 , 0 ) ;
d_Late = gr_complex ( 0 , 0 ) ;
2012-01-07 05:21:11 +00:00
2012-01-13 01:06:28 +00:00
if ( d_enable_tracking = = true )
{
2012-01-07 05:21:11 +00:00
/*
* Receiver signal alignment
*/
2012-01-13 01:06:28 +00:00
if ( d_pull_in = = true )
2012-01-07 05:21:11 +00:00
{
int samples_offset ;
float acq_trk_shif_correction_samples ;
int acq_to_trk_delay_samples ;
2012-01-13 01:06:28 +00:00
acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp ;
acq_trk_shif_correction_samples = d_next_prn_length_samples - fmod ( ( float ) acq_to_trk_delay_samples , ( float ) d_next_prn_length_samples ) ;
samples_offset = round ( d_acq_code_phase_samples + acq_trk_shif_correction_samples ) ;
2012-01-07 05:21:11 +00:00
// /todo: Check if the sample counter sent to the next block as a time reference should be incremented AFTER sended or BEFORE
d_sample_counter_seconds = d_sample_counter_seconds + ( ( ( double ) samples_offset ) / ( double ) d_fs_in ) ;
2012-01-13 01:06:28 +00:00
d_sample_counter = d_sample_counter + samples_offset ; //count for the processed samples
d_pull_in = false ;
2012-01-16 18:27:31 +00:00
consume_each ( samples_offset ) ; //shift input to perform alignment with local replica
2012-01-07 05:21:11 +00:00
return 1 ;
}
2012-01-27 18:01:17 +00:00
// GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder
Gnss_Synchro current_synchro_data ;
// Fill the acquisition data
current_synchro_data = * d_acquisition_gnss_synchro ;
2012-01-07 05:21:11 +00:00
// get the sample in and out pointers
const gr_complex * in = ( gr_complex * ) input_items [ 0 ] ; //block input samples pointer
2012-01-27 18:01:17 +00:00
Gnss_Synchro * * out = ( Gnss_Synchro * * ) & output_items [ 0 ] ; //block output streams pointer
2012-01-07 05:21:11 +00:00
2012-01-16 18:27:31 +00:00
// check for samples consistency (this should be done before in the receiver / here only if the source is a file)
2012-01-13 01:06:28 +00:00
for ( int i = 0 ; i < d_current_prn_length_samples ; i + + )
{
if ( std : : isnan ( in [ i ] . real ( ) ) = = true or std : : isnan ( in [ i ] . imag ( ) ) = = true ) // or std::isinf(in[i].real())==true or std::isinf(in[i].imag())==true)
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:06:28 +00:00
const int samples_available = ninput_items [ 0 ] ;
d_sample_counter = d_sample_counter + samples_available ;
LOG_AT_LEVEL ( WARNING ) < < " Detected NaN samples at sample number " < < d_sample_counter ;
2012-01-07 05:21:11 +00:00
consume_each ( samples_available ) ;
return 0 ;
}
2012-01-13 01:06:28 +00:00
}
2012-01-07 05:21:11 +00:00
// Update the prn length based on code freq (variable) and
// sampling frequency (fixed)
// variable code PRN sample block size
2012-01-13 01:06:28 +00:00
d_current_prn_length_samples = d_next_prn_length_samples ;
2012-01-07 05:21:11 +00:00
update_local_code ( ) ;
update_local_carrier ( ) ;
2012-01-20 16:37:16 +00:00
gr_complex * E_out ;
gr_complex * P_out ;
gr_complex * L_out ;
2012-01-23 00:52:05 +00:00
// TODO: do something if posix_memalign fails
if ( posix_memalign ( ( void * * ) & E_out , 16 , 8 ) = = 0 ) { } ;
if ( posix_memalign ( ( void * * ) & P_out , 16 , 8 ) = = 0 ) { } ;
if ( posix_memalign ( ( void * * ) & L_out , 16 , 8 ) = = 0 ) { } ;
2012-01-07 05:21:11 +00:00
// perform Early, Prompt and Late correlation
2012-01-20 16:37:16 +00:00
d_correlator . Carrier_wipeoff_and_EPL_volk ( d_current_prn_length_samples ,
in ,
d_carr_sign ,
d_early_code ,
d_prompt_code ,
d_late_code ,
E_out ,
P_out ,
L_out ) ;
2012-01-25 01:57:28 +00:00
d_Early = E_out [ 0 ] ;
d_Prompt = P_out [ 0 ] ;
d_Late = L_out [ 0 ] ;
2012-01-20 16:37:16 +00:00
free ( E_out ) ;
free ( P_out ) ;
free ( L_out ) ;
2012-01-23 00:52:05 +00:00
2012-01-07 05:21:11 +00:00
/*
* DLL , FLL , and PLL discriminators
*/
// Compute DLL error
2012-01-13 01:06:28 +00:00
code_error_chips = dll_nc_e_minus_l_normalized ( d_Early , d_Late ) ;
2012-01-07 05:21:11 +00:00
//compute FLL error
2012-01-16 18:27:31 +00:00
correlation_time_s = ( ( float ) d_current_prn_length_samples ) / ( float ) d_fs_in ;
2012-01-13 01:06:28 +00:00
if ( d_FLL_wait = = 1 )
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:06:28 +00:00
d_Prompt_prev = d_Prompt ;
d_FLL_wait = 0 ;
}
else
{
2012-01-16 18:27:31 +00:00
d_FLL_discriminator_hz = fll_four_quadrant_atan ( d_Prompt_prev , d_Prompt , 0 , correlation_time_s ) / ( float ) TWO_PI ;
2012-01-13 01:06:28 +00:00
d_Prompt_prev = d_Prompt ;
d_FLL_wait = 1 ;
2012-01-07 05:21:11 +00:00
}
// Compute PLL error
2012-01-23 00:52:05 +00:00
PLL_discriminator_hz = pll_cloop_two_quadrant_atan ( d_Prompt ) / ( float ) TWO_PI ;
2012-01-07 05:21:11 +00:00
2012-01-23 00:52:05 +00:00
/*
2012-01-07 05:21:11 +00:00
* \ todo Update FLL assistance algorithm !
*/
2012-01-23 00:52:05 +00:00
if ( ( ( ( float ) d_sample_counter - ( float ) d_acq_sample_stamp ) / ( float ) d_fs_in ) > 3 )
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:06:28 +00:00
d_FLL_discriminator_hz = 0 ; //disconnect the FLL after the initial lock
2012-01-07 05:21:11 +00:00
}
2012-01-23 00:52:05 +00:00
/*
2012-01-07 05:21:11 +00:00
* DLL and FLL + PLL filter and get current carrier Doppler and code frequency
*/
2012-01-13 01:06:28 +00:00
carr_nco_hz = d_carrier_loop_filter . get_carrier_error ( d_FLL_discriminator_hz , PLL_discriminator_hz , correlation_time_s ) ;
2012-01-07 05:21:11 +00:00
d_carrier_doppler_hz = ( float ) d_if_freq + carr_nco_hz ;
2012-01-16 18:27:31 +00:00
d_code_freq_hz = GPS_L1_CA_CODE_RATE_HZ - ( ( ( d_carrier_doppler_hz - ( float ) d_if_freq ) * GPS_L1_CA_CODE_RATE_HZ ) / GPS_L1_FREQ_HZ ) - code_error_chips ;
2012-01-07 05:21:11 +00:00
/*!
* \ todo Improve the lock detection algorithm !
*/
// ####### CN0 ESTIMATION AND LOCK DETECTORS ######
2012-01-13 01:06:28 +00:00
if ( d_cn0_estimation_counter < CN0_ESTIMATION_SAMPLES )
2012-01-07 05:21:11 +00:00
{
// fill buffer with prompt correlator output values
2012-01-13 01:06:28 +00:00
d_Prompt_buffer [ d_cn0_estimation_counter ] = d_Prompt ;
2012-01-07 05:21:11 +00:00
d_cn0_estimation_counter + + ;
2012-01-13 01:06:28 +00:00
}
else
{
d_cn0_estimation_counter = 0 ;
2012-01-16 18:27:31 +00:00
d_CN0_SNV_dB_Hz = gps_l1_ca_CN0_SNV ( d_Prompt_buffer , CN0_ESTIMATION_SAMPLES , d_fs_in ) ;
d_carrier_lock_test = carrier_lock_detector ( d_Prompt_buffer , CN0_ESTIMATION_SAMPLES ) ;
2012-01-13 01:06:28 +00:00
// ###### TRACKING UNLOCK NOTIFICATION #####
int tracking_message ;
if ( d_carrier_lock_test < d_carrier_lock_threshold or d_carrier_lock_test > MINIMUM_VALID_CN0 )
{
d_carrier_lock_fail_counter + + ;
}
else
{
if ( d_carrier_lock_fail_counter > 0 ) d_carrier_lock_fail_counter - - ;
}
if ( d_carrier_lock_fail_counter > MAXIMUM_LOCK_FAIL_COUNTER )
{
2012-01-16 18:27:31 +00:00
std : : cout < < " Channel " < < d_channel < < " loss of lock! " < < std : : endl ;
2012-01-13 01:06:28 +00:00
tracking_message = 3 ; //loss of lock
d_channel_internal_queue - > push ( tracking_message ) ;
d_carrier_lock_fail_counter = 0 ;
d_enable_tracking = false ; // TODO: check if disabling tracking is consistent with the channel state machine
}
2012-01-07 05:21:11 +00:00
}
// ########### Output the tracking data to navigation and PVT ##########
2012-01-27 18:01:17 +00:00
// // Output channel 0: Prompt correlator output Q
// *out[0] = (double)d_Prompt.real();
// // Output channel 1: Prompt correlator output I
// *out[1] = (double)d_Prompt.imag();
// // Output channel 2: PRN absolute delay [s]
// *out[2] = d_sample_counter_seconds;
// // Output channel 3: d_acc_carrier_phase_rad [rad]
// *out[3] = (double)d_acc_carrier_phase_rad;
// // Output channel 4: PRN code phase [s]
// *out[4] = (double)d_code_phase_samples * (1/(float)d_fs_in);
current_synchro_data . Prompt_I = ( double ) d_Prompt . real ( ) ;
current_synchro_data . Prompt_Q = ( double ) d_Prompt . imag ( ) ;
current_synchro_data . Tracking_timestamp_secs = d_sample_counter_seconds ;
current_synchro_data . Carrier_phase_rads = ( double ) d_acc_carrier_phase_rad ;
current_synchro_data . Code_phase_secs = ( double ) d_code_phase_samples * ( 1 / ( float ) d_fs_in ) ;
current_synchro_data . CN0_dB_hz = ( double ) d_CN0_SNV_dB_Hz ;
* out [ 0 ] = current_synchro_data ;
2012-01-07 05:21:11 +00:00
// ########## DEBUG OUTPUT
/*!
* \ todo The stop timer has to be moved to the signal source !
*/
// debug: Second counter in channel 0
2012-01-13 01:06:28 +00:00
if ( d_channel = = 0 )
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:06:28 +00:00
if ( floor ( d_sample_counter / d_fs_in ) ! = d_last_seg )
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:06:28 +00:00
d_last_seg = floor ( d_sample_counter / d_fs_in ) ;
2012-01-20 23:28:11 +00:00
std : : cout < < " Current input signal time = " < < d_last_seg < < " [s] " < < std : : endl ;
2012-01-27 18:01:17 +00:00
std : : cout < < " Tracking CH " < < d_channel < < " : Satellite " < < d_acquisition_gnss_synchro - > System < < " " < < d_acquisition_gnss_synchro - > PRN < < " , CN0 = " < < d_CN0_SNV_dB_Hz < < " [dB-Hz] " < < std : : endl ;
2012-01-07 05:21:11 +00:00
//std::cout<<"TRK CH "<<d_channel<<" Carrier_lock_test="<<d_carrier_lock_test<< std::endl;
//if (d_last_seg==5) d_carrier_lock_fail_counter=500; //DEBUG: force unlock!
}
2012-01-13 01:06:28 +00:00
}
else
{
if ( floor ( d_sample_counter / d_fs_in ) ! = d_last_seg )
{
d_last_seg = floor ( d_sample_counter / d_fs_in ) ;
2012-01-27 18:01:17 +00:00
std : : cout < < " Tracking CH " < < d_channel < < " : Satellite " < < d_acquisition_gnss_synchro - > System < < " " < < d_acquisition_gnss_synchro - > PRN < < " , CN0 = " < < d_CN0_SNV_dB_Hz < < " [dB-Hz] " < < std : : endl ;
2012-01-13 01:06:28 +00:00
//std::cout<<"TRK CH "<<d_channel<<" Carrier_lock_test="<<d_carrier_lock_test<< std::endl;
}
}
2012-01-07 05:21:11 +00:00
//predict the next loop PRN period length prediction
float T_chip_seconds ;
float T_prn_seconds ;
float T_prn_samples ;
float K_blk_samples ;
2012-01-13 01:06:28 +00:00
T_chip_seconds = 1 / d_code_freq_hz ;
2012-01-16 18:27:31 +00:00
T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS ;
T_prn_samples = T_prn_seconds * ( float ) d_fs_in ;
2012-01-13 01:06:28 +00:00
d_rem_code_phase_samples = d_next_rem_code_phase_samples ;
2012-01-16 18:27:31 +00:00
K_blk_samples = T_prn_samples + d_rem_code_phase_samples ;
2012-01-07 05:21:11 +00:00
// Update the current PRN delay (code phase in samples)
2012-01-16 18:27:31 +00:00
float T_prn_true_seconds = GPS_L1_CA_CODE_LENGTH_CHIPS / GPS_L1_CA_CODE_RATE_HZ ;
float T_prn_true_samples = T_prn_true_seconds * ( float ) d_fs_in ;
2012-01-13 01:06:28 +00:00
d_code_phase_samples = d_code_phase_samples + T_prn_samples - T_prn_true_samples ;
if ( d_code_phase_samples < 0 )
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:06:28 +00:00
d_code_phase_samples = T_prn_true_samples + d_code_phase_samples ;
2012-01-07 05:21:11 +00:00
}
2012-01-13 01:06:28 +00:00
d_code_phase_samples = fmod ( d_code_phase_samples , T_prn_true_samples ) ;
2012-01-16 18:27:31 +00:00
d_next_prn_length_samples = round ( K_blk_samples ) ; //round to a discrete sample
d_next_rem_code_phase_samples = K_blk_samples - d_next_prn_length_samples ; //rounding error
2012-01-13 01:06:28 +00:00
}
else
{
2012-01-27 18:01:17 +00:00
// double **out = (double **) &output_items[0]; //block output streams pointer
// *out[0] = 0;
// *out[1] = 0;
// *out[2] = 0;
// *out[3] = 0;
// *out[4] = 0;
Gnss_Synchro * * out = ( Gnss_Synchro * * ) & output_items [ 0 ] ; //block output streams pointer
* out [ 0 ] = * d_acquisition_gnss_synchro ;
2012-01-13 01:06:28 +00:00
}
2012-01-07 05:21:11 +00:00
2012-01-13 01:06:28 +00:00
if ( d_dump )
{
2012-01-07 05:21:11 +00:00
// MULTIPLEXED FILE RECORDING - Record results to file
float prompt_I ;
float prompt_Q ;
2012-01-16 18:27:31 +00:00
float tmp_E , tmp_P , tmp_L ;
2012-01-07 05:21:11 +00:00
float tmp_float ;
2012-01-13 01:06:28 +00:00
prompt_I = d_Prompt . imag ( ) ;
prompt_Q = d_Prompt . real ( ) ;
2012-01-07 05:21:11 +00:00
tmp_E = std : : abs < float > ( d_Early ) ;
tmp_P = std : : abs < float > ( d_Prompt ) ;
tmp_L = std : : abs < float > ( d_Late ) ;
2012-01-13 01:06:28 +00:00
try
{
2012-01-07 05:21:11 +00:00
// EPR
d_dump_file . write ( ( char * ) & tmp_E , sizeof ( float ) ) ;
d_dump_file . write ( ( char * ) & tmp_P , sizeof ( float ) ) ;
d_dump_file . write ( ( char * ) & tmp_L , sizeof ( float ) ) ;
// PROMPT I and Q (to analyze navigation symbols)
d_dump_file . write ( ( char * ) & prompt_I , sizeof ( float ) ) ;
d_dump_file . write ( ( char * ) & prompt_Q , sizeof ( float ) ) ;
// PRN start sample stamp
//tmp_float=(float)d_sample_counter;
d_dump_file . write ( ( char * ) & d_sample_counter , sizeof ( unsigned long int ) ) ;
// accumulated carrier phase
d_dump_file . write ( ( char * ) & d_acc_carrier_phase_rad , sizeof ( float ) ) ;
// carrier and code frequency
d_dump_file . write ( ( char * ) & d_carrier_doppler_hz , sizeof ( float ) ) ;
d_dump_file . write ( ( char * ) & d_code_freq_hz , sizeof ( float ) ) ;
//PLL commands
d_dump_file . write ( ( char * ) & PLL_discriminator_hz , sizeof ( float ) ) ;
d_dump_file . write ( ( char * ) & carr_nco_hz , sizeof ( float ) ) ;
//DLL commands
d_dump_file . write ( ( char * ) & code_error_chips , sizeof ( float ) ) ;
d_dump_file . write ( ( char * ) & d_code_phase_samples , sizeof ( float ) ) ;
// CN0 and carrier lock test
d_dump_file . write ( ( char * ) & d_CN0_SNV_dB_Hz , sizeof ( float ) ) ;
d_dump_file . write ( ( char * ) & d_carrier_lock_test , sizeof ( float ) ) ;
// AUX vars (for debug purposes)
2012-01-13 01:06:28 +00:00
tmp_float = 0 ;
2012-01-07 05:21:11 +00:00
d_dump_file . write ( ( char * ) & tmp_float , sizeof ( float ) ) ;
d_dump_file . write ( ( char * ) & d_sample_counter_seconds , sizeof ( double ) ) ;
}
2012-01-13 01:06:28 +00:00
catch ( std : : ifstream : : failure e )
{
2012-01-16 18:27:31 +00:00
std : : cout < < " Exception writing trk dump file " < < e . what ( ) < < std : : endl ;
2012-01-07 05:21:11 +00:00
}
2012-01-13 01:06:28 +00:00
}
2012-01-07 05:21:11 +00:00
consume_each ( d_current_prn_length_samples ) ; // this is necesary in gr_block derivates
2012-01-16 18:27:31 +00:00
d_sample_counter_seconds = d_sample_counter_seconds + ( ( ( double ) d_current_prn_length_samples ) / ( double ) d_fs_in ) ;
2012-01-13 01:06:28 +00:00
d_sample_counter + = d_current_prn_length_samples ; //count for the processed samples
2012-01-07 05:21:11 +00:00
return 1 ; //output tracking result ALWAYS even in the case of d_enable_tracking==false
2011-11-22 17:21:54 +00:00
}
2012-01-13 01:06:28 +00:00
void Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : set_channel ( unsigned int channel )
{
2012-01-07 05:21:11 +00:00
d_channel = channel ;
2012-01-16 18:27:31 +00:00
DLOG ( INFO ) < < " Tracking Channel set to " < < d_channel ;
2012-01-07 05:21:11 +00:00
// ############# ENABLE DATA FILE LOG #################
2012-01-13 01:06:28 +00:00
if ( d_dump = = true )
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:06:28 +00:00
if ( d_dump_file . is_open ( ) = = false )
2012-01-07 05:21:11 +00:00
{
2012-01-13 01:06:28 +00:00
try
{
2012-01-07 05:21:11 +00:00
d_dump_filename . append ( boost : : lexical_cast < std : : string > ( d_channel ) ) ;
d_dump_filename . append ( " .dat " ) ;
d_dump_file . exceptions ( std : : ifstream : : failbit | std : : ifstream : : badbit ) ;
d_dump_file . open ( d_dump_filename . c_str ( ) , std : : ios : : out | std : : ios : : binary ) ;
2012-01-13 01:06:28 +00:00
std : : cout < < " Tracking dump enabled on channel " < < d_channel < < " Log file: " < < d_dump_filename . c_str ( ) < < std : : endl ;
2012-01-07 05:21:11 +00:00
}
2012-01-13 01:06:28 +00:00
catch ( std : : ifstream : : failure e )
{
2012-01-13 01:28:42 +00:00
std : : cout < < " channel " < < d_channel < < " Exception opening trk dump file " < < e . what ( ) < < std : : endl ;
2012-01-07 05:21:11 +00:00
}
}
}
2011-11-22 17:21:54 +00:00
}
2012-01-13 01:06:28 +00:00
2012-01-27 18:01:17 +00:00
void Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : set_channel_queue ( concurrent_queue < int > * channel_internal_queue )
2011-11-22 17:21:54 +00:00
{
2012-01-27 18:01:17 +00:00
d_channel_internal_queue = channel_internal_queue ;
2011-11-22 17:21:54 +00:00
}
2012-01-27 18:01:17 +00:00
void Gps_L1_Ca_Dll_Fll_Pll_Tracking_cc : : set_gnss_synchro ( Gnss_Synchro * p_gnss_synchro )
{
d_acquisition_gnss_synchro = p_gnss_synchro ;
2012-01-13 01:06:28 +00:00
2012-01-27 18:01:17 +00:00
// Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
//DLOG(INFO) << "Tracking code phase set to " << d_acq_code_phase_samples;
//DLOG(INFO) << "Tracking carrier doppler set to " << d_acq_carrier_doppler_hz;
//DLOG(INFO) << "Tracking Satellite set to " << d_satellite;
2012-01-13 01:06:28 +00:00
2011-11-22 17:21:54 +00:00
}