[hamradio-commits] [gnss-sdr] 22/251: GPS L1 C/A + GPS L2C M dual frequency offline acquisition and tracking READY. Issues on PRN numbering are being investigated...
Carles Fernandez
carles_fernandez-guest at moszumanska.debian.org
Wed Sep 2 00:22:32 UTC 2015
This is an automated email from the git hooks/post-receive script.
carles_fernandez-guest pushed a commit to branch master
in repository gnss-sdr.
commit 4c5efd1e8bc304d2ad7b0e8083fabfa4fadff917
Author: Javier <jarribas at cttc.es>
Date: Tue May 5 18:18:16 2015 +0200
GPS L1 C/A + GPS L2C M dual frequency offline acquisition and tracking
READY. Issues on PRN numbering are being investigated...
---
...channel_GPS_L2_M_Flexiband_bin_file_III_1b.conf | 513 ++++++++++++++++++---
src/algorithms/libs/gps_sdr_signal_processing.cc | 6 +-
.../telemetry_decoder/adapters/CMakeLists.txt | 1 +
.../adapters/gps_l2_m_telemetry_decoder.cc | 122 +++++
.../adapters/gps_l2_m_telemetry_decoder.h | 96 ++++
.../gnuradio_blocks/CMakeLists.txt | 1 +
.../gps_l1_ca_telemetry_decoder_cc.cc | 3 +-
...oder_cc.cc => gps_l2_m_telemetry_decoder_cc.cc} | 33 +-
.../gps_l2_m_telemetry_decoder_cc.h | 152 ++++++
.../tracking/adapters/gps_l2_m_dll_pll_tracking.cc | 154 +++++++
.../tracking/adapters/gps_l2_m_dll_pll_tracking.h | 114 +++++
.../gps_l1_ca_dll_pll_tracking_cc.cc | 8 +-
...cking_cc.cc => gps_l2_m_dll_pll_tracking_cc.cc} | 98 ++--
.../gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.h | 187 ++++++++
src/core/receiver/gnss_block_factory.cc | 27 +-
src/tests/data/.gitignore | 1 +
.../gnss_block/gps_l2_m_dll_pll_tracking_test.cc | 167 +++++++
.../gnss_block/gps_l2_m_pcps_acquisition_test.cc | 275 +++++++++++
18 files changed, 1824 insertions(+), 134 deletions(-)
diff --git a/conf/gnss-sdr_multichannel_GPS_L2_M_Flexiband_bin_file_III_1b.conf b/conf/gnss-sdr_multichannel_GPS_L2_M_Flexiband_bin_file_III_1b.conf
index 0c86a20..887da30 100644
--- a/conf/gnss-sdr_multichannel_GPS_L2_M_Flexiband_bin_file_III_1b.conf
+++ b/conf/gnss-sdr_multichannel_GPS_L2_M_Flexiband_bin_file_III_1b.conf
@@ -267,7 +267,7 @@ Resampler2.implementation=Pass_Through
;######### CHANNELS GLOBAL CONFIG ############
;#count: Number of available GPS satellite channels.
-Channels_GPS.count=2
+Channels_GPS.count=9
;#count: Number of available Galileo satellite channels.
Channels_Galileo.count=0
;#in_acquisition: Number of channels simultaneously acquiring for the whole receiver
@@ -281,16 +281,66 @@ Channel0.RF_channel_ID=0
Channel0.system=GPS
Channel0.signal=1C
-Channel1.RF_channel_ID=1
-Channel1.system=GPS L2C M
-Channel1.signal=2S
+Channel1.RF_channel_ID=0
+Channel1.system=GPS
+Channel1.signal=1C
Channel2.RF_channel_ID=0
+Channel2.system=GPS
+Channel2.signal=1C
+
Channel3.RF_channel_ID=0
+Channel3.system=GPS
+Channel3.signal=1C
+
Channel4.RF_channel_ID=0
+Channel4.system=GPS
+Channel4.signal=1C
+
Channel5.RF_channel_ID=0
+Channel5.system=GPS
+Channel5.signal=1C
+
Channel6.RF_channel_ID=0
+Channel6.system=GPS
+Channel6.signal=1C
+
Channel7.RF_channel_ID=0
+Channel7.system=GPS
+Channel7.signal=1C
+
+
+Channel8.RF_channel_ID=1
+Channel8.system=GPS L2C M
+Channel8.signal=2S
+
+Channel9.RF_channel_ID=1
+Channel9.system=GPS L2C M
+Channel9.signal=2S
+
+Channel10.RF_channel_ID=1
+Channel10.system=GPS L2C M
+Channel10.signal=2S
+
+Channel11.RF_channel_ID=1
+Channel11.system=GPS L2C M
+Channel11.signal=2S
+
+Channel12.RF_channel_ID=1
+Channel12.system=GPS L2C M
+Channel12.signal=2S
+
+Channel13.RF_channel_ID=1
+Channel13.system=GPS L2C M
+Channel13.signal=2S
+
+Channel14.RF_channel_ID=1
+Channel14.system=GPS L2C M
+Channel14.signal=2S
+
+Channel15.RF_channel_ID=1
+Channel15.system=GPS L2C M
+Channel15.signal=2S
;#signal:
;#if the option is disabled by default is assigned "1C" GPS L1 C/A
@@ -299,56 +349,208 @@ Channel.signal=1C
;######### SPECIFIC CHANNELS CONFIG ######
;#The following options are specific to each channel and overwrite the generic options
-;#dump: Enable or disable the acquisition internal data file logging [true] or [false]
+;# GPS L1 C/A
Acquisition_GPS0.dump=false
-;#filename: Log path and filename
Acquisition_GPS0.dump_filename=./acq_dump.dat
-;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version.
Acquisition_GPS0.item_type=gr_complex
-;#if: Signal intermediate frequency in [Hz]
Acquisition_GPS0.if=0
-;#sampled_ms: Signal block duration for the acquisition signal detection [ms]
Acquisition_GPS0.sampled_ms=1
-;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition]
Acquisition_GPS0.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
-;#threshold: Acquisition threshold
-Acquisition_GPS0.threshold=0.015
-;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition]
+Acquisition_GPS0.threshold=0.015
;Acquisition_GPS0.pfa=0.0001
-;#doppler_max: Maximum expected Doppler shift [Hz]
Acquisition_GPS0.doppler_max=5000
-;#doppler_max: Maximum expected Doppler shift [Hz]
Acquisition_GPS0.doppler_min=-5000
-;#doppler_step Doppler step in the grid search [Hz]
Acquisition_GPS0.doppler_step=250
-;#maximum dwells
Acquisition_GPS0.max_dwells=2
-;#dump: Enable or disable the acquisition internal data file logging [true] or [false]
Acquisition_GPS1.dump=false
-;#filename: Log path and filename
Acquisition_GPS1.dump_filename=./acq_dump.dat
-;#item_type: Type and resolution for each of the signal samples. Use only gr_complex in this version.
Acquisition_GPS1.item_type=gr_complex
-;#if: Signal intermediate frequency in [Hz]
Acquisition_GPS1.if=0
-;#sampled_ms: Signal block duration for the acquisition signal detection [ms]
Acquisition_GPS1.sampled_ms=1
-;#implementation: Acquisition algorithm selection for this channel: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition]
Acquisition_GPS1.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
-;#threshold: Acquisition threshold
-Acquisition_GPS1.threshold=0.015
-;#pfa: Acquisition false alarm probability. This option overrides the threshold option. Only use with implementations: [GPS_L1_CA_PCPS_Acquisition] or [Galileo_E1_PCPS_Ambiguous_Acquisition]
+Acquisition_GPS1.threshold=0.015
;Acquisition_GPS1.pfa=0.0001
-;#doppler_max: Maximum expected Doppler shift [Hz]
Acquisition_GPS1.doppler_max=5000
-;#doppler_max: Maximum expected Doppler shift [Hz]
Acquisition_GPS1.doppler_min=-5000
-;#doppler_step Doppler step in the grid search [Hz]
-Acquisition_GPS1.doppler_step=100
-;#maximum dwells
+Acquisition_GPS1.doppler_step=250
Acquisition_GPS1.max_dwells=2
+Acquisition_GPS2.dump=false
+Acquisition_GPS2.dump_filename=./acq_dump.dat
+Acquisition_GPS2.item_type=gr_complex
+Acquisition_GPS2.if=0
+Acquisition_GPS2.sampled_ms=1
+Acquisition_GPS2.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS2.threshold=0.015
+;Acquisition_GPS2.pfa=0.0001
+Acquisition_GPS2.doppler_max=5000
+Acquisition_GPS2.doppler_min=-5000
+Acquisition_GPS2.doppler_step=250
+Acquisition_GPS2.max_dwells=2
+
+Acquisition_GPS3.dump=false
+Acquisition_GPS3.dump_filename=./acq_dump.dat
+Acquisition_GPS3.item_type=gr_complex
+Acquisition_GPS3.if=0
+Acquisition_GPS3.sampled_ms=1
+Acquisition_GPS3.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS3.threshold=0.015
+;Acquisition_GPS3.pfa=0.0001
+Acquisition_GPS3.doppler_max=5000
+Acquisition_GPS3.doppler_min=-5000
+Acquisition_GPS3.doppler_step=250
+Acquisition_GPS3.max_dwells=2
+
+Acquisition_GPS4.dump=false
+Acquisition_GPS4.dump_filename=./acq_dump.dat
+Acquisition_GPS4.item_type=gr_complex
+Acquisition_GPS4.if=0
+Acquisition_GPS4.sampled_ms=1
+Acquisition_GPS4.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS4.threshold=0.015
+;Acquisition_GPS4.pfa=0.0001
+Acquisition_GPS4.doppler_max=5000
+Acquisition_GPS4.doppler_min=-5000
+Acquisition_GPS4.doppler_step=250
+Acquisition_GPS4.max_dwells=2
+
+Acquisition_GPS5.dump=false
+Acquisition_GPS5.dump_filename=./acq_dump.dat
+Acquisition_GPS5.item_type=gr_complex
+Acquisition_GPS5.if=0
+Acquisition_GPS5.sampled_ms=1
+Acquisition_GPS5.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS5.threshold=0.015
+;Acquisition_GPS5.pfa=0.0001
+Acquisition_GPS5.doppler_max=5000
+Acquisition_GPS5.doppler_min=-5000
+Acquisition_GPS5.doppler_step=250
+Acquisition_GPS5.max_dwells=2
+
+Acquisition_GPS6.dump=false
+Acquisition_GPS6.dump_filename=./acq_dump.dat
+Acquisition_GPS6.item_type=gr_complex
+Acquisition_GPS6.if=0
+Acquisition_GPS6.sampled_ms=1
+Acquisition_GPS6.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS6.threshold=0.015
+;Acquisition_GPS6.pfa=0.0001
+Acquisition_GPS6.doppler_max=5000
+Acquisition_GPS6.doppler_min=-5000
+Acquisition_GPS6.doppler_step=250
+Acquisition_GPS6.max_dwells=2
+
+Acquisition_GPS7.dump=false
+Acquisition_GPS7.dump_filename=./acq_dump.dat
+Acquisition_GPS7.item_type=gr_complex
+Acquisition_GPS7.if=0
+Acquisition_GPS7.sampled_ms=1
+Acquisition_GPS7.implementation=GPS_L1_CA_PCPS_Acquisition_Fine_Doppler
+Acquisition_GPS7.threshold=0.015
+;Acquisition_GPS7.pfa=0.0001
+Acquisition_GPS7.doppler_max=5000
+Acquisition_GPS7.doppler_min=-5000
+Acquisition_GPS7.doppler_step=250
+Acquisition_GPS7.max_dwells=2
+
+
+;# GPS L2C M
+Acquisition_GPS8.dump=false
+Acquisition_GPS8.dump_filename=./acq_dump.dat
+Acquisition_GPS8.item_type=gr_complex
+Acquisition_GPS8.if=0
+Acquisition_GPS8.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS8.threshold=0.0005
+;Acquisition_GPS8.pfa=0.001
+Acquisition_GPS8.doppler_max=5000
+Acquisition_GPS8.doppler_min=-5000
+Acquisition_GPS8.doppler_step=100
+Acquisition_GPS8.max_dwells=1
+
+Acquisition_GPS9.dump=false
+Acquisition_GPS9.dump_filename=./acq_dump.dat
+Acquisition_GPS9.item_type=gr_complex
+Acquisition_GPS9.if=0
+Acquisition_GPS9.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS9.threshold=0.0005
+;Acquisition_GPS9.pfa=0.001
+Acquisition_GPS9.doppler_max=5000
+Acquisition_GPS9.doppler_min=-5000
+Acquisition_GPS9.doppler_step=100
+Acquisition_GPS9.max_dwells=1
+
+Acquisition_GPS10.dump=false
+Acquisition_GPS10.dump_filename=./acq_dump.dat
+Acquisition_GPS10.item_type=gr_complex
+Acquisition_GPS10.if=0
+Acquisition_GPS10.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS10.threshold=0.0005
+;Acquisition_GPS10.pfa=0.001
+Acquisition_GPS10.doppler_max=5000
+Acquisition_GPS10.doppler_min=-5000
+Acquisition_GPS10.doppler_step=100
+Acquisition_GPS10.max_dwells=1
+
+Acquisition_GPS11.dump=false
+Acquisition_GPS11.dump_filename=./acq_dump.dat
+Acquisition_GPS11.item_type=gr_complex
+Acquisition_GPS11.if=0
+Acquisition_GPS11.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS11.threshold=0.0005
+;Acquisition_GPS11.pfa=0.001
+Acquisition_GPS11.doppler_max=5000
+Acquisition_GPS11.doppler_min=-5000
+Acquisition_GPS11.doppler_step=100
+Acquisition_GPS11.max_dwells=1
+
+Acquisition_GPS12.dump=false
+Acquisition_GPS12.dump_filename=./acq_dump.dat
+Acquisition_GPS12.item_type=gr_complex
+Acquisition_GPS12.if=0
+Acquisition_GPS12.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS12.threshold=0.0005
+;Acquisition_GPS12.pfa=0.001
+Acquisition_GPS12.doppler_max=5000
+Acquisition_GPS12.doppler_min=-5000
+Acquisition_GPS12.doppler_step=100
+Acquisition_GPS12.max_dwells=1
+
+Acquisition_GPS13.dump=false
+Acquisition_GPS13.dump_filename=./acq_dump.dat
+Acquisition_GPS13.item_type=gr_complex
+Acquisition_GPS13.if=0
+Acquisition_GPS13.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS13.threshold=0.0005
+;Acquisition_GPS13.pfa=0.001
+Acquisition_GPS13.doppler_max=5000
+Acquisition_GPS13.doppler_min=-5000
+Acquisition_GPS13.doppler_step=100
+Acquisition_GPS13.max_dwells=1
+
+Acquisition_GPS14.dump=false
+Acquisition_GPS14.dump_filename=./acq_dump.dat
+Acquisition_GPS14.item_type=gr_complex
+Acquisition_GPS14.if=0
+Acquisition_GPS14.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS14.threshold=0.0005
+;Acquisition_GPS14.pfa=0.001
+Acquisition_GPS14.doppler_max=5000
+Acquisition_GPS14.doppler_min=-5000
+Acquisition_GPS14.doppler_step=100
+Acquisition_GPS14.max_dwells=1
+
+Acquisition_GPS15.dump=false
+Acquisition_GPS15.dump_filename=./acq_dump.dat
+Acquisition_GPS15.item_type=gr_complex
+Acquisition_GPS15.if=0
+Acquisition_GPS15.implementation=GPS_L2_M_PCPS_Acquisition
+Acquisition_GPS15.threshold=0.0005
+;Acquisition_GPS15.pfa=0.001
+Acquisition_GPS15.doppler_max=5000
+Acquisition_GPS15.doppler_min=-5000
+Acquisition_GPS15.doppler_step=100
+Acquisition_GPS15.max_dwells=1
;######### ACQUISITION GLOBAL CONFIG ############
@@ -385,50 +587,185 @@ Acquisition_GPS.max_dwells=1
;######### TRACKING CHANNEL 0 CONFIG ############
-
-;#implementation: Selected tracking algorithm: [GPS_L1_CA_DLL_PLL_Tracking] or [GPS_L1_CA_DLL_FLL_PLL_Tracking]
Tracking_GPS0.implementation=GPS_L1_CA_DLL_PLL_Tracking
-;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version.
Tracking_GPS0.item_type=gr_complex
-;#sampling_frequency: Signal Intermediate Frequency in [Hz]
Tracking_GPS0.if=0
-;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false]
Tracking_GPS0.dump=false
-;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number.
Tracking_GPS0.dump_filename=./tracking_ch_
-;#pll_bw_hz: PLL loop filter bandwidth [Hz]
Tracking_GPS0.pll_bw_hz=40.0;
-;#dll_bw_hz: DLL loop filter bandwidth [Hz]
Tracking_GPS0.dll_bw_hz=3.0;
-;#fll_bw_hz: FLL loop filter bandwidth [Hz]
Tracking_GPS0.fll_bw_hz=10.0;
-;#order: PLL/DLL loop filter order [2] or [3]
Tracking_GPS0.order=3;
-;#early_late_space_chips: correlator early-late space [chips]. Use [0.5]
Tracking_GPS0.early_late_space_chips=0.5;
-
;######### TRACKING CHANNEL 1 CONFIG ############
-
-;#implementation: Selected tracking algorithm:
-Tracking_GPS1.implementation=GPS_L2_M_DLL_PLL_Tracking
-;#item_type: Type and resolution for each of the signal samples. Use only [gr_complex] in this version.
+Tracking_GPS1.implementation=GPS_L1_CA_DLL_PLL_Tracking
Tracking_GPS1.item_type=gr_complex
-;#sampling_frequency: Signal Intermediate Frequency in [Hz]
Tracking_GPS1.if=0
-;#dump: Enable or disable the Tracking internal binary data file logging [true] or [false]
Tracking_GPS1.dump=false
-;#dump_filename: Log path and filename. Notice that the tracking channel will add "x.dat" where x is the channel number.
Tracking_GPS1.dump_filename=./tracking_ch_
-;#pll_bw_hz: PLL loop filter bandwidth [Hz]
Tracking_GPS1.pll_bw_hz=40.0;
-;#dll_bw_hz: DLL loop filter bandwidth [Hz]
Tracking_GPS1.dll_bw_hz=3.0;
-;#fll_bw_hz: FLL loop filter bandwidth [Hz]
Tracking_GPS1.fll_bw_hz=10.0;
-;#order: PLL/DLL loop filter order [2] or [3]
Tracking_GPS1.order=3;
-;#early_late_space_chips: correlator early-late space [chips]. Use [0.5]
Tracking_GPS1.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 2 CONFIG ############
+Tracking_GPS2.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS2.item_type=gr_complex
+Tracking_GPS2.if=0
+Tracking_GPS2.dump=false
+Tracking_GPS2.dump_filename=./tracking_ch_
+Tracking_GPS2.pll_bw_hz=40.0;
+Tracking_GPS2.dll_bw_hz=3.0;
+Tracking_GPS2.fll_bw_hz=10.0;
+Tracking_GPS2.order=3;
+Tracking_GPS2.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 3 CONFIG ############
+Tracking_GPS3.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS3.item_type=gr_complex
+Tracking_GPS3.if=0
+Tracking_GPS3.dump=false
+Tracking_GPS3.dump_filename=./tracking_ch_
+Tracking_GPS3.pll_bw_hz=40.0;
+Tracking_GPS3.dll_bw_hz=3.0;
+Tracking_GPS3.fll_bw_hz=10.0;
+Tracking_GPS3.order=3;
+Tracking_GPS3.early_late_space_chips=0.5;
+
+;######### TRACKING CHANNEL 4 CONFIG ############
+Tracking_GPS4.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS4.item_type=gr_complex
+Tracking_GPS4.if=0
+Tracking_GPS4.dump=false
+Tracking_GPS4.dump_filename=./tracking_ch_
+Tracking_GPS4.pll_bw_hz=40.0;
+Tracking_GPS4.dll_bw_hz=3.0;
+Tracking_GPS4.fll_bw_hz=10.0;
+Tracking_GPS4.order=3;
+Tracking_GPS4.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 5 CONFIG ############
+Tracking_GPS5.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS5.item_type=gr_complex
+Tracking_GPS5.if=0
+Tracking_GPS5.dump=false
+Tracking_GPS5.dump_filename=./tracking_ch_
+Tracking_GPS5.pll_bw_hz=40.0;
+Tracking_GPS5.dll_bw_hz=3.0;
+Tracking_GPS5.fll_bw_hz=10.0;
+Tracking_GPS5.order=3;
+Tracking_GPS5.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 6 CONFIG ############
+Tracking_GPS6.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS6.item_type=gr_complex
+Tracking_GPS6.if=0
+Tracking_GPS6.dump=false
+Tracking_GPS6.dump_filename=./tracking_ch_
+Tracking_GPS6.pll_bw_hz=40.0;
+Tracking_GPS6.dll_bw_hz=3.0;
+Tracking_GPS6.fll_bw_hz=10.0;
+Tracking_GPS6.order=3;
+Tracking_GPS6.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 7 CONFIG ############
+Tracking_GPS7.implementation=GPS_L1_CA_DLL_PLL_Tracking
+Tracking_GPS7.item_type=gr_complex
+Tracking_GPS7.if=0
+Tracking_GPS7.dump=false
+Tracking_GPS7.dump_filename=./tracking_ch_
+Tracking_GPS7.pll_bw_hz=40.0;
+Tracking_GPS7.dll_bw_hz=3.0;
+Tracking_GPS7.fll_bw_hz=10.0;
+Tracking_GPS7.order=3;
+Tracking_GPS7.early_late_space_chips=0.5;
+
+;######### TRACKING CHANNEL 8 CONFIG ############
+Tracking_GPS8.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS8.item_type=gr_complex
+Tracking_GPS8.if=0
+Tracking_GPS8.dump=false
+Tracking_GPS8.dump_filename=./tracking_ch_
+Tracking_GPS8.pll_bw_hz=2.0;
+Tracking_GPS8.dll_bw_hz=0.5;
+Tracking_GPS8.fll_bw_hz=2.0;
+Tracking_GPS8.order=2;
+Tracking_GPS8.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 9 CONFIG ############
+Tracking_GPS9.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS9.item_type=gr_complex
+Tracking_GPS9.if=0
+Tracking_GPS9.dump=false
+Tracking_GPS9.dump_filename=./tracking_ch_
+Tracking_GPS9.pll_bw_hz=2.0;
+Tracking_GPS9.dll_bw_hz=0.5;
+Tracking_GPS9.fll_bw_hz=2.0;
+Tracking_GPS9.order=2;
+Tracking_GPS9.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 10 CONFIG ############
+Tracking_GPS10.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS10.item_type=gr_complex
+Tracking_GPS10.if=0
+Tracking_GPS10.dump=false
+Tracking_GPS10.dump_filename=./tracking_ch_
+Tracking_GPS10.pll_bw_hz=2.0;
+Tracking_GPS10.dll_bw_hz=0.5;
+Tracking_GPS10.fll_bw_hz=2.0;
+Tracking_GPS10.order=2;
+Tracking_GPS10.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 11 CONFIG ############
+Tracking_GPS11.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS11.item_type=gr_complex
+Tracking_GPS11.if=0
+Tracking_GPS11.dump=false
+Tracking_GPS11.dump_filename=./tracking_ch_
+Tracking_GPS11.pll_bw_hz=2.0;
+Tracking_GPS11.dll_bw_hz=0.5;
+Tracking_GPS11.fll_bw_hz=2.0;
+Tracking_GPS11.order=2;
+Tracking_GPS11.early_late_space_chips=0.5;
+
+;######### TRACKING CHANNEL 12 CONFIG ############
+Tracking_GPS12.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS12.item_type=gr_complex
+Tracking_GPS12.if=0
+Tracking_GPS12.dump=false
+Tracking_GPS12.dump_filename=./tracking_ch_
+Tracking_GPS12.pll_bw_hz=2.0;
+Tracking_GPS12.dll_bw_hz=0.5;
+Tracking_GPS12.fll_bw_hz=2.0;
+Tracking_GPS12.order=2;
+Tracking_GPS12.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 13 CONFIG ############
+Tracking_GPS13.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS13.item_type=gr_complex
+Tracking_GPS13.if=0
+Tracking_GPS13.dump=false
+Tracking_GPS13.dump_filename=./tracking_ch_
+Tracking_GPS13.pll_bw_hz=2.0;
+Tracking_GPS13.dll_bw_hz=0.5;
+Tracking_GPS13.fll_bw_hz=2.0;
+Tracking_GPS13.order=2;
+Tracking_GPS13.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 14 CONFIG ############
+Tracking_GPS14.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS14.item_type=gr_complex
+Tracking_GPS14.if=0
+Tracking_GPS14.dump=false
+Tracking_GPS14.dump_filename=./tracking_ch_
+Tracking_GPS14.pll_bw_hz=2.0;
+Tracking_GPS14.dll_bw_hz=0.5;
+Tracking_GPS14.fll_bw_hz=2.0;
+Tracking_GPS14.order=2;
+Tracking_GPS14.early_late_space_chips=0.5;
+;######### TRACKING CHANNEL 15 CONFIG ############
+Tracking_GPS15.implementation=GPS_L2_M_DLL_PLL_Tracking
+Tracking_GPS15.item_type=gr_complex
+Tracking_GPS15.if=0
+Tracking_GPS15.dump=false
+Tracking_GPS15.dump_filename=./tracking_ch_
+Tracking_GPS15.pll_bw_hz=2.0;
+Tracking_GPS15.dll_bw_hz=0.5;
+Tracking_GPS15.fll_bw_hz=2.0;
+Tracking_GPS15.order=2;
+Tracking_GPS15.early_late_space_chips=0.5;
+
;######### TRACKING GLOBAL CONFIG ############
@@ -460,6 +797,72 @@ TelemetryDecoder_GPS.dump=false
;#decimation factor
TelemetryDecoder_GPS.decimation_factor=1;
+TelemetryDecoder_GPS0.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS0.dump=false
+TelemetryDecoder_GPS0.decimation_factor=20;
+
+TelemetryDecoder_GPS1.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS1.dump=false
+TelemetryDecoder_GPS1.decimation_factor=20;
+
+TelemetryDecoder_GPS2.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS2.dump=false
+TelemetryDecoder_GPS2.decimation_factor=20;
+
+TelemetryDecoder_GPS3.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS3.dump=false
+TelemetryDecoder_GPS3.decimation_factor=20;
+
+TelemetryDecoder_GPS4.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS4.dump=false
+TelemetryDecoder_GPS4.decimation_factor=20;
+
+TelemetryDecoder_GPS5.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS5.dump=false
+TelemetryDecoder_GPS5.decimation_factor=20;
+
+TelemetryDecoder_GPS6.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS6.dump=false
+TelemetryDecoder_GPS6.decimation_factor=20;
+
+TelemetryDecoder_GPS7.implementation=GPS_L1_CA_Telemetry_Decoder
+TelemetryDecoder_GPS7.dump=false
+TelemetryDecoder_GPS7.decimation_factor=20;
+
+
+TelemetryDecoder_GPS8.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS8.dump=false
+TelemetryDecoder_GPS8.decimation_factor=1;
+
+TelemetryDecoder_GPS9.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS9.dump=false
+TelemetryDecoder_GPS9.decimation_factor=1;
+
+TelemetryDecoder_GPS10.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS10.dump=false
+TelemetryDecoder_GPS10.decimation_factor=1;
+
+TelemetryDecoder_GPS11.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS11.dump=false
+TelemetryDecoder_GPS11.decimation_factor=1;
+
+TelemetryDecoder_GPS12.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS12.dump=false
+TelemetryDecoder_GPS12.decimation_factor=1;
+
+TelemetryDecoder_GPS13.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS13.dump=false
+TelemetryDecoder_GPS13.decimation_factor=1;
+
+TelemetryDecoder_GPS14.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS14.dump=false
+TelemetryDecoder_GPS14.decimation_factor=1;
+
+TelemetryDecoder_GPS15.implementation=GPS_L2_M_Telemetry_Decoder
+TelemetryDecoder_GPS15.dump=false
+TelemetryDecoder_GPS15.decimation_factor=1;
+
+
;######### OBSERVABLES CONFIG ############
;#implementation: Use [GPS_L1_CA_Observables] for GPS L1 C/A.
Observables.implementation=GPS_L1_CA_Observables
diff --git a/src/algorithms/libs/gps_sdr_signal_processing.cc b/src/algorithms/libs/gps_sdr_signal_processing.cc
index 9037fc4..4b3ad17 100644
--- a/src/algorithms/libs/gps_sdr_signal_processing.cc
+++ b/src/algorithms/libs/gps_sdr_signal_processing.cc
@@ -54,11 +54,13 @@ void gps_l1_ca_code_gen_complex(std::complex<float>* _dest, signed int _prn, uns
// compute delay array index for given PRN number
if(120 <= _prn && _prn <= 138)
{
- prn_idx = _prn - 88; // SBAS PRNs are at array indices 31 to 50 (offset: -120+33-1 =-88)
+ //prn_idx = _prn - 88; // SBAS PRNs are at array indices 31 to 50 (offset: -120+33-1 =-88)
+ prn_idx = _prn - 87; // SBAS PRNs are at array indices 31 to 50 (offset: -120+33 =-87)
}
else
{
- prn_idx = _prn-1;
+ //prn_idx = _prn-1;
+ prn_idx = _prn;
}
/* A simple error check */
diff --git a/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt b/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt
index f29ea2c..3eaacbf 100644
--- a/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt
+++ b/src/algorithms/telemetry_decoder/adapters/CMakeLists.txt
@@ -18,6 +18,7 @@
set(TELEMETRY_DECODER_ADAPTER_SOURCES
gps_l1_ca_telemetry_decoder.cc
+ gps_l2_m_telemetry_decoder.cc
galileo_e1b_telemetry_decoder.cc
sbas_l1_telemetry_decoder.cc
galileo_e5a_telemetry_decoder.cc
diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.cc b/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.cc
new file mode 100644
index 0000000..da02c29
--- /dev/null
+++ b/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.cc
@@ -0,0 +1,122 @@
+/*!
+ * \file gps_l2_m_telemetry_decoder.cc
+ * \brief Implementation of an adapter of a GPS L2C M NAV data decoder block
+ * to a TelemetryDecoderInterface
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015 (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/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#include "gps_l2_m_telemetry_decoder.h"
+#include <gnuradio/io_signature.h>
+#include <glog/logging.h>
+#include "gps_ephemeris.h"
+#include "gps_almanac.h"
+#include "gps_iono.h"
+#include "gps_utc_model.h"
+#include "configuration_interface.h"
+
+extern concurrent_queue<Gps_Ephemeris> global_gps_ephemeris_queue;
+extern concurrent_queue<Gps_Iono> global_gps_iono_queue;
+extern concurrent_queue<Gps_Utc_Model> global_gps_utc_model_queue;
+extern concurrent_queue<Gps_Almanac> global_gps_almanac_queue;
+
+
+using google::LogMessage;
+
+GpsL2MTelemetryDecoder::GpsL2MTelemetryDecoder(ConfigurationInterface* configuration,
+ std::string role,
+ unsigned int in_streams,
+ unsigned int out_streams,
+ boost::shared_ptr<gr::msg_queue> queue) :
+ role_(role),
+ in_streams_(in_streams),
+ out_streams_(out_streams),
+ queue_(queue)
+{
+ std::string default_item_type = "gr_complex";
+ std::string default_dump_filename = "./navigation.dat";
+ DLOG(INFO) << "role " << role;
+ DLOG(INFO) << "vector length " << vector_length_;
+ vector_length_ = configuration->property(role + ".vector_length", 2048);
+ dump_ = configuration->property(role + ".dump", false);
+ dump_filename_ = configuration->property(role + ".dump_filename", default_dump_filename);
+ int fs_in;
+ fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000);
+ // make telemetry decoder object
+ telemetry_decoder_ = gps_l2_m_make_telemetry_decoder_cc(satellite_, 0, (long)fs_in, vector_length_, queue_, dump_); // TODO fix me
+ DLOG(INFO) << "telemetry_decoder(" << telemetry_decoder_->unique_id() << ")";
+ // set the navigation msg queue;
+ telemetry_decoder_->set_ephemeris_queue(&global_gps_ephemeris_queue);
+ telemetry_decoder_->set_iono_queue(&global_gps_iono_queue);
+ telemetry_decoder_->set_almanac_queue(&global_gps_almanac_queue);
+ telemetry_decoder_->set_utc_model_queue(&global_gps_utc_model_queue);
+
+ //decimation factor
+ int decimation_factor = configuration->property(role + ".decimation_factor", 1);
+ telemetry_decoder_->set_decimation(decimation_factor);
+ LOG(INFO) << "global navigation message queue assigned to telemetry_decoder ("<< telemetry_decoder_->unique_id() << ")"<<"role "<<role;
+}
+
+
+GpsL2MTelemetryDecoder::~GpsL2MTelemetryDecoder()
+{}
+
+
+void GpsL2MTelemetryDecoder::set_satellite(Gnss_Satellite satellite)
+{
+ satellite_ = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
+ telemetry_decoder_->set_satellite(satellite_);
+ DLOG(INFO) << "TELEMETRY DECODER: satellite set to " << satellite_;
+}
+
+
+void GpsL2MTelemetryDecoder::connect(gr::top_block_sptr top_block)
+{
+ if(top_block) { /* top_block is not null */};
+ // Nothing to connect internally
+ DLOG(INFO) << "nothing to connect internally";
+}
+
+
+void GpsL2MTelemetryDecoder::disconnect(gr::top_block_sptr top_block)
+{
+ if(top_block) { /* top_block is not null */};
+ // Nothing to disconnect
+}
+
+
+gr::basic_block_sptr GpsL2MTelemetryDecoder::get_left_block()
+{
+ return telemetry_decoder_;
+}
+
+
+gr::basic_block_sptr GpsL2MTelemetryDecoder::get_right_block()
+{
+ return telemetry_decoder_;
+}
+
diff --git a/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.h b/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.h
new file mode 100644
index 0000000..506fdc4
--- /dev/null
+++ b/src/algorithms/telemetry_decoder/adapters/gps_l2_m_telemetry_decoder.h
@@ -0,0 +1,96 @@
+/*!
+ * \file gps_l2_m_telemetry_decoder.h
+ * \brief Interface of an adapter of a GPS L1 C/A NAV data decoder block
+ * to a TelemetryDecoderInterface
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015 (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/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#ifndef GNSS_SDR_GPS_L2_M_TELEMETRY_DECODER_H_
+#define GNSS_SDR_GPS_L2_M_TELEMETRY_DECODER_H_
+
+#include <string>
+#include <gnuradio/msg_queue.h>
+#include "telemetry_decoder_interface.h"
+#include "gps_l2_m_telemetry_decoder_cc.h"
+
+
+class ConfigurationInterface;
+
+/*!
+ * \brief This class implements a NAV data decoder for GPS L2 M
+ */
+class GpsL2MTelemetryDecoder : public TelemetryDecoderInterface
+{
+public:
+ GpsL2MTelemetryDecoder(ConfigurationInterface* configuration,
+ std::string role,
+ unsigned int in_streams,
+ unsigned int out_streams,
+ boost::shared_ptr<gr::msg_queue> queue);
+
+ virtual ~GpsL2MTelemetryDecoder();
+ std::string role()
+ {
+ return role_;
+ }
+
+ //! Returns "gps_l2_m_telemetry_decoder"
+ std::string implementation()
+ {
+ return "gps_l2_m_telemetry_decoder";
+ }
+ void connect(gr::top_block_sptr top_block);
+ void disconnect(gr::top_block_sptr top_block);
+ gr::basic_block_sptr get_left_block();
+ gr::basic_block_sptr get_right_block();
+ void set_satellite(Gnss_Satellite satellite);
+ void set_channel(int channel){telemetry_decoder_->set_channel(channel);}
+ void reset()
+ {
+ return;
+ }
+ size_t item_size()
+ {
+ return 0;
+ }
+
+private:
+ gps_l2_m_telemetry_decoder_cc_sptr telemetry_decoder_;
+ Gnss_Satellite satellite_;
+ int channel_;
+ unsigned int vector_length_;
+ std::string item_type_;
+ bool dump_;
+ std::string dump_filename_;
+ std::string role_;
+ unsigned int in_streams_;
+ unsigned int out_streams_;
+ boost::shared_ptr<gr::msg_queue> queue_;
+};
+
+#endif
diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt b/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt
index b7c1e03..c4e9047 100644
--- a/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt
+++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/CMakeLists.txt
@@ -18,6 +18,7 @@
set(TELEMETRY_DECODER_GR_BLOCKS_SOURCES
gps_l1_ca_telemetry_decoder_cc.cc
+ gps_l2_m_telemetry_decoder_cc.cc
galileo_e1b_telemetry_decoder_cc.cc
sbas_l1_telemetry_decoder_cc.cc
galileo_e5a_telemetry_decoder_cc.cc
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 d800373..71aca1b 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
@@ -86,7 +86,6 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(
d_queue = queue;
d_dump = dump;
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
- LOG(INFO) << "TELEMETRY PROCESSING: satellite " << d_satellite;
d_vector_length = vector_length;
d_samples_per_bit = ( GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS ) / GPS_CA_TELEMETRY_RATE_BITS_SECOND;
d_fs_in = fs_in;
@@ -357,7 +356,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
d_average_count = 0;
//3. Make the output (copy the object contents to the GNURadio reserved memory)
*out[0] = current_synchro_data;
- //std::cout<<"GPS TLM output on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter/d_decimation_output_factor<<std::endl;
+ //std::cout<<"GPS L1 TLM output on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter/d_decimation_output_factor<<std::endl;
return 1;
}
else
diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.cc
similarity index 92%
copy from src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
copy to src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.cc
index d800373..0910677 100644
--- a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l1_ca_telemetry_decoder_cc.cc
+++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.cc
@@ -1,8 +1,8 @@
/*!
- * \file gps_l1_ca_telemetry_decoder_cc.cc
+ * \file gps_l2_m_telemetry_decoder_cc.cc
* \brief Implementation of a NAV message demodulator block based on
* Kay Borre book MATLAB-based GPS receiver
- * \author Javier Arribas, 2011. jarribas(at)cttc.es
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
*
* -------------------------------------------------------------------------
*
@@ -34,7 +34,7 @@
*/
-#include "gps_l1_ca_telemetry_decoder_cc.h"
+#include "gps_l2_m_telemetry_decoder_cc.h"
#include <iostream>
#include <sstream>
#include <boost/lexical_cast.hpp>
@@ -51,17 +51,17 @@ using google::LogMessage;
/*!
* \todo name and move the magic numbers to GPS_L1_CA.h
*/
-gps_l1_ca_telemetry_decoder_cc_sptr
-gps_l1_ca_make_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in, unsigned
+gps_l2_m_telemetry_decoder_cc_sptr
+gps_l2_m_make_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in, unsigned
int vector_length, boost::shared_ptr<gr::msg_queue> queue, bool dump)
{
- return gps_l1_ca_telemetry_decoder_cc_sptr(new gps_l1_ca_telemetry_decoder_cc(satellite, if_freq,
+ return gps_l2_m_telemetry_decoder_cc_sptr(new gps_l2_m_telemetry_decoder_cc(satellite, if_freq,
fs_in, vector_length, queue, dump));
}
-void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+void gps_l2_m_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int &ninput_items_required)
{
for (unsigned i = 0; i < 3; i++)
{
@@ -71,7 +71,7 @@ void gps_l1_ca_telemetry_decoder_cc::forecast (int noutput_items, gr_vector_int
-gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(
+gps_l2_m_telemetry_decoder_cc::gps_l2_m_telemetry_decoder_cc(
Gnss_Satellite satellite,
long if_freq,
long fs_in,
@@ -86,7 +86,6 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(
d_queue = queue;
d_dump = dump;
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
- LOG(INFO) << "TELEMETRY PROCESSING: satellite " << d_satellite;
d_vector_length = vector_length;
d_samples_per_bit = ( GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS ) / GPS_CA_TELEMETRY_RATE_BITS_SECOND;
d_fs_in = fs_in;
@@ -135,7 +134,7 @@ gps_l1_ca_telemetry_decoder_cc::gps_l1_ca_telemetry_decoder_cc(
}
-gps_l1_ca_telemetry_decoder_cc::~gps_l1_ca_telemetry_decoder_cc()
+gps_l2_m_telemetry_decoder_cc::~gps_l2_m_telemetry_decoder_cc()
{
delete d_preambles_symbols;
d_dump_file.close();
@@ -143,7 +142,7 @@ gps_l1_ca_telemetry_decoder_cc::~gps_l1_ca_telemetry_decoder_cc()
-bool gps_l1_ca_telemetry_decoder_cc::gps_word_parityCheck(unsigned int gpsword)
+bool gps_l2_m_telemetry_decoder_cc::gps_word_parityCheck(unsigned int gpsword)
{
unsigned int d1, d2, d3, d4, d5, d6, d7, t, parity;
/* XOR as many bits in parallel as possible. The magic constants pick
@@ -166,7 +165,7 @@ bool gps_l1_ca_telemetry_decoder_cc::gps_word_parityCheck(unsigned int gpsword)
}
-int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_int &ninput_items,
+int gps_l2_m_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items, gr_vector_void_star &output_items)
{
int corr_value = 0;
@@ -275,7 +274,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
{
d_GPS_frame_4bytes ^= 0x3FFFFFC0; // invert the data bits (using XOR)
}
- if (gps_l1_ca_telemetry_decoder_cc::gps_word_parityCheck(d_GPS_frame_4bytes))
+ if (gps_l2_m_telemetry_decoder_cc::gps_word_parityCheck(d_GPS_frame_4bytes))
{
memcpy(&d_GPS_FSM.d_GPS_frame_4bytes, &d_GPS_frame_4bytes, sizeof(char)*4);
d_GPS_FSM.d_preamble_time_ms = d_preamble_time_seconds*1000.0;
@@ -357,7 +356,7 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
d_average_count = 0;
//3. Make the output (copy the object contents to the GNURadio reserved memory)
*out[0] = current_synchro_data;
- //std::cout<<"GPS TLM output on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter/d_decimation_output_factor<<std::endl;
+ //std::cout<<"GPS L2 TLM output on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter/d_decimation_output_factor<<std::endl;
return 1;
}
else
@@ -367,12 +366,12 @@ int gps_l1_ca_telemetry_decoder_cc::general_work (int noutput_items, gr_vector_i
}
-void gps_l1_ca_telemetry_decoder_cc::set_decimation(int decimation)
+void gps_l2_m_telemetry_decoder_cc::set_decimation(int decimation)
{
d_decimation_output_factor = decimation;
}
-void gps_l1_ca_telemetry_decoder_cc::set_satellite(Gnss_Satellite satellite)
+void gps_l2_m_telemetry_decoder_cc::set_satellite(Gnss_Satellite satellite)
{
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
LOG(INFO) << "Setting decoder Finite State Machine to satellite " << d_satellite;
@@ -381,7 +380,7 @@ void gps_l1_ca_telemetry_decoder_cc::set_satellite(Gnss_Satellite satellite)
}
-void gps_l1_ca_telemetry_decoder_cc::set_channel(int channel)
+void gps_l2_m_telemetry_decoder_cc::set_channel(int channel)
{
d_channel = channel;
d_GPS_FSM.i_channel_ID = channel;
diff --git a/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.h b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.h
new file mode 100644
index 0000000..cbb5a68
--- /dev/null
+++ b/src/algorithms/telemetry_decoder/gnuradio_blocks/gps_l2_m_telemetry_decoder_cc.h
@@ -0,0 +1,152 @@
+/*!
+ * \file gps_l2_m_telemetry_decoder_cc.h
+ * \brief Interface of a NAV message demodulator block based on
+ * Kay Borre book MATLAB-based GPS receiver
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015 (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/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#ifndef GNSS_SDR_GPS_L2_M_TELEMETRY_DECODER_CC_H
+#define GNSS_SDR_GPS_L2_M_TELEMETRY_DECODER_CC_H
+
+#include <fstream>
+#include <string>
+#include <gnuradio/block.h>
+#include <gnuradio/msg_queue.h>
+#include "GPS_L1_CA.h"
+#include "gps_l1_ca_subframe_fsm.h"
+#include "concurrent_queue.h"
+#include "gnss_satellite.h"
+
+
+
+class gps_l2_m_telemetry_decoder_cc;
+
+typedef boost::shared_ptr<gps_l2_m_telemetry_decoder_cc> gps_l2_m_telemetry_decoder_cc_sptr;
+
+gps_l2_m_telemetry_decoder_cc_sptr
+gps_l2_m_make_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in, unsigned
+ int vector_length, boost::shared_ptr<gr::msg_queue> queue, bool dump);
+
+/*!
+ * \brief This class implements a block that decodes the NAV data defined in IS-GPS-200E
+ *
+ */
+class gps_l2_m_telemetry_decoder_cc : public gr::block
+{
+public:
+ ~gps_l2_m_telemetry_decoder_cc();
+ void set_satellite(Gnss_Satellite satellite); //!< Set satellite PRN
+ void set_channel(int channel); //!< Set receiver's channel
+
+
+ /*!
+ * \brief Set decimation factor to average the GPS synchronization estimation output from the tracking module.
+ */
+ void set_decimation(int decimation);
+
+ /*!
+ * \brief Set the satellite data queue
+ */
+ void set_ephemeris_queue(concurrent_queue<Gps_Ephemeris> *ephemeris_queue){d_GPS_FSM.d_ephemeris_queue = ephemeris_queue;} //!< Set the ephemeris data queue
+ void set_iono_queue(concurrent_queue<Gps_Iono> *iono_queue){d_GPS_FSM.d_iono_queue = iono_queue;} //!< Set the iono data queue
+ void set_almanac_queue(concurrent_queue<Gps_Almanac> *almanac_queue){d_GPS_FSM.d_almanac_queue = almanac_queue;} //!< Set the almanac data queue
+ void set_utc_model_queue(concurrent_queue<Gps_Utc_Model> *utc_model_queue){d_GPS_FSM.d_utc_model_queue = utc_model_queue;} //!< Set the UTC model data queue
+
+ /*!
+ * \brief This is where all signal processing takes place
+ */
+ int general_work (int noutput_items, gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items, gr_vector_void_star &output_items);
+
+ /*!
+ * \brief Function which tells the scheduler how many input items
+ * are required to produce noutput_items output items.
+ */
+ void forecast (int noutput_items, gr_vector_int &ninput_items_required);
+
+private:
+ friend gps_l2_m_telemetry_decoder_cc_sptr
+ gps_l2_m_make_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in,unsigned
+ int vector_length, boost::shared_ptr<gr::msg_queue> queue, bool dump);
+
+ gps_l2_m_telemetry_decoder_cc(Gnss_Satellite satellite, long if_freq, long fs_in, unsigned
+ int vector_length, boost::shared_ptr<gr::msg_queue> queue, bool dump);
+
+ bool gps_word_parityCheck(unsigned int gpsword);
+
+ // constants
+ unsigned short int d_preambles_bits[GPS_CA_PREAMBLE_LENGTH_BITS];
+ // class private vars
+
+ signed int *d_preambles_symbols;
+ unsigned int d_samples_per_bit;
+ long unsigned int d_sample_counter;
+ long unsigned int d_preamble_index;
+ unsigned int d_stat;
+ bool d_flag_frame_sync;
+
+ // symbols
+ double d_symbol_accumulator;
+ short int d_symbol_accumulator_counter;
+
+ //bits and frame
+ unsigned short int d_frame_bit_index;
+ unsigned int d_GPS_frame_4bytes;
+ unsigned int d_prev_GPS_frame_4bytes;
+ bool d_flag_parity;
+ bool d_flag_preamble;
+ int d_word_number;
+
+ // output averaging and decimation
+ int d_average_count;
+ int d_decimation_output_factor;
+
+ long d_fs_in;
+ //double d_preamble_duration_seconds;
+ // navigation message vars
+ Gps_Navigation_Message d_nav;
+ GpsL1CaSubframeFsm d_GPS_FSM;
+
+ boost::shared_ptr<gr::msg_queue> d_queue;
+ unsigned int d_vector_length;
+ bool d_dump;
+ Gnss_Satellite d_satellite;
+ int d_channel;
+
+ //std::deque<double> d_prn_start_sample_history;
+
+ double d_preamble_time_seconds;
+
+ double d_TOW_at_Preamble;
+ double d_TOW_at_current_symbol;
+ double Prn_timestamp_at_preamble_ms;
+ bool flag_TOW_set;
+
+ std::string d_dump_filename;
+ std::ofstream d_dump_file;
+};
+
+#endif
diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc
new file mode 100644
index 0000000..25fef9f
--- /dev/null
+++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.cc
@@ -0,0 +1,154 @@
+/*!
+ * \file gps_l2_m_dll_pll_tracking.cc
+ * \brief Implementation of an adapter of a DLL+PLL tracking loop block
+ * for GPS L1 C/A to a TrackingInterface
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * Code DLL + carrier PLL according to the algorithms described in:
+ * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen,
+ * A Software-Defined GPS and Galileo Receiver. A Single-Frequency
+ * Approach, Birkhauser, 2007
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015 (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/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#include "gps_l2_m_dll_pll_tracking.h"
+#include <glog/logging.h>
+#include "GPS_L2C.h"
+#include "configuration_interface.h"
+
+
+using google::LogMessage;
+
+GpsL2MDllPllTracking::GpsL2MDllPllTracking(
+ ConfigurationInterface* configuration, std::string role,
+ unsigned int in_streams, unsigned int out_streams,
+ boost::shared_ptr<gr::msg_queue> queue) :
+ role_(role), in_streams_(in_streams), out_streams_(out_streams),
+ queue_(queue)
+{
+ LOG(INFO) << "role " << role;
+ //################# CONFIGURATION PARAMETERS ########################
+ int fs_in;
+ int vector_length;
+ int f_if;
+ bool dump;
+ std::string dump_filename;
+ std::string item_type;
+ std::string default_item_type = "gr_complex";
+ float pll_bw_hz;
+ float dll_bw_hz;
+ float early_late_space_chips;
+ item_type = configuration->property(role + ".item_type", default_item_type);
+ fs_in = configuration->property("GNSS-SDR.internal_fs_hz", 2048000);
+ f_if = configuration->property(role + ".if", 0);
+ dump = configuration->property(role + ".dump", false);
+ pll_bw_hz = configuration->property(role + ".pll_bw_hz", 50.0);
+ dll_bw_hz = configuration->property(role + ".dll_bw_hz", 2.0);
+ early_late_space_chips = configuration->property(role + ".early_late_space_chips", 0.5);
+ std::string default_dump_filename = "./track_ch";
+ dump_filename = configuration->property(role + ".dump_filename",
+ default_dump_filename); //unused!
+ vector_length = std::round(fs_in / (GPS_L2_M_CODE_RATE_HZ / GPS_L2_M_CODE_LENGTH_CHIPS));
+
+ //################# MAKE TRACKING GNURadio object ###################
+ if (item_type.compare("gr_complex") == 0)
+ {
+ item_size_ = sizeof(gr_complex);
+ tracking_ = gps_l2_m_dll_pll_make_tracking_cc(
+ f_if,
+ fs_in,
+ vector_length,
+ queue_,
+ dump,
+ dump_filename,
+ pll_bw_hz,
+ dll_bw_hz,
+ early_late_space_chips);
+ }
+ else
+ {
+ LOG(WARNING) << item_type << " unknown tracking item type.";
+ }
+ DLOG(INFO) << "tracking(" << tracking_->unique_id() << ")";
+}
+
+
+GpsL2MDllPllTracking::~GpsL2MDllPllTracking()
+{}
+
+
+void GpsL2MDllPllTracking::start_tracking()
+{
+ tracking_->start_tracking();
+}
+
+/*
+ * Set tracking channel unique ID
+ */
+void GpsL2MDllPllTracking::set_channel(unsigned int channel)
+{
+ channel_ = channel;
+ tracking_->set_channel(channel);
+}
+
+/*
+ * Set tracking channel internal queue
+ */
+void GpsL2MDllPllTracking::set_channel_queue(
+ concurrent_queue<int> *channel_internal_queue)
+{
+ channel_internal_queue_ = channel_internal_queue;
+ tracking_->set_channel_queue(channel_internal_queue_);
+}
+
+void GpsL2MDllPllTracking::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
+{
+ tracking_->set_gnss_synchro(p_gnss_synchro);
+}
+
+void GpsL2MDllPllTracking::connect(gr::top_block_sptr top_block)
+{
+ if(top_block) { /* top_block is not null */};
+ //nothing to connect, now the tracking uses gr_sync_decimator
+}
+
+void GpsL2MDllPllTracking::disconnect(gr::top_block_sptr top_block)
+{
+ if(top_block) { /* top_block is not null */};
+ //nothing to disconnect, now the tracking uses gr_sync_decimator
+}
+
+gr::basic_block_sptr GpsL2MDllPllTracking::get_left_block()
+{
+ return tracking_;
+}
+
+gr::basic_block_sptr GpsL2MDllPllTracking::get_right_block()
+{
+ return tracking_;
+}
+
diff --git a/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h
new file mode 100644
index 0000000..06e9112
--- /dev/null
+++ b/src/algorithms/tracking/adapters/gps_l2_m_dll_pll_tracking.h
@@ -0,0 +1,114 @@
+/*!
+ * \file gps_l2_m_dll_pll_tracking.h
+ * \brief Interface of an adapter of a DLL+PLL tracking loop block
+ * for GPS L1 C/A to a TrackingInterface
+ * \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com
+ * Javier Arribas, 2011. jarribas(at)cttc.es
+ *
+ * Code DLL + carrier PLL according to the algorithms described in:
+ * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen,
+ * A Software-Defined GPS and Galileo Receiver. A Single-Frequency
+ * Approach, Birkha user, 2007
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015 (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/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#ifndef GNSS_SDR_gps_l2_m_dll_pll_tracking_H_
+#define GNSS_SDR_gps_l2_m_dll_pll_tracking_H_
+
+#include <string>
+#include <gnuradio/msg_queue.h>
+#include "tracking_interface.h"
+#include "gps_l2_m_dll_pll_tracking_cc.h"
+
+
+class ConfigurationInterface;
+
+/*!
+ * \brief This class implements a code DLL + carrier PLL tracking loop
+ */
+class GpsL2MDllPllTracking : public TrackingInterface
+{
+public:
+
+ GpsL2MDllPllTracking(ConfigurationInterface* configuration,
+ std::string role,
+ unsigned int in_streams,
+ unsigned int out_streams,
+ boost::shared_ptr<gr::msg_queue> queue);
+
+ virtual ~GpsL2MDllPllTracking();
+
+ std::string role()
+ {
+ return role_;
+ }
+
+ //! Returns "gps_l2_m_dll_pll_tracking"
+ std::string implementation()
+ {
+ return "gps_l2_m_dll_pll_tracking";
+ }
+ size_t item_size()
+ {
+ return item_size_;
+ }
+
+ void connect(gr::top_block_sptr top_block);
+ void disconnect(gr::top_block_sptr top_block);
+ gr::basic_block_sptr get_left_block();
+ gr::basic_block_sptr get_right_block();
+
+
+ /*!
+ * \brief Set tracking channel unique ID
+ */
+ void set_channel(unsigned int channel);
+
+ /*!
+ * \brief Set acquisition/tracking common Gnss_Synchro object pointer
+ * to efficiently exchange synchronization data between acquisition and tracking blocks
+ */
+ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro);
+
+ /*!
+ * \brief Set tracking channel internal queue
+ */
+ void set_channel_queue(concurrent_queue<int> *channel_internal_queue);
+
+ void start_tracking();
+
+private:
+ gps_l2_m_dll_pll_tracking_cc_sptr tracking_;
+ size_t item_size_;
+ unsigned int channel_;
+ std::string role_;
+ unsigned int in_streams_;
+ unsigned int out_streams_;
+ boost::shared_ptr<gr::msg_queue> queue_;
+ concurrent_queue<int> *channel_internal_queue_;
+};
+
+#endif // GNSS_SDR_gps_l2_m_dll_pll_tracking_H_
diff --git 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
index 7b2fbed..586cb54 100644
--- 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
@@ -509,8 +509,8 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
{
d_last_seg = floor(d_sample_counter / d_fs_in);
std::cout << "Current input signal time = " << d_last_seg << " [s]" << std::endl;
- LOG(INFO) << "Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
- << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]";
+ std::cout << "GPS L1 C/A Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
+ << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]" << std::endl;
//if (d_last_seg==5) d_carrier_lock_fail_counter=500; //DEBUG: force unlock!
}
}
@@ -519,8 +519,8 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
if (floor(d_sample_counter / d_fs_in) != d_last_seg)
{
d_last_seg = floor(d_sample_counter / d_fs_in);
- LOG(INFO) << "Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
- << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]";
+ std::cout<< "GPS L1 C/A Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
+ << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]"<< std::endl;
//std::cout<<"TRK CH "<<d_channel<<" Carrier_lock_test="<<d_carrier_lock_test<< std::endl;
}
}
diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc
similarity index 89%
copy from src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
copy to src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc
index 7b2fbed..6349e5a 100644
--- a/src/algorithms/tracking/gnuradio_blocks/gps_l1_ca_dll_pll_tracking_cc.cc
+++ b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.cc
@@ -1,5 +1,5 @@
/*!
- * \file gps_l1_ca_dll_pll_tracking_cc.cc
+ * \file gps_l2_m_dll_pll_tracking_cc.cc
* \brief Implementation of a code DLL + carrier PLL tracking block
* \author Carlos Aviles, 2010. carlos.avilesr(at)googlemail.com
* Javier Arribas, 2011. jarribas(at)cttc.es
@@ -34,7 +34,7 @@
* -------------------------------------------------------------------------
*/
-#include "gps_l1_ca_dll_pll_tracking_cc.h"
+#include "gps_l2_m_dll_pll_tracking_cc.h"
#include <cmath>
#include <iostream>
#include <memory>
@@ -43,10 +43,10 @@
#include <gnuradio/io_signature.h>
#include <glog/logging.h>
#include "gnss_synchro.h"
-#include "gps_sdr_signal_processing.h"
+#include "gps_l2c_signal.h"
#include "tracking_discriminators.h"
#include "lock_detectors.h"
-#include "GPS_L1_CA.h"
+#include "GPS_L2C.h"
#include "control_message_factory.h"
@@ -61,8 +61,8 @@
using google::LogMessage;
-gps_l1_ca_dll_pll_tracking_cc_sptr
-gps_l1_ca_dll_pll_make_tracking_cc(
+gps_l2_m_dll_pll_tracking_cc_sptr
+gps_l2_m_dll_pll_make_tracking_cc(
long if_freq,
long fs_in,
unsigned int vector_length,
@@ -73,13 +73,13 @@ gps_l1_ca_dll_pll_make_tracking_cc(
float dll_bw_hz,
float early_late_space_chips)
{
- return gps_l1_ca_dll_pll_tracking_cc_sptr(new Gps_L1_Ca_Dll_Pll_Tracking_cc(if_freq,
+ return gps_l2_m_dll_pll_tracking_cc_sptr(new gps_l2_m_dll_pll_tracking_cc(if_freq,
fs_in, vector_length, queue, dump, dump_filename, pll_bw_hz, dll_bw_hz, early_late_space_chips));
}
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::forecast (int noutput_items,
+void gps_l2_m_dll_pll_tracking_cc::forecast (int noutput_items,
gr_vector_int &ninput_items_required)
{
ninput_items_required[0] = static_cast<int>(d_vector_length) * 2; //set the required available samples in each call
@@ -87,7 +87,7 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::forecast (int noutput_items,
-Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
+gps_l2_m_dll_pll_tracking_cc::gps_l2_m_dll_pll_tracking_cc(
long if_freq,
long fs_in,
unsigned int vector_length,
@@ -97,7 +97,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
float pll_bw_hz,
float dll_bw_hz,
float early_late_space_chips) :
- gr::block("Gps_L1_Ca_Dll_Pll_Tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)),
+ gr::block("gps_l2_m_dll_pll_tracking_cc", gr::io_signature::make(1, 1, sizeof(gr_complex)),
gr::io_signature::make(1, 1, sizeof(Gnss_Synchro)))
{
// initialize internal vars
@@ -108,6 +108,10 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
d_vector_length = vector_length;
d_dump_filename = dump_filename;
+ // DLL/PLL filter initialization
+ d_carrier_loop_filter=Tracking_2nd_PLL_filter(GPS_L2_M_PERIOD);
+ d_code_loop_filter=Tracking_2nd_DLL_filter(GPS_L2_M_PERIOD);
+
// Initialize tracking ==========================================
d_code_loop_filter.set_DLL_BW(dll_bw_hz);
d_carrier_loop_filter.set_PLL_BW(pll_bw_hz);
@@ -117,7 +121,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
// Initialization of local code replica
// Get space for a vector with the C/A code replica sampled 1x/chip
- d_ca_code = static_cast<gr_complex*>(volk_malloc((GPS_L1_CA_CODE_LENGTH_CHIPS + 2) * sizeof(gr_complex), volk_get_alignment()));
+ d_ca_code = static_cast<gr_complex*>(volk_malloc((GPS_L2_M_CODE_LENGTH_CHIPS + 2) * sizeof(gr_complex), volk_get_alignment()));
// Get space for the resampled early / prompt / late local replicas
d_early_code = static_cast<gr_complex*>(volk_malloc(2 * d_vector_length * sizeof(gr_complex), volk_get_alignment()));
@@ -135,7 +139,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
//--- Perform initializations ------------------------------
// define initial code frequency basis of NCO
- d_code_freq_chips = GPS_L1_CA_CODE_RATE_HZ;
+ d_code_freq_chips = GPS_L2_M_CODE_RATE_HZ;
// define residual code phase (in chips)
d_rem_code_phase_samples = 0.0;
// define residual carrier phase
@@ -161,16 +165,15 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::Gps_L1_Ca_Dll_Pll_Tracking_cc(
d_carrier_lock_threshold = CARRIER_LOCK_THRESHOLD;
systemName["G"] = std::string("GPS");
- systemName["S"] = std::string("SBAS");
-
set_relative_rate(1.0/((double)d_vector_length*2));
-
//set_min_output_buffer((long int)300);
+
+ LOG(INFO)<<"d_vector_length"<<d_vector_length<<std::endl;
}
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking()
+void gps_l2_m_dll_pll_tracking_cc::start_tracking()
{
/*
* correct the code phase according to the delay between acq and trk
@@ -186,19 +189,19 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking()
acq_trk_diff_seconds = static_cast<float>(acq_trk_diff_samples) / static_cast<float>(d_fs_in);
//doppler effect
// Fd=(C/(C+Vr))*F
- float radial_velocity = (GPS_L1_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L1_FREQ_HZ;
+ float radial_velocity = (GPS_L2_FREQ_HZ + d_acq_carrier_doppler_hz) / GPS_L2_FREQ_HZ;
// 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;
- d_code_freq_chips = radial_velocity * GPS_L1_CA_CODE_RATE_HZ;
+ d_code_freq_chips = radial_velocity * GPS_L2_M_CODE_RATE_HZ;
T_chip_mod_seconds = 1/d_code_freq_chips;
- T_prn_mod_seconds = T_chip_mod_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS;
+ T_prn_mod_seconds = T_chip_mod_seconds * GPS_L2_M_CODE_LENGTH_CHIPS;
T_prn_mod_samples = T_prn_mod_seconds * static_cast<float>(d_fs_in);
d_current_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_seconds = GPS_L2_M_CODE_LENGTH_CHIPS / GPS_L2_M_CODE_RATE_HZ;
float T_prn_true_samples = T_prn_true_seconds * static_cast<float>(d_fs_in);
float T_prn_diff_seconds= T_prn_true_seconds - T_prn_mod_seconds;
float N_prn_diff = acq_trk_diff_seconds / T_prn_true_seconds;
@@ -219,9 +222,9 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking()
d_code_loop_filter.initialize(); // initialize the code filter
// generate local reference ALWAYS starting at chip 1 (1 sample per chip)
- gps_l1_ca_code_gen_complex(&d_ca_code[1], d_acquisition_gnss_synchro->PRN, 0);
- d_ca_code[0] = d_ca_code[static_cast<int>(GPS_L1_CA_CODE_LENGTH_CHIPS)];
- d_ca_code[static_cast<int>(GPS_L1_CA_CODE_LENGTH_CHIPS) + 1] = d_ca_code[1];
+ gps_l2c_m_code_gen_complex(&d_ca_code[1], d_acquisition_gnss_synchro->PRN);
+ d_ca_code[0] = d_ca_code[static_cast<int>(GPS_L2_M_CODE_LENGTH_CHIPS)];
+ d_ca_code[static_cast<int>(GPS_L2_M_CODE_LENGTH_CHIPS) + 1] = d_ca_code[1];
d_carrier_lock_fail_counter = 0;
d_rem_code_phase_samples = 0;
@@ -252,12 +255,12 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::start_tracking()
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::update_local_code()
+void gps_l2_m_dll_pll_tracking_cc::update_local_code()
{
double tcode_chips;
double rem_code_phase_chips;
int associated_chip_index;
- int code_length_chips = static_cast<int>(GPS_L1_CA_CODE_LENGTH_CHIPS);
+ int code_length_chips = static_cast<int>(GPS_L2_M_CODE_LENGTH_CHIPS);
double code_phase_step_chips;
int early_late_spc_samples;
int epl_loop_length_samples;
@@ -284,7 +287,7 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::update_local_code()
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::update_local_carrier()
+void gps_l2_m_dll_pll_tracking_cc::update_local_carrier()
{
float phase_rad, phase_step_rad;
@@ -302,7 +305,7 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::update_local_carrier()
-Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc()
+gps_l2_m_dll_pll_tracking_cc::~gps_l2_m_dll_pll_tracking_cc()
{
d_dump_file.close();
@@ -320,7 +323,7 @@ Gps_L1_Ca_Dll_Pll_Tracking_cc::~Gps_L1_Ca_Dll_Pll_Tracking_cc()
-int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_int &ninput_items,
+int gps_l2_m_dll_pll_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)
{
// process vars
@@ -329,13 +332,12 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
float code_error_chips;
float code_error_filt_chips;
- // Block input data and block output stream pointers
- const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment
- Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0];
-
// GNSS_SYNCHRO OBJECT to interchange data between tracking->telemetry_decoder
Gnss_Synchro current_synchro_data;
+ // Block input data and block output stream pointers
+ const gr_complex* in = (gr_complex*) input_items[0]; //PRN start block alignment
+ Gnss_Synchro **out = (Gnss_Synchro **) &output_items[0];
if (d_enable_tracking == true)
{
@@ -377,7 +379,6 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
d_Early,
d_Prompt,
d_Late);
-
// check for samples consistency (this should be done before in the receiver / here only if the source is a file)
if (std::isnan((*d_Prompt).real()) == true or std::isnan((*d_Prompt).imag()) == true ) // or std::isinf(in[i].real())==true or std::isinf(in[i].imag())==true)
{
@@ -397,6 +398,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
current_synchro_data.Flag_valid_pseudorange = false;
*out[0] = current_synchro_data;
+
return 1;
}
@@ -408,11 +410,11 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
// New carrier Doppler frequency estimation
d_carrier_doppler_hz = d_acq_carrier_doppler_hz + carr_error_filt_hz;
// 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);
+ d_code_freq_chips = GPS_L2_M_CODE_RATE_HZ + ((d_carrier_doppler_hz * GPS_L2_M_CODE_RATE_HZ) / GPS_L2_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 = d_acc_carrier_phase_rad + GPS_TWO_PI * d_carrier_doppler_hz * GPS_L2_M_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_carrier_doppler_hz * GPS_L2_M_PERIOD;
d_rem_carr_phase_rad = fmod(d_rem_carr_phase_rad, GPS_TWO_PI);
// ################## DLL ##########################################################
@@ -422,7 +424,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
code_error_filt_chips = d_code_loop_filter.get_code_nco(code_error_chips); //[chips/second]
//Code phase accumulator
float code_error_filt_secs;
- code_error_filt_secs = (GPS_L1_CA_CODE_PERIOD * code_error_filt_chips) / GPS_L1_CA_CODE_RATE_HZ; //[seconds]
+ code_error_filt_secs = (GPS_L2_M_PERIOD * code_error_filt_chips) / GPS_L2_M_CODE_RATE_HZ; //[seconds]
d_acc_code_phase_secs = d_acc_code_phase_secs + code_error_filt_secs;
// ################## CARRIER AND CODE NCO BUFFER ALIGNEMENT #######################
@@ -433,7 +435,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
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_chip_seconds = 1 / static_cast<double>(d_code_freq_chips);
- T_prn_seconds = T_chip_seconds * GPS_L1_CA_CODE_LENGTH_CHIPS;
+ T_prn_seconds = T_chip_seconds * GPS_L2_M_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
@@ -450,7 +452,7 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
{
d_cn0_estimation_counter = 0;
// Code lock indicator
- d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L1_CA_CODE_LENGTH_CHIPS);
+ d_CN0_SNV_dB_Hz = cn0_svn_estimator(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES, d_fs_in, GPS_L2_M_CODE_LENGTH_CHIPS);
// Carrier lock indicator
d_carrier_lock_test = carrier_lock_detector(d_Prompt_buffer, CN0_ESTIMATION_SAMPLES);
// Loss of lock detection
@@ -509,8 +511,8 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
{
d_last_seg = floor(d_sample_counter / d_fs_in);
std::cout << "Current input signal time = " << d_last_seg << " [s]" << std::endl;
- LOG(INFO) << "Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
- << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]";
+ std::cout << "GPS L2C M Tracking CH " << d_channel << ": Satellite "
+ << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN) << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]"<< std::endl;
//if (d_last_seg==5) d_carrier_lock_fail_counter=500; //DEBUG: force unlock!
}
}
@@ -519,8 +521,9 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
if (floor(d_sample_counter / d_fs_in) != d_last_seg)
{
d_last_seg = floor(d_sample_counter / d_fs_in);
- LOG(INFO) << "Tracking CH " << d_channel << ": Satellite " << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
- << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]";
+ std::cout << "GPS L2C M Tracking CH " << d_channel << ": Satellite "
+ << Gnss_Satellite(systemName[sys], d_acquisition_gnss_synchro->PRN)
+ << ", CN0 = " << d_CN0_SNV_dB_Hz << " [dB-Hz]"<<std::endl;
//std::cout<<"TRK CH "<<d_channel<<" Carrier_lock_test="<<d_carrier_lock_test<< std::endl;
}
}
@@ -607,16 +610,15 @@ int Gps_L1_Ca_Dll_Pll_Tracking_cc::general_work (int noutput_items, gr_vector_in
LOG(WARNING) << "Exception writing trk dump file " << e.what();
}
}
-
consume_each(d_current_prn_length_samples); // this is necessary in gr::block derivates
d_sample_counter += d_current_prn_length_samples; //count for the processed samples
- //LOG(INFO)<<"GPS tracking output end on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter<<std::endl;
+ //LOG(INFO)<<"GPS L2 tracking output end on CH="<<this->d_channel << " SAMPLE STAMP="<<d_sample_counter<<std::endl;
return 1; //output tracking result ALWAYS even in the case of d_enable_tracking==false
}
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_channel(unsigned int channel)
+void gps_l2_m_dll_pll_tracking_cc::set_channel(unsigned int channel)
{
d_channel = channel;
LOG(INFO) << "Tracking Channel set to " << d_channel;
@@ -643,13 +645,13 @@ void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_channel(unsigned int channel)
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_channel_queue(concurrent_queue<int> *channel_internal_queue)
+void gps_l2_m_dll_pll_tracking_cc::set_channel_queue(concurrent_queue<int> *channel_internal_queue)
{
d_channel_internal_queue = channel_internal_queue;
}
-void Gps_L1_Ca_Dll_Pll_Tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
+void gps_l2_m_dll_pll_tracking_cc::set_gnss_synchro(Gnss_Synchro* p_gnss_synchro)
{
d_acquisition_gnss_synchro = p_gnss_synchro;
}
diff --git a/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.h b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.h
new file mode 100644
index 0000000..8432685
--- /dev/null
+++ b/src/algorithms/tracking/gnuradio_blocks/gps_l2_m_dll_pll_tracking_cc.h
@@ -0,0 +1,187 @@
+/*!
+ * \file gps_l2_m_dll_pll_tracking_cc.h
+ * \brief Interface of a code DLL + carrier PLL tracking block
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * Code DLL + carrier PLL according to the algorithms described in:
+ * K.Borre, D.M.Akos, N.Bertelsen, P.Rinder, and S.H.Jensen,
+ * A Software-Defined GPS and Galileo Receiver. A Single-Frequency Approach,
+ * Birkhauser, 2007
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015 (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/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+#ifndef GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H
+#define GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H
+
+#include <fstream>
+#include <queue>
+#include <map>
+#include <string>
+#include <boost/thread/mutex.hpp>
+#include <boost/thread/thread.hpp>
+#include <gnuradio/block.h>
+#include <gnuradio/msg_queue.h>
+#include "concurrent_queue.h"
+#include "gps_sdr_signal_processing.h"
+#include "gnss_synchro.h"
+#include "tracking_2nd_DLL_filter.h"
+#include "tracking_2nd_PLL_filter.h"
+#include "correlator.h"
+
+class gps_l2_m_dll_pll_tracking_cc;
+
+typedef boost::shared_ptr<gps_l2_m_dll_pll_tracking_cc>
+ gps_l2_m_dll_pll_tracking_cc_sptr;
+
+gps_l2_m_dll_pll_tracking_cc_sptr
+gps_l2_m_dll_pll_make_tracking_cc(long if_freq,
+ long fs_in, unsigned
+ int vector_length,
+ boost::shared_ptr<gr::msg_queue> queue,
+ bool dump,
+ std::string dump_filename,
+ float pll_bw_hz,
+ float dll_bw_hz,
+ float early_late_space_chips);
+
+
+
+/*!
+ * \brief This class implements a DLL + PLL tracking loop block
+ */
+class gps_l2_m_dll_pll_tracking_cc: public gr::block
+{
+public:
+ ~gps_l2_m_dll_pll_tracking_cc();
+
+ void set_channel(unsigned int channel);
+ void set_gnss_synchro(Gnss_Synchro* p_gnss_synchro);
+ void start_tracking();
+ void set_channel_queue(concurrent_queue<int> *channel_internal_queue);
+
+ int general_work (int noutput_items, gr_vector_int &ninput_items,
+ gr_vector_const_void_star &input_items, gr_vector_void_star &output_items);
+
+ void forecast (int noutput_items, gr_vector_int &ninput_items_required);
+
+private:
+ friend gps_l2_m_dll_pll_tracking_cc_sptr
+ gps_l2_m_dll_pll_make_tracking_cc(long if_freq,
+ long fs_in, unsigned
+ int vector_length,
+ boost::shared_ptr<gr::msg_queue> queue,
+ bool dump,
+ std::string dump_filename,
+ float pll_bw_hz,
+ float dll_bw_hz,
+ float early_late_space_chips);
+
+ gps_l2_m_dll_pll_tracking_cc(long if_freq,
+ long fs_in, unsigned
+ int vector_length,
+ boost::shared_ptr<gr::msg_queue> queue,
+ bool dump,
+ std::string dump_filename,
+ float pll_bw_hz,
+ float dll_bw_hz,
+ float early_late_space_chips);
+ void update_local_code();
+ void update_local_carrier();
+
+ // tracking configuration vars
+ boost::shared_ptr<gr::msg_queue> d_queue;
+ concurrent_queue<int> *d_channel_internal_queue;
+ unsigned int d_vector_length;
+ bool d_dump;
+
+ Gnss_Synchro* d_acquisition_gnss_synchro;
+ unsigned int d_channel;
+ int d_last_seg;
+ long d_if_freq;
+ long d_fs_in;
+
+ double d_early_late_spc_chips;
+
+ gr_complex* d_ca_code;
+
+ gr_complex* d_early_code;
+ gr_complex* d_late_code;
+ gr_complex* d_prompt_code;
+ gr_complex* d_carr_sign;
+
+ gr_complex *d_Early;
+ gr_complex *d_Prompt;
+ gr_complex *d_Late;
+
+ // remaining code phase and carrier phase between tracking loops
+ double d_rem_code_phase_samples;
+ float d_rem_carr_phase_rad;
+
+ // PLL and DLL filter library
+ Tracking_2nd_DLL_filter d_code_loop_filter;
+ Tracking_2nd_PLL_filter d_carrier_loop_filter;
+
+ // acquisition
+ float d_acq_code_phase_samples;
+ float d_acq_carrier_doppler_hz;
+ // correlator
+ Correlator d_correlator;
+
+ // tracking vars
+ double d_code_freq_chips;
+ float d_carrier_doppler_hz;
+ float d_acc_carrier_phase_rad;
+ float d_code_phase_samples;
+ float d_acc_code_phase_secs;
+
+ //PRN period in samples
+ int d_current_prn_length_samples;
+
+ //processing samples counters
+ unsigned long int d_sample_counter;
+ unsigned long int d_acq_sample_stamp;
+
+ // CN0 estimation and lock detector
+ int d_cn0_estimation_counter;
+ gr_complex* d_Prompt_buffer;
+ float d_carrier_lock_test;
+ float d_CN0_SNV_dB_Hz;
+ float d_carrier_lock_threshold;
+ int d_carrier_lock_fail_counter;
+
+ // control vars
+ bool d_enable_tracking;
+ bool d_pull_in;
+
+ // file dump
+ std::string d_dump_filename;
+ std::ofstream d_dump_file;
+
+ std::map<std::string, std::string> systemName;
+ std::string sys;
+};
+
+#endif //GNSS_SDR_GPS_L2_M_DLL_PLL_TRACKING_CC_H
diff --git a/src/core/receiver/gnss_block_factory.cc b/src/core/receiver/gnss_block_factory.cc
index e67681b..a193501 100644
--- a/src/core/receiver/gnss_block_factory.cc
+++ b/src/core/receiver/gnss_block_factory.cc
@@ -84,6 +84,7 @@
#include "galileo_e5a_dll_pll_tracking.h"
#include "gps_l2_m_dll_pll_tracking.h"
#include "gps_l1_ca_telemetry_decoder.h"
+#include "gps_l2_m_telemetry_decoder.h"
#include "galileo_e1b_telemetry_decoder.h"
#include "galileo_e5a_telemetry_decoder.h"
#include "sbas_l1_telemetry_decoder.h"
@@ -256,16 +257,15 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetChannel_GPS(
std::string acq, std::string trk, std::string tlm, int channel,
boost::shared_ptr<gr::msg_queue> queue)
{
- std::stringstream stream;
- stream << channel;
- std::string id = stream.str();
- LOG(INFO) << "Instantiating Channel " << id << " with Acquisition Implementation: "
+
+ LOG(INFO) << "Instantiating Channel " << channel << " with Acquisition Implementation: "
<< acq << ", Tracking Implementation: " << trk << ", Telemetry Decoder implementation: " << tlm;
std::unique_ptr<GNSSBlockInterface> pass_through_ = GetBlock(configuration, "Channel", "Pass_Through", 1, 1, queue);
std::unique_ptr<AcquisitionInterface> acq_ = GetAcqBlock(configuration, "Acquisition_GPS", acq, 1, 1, queue);
- std::unique_ptr<TrackingInterface> trk_ = GetTrkBlock(configuration, "Tracking_GPS", trk, 1, 1, queue);
- std::unique_ptr<TelemetryDecoderInterface> tlm_ = GetTlmBlock(configuration, "TelemetryDecoder_GPS", tlm, 1, 1, queue);
+ std::unique_ptr<TrackingInterface> trk_ = GetTrkBlock(configuration, "Tracking_GPS" +boost::lexical_cast<std::string>(channel), trk, 1, 1, queue);
+
+ std::unique_ptr<TelemetryDecoderInterface> tlm_ = GetTlmBlock(configuration, "TelemetryDecoder_GPS"+boost::lexical_cast<std::string>(channel) , tlm, 1, 1, queue);
std::unique_ptr<GNSSBlockInterface> channel_(new Channel(configuration.get(), channel, pass_through_.release(),
acq_.release(),
@@ -345,6 +345,14 @@ std::unique_ptr<std::vector<std::unique_ptr<GNSSBlockInterface>>> GNSSBlockFacto
tracking_implementation = tracking_implementation_specific;
}
+ std::string telemetry_decoder_implementation_specific = configuration->property(
+ "TelemetryDecoder_GPS" + boost::lexical_cast<std::string>(i) + ".implementation",
+ default_implementation);
+ if(telemetry_decoder_implementation_specific.compare(default_implementation) != 0)
+ {
+ telemetry_decoder = telemetry_decoder_implementation_specific;
+ }
+
channels->push_back(std::move(GetChannel_GPS(configuration,
acquisition_implementation, tracking_implementation, telemetry_decoder, channel_absolute_id, queue)));
channel_absolute_id++;
@@ -988,6 +996,7 @@ std::unique_ptr<TelemetryDecoderInterface> GNSSBlockFactory::GetTlmBlock(
{
std::unique_ptr<TelemetryDecoderInterface> block;
+ std::cout<<"implementation tlm="<<implementation<<std::endl;
// TELEMETRY DECODERS ----------------------------------------------------------
if (implementation.compare("GPS_L1_CA_Telemetry_Decoder") == 0)
{
@@ -1013,6 +1022,12 @@ std::unique_ptr<TelemetryDecoderInterface> GNSSBlockFactory::GetTlmBlock(
out_streams, queue));
block = std::move(block_);
}
+ else if (implementation.compare("GPS_L2_M_Telemetry_Decoder") == 0)
+ {
+ std::unique_ptr<TelemetryDecoderInterface> block_(new GpsL2MTelemetryDecoder(configuration.get(), role, in_streams,
+ out_streams, queue));
+ block = std::move(block_);
+ }
else
{
// Log fatal. This causes execution to stop.
diff --git a/src/tests/data/.gitignore b/src/tests/data/.gitignore
new file mode 100644
index 0000000..a7004ac
--- /dev/null
+++ b/src/tests/data/.gitignore
@@ -0,0 +1 @@
+/gps_l2c_m_prn7_5msps.dat
diff --git a/src/tests/gnss_block/gps_l2_m_dll_pll_tracking_test.cc b/src/tests/gnss_block/gps_l2_m_dll_pll_tracking_test.cc
new file mode 100644
index 0000000..f135388
--- /dev/null
+++ b/src/tests/gnss_block/gps_l2_m_dll_pll_tracking_test.cc
@@ -0,0 +1,167 @@
+/*!
+ * \file gps_l2_m_dll_pll_tracking_test.cc
+ * \brief This class implements a tracking test for Galileo_E5a_DLL_PLL_Tracking
+ * implementation based on some input parameters.
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2012-2015 (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/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+#include <ctime>
+#include <iostream>
+#include <gnuradio/top_block.h>
+#include <gnuradio/blocks/file_source.h>
+#include <gnuradio/analog/sig_source_waveform.h>
+#include <gnuradio/analog/sig_source_c.h>
+#include <gnuradio/msg_queue.h>
+#include <gnuradio/blocks/null_sink.h>
+#include <gnuradio/blocks/skiphead.h>
+#include <gtest/gtest.h>
+#include "gnss_block_factory.h"
+#include "gnss_block_interface.h"
+#include "tracking_interface.h"
+#include "in_memory_configuration.h"
+#include "gnss_sdr_valve.h"
+#include "gnss_synchro.h"
+#include "gps_l2_m_dll_pll_tracking.h"
+
+
+class GpsL2MDllPllTrackingTest: public ::testing::Test
+{
+protected:
+ GpsL2MDllPllTrackingTest()
+ {
+ factory = std::make_shared<GNSSBlockFactory>();
+ config = std::make_shared<InMemoryConfiguration>();
+ item_size = sizeof(gr_complex);
+ stop = false;
+ message = 0;
+ }
+
+ ~GpsL2MDllPllTrackingTest()
+ {}
+
+ void init();
+
+ gr::msg_queue::sptr queue;
+ gr::top_block_sptr top_block;
+ std::shared_ptr<GNSSBlockFactory> factory;
+ std::shared_ptr<InMemoryConfiguration> config;
+ Gnss_Synchro gnss_synchro;
+ size_t item_size;
+ concurrent_queue<int> channel_internal_queue;
+ bool stop;
+ int message;
+};
+
+
+void GpsL2MDllPllTrackingTest::init()
+{
+ gnss_synchro.Channel_ID = 0;
+ gnss_synchro.System = 'G';
+ std::string signal = "2S";
+ signal.copy(gnss_synchro.Signal, 2, 0);
+ gnss_synchro.PRN = 15;
+
+ config->set_property("GNSS-SDR.internal_fs_hz", "4000000");
+ config->set_property("Tracking_GPS.item_type", "gr_complex");
+ config->set_property("Tracking_GPS.dump", "true");
+ config->set_property("Tracking_GPS.dump_filename", "../data/L2m_tracking_ch_");
+ config->set_property("Tracking_GPS.implementation", "GPS_L2_M_DLL_PLL_Tracking");
+ config->set_property("Tracking_GPS.early_late_space_chips", "0.5");
+ config->set_property("Tracking_GPS.order", "2");
+ config->set_property("Tracking_GPS.pll_bw_hz", "2");
+ config->set_property("Tracking_GPS.dll_bw_hz", "0.5");
+}
+
+TEST_F(GpsL2MDllPllTrackingTest, ValidationOfResults)
+{
+ struct timeval tv;
+ long long int begin = 0;
+ long long int end = 0;
+ int fs_in = 4000000;
+ int nsamples = fs_in*30;
+ init();
+ queue = gr::msg_queue::make(0);
+ top_block = gr::make_top_block("Tracking test");
+
+ std::shared_ptr<TrackingInterface> tracking = std::make_shared<GpsL2MDllPllTracking>(config.get(), "Tracking_GPS", 1, 1, queue);
+
+ //REAL
+ gnss_synchro.Acq_delay_samples = 2004;
+ gnss_synchro.Acq_doppler_hz = 2980;//1200;
+ gnss_synchro.Acq_samplestamp_samples = 0;
+
+ ASSERT_NO_THROW( {
+ tracking->set_channel(gnss_synchro.Channel_ID);
+ }) << "Failure setting channel." << std::endl;
+
+ ASSERT_NO_THROW( {
+ tracking->set_gnss_synchro(&gnss_synchro);
+ }) << "Failure setting gnss_synchro." << std::endl;
+
+ ASSERT_NO_THROW( {
+ tracking->set_channel_queue(&channel_internal_queue);
+ }) << "Failure setting channel_internal_queue." << std::endl;
+
+ ASSERT_NO_THROW( {
+ tracking->connect(top_block);
+ }) << "Failure connecting tracking to the top_block." << std::endl;
+
+ ASSERT_NO_THROW( {
+ //gr::analog::sig_source_c::sptr source = gr::analog::sig_source_c::make(fs_in, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0));
+
+
+ std::string path = std::string(TEST_PATH);
+ //std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat";
+ std::string file = "/datalogger/signals/Fraunhofer/L125_III1b_210s_L2_resampled.bin";
+ //std::string file = "/home/gnss/git/gnss-sdr/src/tests/data/gps_l2c_m_prn7_5msps.dat";
+ const char * file_name = file.c_str();
+ gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false);
+
+
+ boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue);
+ gr::blocks::null_sink::sptr sink = gr::blocks::null_sink::make(sizeof(Gnss_Synchro));
+ top_block->connect(file_source, 0, valve, 0);
+ top_block->connect(valve, 0, tracking->get_left_block(), 0);
+ top_block->connect(tracking->get_right_block(), 0, sink, 0);
+
+ }) << "Failure connecting the blocks of tracking test." << std::endl;
+
+ tracking->start_tracking();
+
+ EXPECT_NO_THROW( {
+ gettimeofday(&tv, NULL);
+ begin = tv.tv_sec *1000000 + tv.tv_usec;
+ top_block->run(); // Start threads and wait
+ gettimeofday(&tv, NULL);
+ end = tv.tv_sec *1000000 + tv.tv_usec;
+ }) << "Failure running the top_block." << std::endl;
+
+ std::cout << "Tracked " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl;
+}
+
diff --git a/src/tests/gnss_block/gps_l2_m_pcps_acquisition_test.cc b/src/tests/gnss_block/gps_l2_m_pcps_acquisition_test.cc
new file mode 100644
index 0000000..355f452
--- /dev/null
+++ b/src/tests/gnss_block/gps_l2_m_pcps_acquisition_test.cc
@@ -0,0 +1,275 @@
+/*!
+ * \file gps_l1_ca_pcps_acquisition_test.cc
+ * \brief This class implements an acquisition test for
+ * GpsL1CaPcpsAcquisition class based on some input parameters.
+ * \author Javier Arribas, 2015 (jarribas at cttc.es)
+ *
+ *
+ * -------------------------------------------------------------------------
+ *
+ * Copyright (C) 2010-2015 (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/>.
+ *
+ * -------------------------------------------------------------------------
+ */
+
+
+
+#include <ctime>
+#include <cstdlib>
+#include <iostream>
+#include <boost/chrono.hpp>
+#include <gnuradio/top_block.h>
+#include <gnuradio/blocks/file_source.h>
+#include <gnuradio/analog/sig_source_waveform.h>
+#include <gnuradio/analog/sig_source_c.h>
+#include <gnuradio/blocks/interleaved_short_to_complex.h>
+#include <gnuradio/blocks/char_to_short.h>
+#include <gnuradio/msg_queue.h>
+#include <gnuradio/blocks/null_sink.h>
+#include <gtest/gtest.h>
+#include "gnss_block_factory.h"
+#include "gnss_block_interface.h"
+#include "in_memory_configuration.h"
+#include "gnss_sdr_valve.h"
+#include "gnss_synchro.h"
+#include "gps_l2_m_pcps_acquisition.h"
+#include "GPS_L2C.h"
+
+
+class GpsL2MPcpsAcquisitionTest: public ::testing::Test
+{
+protected:
+ GpsL2MPcpsAcquisitionTest()
+ {
+ //queue = gr::msg_queue::make(0);
+ factory = std::make_shared<GNSSBlockFactory>();
+ config = std::make_shared<InMemoryConfiguration>();
+ item_size = sizeof(gr_complex);
+ stop = false;
+ message = 0;
+ sampling_freqeuncy_hz = 0;
+ nsamples=0;
+ }
+
+ ~GpsL2MPcpsAcquisitionTest()
+ {}
+
+ void init();
+ void start_queue();
+ void wait_message();
+ void stop_queue();
+
+ gr::msg_queue::sptr queue;
+ gr::top_block_sptr top_block;
+ std::shared_ptr<GNSSBlockFactory> factory;
+ std::shared_ptr<InMemoryConfiguration> config;
+ Gnss_Synchro gnss_synchro;
+ size_t item_size;
+ concurrent_queue<int> channel_internal_queue;
+ bool stop;
+ int message;
+ boost::thread ch_thread;
+
+ int sampling_freqeuncy_hz;
+ int nsamples;
+};
+
+
+void GpsL2MPcpsAcquisitionTest::init()
+{
+ gnss_synchro.Channel_ID = 0;
+ gnss_synchro.System = 'G';
+ std::string signal = "2S";
+ strcpy(gnss_synchro.Signal,signal.c_str());
+ gnss_synchro.PRN = 15;
+
+ sampling_freqeuncy_hz = 4000000;
+ nsamples=round((double)sampling_freqeuncy_hz*GPS_L2_M_PERIOD)*2;
+ config->set_property("GNSS-SDR.internal_fs_hz", std::to_string(sampling_freqeuncy_hz));
+ config->set_property("Acquisition.item_type", "gr_complex");
+ config->set_property("Acquisition.if", "0");
+ config->set_property("Acquisition.dump", "true");
+ config->set_property("Acquisition.implementation", "GPS_L2_M_PCPS_Acquisition");
+ config->set_property("Acquisition.threshold", "0.001");
+ config->set_property("Acquisition.doppler_max", "5000");
+ config->set_property("Acquisition.doppler_step", "10");
+ config->set_property("Acquisition.repeat_satellite", "false");
+ config->set_property("Acquisition.pfa", "0.0");
+}
+
+
+void GpsL2MPcpsAcquisitionTest::start_queue()
+{
+ ch_thread = boost::thread(&GpsL2MPcpsAcquisitionTest::wait_message, this);
+}
+
+
+void GpsL2MPcpsAcquisitionTest::wait_message()
+{
+ while (!stop)
+ {
+ channel_internal_queue.wait_and_pop(message);
+ stop_queue();
+ }
+}
+
+
+
+void GpsL2MPcpsAcquisitionTest::stop_queue()
+{
+ stop = true;
+}
+
+
+
+TEST_F(GpsL2MPcpsAcquisitionTest, Instantiate)
+{
+ init();
+ queue = gr::msg_queue::make(0);
+ std::shared_ptr<GpsL2MPcpsAcquisition> acquisition = std::make_shared<GpsL2MPcpsAcquisition>(config.get(), "Acquisition", 1, 1, queue);
+}
+
+TEST_F(GpsL2MPcpsAcquisitionTest, ConnectAndRun)
+{
+ struct timeval tv;
+ long long int begin = 0;
+ long long int end = 0;
+ top_block = gr::make_top_block("Acquisition test");
+ queue = gr::msg_queue::make(0);
+
+ init();
+ std::shared_ptr<GpsL2MPcpsAcquisition> acquisition = std::make_shared<GpsL2MPcpsAcquisition>(config.get(), "Acquisition", 1, 1, queue);
+
+ ASSERT_NO_THROW( {
+ acquisition->connect(top_block);
+ boost::shared_ptr<gr::analog::sig_source_c> source = gr::analog::sig_source_c::make(sampling_freqeuncy_hz, gr::analog::GR_SIN_WAVE, 1000, 1, gr_complex(0));
+ boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue);
+ top_block->connect(source, 0, valve, 0);
+ top_block->connect(valve, 0, acquisition->get_left_block(), 0);
+ }) << "Failure connecting the blocks of acquisition test." << std::endl;
+
+ EXPECT_NO_THROW( {
+ gettimeofday(&tv, NULL);
+ begin = tv.tv_sec * 1000000 + tv.tv_usec;
+ top_block->run(); // Start threads and wait
+ gettimeofday(&tv, NULL);
+ end = tv.tv_sec * 1000000 + tv.tv_usec;
+ }) << "Failure running the top_block." << std::endl;
+
+ std::cout << "Processed " << nsamples << " samples in " << (end - begin) << " microseconds" << std::endl;
+}
+
+TEST_F(GpsL2MPcpsAcquisitionTest, ValidationOfResults)
+{
+ struct timeval tv;
+ long long int begin = 0;
+ long long int end = 0;
+ top_block = gr::make_top_block("Acquisition test");
+ queue = gr::msg_queue::make(0);
+
+
+ double expected_delay_samples = 2004;
+ double expected_doppler_hz = 3000;
+ init();
+ start_queue();
+ std::shared_ptr<GpsL2MPcpsAcquisition> acquisition = std::make_shared<GpsL2MPcpsAcquisition>(config.get(), "Acquisition", 1, 1, queue);
+
+
+ ASSERT_NO_THROW( {
+ acquisition->set_channel(1);
+ }) << "Failure setting channel." << std::endl;
+
+ ASSERT_NO_THROW( {
+ acquisition->set_gnss_synchro(&gnss_synchro);
+ }) << "Failure setting gnss_synchro." << std::endl;
+
+ ASSERT_NO_THROW( {
+ acquisition->set_channel_queue(&channel_internal_queue);
+ }) << "Failure setting channel_internal_queue." << std::endl;
+
+ ASSERT_NO_THROW( {
+ acquisition->set_threshold(0.001);
+ }) << "Failure setting threshold." << std::endl;
+
+ ASSERT_NO_THROW( {
+ acquisition->set_doppler_max(5000);
+ }) << "Failure setting doppler_max." << std::endl;
+
+ ASSERT_NO_THROW( {
+ acquisition->set_doppler_step(10);
+ }) << "Failure setting doppler_step." << std::endl;
+
+ ASSERT_NO_THROW( {
+ acquisition->connect(top_block);
+ }) << "Failure connecting acquisition to the top_block." << std::endl;
+
+ ASSERT_NO_THROW( {
+ std::string path = std::string(TEST_PATH);
+ //std::string file = path + "signal_samples/GSoC_CTTC_capture_2012_07_26_4Msps_4ms.dat";
+ //std::string file = "/home/gnss/git/gnss-sdr/src/tests/data/gps_l2c_m_prn7_5msps.dat";
+ std::string file = "/datalogger/signals/Fraunhofer/L125_III1b_210s_L2_resampled.bin";
+ const char * file_name = file.c_str();
+ gr::blocks::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false);
+ //gr::blocks::interleaved_short_to_complex::sptr gr_interleaved_short_to_complex_ = gr::blocks::interleaved_short_to_complex::make();
+ //gr::blocks::char_to_short::sptr gr_char_to_short_ = gr::blocks::char_to_short::make();
+ boost::shared_ptr<gr::block> valve = gnss_sdr_make_valve(sizeof(gr_complex), nsamples, queue);
+
+ //top_block->connect(file_source, 0, gr_char_to_short_, 0);
+ //top_block->connect(gr_char_to_short_, 0, gr_interleaved_short_to_complex_ , 0);
+ top_block->connect(file_source, 0, valve , 0);
+ top_block->connect(valve, 0, acquisition->get_left_block(), 0);
+
+ }) << "Failure connecting the blocks of acquisition test." << std::endl;
+
+
+ ASSERT_NO_THROW( {
+ acquisition->set_state(1); // Ensure that acquisition starts at the first sample
+ acquisition->init();
+ }) << "Failure set_state and init acquisition test" << std::endl;
+
+ EXPECT_NO_THROW( {
+ gettimeofday(&tv, NULL);
+ begin = tv.tv_sec * 1000000 + tv.tv_usec;
+ top_block->run(); // Start threads and wait
+ gettimeofday(&tv, NULL);
+ end = tv.tv_sec * 1000000 + tv.tv_usec;
+ }) << "Failure running the top_block." << std::endl;
+
+ stop_queue();
+
+ unsigned long int Acq_samplestamp_samples = gnss_synchro.Acq_samplestamp_samples;
+ std::cout << "Acquisition process runtime duration: " << (end - begin) << " microseconds" << std::endl;
+
+ std::cout << "gnss_synchro.Acq_doppler_hz = " << gnss_synchro.Acq_doppler_hz << " Hz" << std::endl;
+ std::cout << "gnss_synchro.Acq_delay_samples = " << gnss_synchro.Acq_delay_samples << " Samples" << std::endl;
+
+
+ ASSERT_EQ(1, message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS.";
+
+ double delay_error_samples = std::abs(expected_delay_samples - gnss_synchro.Acq_delay_samples);
+ float delay_error_chips = (float)(delay_error_samples * 1023 / 4000);
+ double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz);
+
+ EXPECT_LE(doppler_error_hz, 200) << "Doppler error exceeds the expected value: 666 Hz = 2/(3*integration period)";
+ EXPECT_LT(delay_error_chips, 0.5) << "Delay error exceeds the expected value: 0.5 chips";
+
+ ch_thread.join();
+}
--
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