[hamradio-commits] [gnss-sdr] 75/126: Merge branch 'contrib' of https://github.com/odrisci/gnss-sdr into odrisci-contrib
Carles Fernandez
carles_fernandez-guest at moszumanska.debian.org
Sat Dec 26 18:38:03 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 74d42250d8f74c4a1375381d4175bfa4ade8ebfe
Merge: ed89b70 26b18c1
Author: Carles Fernandez <carles.fernandez at gmail.com>
Date: Mon Nov 30 10:18:09 2015 +0100
Merge branch 'contrib' of https://github.com/odrisci/gnss-sdr into
odrisci-contrib
# Conflicts:
# src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
# src/algorithms/tracking/libs/tracking_discriminators.cc
CMakeLists.txt | 3 +
README.md | 39 ++-
.../galileo_e1_pcps_ambiguous_acquisition.cc | 4 +
.../gnuradio_blocks/pcps_acquisition_cc.cc | 83 +++++-
.../pcps_acquisition_fine_doppler_cc.cc | 4 +-
.../signal_source/adapters/file_signal_source.cc | 46 +++-
.../galileo_e1_dll_pll_veml_tracking_cc.cc | 46 ++--
.../galileo_e1_dll_pll_veml_tracking_cc.h | 18 +-
.../gps_l1_ca_dll_pll_tracking_cc.cc | 4 +-
src/algorithms/tracking/libs/CMakeLists.txt | 1 +
src/algorithms/tracking/libs/correlator.cc | 47 ++++
src/algorithms/tracking/libs/correlator.h | 31 ++-
.../tracking/libs/tracking_discriminators.cc | 20 +-
.../tracking/libs/tracking_loop_filter.cc | 284 +++++++++++++++++++++
.../tracking/libs/tracking_loop_filter.h | 98 +++++++
src/core/receiver/gnss_flowgraph.cc | 74 +++++-
src/core/system_parameters/gnss_signal.cc | 2 +-
src/core/system_parameters/gnss_synchro.h | 2 +-
src/tests/CMakeLists.txt | 3 +-
src/tests/arithmetic/tracking_loop_filter_test.cc | 234 +++++++++++++++++
.../libs/gps_l1_ca_dll_pll_read_tracking_dump.m | 7 +-
21 files changed, 984 insertions(+), 66 deletions(-)
diff --cc src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc
index 934e00a,0ea9258..83fae8c
--- a/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc
+++ b/src/algorithms/tracking/gnuradio_blocks/galileo_e1_dll_pll_veml_tracking_cc.cc
@@@ -210,10 -210,10 +210,10 @@@ void galileo_e1_dll_pll_veml_tracking_c
d_carrier_lock_fail_counter = 0;
d_rem_code_phase_samples = 0.0;
-- d_rem_carr_phase_rad = 0;
-- d_acc_carrier_phase_rad = 0;
++ d_rem_carr_phase_rad = 0.0;
++ d_acc_carrier_phase_rad = 0.0;
-- d_acc_code_phase_secs = 0;
++ d_acc_code_phase_secs = 0.0;
d_carrier_doppler_hz = d_acq_carrier_doppler_hz;
d_current_prn_length_samples = d_vector_length;
@@@ -246,20 -246,20 +246,20 @@@ void galileo_e1_dll_pll_veml_tracking_c
int epl_loop_length_samples;
// unified loop for VE, E, P, L, VL code vectors
- code_phase_step_chips = (static_cast<double>(d_code_freq_chips)) / (static_cast<double>(d_fs_in));
- code_phase_step_half_chips = (2.0 * static_cast<double>(d_code_freq_chips)) / (static_cast<double>(d_fs_in));
+ code_phase_step_chips = d_code_freq_chips / (static_cast<double>(d_fs_in));
+ code_phase_step_half_chips = (2.0 * d_code_freq_chips) / (static_cast<double>(d_fs_in));
-- rem_code_phase_half_chips = d_rem_code_phase_samples * (2*d_code_freq_chips / d_fs_in);
- tcode_half_chips = - static_cast<double>(rem_code_phase_half_chips);
++ rem_code_phase_half_chips = d_rem_code_phase_samples * (2.0 * d_code_freq_chips / static_cast<double>(d_fs_in));
+ tcode_half_chips = - rem_code_phase_half_chips;
-- early_late_spc_samples = round(d_early_late_spc_chips / code_phase_step_chips);
-- very_early_late_spc_samples = round(d_very_early_late_spc_chips / code_phase_step_chips);
++ early_late_spc_samples = std::round(d_early_late_spc_chips / code_phase_step_chips);
++ very_early_late_spc_samples = std::round(d_very_early_late_spc_chips / code_phase_step_chips);
epl_loop_length_samples = d_current_prn_length_samples + very_early_late_spc_samples * 2;
for (int i = 0; i < epl_loop_length_samples; i++)
{
-- associated_chip_index = 2 + round(fmod(tcode_half_chips - 2 * d_very_early_late_spc_chips, code_length_half_chips));
++ associated_chip_index = 2 + std::round(std::fmod(tcode_half_chips - 2.0 * d_very_early_late_spc_chips, static_cast<double>(code_length_half_chips)));
d_very_early_code[i] = d_ca_code[associated_chip_index];
tcode_half_chips = tcode_half_chips + code_phase_step_half_chips;
}
@@@ -273,7 -273,7 +273,7 @@@
void galileo_e1_dll_pll_veml_tracking_cc::update_local_carrier()
{
float sin_f, cos_f;
-- float phase_step_rad = static_cast<float>(2 * GALILEO_PI) * d_carrier_doppler_hz / static_cast<float>(d_fs_in);
++ float phase_step_rad = static_cast<float>(2.0 * GALILEO_PI) * d_carrier_doppler_hz / static_cast<float>(d_fs_in);
int phase_step_rad_i = gr::fxpt::float_to_fixed(phase_step_rad);
int phase_rad_i = gr::fxpt::float_to_fixed(d_rem_carr_phase_rad);
@@@ -310,11 -310,10 +310,10 @@@ galileo_e1_dll_pll_veml_tracking_cc::~g
int galileo_e1_dll_pll_veml_tracking_cc::general_work (int noutput_items,gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
{
- double carr_error_hz = 0.0;
- double carr_error_filt_hz = 0.0;
- double code_error_chips = 0.0;
- double code_error_filt_chips = 0.0;
-
- float carr_error_hz;
- float carr_error_filt_hz;
- float code_error_chips;
- float code_error_filt_chips;
++ double carr_error_hz = 0.0;
++ double carr_error_filt_hz = 0.0;
++ double code_error_chips = 0.0;
++ double code_error_filt_chips = 0.0;
if (d_enable_tracking == true)
{
@@@ -324,11 -323,11 +323,11 @@@
* Signal alignment (skip samples until the incoming signal is aligned with local replica)
*/
int samples_offset;
- float acq_trk_shif_correction_samples;
+ double acq_trk_shif_correction_samples;
int acq_to_trk_delay_samples;
acq_to_trk_delay_samples = d_sample_counter - d_acq_sample_stamp;
-- acq_trk_shif_correction_samples = d_current_prn_length_samples - fmod(static_cast<float>(acq_to_trk_delay_samples), static_cast<float>(d_current_prn_length_samples));
-- samples_offset = round(d_acq_code_phase_samples + acq_trk_shif_correction_samples);
++ acq_trk_shif_correction_samples = static_cast<double>(d_current_prn_length_samples) - static_cast<double>(std::fmod(static_cast<double>(acq_to_trk_delay_samples), static_cast<double>(d_current_prn_length_samples)));
++ samples_offset = static_cast<int>(std::round(d_acq_code_phase_samples + acq_trk_shif_correction_samples));
d_sample_counter = d_sample_counter + samples_offset; //count for the processed samples
d_pull_in = false;
consume_each(samples_offset); //shift input to perform alignment with local replica
@@@ -365,7 -364,7 +364,7 @@@
// ################## PLL ##########################################################
// PLL discriminator
-- carr_error_hz = pll_cloop_two_quadrant_atan(*d_Prompt) / static_cast<float>(GPS_TWO_PI);
++ carr_error_hz = pll_cloop_two_quadrant_atan(*d_Prompt) / static_cast<double>(GPS_TWO_PI);
// Carrier discriminator filter
carr_error_filt_hz = d_carrier_loop_filter.get_carrier_nco(carr_error_hz);
// New carrier Doppler frequency estimation
@@@ -373,10 -372,10 +372,10 @@@
// New code Doppler frequency estimation
d_code_freq_chips = Galileo_E1_CODE_CHIP_RATE_HZ + ((d_carrier_doppler_hz * Galileo_E1_CODE_CHIP_RATE_HZ) / Galileo_E1_FREQ_HZ);
//carrier phase accumulator for (K) Doppler estimation
- d_acc_carrier_phase_rad = d_acc_carrier_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * Galileo_E1_CODE_PERIOD;
+ d_acc_carrier_phase_rad -= GPS_TWO_PI * d_carrier_doppler_hz * Galileo_E1_CODE_PERIOD;
//remnant carrier phase to prevent overflow in the code NCO
d_rem_carr_phase_rad = d_rem_carr_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * Galileo_E1_CODE_PERIOD;
-- d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, GPS_TWO_PI);
++ d_rem_carr_phase_rad = std::fmod(d_rem_carr_phase_rad, GPS_TWO_PI);
// ################## DLL ##########################################################
// DLL discriminator
@@@ -400,7 -399,7 +399,7 @@@
T_prn_seconds = T_chip_seconds * Galileo_E1_B_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 + code_error_filt_secs * static_cast<double>(d_fs_in);
-- d_current_prn_length_samples = round(K_blk_samples); //round to a discrete samples
++ d_current_prn_length_samples = static_cast<int>(std::round(K_blk_samples)); //round to a discrete samples
//d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample
// ####### CN0 ESTIMATION AND LOCK DETECTORS ######
@@@ -457,7 -456,7 +456,7 @@@
// Tracking_timestamp_secs is aligned with the CURRENT PRN start sample (Hybridization OK!, but some glitches??)
current_synchro_data.Tracking_timestamp_secs = (static_cast<double>(d_sample_counter) + static_cast<double>(d_rem_code_phase_samples)) / static_cast<double>(d_fs_in);
//compute remnant code phase samples AFTER the Tracking timestamp
-- d_rem_code_phase_samples = K_blk_samples - d_current_prn_length_samples; //rounding error < 1 sample
++ d_rem_code_phase_samples = K_blk_samples - static_cast<double>(d_current_prn_length_samples); //rounding error < 1 sample
// This tracking block aligns the Tracking_timestamp_secs with the start sample of the PRN, thus, Code_phase_secs=0
current_synchro_data.Code_phase_secs = 0;
@@@ -472,10 -471,10 +471,9 @@@
* \todo The stop timer has to be moved to the signal source!
*/
// stream to collect cout calls to improve thread safety
-- std::stringstream tmp_str_stream;
-- if (floor(d_sample_counter / d_fs_in) != d_last_seg)
++ if (std::floor(d_sample_counter / d_fs_in) != d_last_seg)
{
-- d_last_seg = floor(d_sample_counter / d_fs_in);
++ d_last_seg = std::floor(d_sample_counter / d_fs_in);
if (d_channel == 0)
{
@@@ -498,9 -497,9 +496,9 @@@
*/
// stream to collect cout calls to improve thread safety
std::stringstream tmp_str_stream;
-- if (floor(d_sample_counter / d_fs_in) != d_last_seg)
++ if (std::floor(d_sample_counter / d_fs_in) != d_last_seg)
{
-- d_last_seg = floor(d_sample_counter / d_fs_in);
++ d_last_seg = std::floor(d_sample_counter / d_fs_in);
if (d_channel == 0)
{
diff --cc src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
index 07d64b9,5027cbf..b75505e
--- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
+++ b/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
@@@ -422,9 -422,9 +422,9 @@@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::gene
// New code Doppler frequency estimation
d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L1_CA_CODE_RATE_HZ) / GPS_L1_FREQ_HZ);
//carrier phase accumulator for (K) doppler estimation
- d_acc_carrier_phase_rad = d_acc_carrier_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * GPS_L1_CA_CODE_PERIOD;
+ d_acc_carrier_phase_rad -= GPS_TWO_PI * d_carrier_doppler_hz * GPS_L1_CA_CODE_PERIOD;
//remanent carrier phase to prevent overflow in the code NCO
- d_rem_carr_phase_rad = d_rem_carr_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * GPS_L1_CA_CODE_PERIOD;
+ d_rem_carr_phase_rad = d_rem_carr_phase_rad + GPS_TWO_PI * ( d_if_freq + d_carrier_doppler_hz ) * GPS_L1_CA_CODE_PERIOD;
d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, GPS_TWO_PI);
// ################## DLL ##########################################################
diff --cc src/algorithms/tracking/libs/correlator.h
index 38d2d9b,a5f2f66..aebd198
--- a/src/algorithms/tracking/libs/correlator.h
+++ b/src/algorithms/tracking/libs/correlator.h
@@@ -56,17 -56,43 +56,44 @@@
class Correlator
{
public:
++ Correlator();
++ ~Correlator();
void Carrier_wipeoff_and_EPL_generic(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out);
void Carrier_wipeoff_and_EPL_volk(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out);
void Carrier_wipeoff_and_VEPL_volk(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* VE_code, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* VL_code, gr_complex* VE_out, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* VL_out);
// void Carrier_wipeoff_and_EPL_volk_IQ(int prn_length_samples,int integration_time ,const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* P_data_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* P_data_out);
void Carrier_wipeoff_and_EPL_volk_IQ(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* P_data_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out, gr_complex* P_data_out);
-- Correlator();
-- ~Correlator();
-#if USING_VOLK_CW_EPL_CORR_CUSTOM
- void Carrier_wipeoff_and_EPL_volk_custom(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out);
-#endif
+
+ void Carrier_rotate_and_EPL_volk(int signal_length_samples,
+ const gr_complex* input,
+ gr_complex *phase_as_complex,
+ gr_complex phase_inc_as_complex,
+ const gr_complex* E_code,
+ const gr_complex* P_code,
+ const gr_complex* L_code,
+ gr_complex* E_out,
+ gr_complex* P_out,
+ gr_complex* L_out );
+
+ void Carrier_rotate_and_VEPL_volk(int signal_length_samples,
+ const gr_complex* input,
+ gr_complex *phase_as_complex,
+ gr_complex phase_inc_as_complex,
+ const gr_complex* VE_code,
+ const gr_complex* E_code,
+ const gr_complex* P_code,
+ const gr_complex* L_code,
+ const gr_complex* VL_code,
+ gr_complex* VE_out,
+ gr_complex* E_out,
+ gr_complex* P_out,
+ gr_complex* L_out,
+ gr_complex* VL_out );
+
+#if USING_VOLK_CW_EPL_CORR_CUSTOM
+ void Carrier_wipeoff_and_EPL_volk_custom(int signal_length_samples, const gr_complex* input, gr_complex* carrier, gr_complex* E_code, gr_complex* P_code, gr_complex* L_code, gr_complex* E_out, gr_complex* P_out, gr_complex* L_out);
+#endif
+
private:
unsigned long next_power_2(unsigned long v);
};
diff --cc src/algorithms/tracking/libs/tracking_discriminators.cc
index 1aaa100,106b3a3..72b51a5
--- a/src/algorithms/tracking/libs/tracking_discriminators.cc
+++ b/src/algorithms/tracking/libs/tracking_discriminators.cc
@@@ -91,17 -91,24 +91,24 @@@ double pll_cloop_two_quadrant_atan(gr_c
/*
* DLL Noncoherent Early minus Late envelope normalized discriminator:
* \f{equation}
-- * error=\frac{E-L}{E+L},
++ * error=\frac{1}{2}\frac{E-L}{E+L},
* \f}
* where \f$E=\sqrt{I_{ES}^2+Q_{ES}^2}\f$ is the Early correlator output absolute value and
* \f$L=\sqrt{I_{LS}^2+Q_{LS}^2}\f$ is the Late correlator output absolute value. The output is in [chips].
*/
-float dll_nc_e_minus_l_normalized(gr_complex early_s1, gr_complex late_s1)
+double dll_nc_e_minus_l_normalized(gr_complex early_s1, gr_complex late_s1)
{
- float P_early, P_late;
+ double P_early, P_late;
P_early = std::abs(early_s1);
P_late = std::abs(late_s1);
- return 0.5*(P_early - P_late) / ((P_early + P_late));
+ if( P_early + P_late == 0.0 )
- {
- return 0.0;
- }
++ {
++ return 0.0;
++ }
+ else
- {
- return (P_early - P_late) / ((P_early + P_late));
- }
++ {
++ return 0.5 * (P_early - P_late) / ((P_early + P_late));
++ }
}
/*
@@@ -113,10 -120,10 +120,17 @@@
* where \f$E=\sqrt{I_{VE}^2+Q_{VE}^2+I_{E}^2+Q_{E}^2}\f$ and
* \f$L=\sqrt{I_{VL}^2+Q_{VL}^2+I_{L}^2+Q_{L}^2}\f$ . The output is in [chips].
*/
-float dll_nc_vemlp_normalized(gr_complex very_early_s1, gr_complex early_s1, gr_complex late_s1, gr_complex very_late_s1)
+double dll_nc_vemlp_normalized(gr_complex very_early_s1, gr_complex early_s1, gr_complex late_s1, gr_complex very_late_s1)
{
- float P_early, P_late;
+ double P_early, P_late;
P_early = std::sqrt(std::norm(very_early_s1) + std::norm(early_s1));
P_late = std::sqrt(std::norm(very_late_s1) + std::norm(late_s1));
-- return (P_early - P_late) / ((P_early + P_late));
++ if( P_early + P_late == 0.0 )
++ {
++ return 0.0;
++ }
++ else
++ {
++ return (P_early - P_late) / ((P_early + P_late));
++ }
}
diff --cc src/core/receiver/gnss_flowgraph.cc
index 1d1c142,3cdacde..00af053
--- a/src/core/receiver/gnss_flowgraph.cc
+++ b/src/core/receiver/gnss_flowgraph.cc
@@@ -34,10 -34,10 +34,13 @@@
#include "gnss_flowgraph.h"
#include "unistd.h"
++
++#include <algorithm>
#include <exception>
#include <iostream>
#include <set>
#include <boost/lexical_cast.hpp>
++#include <boost/tokenizer.hpp>
#include <glog/logging.h>
#include "configuration_interface.h"
#include "gnss_block_interface.h"
diff --cc src/core/system_parameters/gnss_signal.cc
index 3230c10,feba0e7..399a6a9
--- a/src/core/system_parameters/gnss_signal.cc
+++ b/src/core/system_parameters/gnss_signal.cc
@@@ -73,7 -73,7 +73,7 @@@ bool operator==(const Gnss_Signal &sig1
if (sig1.get_satellite() == sig2.get_satellite())
{
- if (sig1.get_signal_str().compare(sig1.get_signal_str()))
- if (sig1.get_signal_str().compare(sig1.get_signal_str())==0)
++ if (sig1.get_signal_str().compare(sig1.get_signal_str()) == 0)
{
equal = true;
}
diff --cc src/core/system_parameters/gnss_synchro.h
index 9c603f9,df688e1..59aed13
--- a/src/core/system_parameters/gnss_synchro.h
+++ b/src/core/system_parameters/gnss_synchro.h
@@@ -32,8 -32,7 +32,8 @@@
#define GNSS_SDR_GNSS_SYNCHRO_H_
#include "gnss_signal.h"
- #include <deque>
+
+
/*!
* \brief This is the class that contains the information that is shared
* by the processing blocks.
--
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