mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-11-09 03:20:01 +00:00
Merge branch 'next' of https://github.com/gnss-sdr/gnss-sdr into next
This commit is contained in:
commit
f04e63f4de
@ -47,6 +47,8 @@ InputFilter.filter_type=bandpass
|
|||||||
InputFilter.grid_density=16
|
InputFilter.grid_density=16
|
||||||
InputFilter.sampling_frequency=25000000
|
InputFilter.sampling_frequency=25000000
|
||||||
InputFilter.IF=6250000
|
InputFilter.IF=6250000
|
||||||
|
InputFilter.dump = false
|
||||||
|
InputFilter.dump_filename=/home/dmiralles/Documents/gnss-sdr/src/tests/signal_samples/BdsB1IStr01_fs25e6_if0_4ms.dat
|
||||||
Resampler.implementation=Pass_Through
|
Resampler.implementation=Pass_Through
|
||||||
Resampler.sample_freq_in=25000000
|
Resampler.sample_freq_in=25000000
|
||||||
Resampler.sample_freq_out=25000000
|
Resampler.sample_freq_out=25000000
|
||||||
@ -77,7 +79,7 @@ Acquisition_B1.threshold=0.0038
|
|||||||
;Acquisition_B1.pfa=0.0000001;
|
;Acquisition_B1.pfa=0.0000001;
|
||||||
Acquisition_B1.doppler_max=10000
|
Acquisition_B1.doppler_max=10000
|
||||||
Acquisition_B1.doppler_step=100
|
Acquisition_B1.doppler_step=100
|
||||||
Acquisition_B1.dump=false
|
Acquisition_B1.dump=true
|
||||||
Acquisition_B1.dump_filename=./bds_acq
|
Acquisition_B1.dump_filename=./bds_acq
|
||||||
Acquisition_B1.blocking=false;
|
Acquisition_B1.blocking=false;
|
||||||
Acquisition_B1.use_CFAR_algorithm=true;
|
Acquisition_B1.use_CFAR_algorithm=true;
|
||||||
@ -89,7 +91,7 @@ Tracking_B1.implementation=BEIDOU_B1I_DLL_PLL_Tracking
|
|||||||
Tracking_B1.item_type=gr_complex
|
Tracking_B1.item_type=gr_complex
|
||||||
Tracking_B1.pll_bw_hz=25.0;
|
Tracking_B1.pll_bw_hz=25.0;
|
||||||
Tracking_B1.dll_bw_hz=2.50;
|
Tracking_B1.dll_bw_hz=2.50;
|
||||||
Tracking_B1.dump=false;
|
Tracking_B1.dump=true;
|
||||||
Tracking_B1.dump_filename=./epl_tracking_ch_
|
Tracking_B1.dump_filename=./epl_tracking_ch_
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ SignalSource.samples=0
|
|||||||
SignalSource.repeat=false
|
SignalSource.repeat=false
|
||||||
SignalSource.dump=false
|
SignalSource.dump=false
|
||||||
SignalSource.enable_throttle_control=false
|
SignalSource.enable_throttle_control=false
|
||||||
|
;SignalSource.samples=200000
|
||||||
|
|
||||||
;######### SIGNAL_CONDITIONER CONFIG ############
|
;######### SIGNAL_CONDITIONER CONFIG ############
|
||||||
SignalConditioner.implementation=Signal_Conditioner
|
SignalConditioner.implementation=Signal_Conditioner
|
||||||
@ -47,6 +48,8 @@ InputFilter.filter_type=bandpass
|
|||||||
InputFilter.grid_density=16
|
InputFilter.grid_density=16
|
||||||
InputFilter.sampling_frequency=50000000
|
InputFilter.sampling_frequency=50000000
|
||||||
InputFilter.IF=12500000
|
InputFilter.IF=12500000
|
||||||
|
InputFilter.dump = false
|
||||||
|
InputFilter.dump_filename=/home/dmiralles/Documents/gnss-sdr/src/tests/signal_samples/BdsB3IStr01_fs50e6_if0_4ms.dat
|
||||||
Resampler.implementation=Pass_Through
|
Resampler.implementation=Pass_Through
|
||||||
Resampler.sample_freq_in=50000000
|
Resampler.sample_freq_in=50000000
|
||||||
Resampler.sample_freq_out=50000000
|
Resampler.sample_freq_out=50000000
|
||||||
@ -55,7 +58,7 @@ Resampler.item_type=gr_complex
|
|||||||
|
|
||||||
;######### CHANNELS GLOBAL CONFIG ############
|
;######### CHANNELS GLOBAL CONFIG ############
|
||||||
Channels_B3.count=10
|
Channels_B3.count=10
|
||||||
Channels.in_acquisition=10
|
Channels.in_acquisition=1
|
||||||
Channel.signal=B3
|
Channel.signal=B3
|
||||||
|
|
||||||
Channel0.satellite = 6;
|
Channel0.satellite = 6;
|
||||||
@ -74,7 +77,7 @@ Acquisition_B3.implementation=BEIDOU_B3I_PCPS_Acquisition
|
|||||||
Acquisition_B3.item_type=gr_complex
|
Acquisition_B3.item_type=gr_complex
|
||||||
Acquisition_B3.coherent_integration_time_ms=3
|
Acquisition_B3.coherent_integration_time_ms=3
|
||||||
Acquisition_B3.max_dwells = 2
|
Acquisition_B3.max_dwells = 2
|
||||||
Acquisition_B3.threshold=0.0004
|
Acquisition_B3.threshold=0.0005
|
||||||
Acquisition_B3.doppler_max=10000
|
Acquisition_B3.doppler_max=10000
|
||||||
Acquisition_B3.doppler_step=100
|
Acquisition_B3.doppler_step=100
|
||||||
Acquisition_B3.dump=false
|
Acquisition_B3.dump=false
|
||||||
|
@ -892,6 +892,7 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
|
|||||||
if ((valid_obs + glo_valid_obs) > 3)
|
if ((valid_obs + glo_valid_obs) > 3)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
int sat = 0;
|
||||||
nav_t nav_data;
|
nav_t nav_data;
|
||||||
nav_data.eph = eph_data;
|
nav_data.eph = eph_data;
|
||||||
nav_data.geph = geph_data;
|
nav_data.geph = geph_data;
|
||||||
@ -903,6 +904,15 @@ bool Rtklib_Solver::get_PVT(const std::map<int, Gnss_Synchro> &gnss_observables_
|
|||||||
i[0] = SPEED_OF_LIGHT / FREQ1; // L1/E1
|
i[0] = SPEED_OF_LIGHT / FREQ1; // L1/E1
|
||||||
i[1] = SPEED_OF_LIGHT / FREQ2; // L2
|
i[1] = SPEED_OF_LIGHT / FREQ2; // L2
|
||||||
i[2] = SPEED_OF_LIGHT / FREQ5; // L5/E5
|
i[2] = SPEED_OF_LIGHT / FREQ5; // L5/E5
|
||||||
|
|
||||||
|
// Keep update on sat number
|
||||||
|
sat++;
|
||||||
|
if (sat > NSYSGPS + NSYSGLO + NSYSGAL + NSYSQZS and sat < NSYSGPS + NSYSGLO + NSYSGAL + NSYSQZS + NSYSBDS)
|
||||||
|
{
|
||||||
|
i[0] = SPEED_OF_LIGHT / FREQ1_BDS; // B1I
|
||||||
|
i[1] = SPEED_OF_LIGHT / FREQ3_BDS; // B3I
|
||||||
|
i[2] = SPEED_OF_LIGHT / FREQ5; // L5/E5
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result = rtkpos(&rtk_, obs_data, valid_obs + glo_valid_obs, &nav_data);
|
result = rtkpos(&rtk_, obs_data, valid_obs + glo_valid_obs, &nav_data);
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
|
* along with GNSS-SDR. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*
|
*
|
||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -57,7 +57,6 @@ BeidouB1iPcpsAcquisition::BeidouB1iPcpsAcquisition(
|
|||||||
DLOG(INFO) << "role " << role;
|
DLOG(INFO) << "role " << role;
|
||||||
|
|
||||||
item_type_ = configuration_->property(role + ".item_type", default_item_type);
|
item_type_ = configuration_->property(role + ".item_type", default_item_type);
|
||||||
|
|
||||||
int64_t fs_in_deprecated = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000);
|
int64_t fs_in_deprecated = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000);
|
||||||
fs_in_ = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated);
|
fs_in_ = configuration_->property("GNSS-SDR.internal_fs_sps", fs_in_deprecated);
|
||||||
acq_parameters.fs_in = fs_in_;
|
acq_parameters.fs_in = fs_in_;
|
||||||
|
@ -43,12 +43,17 @@
|
|||||||
#include "rtklib_rtkcmn.h"
|
#include "rtklib_rtkcmn.h"
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs, const Gnss_Synchro& gnss_synchro, int week, int band)
|
obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs, const Gnss_Synchro& gnss_synchro, int week, int band)
|
||||||
{
|
{
|
||||||
|
// Get signal type info to adjust code type based on constellation
|
||||||
|
std::string sig_ = gnss_synchro.Signal;
|
||||||
|
|
||||||
rtklib_obs.D[band] = gnss_synchro.Carrier_Doppler_hz;
|
rtklib_obs.D[band] = gnss_synchro.Carrier_Doppler_hz;
|
||||||
rtklib_obs.P[band] = gnss_synchro.Pseudorange_m;
|
rtklib_obs.P[band] = gnss_synchro.Pseudorange_m;
|
||||||
rtklib_obs.L[band] = gnss_synchro.Carrier_phase_rads / PI_2;
|
rtklib_obs.L[band] = gnss_synchro.Carrier_phase_rads / PI_2;
|
||||||
|
|
||||||
switch (band)
|
switch (band)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
@ -86,6 +91,16 @@ obsd_t insert_obs_to_rtklib(obsd_t& rtklib_obs, const Gnss_Synchro& gnss_synchro
|
|||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
rtklib_obs.sat = gnss_synchro.PRN + NSATGPS + NSATGLO + NSATGAL + NSATQZS;
|
rtklib_obs.sat = gnss_synchro.PRN + NSATGPS + NSATGLO + NSATGAL + NSATQZS;
|
||||||
|
// Update signal code
|
||||||
|
if (sig_ == "B1")
|
||||||
|
{
|
||||||
|
rtklib_obs.code[band] = static_cast<unsigned char>(CODE_L2I);
|
||||||
|
}
|
||||||
|
else if (sig_ == "B3")
|
||||||
|
{
|
||||||
|
rtklib_obs.code[band] = static_cast<unsigned char>(CODE_L6I);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -210,7 +210,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* fL1^2 / fL2(orL5)^2 . See IS-GPS-200, p. 103 and Galileo ICD p. 48 */
|
/* fL1^2 / fL2(orL5)^2 . See IS-GPS-200, p. 103 and Galileo ICD p. 48 */
|
||||||
if (sys == SYS_GPS or sys == SYS_GAL or sys == SYS_GLO)
|
if (sys == SYS_GPS or sys == SYS_GAL or sys == SYS_GLO or sys == SYS_BDS)
|
||||||
{
|
{
|
||||||
gamma_ = std::pow(lam[j], 2.0) / std::pow(lam[i], 2.0);
|
gamma_ = std::pow(lam[j], 2.0) / std::pow(lam[i], 2.0);
|
||||||
}
|
}
|
||||||
@ -282,7 +282,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel,
|
|||||||
PC = P2 + P1_P2 - ISCl5i;
|
PC = P2 + P1_P2 - ISCl5i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (sys == SYS_GAL or sys == SYS_GLO) // Gal. E5a single freq.
|
else if (sys == SYS_GAL or sys == SYS_GLO or sys == SYS_BDS) // Gal. E5a single freq.
|
||||||
{
|
{
|
||||||
P2 += P2_C2; /* C2->P2 */
|
P2 += P2_C2; /* C2->P2 */
|
||||||
PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_);
|
PC = P2 - gamma_ * P1_P2 / (1.0 - gamma_);
|
||||||
@ -306,7 +306,7 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel,
|
|||||||
PC = P1 + P1_P2;
|
PC = P1 + P1_P2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (sys == SYS_GAL or sys == SYS_GLO) /* E1 + E5a */
|
else if (sys == SYS_GAL or sys == SYS_GLO or sys == SYS_BDS) /* E1 + E5a */
|
||||||
{
|
{
|
||||||
P1 += P1_C1;
|
P1 += P1_C1;
|
||||||
P2 += P2_C2;
|
P2 += P2_C2;
|
||||||
|
@ -48,7 +48,7 @@ class BeidouB3iTelemetryDecoder : public TelemetryDecoderInterface
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BeidouB3iTelemetryDecoder(ConfigurationInterface *configuration,
|
BeidouB3iTelemetryDecoder(ConfigurationInterface *configuration,
|
||||||
const std::string& role, unsigned int in_streams,
|
const std::string &role, unsigned int in_streams,
|
||||||
unsigned int out_streams);
|
unsigned int out_streams);
|
||||||
|
|
||||||
virtual ~BeidouB3iTelemetryDecoder();
|
virtual ~BeidouB3iTelemetryDecoder();
|
||||||
@ -72,7 +72,11 @@ public:
|
|||||||
telemetry_decoder_->set_channel(channel);
|
telemetry_decoder_->set_channel(channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void reset() override { return; }
|
inline void reset() override
|
||||||
|
{
|
||||||
|
telemetry_decoder_->reset();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
inline size_t item_size() override { return 0; }
|
inline size_t item_size() override { return 0; }
|
||||||
|
|
||||||
|
@ -56,6 +56,7 @@ beidou_b3i_make_telemetry_decoder_gs(const Gnss_Satellite &satellite,
|
|||||||
new beidou_b3i_telemetry_decoder_gs(satellite, dump));
|
new beidou_b3i_telemetry_decoder_gs(satellite, dump));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
beidou_b3i_telemetry_decoder_gs::beidou_b3i_telemetry_decoder_gs(
|
beidou_b3i_telemetry_decoder_gs::beidou_b3i_telemetry_decoder_gs(
|
||||||
const Gnss_Satellite &satellite, bool dump)
|
const Gnss_Satellite &satellite, bool dump)
|
||||||
: gr::block("beidou_b3i_telemetry_decoder_gs",
|
: gr::block("beidou_b3i_telemetry_decoder_gs",
|
||||||
@ -64,6 +65,9 @@ beidou_b3i_telemetry_decoder_gs::beidou_b3i_telemetry_decoder_gs(
|
|||||||
{
|
{
|
||||||
// Ephemeris data port out
|
// Ephemeris data port out
|
||||||
this->message_port_register_out(pmt::mp("telemetry"));
|
this->message_port_register_out(pmt::mp("telemetry"));
|
||||||
|
// Control messages to tracking block
|
||||||
|
this->message_port_register_out(pmt::mp("telemetry_to_trk"));
|
||||||
|
|
||||||
// initialize internal vars
|
// initialize internal vars
|
||||||
d_dump = dump;
|
d_dump = dump;
|
||||||
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
|
d_satellite = Gnss_Satellite(satellite.get_system(), satellite.get_PRN());
|
||||||
@ -396,6 +400,7 @@ void beidou_b3i_telemetry_decoder_gs::set_satellite(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void beidou_b3i_telemetry_decoder_gs::set_channel(int32_t channel)
|
void beidou_b3i_telemetry_decoder_gs::set_channel(int32_t channel)
|
||||||
{
|
{
|
||||||
d_channel = channel;
|
d_channel = channel;
|
||||||
|
@ -60,7 +60,10 @@ public:
|
|||||||
~beidou_b3i_telemetry_decoder_gs(); //!< Class destructor
|
~beidou_b3i_telemetry_decoder_gs(); //!< Class destructor
|
||||||
void set_satellite(const Gnss_Satellite &satellite); //!< Set satellite PRN
|
void set_satellite(const Gnss_Satellite &satellite); //!< Set satellite PRN
|
||||||
void set_channel(int channel); //!< Set receiver's channel
|
void set_channel(int channel); //!< Set receiver's channel
|
||||||
|
inline void reset()
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
/*!
|
/*!
|
||||||
* \brief This is where all signal processing takes place
|
* \brief This is where all signal processing takes place
|
||||||
*/
|
*/
|
||||||
|
@ -39,6 +39,12 @@
|
|||||||
#include "acquisition_interface.h" // for AcquisitionInterface
|
#include "acquisition_interface.h" // for AcquisitionInterface
|
||||||
#include "array_signal_conditioner.h"
|
#include "array_signal_conditioner.h"
|
||||||
#include "beamformer_filter.h"
|
#include "beamformer_filter.h"
|
||||||
|
#include "beidou_b1i_dll_pll_tracking.h"
|
||||||
|
#include "beidou_b1i_pcps_acquisition.h"
|
||||||
|
#include "beidou_b1i_telemetry_decoder.h"
|
||||||
|
#include "beidou_b3i_dll_pll_tracking.h"
|
||||||
|
#include "beidou_b3i_pcps_acquisition.h"
|
||||||
|
#include "beidou_b3i_telemetry_decoder.h"
|
||||||
#include "byte_to_short.h"
|
#include "byte_to_short.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "configuration_interface.h"
|
#include "configuration_interface.h"
|
||||||
@ -66,12 +72,6 @@
|
|||||||
#include "glonass_l2_ca_dll_pll_tracking.h"
|
#include "glonass_l2_ca_dll_pll_tracking.h"
|
||||||
#include "glonass_l2_ca_pcps_acquisition.h"
|
#include "glonass_l2_ca_pcps_acquisition.h"
|
||||||
#include "glonass_l2_ca_telemetry_decoder.h"
|
#include "glonass_l2_ca_telemetry_decoder.h"
|
||||||
#include "beidou_b1i_pcps_acquisition.h"
|
|
||||||
#include "beidou_b1i_dll_pll_tracking.h"
|
|
||||||
#include "beidou_b1i_telemetry_decoder.h"
|
|
||||||
#include "beidou_b3i_pcps_acquisition.h"
|
|
||||||
#include "beidou_b3i_dll_pll_tracking.h"
|
|
||||||
#include "beidou_b3i_telemetry_decoder.h"
|
|
||||||
#include "gnss_block_interface.h"
|
#include "gnss_block_interface.h"
|
||||||
#include "gps_l1_ca_dll_pll_c_aid_tracking.h"
|
#include "gps_l1_ca_dll_pll_c_aid_tracking.h"
|
||||||
#include "gps_l1_ca_dll_pll_tracking.h"
|
#include "gps_l1_ca_dll_pll_tracking.h"
|
||||||
@ -289,12 +289,12 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetObservables(const std::
|
|||||||
Galileo_channels +
|
Galileo_channels +
|
||||||
GPS_channels +
|
GPS_channels +
|
||||||
Glonass_channels +
|
Glonass_channels +
|
||||||
Beidou_channels +
|
Beidou_channels +
|
||||||
extra_channels,
|
extra_channels,
|
||||||
Galileo_channels +
|
Galileo_channels +
|
||||||
GPS_channels +
|
GPS_channels +
|
||||||
Glonass_channels +
|
Glonass_channels +
|
||||||
Beidou_channels);
|
Beidou_channels);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -313,7 +313,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetPVT(const std::shared_p
|
|||||||
unsigned int Beidou_channels = configuration->property("Channels_B1.count", 0);
|
unsigned int Beidou_channels = configuration->property("Channels_B1.count", 0);
|
||||||
Beidou_channels += configuration->property("Channels_B3.count", 0);
|
Beidou_channels += configuration->property("Channels_B3.count", 0);
|
||||||
return GetBlock(configuration, "PVT", implementation,
|
return GetBlock(configuration, "PVT", implementation,
|
||||||
Galileo_channels + GPS_channels + Glonass_channels + Beidou_channels, 0);
|
Galileo_channels + GPS_channels + Glonass_channels + Beidou_channels, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -948,7 +948,7 @@ std::unique_ptr<std::vector<std::unique_ptr<GNSSBlockInterface>>> GNSSBlockFacto
|
|||||||
Channels_5X_count +
|
Channels_5X_count +
|
||||||
Channels_L5_count +
|
Channels_L5_count +
|
||||||
Channels_B1_count +
|
Channels_B1_count +
|
||||||
Channels_B3_count;
|
Channels_B3_count;
|
||||||
|
|
||||||
std::unique_ptr<std::vector<std::unique_ptr<GNSSBlockInterface>>> channels(new std::vector<std::unique_ptr<GNSSBlockInterface>>(total_channels));
|
std::unique_ptr<std::vector<std::unique_ptr<GNSSBlockInterface>>> channels(new std::vector<std::unique_ptr<GNSSBlockInterface>>(total_channels));
|
||||||
try
|
try
|
||||||
@ -1218,7 +1218,6 @@ std::unique_ptr<std::vector<std::unique_ptr<GNSSBlockInterface>>> GNSSBlockFacto
|
|||||||
queue);
|
queue);
|
||||||
channel_absolute_id++;
|
channel_absolute_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
@ -1704,8 +1703,8 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetBlock(
|
|||||||
block = std::move(block_);
|
block = std::move(block_);
|
||||||
}
|
}
|
||||||
else if (implementation == "BEIDOU_B3I_PCPS_Acquisition")
|
else if (implementation == "BEIDOU_B3I_PCPS_Acquisition")
|
||||||
{
|
{
|
||||||
std::unique_ptr<AcquisitionInterface> block_(new BeidouB3iPcpsAcquisition(configuration.get(), role, in_streams,
|
std::unique_ptr<AcquisitionInterface> block_(new BeidouB3iPcpsAcquisition(configuration.get(), role, in_streams,
|
||||||
out_streams));
|
out_streams));
|
||||||
block = std::move(block_);
|
block = std::move(block_);
|
||||||
}
|
}
|
||||||
@ -1720,7 +1719,7 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetBlock(
|
|||||||
else if (implementation == "GPS_L1_CA_KF_Tracking")
|
else if (implementation == "GPS_L1_CA_KF_Tracking")
|
||||||
{
|
{
|
||||||
std::unique_ptr<GNSSBlockInterface> block_(new GpsL1CaKfTracking(configuration.get(), role, in_streams,
|
std::unique_ptr<GNSSBlockInterface> block_(new GpsL1CaKfTracking(configuration.get(), role, in_streams,
|
||||||
out_streams));
|
out_streams));
|
||||||
block = std::move(block_);
|
block = std::move(block_);
|
||||||
}
|
}
|
||||||
else if (implementation == "GPS_L1_CA_DLL_PLL_C_Aid_Tracking")
|
else if (implementation == "GPS_L1_CA_DLL_PLL_C_Aid_Tracking")
|
||||||
@ -1844,11 +1843,11 @@ std::unique_ptr<GNSSBlockInterface> GNSSBlockFactory::GetBlock(
|
|||||||
block = std::move(block_);
|
block = std::move(block_);
|
||||||
}
|
}
|
||||||
else if (implementation == "BEIDOU_B3I_DLL_PLL_Tracking")
|
else if (implementation == "BEIDOU_B3I_DLL_PLL_Tracking")
|
||||||
{
|
{
|
||||||
std::unique_ptr<GNSSBlockInterface> block_(new BeidouB3iDllPllTracking(configuration.get(), role, in_streams,
|
std::unique_ptr<GNSSBlockInterface> block_(new BeidouB3iDllPllTracking(configuration.get(), role, in_streams,
|
||||||
out_streams));
|
out_streams));
|
||||||
block = std::move(block_);
|
block = std::move(block_);
|
||||||
}
|
}
|
||||||
// TELEMETRY DECODERS ----------------------------------------------------------
|
// TELEMETRY DECODERS ----------------------------------------------------------
|
||||||
else if (implementation == "GPS_L1_CA_Telemetry_Decoder")
|
else if (implementation == "GPS_L1_CA_Telemetry_Decoder")
|
||||||
{
|
{
|
||||||
@ -2138,7 +2137,7 @@ std::unique_ptr<TrackingInterface> GNSSBlockFactory::GetTrkBlock(
|
|||||||
else if (implementation == "GPS_L1_CA_KF_Tracking")
|
else if (implementation == "GPS_L1_CA_KF_Tracking")
|
||||||
{
|
{
|
||||||
std::unique_ptr<TrackingInterface> block_(new GpsL1CaKfTracking(configuration.get(), role, in_streams,
|
std::unique_ptr<TrackingInterface> block_(new GpsL1CaKfTracking(configuration.get(), role, in_streams,
|
||||||
out_streams));
|
out_streams));
|
||||||
block = std::move(block_);
|
block = std::move(block_);
|
||||||
}
|
}
|
||||||
else if (implementation == "GPS_L1_CA_DLL_PLL_C_Aid_Tracking")
|
else if (implementation == "GPS_L1_CA_DLL_PLL_C_Aid_Tracking")
|
||||||
|
@ -309,21 +309,41 @@ endif()
|
|||||||
|
|
||||||
if(ENABLE_UNIT_TESTING_EXTRA)
|
if(ENABLE_UNIT_TESTING_EXTRA)
|
||||||
add_definitions(-DEXTRA_TESTS)
|
add_definitions(-DEXTRA_TESTS)
|
||||||
|
message(STATUS "Downloading some data files for testing...")
|
||||||
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples/gps_l2c_m_prn7_5msps.dat)
|
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples/gps_l2c_m_prn7_5msps.dat)
|
||||||
message(STATUS "Downloading some data files for testing...")
|
message(STATUS "Downloading file: gps_l2c_m_prn7_5msps.dat")
|
||||||
file(DOWNLOAD https://sourceforge.net/projects/gnss-sdr/files/data/gps_l2c_m_prn7_5msps.dat ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/gps_l2c_m_prn7_5msps.dat
|
file(DOWNLOAD https://sourceforge.net/projects/gnss-sdr/files/data/gps_l2c_m_prn7_5msps.dat ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/gps_l2c_m_prn7_5msps.dat
|
||||||
SHOW_PROGRESS
|
SHOW_PROGRESS
|
||||||
EXPECTED_HASH MD5=a6fcbefe155137945d3c33c5ef7bd0f9)
|
EXPECTED_HASH MD5=a6fcbefe155137945d3c33c5ef7bd0f9
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples/Glonass_L1_CA_SIM_Fs_62Msps_4ms.dat)
|
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples/Glonass_L1_CA_SIM_Fs_62Msps_4ms.dat)
|
||||||
message(STATUS "Downloading some data files for testing...")
|
message(STATUS "Downloading file: Glonass_L1_CA_SIM_Fs_62Msps_4ms.dat")
|
||||||
file(DOWNLOAD https://sourceforge.net/projects/gnss-sdr/files/data/Glonass_L1_CA_SIM_Fs_62Msps_4ms.dat ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/Glonass_L1_CA_SIM_Fs_62Msps_4ms.dat
|
file(DOWNLOAD https://sourceforge.net/projects/gnss-sdr/files/data/Glonass_L1_CA_SIM_Fs_62Msps_4ms.dat ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/Glonass_L1_CA_SIM_Fs_62Msps_4ms.dat
|
||||||
SHOW_PROGRESS
|
SHOW_PROGRESS
|
||||||
EXPECTED_HASH MD5=ffb72fc63c116be58d5e5ccb1daaed3a)
|
EXPECTED_HASH MD5=ffb72fc63c116be58d5e5ccb1daaed3a
|
||||||
|
)
|
||||||
endif()
|
endif()
|
||||||
|
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples/BdsB1IStr01_fs25e6_if0_4ms.dat)
|
||||||
|
message(STATUS "Downloading file: BdsB1IStr01_fs25e6_if0_4ms.dat")
|
||||||
|
file(DOWNLOAD https://sourceforge.net/projects/gnss-sdr/files/data/BdsB1IStr01_fs25e6_if0_4ms.dat ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/BdsB1IStr01_fs25e6_if0_4ms.dat
|
||||||
|
SHOW_PROGRESS
|
||||||
|
EXPECTED_HASH MD5=5a4336dad9d80f3313a16dec4fff9233
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/thirdparty/signal_samples/BdsB3IStr01_fs50e6_if0_4ms.dat)
|
||||||
|
message(STATUS "Downloading file: BdsB3IStr01_fs50e6_if0_4ms.dat")
|
||||||
|
file(DOWNLOAD https://sourceforge.net/projects/gnss-sdr/files/data/BdsB3IStr01_fs50e6_if0_4ms.dat ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/BdsB3IStr01_fs50e6_if0_4ms.dat
|
||||||
|
SHOW_PROGRESS
|
||||||
|
EXPECTED_HASH MD5=066d0d8434a8bc81e161778b7c34cc07
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
message(STATUS "Done.")
|
||||||
if(ENABLE_INSTALL_TESTS)
|
if(ENABLE_INSTALL_TESTS)
|
||||||
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/gps_l2c_m_prn7_5msps.dat DESTINATION share/gnss-sdr/signal_samples)
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/gps_l2c_m_prn7_5msps.dat DESTINATION share/gnss-sdr/signal_samples)
|
||||||
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/Glonass_L1_CA_SIM_Fs_62Msps_4ms.dat DESTINATION share/gnss-sdr/signal_samples)
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/Glonass_L1_CA_SIM_Fs_62Msps_4ms.dat DESTINATION share/gnss-sdr/signal_samples)
|
||||||
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/BdsB1IStr01_fs25e6_if0_4ms.dat DESTINATION share/gnss-sdr/signal_samples)
|
||||||
|
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/../../thirdparty/signal_samples/BdsB1IStr01_fs25e6_if0_4ms.dat DESTINATION share/gnss-sdr/signal_samples)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -92,7 +92,6 @@ DECLARE_string(log_dir);
|
|||||||
#include "unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc"
|
#include "unit-tests/signal-processing-blocks/sources/gnss_sdr_valve_test.cc"
|
||||||
#include "unit-tests/signal-processing-blocks/sources/unpack_2bit_samples_test.cc"
|
#include "unit-tests/signal-processing-blocks/sources/unpack_2bit_samples_test.cc"
|
||||||
// #include "unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc"
|
// #include "unit-tests/signal-processing-blocks/acquisition/glonass_l2_ca_pcps_acquisition_test.cc"
|
||||||
// #include "unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc"
|
|
||||||
|
|
||||||
#if OPENCL_BLOCKS_TEST
|
#if OPENCL_BLOCKS_TEST
|
||||||
#include "unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc"
|
#include "unit-tests/signal-processing-blocks/acquisition/gps_l1_ca_pcps_opencl_acquisition_gsoc2013_test.cc"
|
||||||
@ -127,6 +126,8 @@ DECLARE_string(log_dir);
|
|||||||
|
|
||||||
#if EXTRA_TESTS
|
#if EXTRA_TESTS
|
||||||
#include "unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc"
|
#include "unit-tests/signal-processing-blocks/acquisition/acq_performance_test.cc"
|
||||||
|
//#include "unit-tests/signal-processing-blocks/acquisition/beidou_b1i_pcps_acquisition_test.cc"
|
||||||
|
//#include "unit-tests/signal-processing-blocks/acquisition/beidou_b3i_pcps_acquisition_test.cc"
|
||||||
#include "unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc"
|
#include "unit-tests/signal-processing-blocks/acquisition/glonass_l1_ca_pcps_acquisition_test.cc"
|
||||||
#include "unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc"
|
#include "unit-tests/signal-processing-blocks/acquisition/gps_l2_m_pcps_acquisition_test.cc"
|
||||||
#include "unit-tests/signal-processing-blocks/pvt/rtklib_solver_test.cc"
|
#include "unit-tests/signal-processing-blocks/pvt/rtklib_solver_test.cc"
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
* \brief This class implements an acquisition test for
|
* \brief This class implements an acquisition test for
|
||||||
* BeidouB1iPcpsAcquisition class based on some input parameters.
|
* BeidouB1iPcpsAcquisition class based on some input parameters.
|
||||||
* \author Sergi Segura, 2018. sergi.segura.munoz(at)gmail.com
|
* \author Sergi Segura, 2018. sergi.segura.munoz(at)gmail.com
|
||||||
*
|
* \author Damian Miralles, 2019. dmiralles2009(at)gmail.com
|
||||||
*
|
*
|
||||||
* -------------------------------------------------------------------------
|
* -------------------------------------------------------------------------
|
||||||
*
|
*
|
||||||
@ -44,7 +44,6 @@
|
|||||||
#include <boost/filesystem.hpp>
|
#include <boost/filesystem.hpp>
|
||||||
#include <boost/make_shared.hpp>
|
#include <boost/make_shared.hpp>
|
||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
#include <gnuradio/analog/sig_source_c.h>
|
|
||||||
#include <gnuradio/analog/sig_source_waveform.h>
|
#include <gnuradio/analog/sig_source_waveform.h>
|
||||||
#include <gnuradio/blocks/file_source.h>
|
#include <gnuradio/blocks/file_source.h>
|
||||||
#include <gnuradio/blocks/null_sink.h>
|
#include <gnuradio/blocks/null_sink.h>
|
||||||
@ -52,12 +51,18 @@
|
|||||||
#include <gnuradio/top_block.h>
|
#include <gnuradio/top_block.h>
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <utility>
|
||||||
|
#ifdef GR_GREATER_38
|
||||||
|
#include <gnuradio/analog/sig_source.h>
|
||||||
|
#else
|
||||||
|
#include <gnuradio/analog/sig_source_c.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// ######## GNURADIO BLOCK MESSAGE RECEVER #########
|
// ######## GNURADIO BLOCK MESSAGE RECEVER #########
|
||||||
class BeidouB1iPcpsAcquisitionTest_msg_rx;
|
class BeidouB1iPcpsAcquisitionTest_msg_rx;
|
||||||
|
|
||||||
typedef boost::shared_ptr<BeidouB1iPcpsAcquisitionTest_msg_rx> BeidouB1iPcpsAcquisitionTest_msg_rx_sptr;
|
using BeidouB1iPcpsAcquisitionTest_msg_rx_sptr = boost::shared_ptr<BeidouB1iPcpsAcquisitionTest_msg_rx>;
|
||||||
|
|
||||||
BeidouB1iPcpsAcquisitionTest_msg_rx_sptr BeidouB1iPcpsAcquisitionTest_msg_rx_make();
|
BeidouB1iPcpsAcquisitionTest_msg_rx_sptr BeidouB1iPcpsAcquisitionTest_msg_rx_make();
|
||||||
|
|
||||||
@ -84,7 +89,7 @@ void BeidouB1iPcpsAcquisitionTest_msg_rx::msg_handler_events(pmt::pmt_t msg)
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
long int message = pmt::to_long(msg);
|
int64_t message = pmt::to_long(std::move(msg));
|
||||||
rx_message = message;
|
rx_message = message;
|
||||||
}
|
}
|
||||||
catch (boost::bad_any_cast &e)
|
catch (boost::bad_any_cast &e)
|
||||||
@ -103,9 +108,7 @@ BeidouB1iPcpsAcquisitionTest_msg_rx::BeidouB1iPcpsAcquisitionTest_msg_rx() : gr:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BeidouB1iPcpsAcquisitionTest_msg_rx::~BeidouB1iPcpsAcquisitionTest_msg_rx()
|
BeidouB1iPcpsAcquisitionTest_msg_rx::~BeidouB1iPcpsAcquisitionTest_msg_rx() = default;
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ###########################################################
|
// ###########################################################
|
||||||
@ -123,9 +126,7 @@ protected:
|
|||||||
doppler_step = 100;
|
doppler_step = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
~BeidouB1iPcpsAcquisitionTest()
|
~BeidouB1iPcpsAcquisitionTest() = default;
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void init();
|
void init();
|
||||||
void plot_grid();
|
void plot_grid();
|
||||||
@ -133,7 +134,7 @@ protected:
|
|||||||
gr::top_block_sptr top_block;
|
gr::top_block_sptr top_block;
|
||||||
std::shared_ptr<GNSSBlockFactory> factory;
|
std::shared_ptr<GNSSBlockFactory> factory;
|
||||||
std::shared_ptr<InMemoryConfiguration> config;
|
std::shared_ptr<InMemoryConfiguration> config;
|
||||||
Gnss_Synchro gnss_synchro;
|
Gnss_Synchro gnss_synchro{};
|
||||||
size_t item_size;
|
size_t item_size;
|
||||||
unsigned int doppler_max;
|
unsigned int doppler_max;
|
||||||
unsigned int doppler_step;
|
unsigned int doppler_step;
|
||||||
@ -159,8 +160,9 @@ void BeidouB1iPcpsAcquisitionTest::init()
|
|||||||
{
|
{
|
||||||
config->set_property("Acquisition_B1.dump", "false");
|
config->set_property("Acquisition_B1.dump", "false");
|
||||||
}
|
}
|
||||||
config->set_property("Acquisition_B1.dump_filename", "./tmp-acq-beidou1/acquisition");
|
config->set_property("Acquisition_B1.dump_filename", "./tmp-acq-bds-b1i/acquisition");
|
||||||
config->set_property("Acquisition_B1.threshold", "0.00001");
|
config->set_property("Acquisition_B1.dump_channel", "1");
|
||||||
|
config->set_property("Acquisition_B1.threshold", "0.0038");
|
||||||
config->set_property("Acquisition_B1.doppler_max", std::to_string(doppler_max));
|
config->set_property("Acquisition_B1.doppler_max", std::to_string(doppler_max));
|
||||||
config->set_property("Acquisition_B1.doppler_step", std::to_string(doppler_step));
|
config->set_property("Acquisition_B1.doppler_step", std::to_string(doppler_step));
|
||||||
config->set_property("Acquisition_B1.repeat_satellite", "false");
|
config->set_property("Acquisition_B1.repeat_satellite", "false");
|
||||||
@ -171,13 +173,16 @@ void BeidouB1iPcpsAcquisitionTest::init()
|
|||||||
void BeidouB1iPcpsAcquisitionTest::plot_grid()
|
void BeidouB1iPcpsAcquisitionTest::plot_grid()
|
||||||
{
|
{
|
||||||
//load the measured values
|
//load the measured values
|
||||||
std::string basename = "./tmp-acq-beidou1/acquisition_C_B1";
|
std::string basename = "./tmp-acq-bds-b1i/acquisition_C_B1";
|
||||||
unsigned int sat = static_cast<unsigned int>(gnss_synchro.PRN);
|
auto sat = static_cast<unsigned int>(gnss_synchro.PRN);
|
||||||
|
|
||||||
unsigned int samples_per_code = static_cast<unsigned int>(round(4000000 / (BEIDOU_B1I_CODE_RATE_HZ / BEIDOU_B1I_CODE_LENGTH_CHIPS))); // !!
|
auto samples_per_code = static_cast<unsigned int>(round(25000000 / (BEIDOU_B1I_CODE_RATE_HZ / BEIDOU_B1I_CODE_LENGTH_CHIPS))); // !!
|
||||||
acquisition_dump_reader acq_dump(basename, sat, doppler_max, doppler_step, samples_per_code);
|
Acquisition_Dump_Reader acq_dump(basename, sat, doppler_max, doppler_step, samples_per_code, 1);
|
||||||
|
|
||||||
if (!acq_dump.read_binary_acq()) std::cout << "Error reading files" << std::endl;
|
if (!acq_dump.read_binary_acq())
|
||||||
|
{
|
||||||
|
std::cout << "Error reading files" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<int> *doppler = &acq_dump.doppler;
|
std::vector<int> *doppler = &acq_dump.doppler;
|
||||||
std::vector<unsigned int> *samples = &acq_dump.samples;
|
std::vector<unsigned int> *samples = &acq_dump.samples;
|
||||||
@ -197,26 +202,33 @@ void BeidouB1iPcpsAcquisitionTest::plot_grid()
|
|||||||
{
|
{
|
||||||
boost::filesystem::path p(gnuplot_executable);
|
boost::filesystem::path p(gnuplot_executable);
|
||||||
boost::filesystem::path dir = p.parent_path();
|
boost::filesystem::path dir = p.parent_path();
|
||||||
std::string gnuplot_path = dir.native();
|
const std::string &gnuplot_path = dir.native();
|
||||||
Gnuplot::set_GNUPlotPath(gnuplot_path);
|
Gnuplot::set_GNUPlotPath(gnuplot_path);
|
||||||
|
|
||||||
Gnuplot g1("lines");
|
Gnuplot g1("lines");
|
||||||
g1.set_title("BeiDou signal acquisition for satellite PRN #" + std::to_string(gnss_synchro.PRN));
|
if (FLAGS_show_plots)
|
||||||
|
{
|
||||||
|
g1.showonscreen(); // window output
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g1.disablescreen();
|
||||||
|
}
|
||||||
|
g1.set_title("BeiDou B1I signal acquisition for satellite PRN #" + std::to_string(gnss_synchro.PRN));
|
||||||
g1.set_xlabel("Doppler [Hz]");
|
g1.set_xlabel("Doppler [Hz]");
|
||||||
g1.set_ylabel("Sample");
|
g1.set_ylabel("Sample");
|
||||||
//g1.cmd("set view 60, 105, 1, 1");
|
//g1.cmd("set view 60, 105, 1, 1");
|
||||||
g1.plot_grid3d(*doppler, *samples, *mag);
|
g1.plot_grid3d(*doppler, *samples, *mag);
|
||||||
|
|
||||||
g1.savetops("BEIDOU_B1I_acq_grid");
|
g1.savetops("BeiDou_B1I_acq_grid");
|
||||||
g1.savetopdf("BEIDOU_BI1_acq_grid");
|
g1.savetopdf("BeiDou_B1I_acq_grid");
|
||||||
g1.showonscreen();
|
|
||||||
}
|
}
|
||||||
catch (const GnuplotException &ge)
|
catch (const GnuplotException &ge)
|
||||||
{
|
{
|
||||||
std::cout << ge.what() << std::endl;
|
std::cout << ge.what() << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::string data_str = "./tmp-acq-beidou1";
|
std::string data_str = "./tmp-acq-bds-b1i";
|
||||||
if (boost::filesystem::exists(data_str))
|
if (boost::filesystem::exists(data_str))
|
||||||
{
|
{
|
||||||
boost::filesystem::remove_all(data_str);
|
boost::filesystem::remove_all(data_str);
|
||||||
@ -234,7 +246,7 @@ TEST_F(BeidouB1iPcpsAcquisitionTest, Instantiate)
|
|||||||
TEST_F(BeidouB1iPcpsAcquisitionTest, ConnectAndRun)
|
TEST_F(BeidouB1iPcpsAcquisitionTest, ConnectAndRun)
|
||||||
{
|
{
|
||||||
int fs_in = 25000000;
|
int fs_in = 25000000;
|
||||||
int nsamples = 4000;
|
int nsamples = 25000;
|
||||||
std::chrono::time_point<std::chrono::system_clock> start, end;
|
std::chrono::time_point<std::chrono::system_clock> start, end;
|
||||||
std::chrono::duration<double> elapsed_seconds(0);
|
std::chrono::duration<double> elapsed_seconds(0);
|
||||||
gr::msg_queue::sptr queue = gr::msg_queue::make(0);
|
gr::msg_queue::sptr queue = gr::msg_queue::make(0);
|
||||||
@ -270,14 +282,14 @@ TEST_F(BeidouB1iPcpsAcquisitionTest, ValidationOfResults)
|
|||||||
std::chrono::duration<double> elapsed_seconds(0.0);
|
std::chrono::duration<double> elapsed_seconds(0.0);
|
||||||
top_block = gr::make_top_block("Acquisition test");
|
top_block = gr::make_top_block("Acquisition test");
|
||||||
|
|
||||||
double expected_delay_samples = 524;
|
double expected_delay_samples = 22216;
|
||||||
double expected_doppler_hz = 1680;
|
double expected_doppler_hz = 125;
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
||||||
if (FLAGS_plot_acq_grid == true)
|
if (FLAGS_plot_acq_grid == true)
|
||||||
{
|
{
|
||||||
std::string data_str = "./tmp-acq-beidou1";
|
std::string data_str = "./tmp-acq-bds-b1i";
|
||||||
if (boost::filesystem::exists(data_str))
|
if (boost::filesystem::exists(data_str))
|
||||||
{
|
{
|
||||||
boost::filesystem::remove_all(data_str);
|
boost::filesystem::remove_all(data_str);
|
||||||
@ -297,7 +309,7 @@ TEST_F(BeidouB1iPcpsAcquisitionTest, ValidationOfResults)
|
|||||||
}) << "Failure setting gnss_synchro.";
|
}) << "Failure setting gnss_synchro.";
|
||||||
|
|
||||||
ASSERT_NO_THROW({
|
ASSERT_NO_THROW({
|
||||||
acquisition->set_threshold(0.001);
|
acquisition->set_threshold(0.0038);
|
||||||
}) << "Failure setting threshold.";
|
}) << "Failure setting threshold.";
|
||||||
|
|
||||||
ASSERT_NO_THROW({
|
ASSERT_NO_THROW({
|
||||||
@ -314,7 +326,7 @@ TEST_F(BeidouB1iPcpsAcquisitionTest, ValidationOfResults)
|
|||||||
|
|
||||||
ASSERT_NO_THROW({
|
ASSERT_NO_THROW({
|
||||||
std::string path = std::string(TEST_PATH);
|
std::string path = std::string(TEST_PATH);
|
||||||
std::string file = path + "signal_samples/BEIDOU_B1I_ID_1_Fs_4Msps_2ms.dat";
|
std::string file = path + "signal_samples/BdsB1IStr01_fs25e6_if0_4ms.dat";
|
||||||
const char *file_name = file.c_str();
|
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::file_source::sptr file_source = gr::blocks::file_source::make(sizeof(gr_complex), file_name, false);
|
||||||
top_block->connect(file_source, 0, acquisition->get_left_block(), 0);
|
top_block->connect(file_source, 0, acquisition->get_left_block(), 0);
|
||||||
@ -332,12 +344,12 @@ TEST_F(BeidouB1iPcpsAcquisitionTest, ValidationOfResults)
|
|||||||
elapsed_seconds = end - start;
|
elapsed_seconds = end - start;
|
||||||
}) << "Failure running the top_block.";
|
}) << "Failure running the top_block.";
|
||||||
|
|
||||||
unsigned long int nsamples = gnss_synchro.Acq_samplestamp_samples;
|
uint64_t nsamples = gnss_synchro.Acq_samplestamp_samples;
|
||||||
std::cout << "Acquired " << nsamples << " samples in " << elapsed_seconds.count() * 1e6 << " microseconds" << std::endl;
|
std::cout << "Acquired " << nsamples << " samples in " << elapsed_seconds.count() * 1e6 << " microseconds" << std::endl;
|
||||||
ASSERT_EQ(1, msg_rx->rx_message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS.";
|
ASSERT_EQ(1, msg_rx->rx_message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS.";
|
||||||
|
|
||||||
double delay_error_samples = std::abs(expected_delay_samples - gnss_synchro.Acq_delay_samples);
|
double delay_error_samples = std::abs(expected_delay_samples - gnss_synchro.Acq_delay_samples);
|
||||||
float delay_error_chips = static_cast<float>(delay_error_samples * 1023 / 4000);
|
auto delay_error_chips = static_cast<float>(delay_error_samples * BEIDOU_B1I_CODE_LENGTH_CHIPS / 25000);
|
||||||
double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz);
|
double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz);
|
||||||
|
|
||||||
EXPECT_LE(doppler_error_hz, 666) << "Doppler error exceeds the expected value: 666 Hz = 2/(3*integration period)";
|
EXPECT_LE(doppler_error_hz, 666) << "Doppler error exceeds the expected value: 666 Hz = 2/(3*integration period)";
|
||||||
|
@ -0,0 +1,361 @@
|
|||||||
|
/*!
|
||||||
|
* \file beidou_b3i_pcps_acquisition_test.cc
|
||||||
|
* \brief This class implements an acquisition test for
|
||||||
|
* BeidouB3iPcpsAcquisition class based on some input parameters.
|
||||||
|
* \author Damian Miralles, 2019. dmiralles2009(at)gmail.com
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* -------------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010-2018 (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 <https://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* -------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "Beidou_B3I.h"
|
||||||
|
#include "acquisition_dump_reader.h"
|
||||||
|
#include "gnss_block_factory.h"
|
||||||
|
#include "gnss_block_interface.h"
|
||||||
|
#include "gnss_sdr_valve.h"
|
||||||
|
#include "gnss_synchro.h"
|
||||||
|
#include "gnuplot_i.h"
|
||||||
|
#include "beidou_b3i_pcps_acquisition.h"
|
||||||
|
#include "in_memory_configuration.h"
|
||||||
|
#include "test_flags.h"
|
||||||
|
#include <boost/filesystem.hpp>
|
||||||
|
#include <boost/make_shared.hpp>
|
||||||
|
#include <glog/logging.h>
|
||||||
|
#include <gnuradio/analog/sig_source_waveform.h>
|
||||||
|
#include <gnuradio/blocks/file_source.h>
|
||||||
|
#include <gnuradio/blocks/null_sink.h>
|
||||||
|
#include <gnuradio/msg_queue.h>
|
||||||
|
#include <gnuradio/top_block.h>
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <chrono>
|
||||||
|
#include <utility>
|
||||||
|
#ifdef GR_GREATER_38
|
||||||
|
#include <gnuradio/analog/sig_source.h>
|
||||||
|
#else
|
||||||
|
#include <gnuradio/analog/sig_source_c.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// ######## GNURADIO BLOCK MESSAGE RECEVER #########
|
||||||
|
class BeidouB3iPcpsAcquisitionTest_msg_rx;
|
||||||
|
|
||||||
|
using BeidouB3iPcpsAcquisitionTest_msg_rx_sptr = boost::shared_ptr<BeidouB3iPcpsAcquisitionTest_msg_rx>;
|
||||||
|
|
||||||
|
BeidouB3iPcpsAcquisitionTest_msg_rx_sptr BeidouB3iPcpsAcquisitionTest_msg_rx_make();
|
||||||
|
|
||||||
|
class BeidouB3iPcpsAcquisitionTest_msg_rx : public gr::block
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
friend BeidouB3iPcpsAcquisitionTest_msg_rx_sptr BeidouB3iPcpsAcquisitionTest_msg_rx_make();
|
||||||
|
void msg_handler_events(pmt::pmt_t msg);
|
||||||
|
BeidouB3iPcpsAcquisitionTest_msg_rx();
|
||||||
|
|
||||||
|
public:
|
||||||
|
int rx_message;
|
||||||
|
~BeidouB3iPcpsAcquisitionTest_msg_rx(); //!< Default destructor
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
BeidouB3iPcpsAcquisitionTest_msg_rx_sptr BeidouB3iPcpsAcquisitionTest_msg_rx_make()
|
||||||
|
{
|
||||||
|
return BeidouB3iPcpsAcquisitionTest_msg_rx_sptr(new BeidouB3iPcpsAcquisitionTest_msg_rx());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BeidouB3iPcpsAcquisitionTest_msg_rx::msg_handler_events(pmt::pmt_t msg)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int64_t message = pmt::to_long(std::move(msg));
|
||||||
|
rx_message = message;
|
||||||
|
}
|
||||||
|
catch (boost::bad_any_cast &e)
|
||||||
|
{
|
||||||
|
LOG(WARNING) << "msg_handler_telemetry Bad any cast!";
|
||||||
|
rx_message = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BeidouB3iPcpsAcquisitionTest_msg_rx::BeidouB3iPcpsAcquisitionTest_msg_rx() : gr::block("BeidouB3iPcpsAcquisitionTest_msg_rx", gr::io_signature::make(0, 0, 0), gr::io_signature::make(0, 0, 0))
|
||||||
|
{
|
||||||
|
this->message_port_register_in(pmt::mp("events"));
|
||||||
|
this->set_msg_handler(pmt::mp("events"), boost::bind(&BeidouB3iPcpsAcquisitionTest_msg_rx::msg_handler_events, this, _1));
|
||||||
|
rx_message = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BeidouB3iPcpsAcquisitionTest_msg_rx::~BeidouB3iPcpsAcquisitionTest_msg_rx() = default;
|
||||||
|
|
||||||
|
|
||||||
|
// ###########################################################
|
||||||
|
|
||||||
|
class BeidouB3iPcpsAcquisitionTest : public ::testing::Test
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
BeidouB3iPcpsAcquisitionTest()
|
||||||
|
{
|
||||||
|
factory = std::make_shared<GNSSBlockFactory>();
|
||||||
|
config = std::make_shared<InMemoryConfiguration>();
|
||||||
|
item_size = sizeof(gr_complex);
|
||||||
|
gnss_synchro = Gnss_Synchro();
|
||||||
|
doppler_max = 5000;
|
||||||
|
doppler_step = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
~BeidouB3iPcpsAcquisitionTest() = default;
|
||||||
|
|
||||||
|
void init();
|
||||||
|
void plot_grid();
|
||||||
|
|
||||||
|
gr::top_block_sptr top_block;
|
||||||
|
std::shared_ptr<GNSSBlockFactory> factory;
|
||||||
|
std::shared_ptr<InMemoryConfiguration> config;
|
||||||
|
Gnss_Synchro gnss_synchro{};
|
||||||
|
size_t item_size;
|
||||||
|
unsigned int doppler_max;
|
||||||
|
unsigned int doppler_step;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void BeidouB3iPcpsAcquisitionTest::init()
|
||||||
|
{
|
||||||
|
gnss_synchro.Channel_ID = 0;
|
||||||
|
gnss_synchro.System = 'C';
|
||||||
|
std::string signal = "B3";
|
||||||
|
signal.copy(gnss_synchro.Signal, 2, 0);
|
||||||
|
gnss_synchro.PRN = 1;
|
||||||
|
config->set_property("GNSS-SDR.internal_fs_sps", "50000000");
|
||||||
|
config->set_property("Acquisition_B3.implementation", "BEIDOU_B3I_PCPS_Acquisition");
|
||||||
|
config->set_property("Acquisition_B3.item_type", "gr_complex");
|
||||||
|
config->set_property("Acquisition_B3.coherent_integration_time_ms", "1");
|
||||||
|
if (FLAGS_plot_acq_grid == true)
|
||||||
|
{
|
||||||
|
config->set_property("Acquisition_B3.dump", "true");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
config->set_property("Acquisition_B3.dump", "false");
|
||||||
|
}
|
||||||
|
config->set_property("Acquisition_B3.dump_filename", "./tmp-acq-bds-b3i/acquisition");
|
||||||
|
config->set_property("Acquisition_B3.dump_channel", "1");
|
||||||
|
config->set_property("Acquisition_B3.threshold", "0.00001");
|
||||||
|
config->set_property("Acquisition_B3.doppler_max", std::to_string(doppler_max));
|
||||||
|
config->set_property("Acquisition_B3.doppler_step", std::to_string(doppler_step));
|
||||||
|
config->set_property("Acquisition_B3.repeat_satellite", "false");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void BeidouB3iPcpsAcquisitionTest::plot_grid()
|
||||||
|
{
|
||||||
|
//load the measured values
|
||||||
|
std::string basename = "./tmp-acq-bds-b3i/acquisition_C_B3";
|
||||||
|
auto sat = static_cast<unsigned int>(gnss_synchro.PRN);
|
||||||
|
|
||||||
|
auto samples_per_code = static_cast<unsigned int>(round(50000000 / (BEIDOU_B3I_CODE_RATE_HZ / BEIDOU_B3I_CODE_LENGTH_CHIPS))); // !!
|
||||||
|
Acquisition_Dump_Reader acq_dump(basename, sat, doppler_max, doppler_step, samples_per_code, 1);
|
||||||
|
|
||||||
|
if (!acq_dump.read_binary_acq())
|
||||||
|
{
|
||||||
|
std::cout << "Error reading files" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<int> *doppler = &acq_dump.doppler;
|
||||||
|
std::vector<unsigned int> *samples = &acq_dump.samples;
|
||||||
|
std::vector<std::vector<float> > *mag = &acq_dump.mag;
|
||||||
|
|
||||||
|
const std::string gnuplot_executable(FLAGS_gnuplot_executable);
|
||||||
|
if (gnuplot_executable.empty())
|
||||||
|
{
|
||||||
|
std::cout << "WARNING: Although the flag plot_acq_grid has been set to TRUE," << std::endl;
|
||||||
|
std::cout << "gnuplot has not been found in your system." << std::endl;
|
||||||
|
std::cout << "Test results will not be plotted." << std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::cout << "Plotting the acquisition grid. This can take a while..." << std::endl;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
boost::filesystem::path p(gnuplot_executable);
|
||||||
|
boost::filesystem::path dir = p.parent_path();
|
||||||
|
const std::string &gnuplot_path = dir.native();
|
||||||
|
Gnuplot::set_GNUPlotPath(gnuplot_path);
|
||||||
|
|
||||||
|
Gnuplot g1("lines");
|
||||||
|
if (FLAGS_show_plots)
|
||||||
|
{
|
||||||
|
g1.showonscreen(); // window output
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g1.disablescreen();
|
||||||
|
}
|
||||||
|
g1.set_title("BeiDou B3I signal acquisition for satellite PRN #" + std::to_string(gnss_synchro.PRN));
|
||||||
|
g1.set_xlabel("Doppler [Hz]");
|
||||||
|
g1.set_ylabel("Sample");
|
||||||
|
//g1.cmd("set view 60, 105, 1, 1");
|
||||||
|
g1.plot_grid3d(*doppler, *samples, *mag);
|
||||||
|
|
||||||
|
g1.savetops("BDS_B3I_acq_grid");
|
||||||
|
g1.savetopdf("BDS_B3I_acq_grid");
|
||||||
|
}
|
||||||
|
catch (const GnuplotException &ge)
|
||||||
|
{
|
||||||
|
std::cout << ge.what() << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::string data_str = "./tmp-acq-bds-b3i";
|
||||||
|
if (boost::filesystem::exists(data_str))
|
||||||
|
{
|
||||||
|
boost::filesystem::remove_all(data_str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST_F(BeidouB3iPcpsAcquisitionTest, Instantiate)
|
||||||
|
{
|
||||||
|
init();
|
||||||
|
boost::shared_ptr<BeidouB3iPcpsAcquisition> acquisition = boost::make_shared<BeidouB3iPcpsAcquisition>(config.get(), "Acquisition_B3", 1, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST_F(BeidouB3iPcpsAcquisitionTest, ConnectAndRun)
|
||||||
|
{
|
||||||
|
int fs_in = 50000000;
|
||||||
|
int nsamples = 50000;
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> start, end;
|
||||||
|
std::chrono::duration<double> elapsed_seconds(0);
|
||||||
|
gr::msg_queue::sptr queue = gr::msg_queue::make(0);
|
||||||
|
|
||||||
|
top_block = gr::make_top_block("Acquisition test");
|
||||||
|
init();
|
||||||
|
boost::shared_ptr<BeidouB3iPcpsAcquisition> acquisition = boost::make_shared<BeidouB3iPcpsAcquisition>(config.get(), "Acquisition_B3", 1, 0);
|
||||||
|
boost::shared_ptr<BeidouB3iPcpsAcquisitionTest_msg_rx> msg_rx = BeidouB3iPcpsAcquisitionTest_msg_rx_make();
|
||||||
|
|
||||||
|
ASSERT_NO_THROW({
|
||||||
|
acquisition->connect(top_block);
|
||||||
|
boost::shared_ptr<gr::analog::sig_source_c> source = gr::analog::sig_source_c::make(fs_in, 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);
|
||||||
|
top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events"));
|
||||||
|
}) << "Failure connecting the blocks of acquisition test.";
|
||||||
|
|
||||||
|
EXPECT_NO_THROW({
|
||||||
|
start = std::chrono::system_clock::now();
|
||||||
|
top_block->run(); // Start threads and wait
|
||||||
|
end = std::chrono::system_clock::now();
|
||||||
|
elapsed_seconds = end - start;
|
||||||
|
}) << "Failure running the top_block.";
|
||||||
|
|
||||||
|
std::cout << "Processed " << nsamples << " samples in " << elapsed_seconds.count() * 1e6 << " microseconds" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST_F(BeidouB3iPcpsAcquisitionTest, ValidationOfResults)
|
||||||
|
{
|
||||||
|
std::chrono::time_point<std::chrono::system_clock> start, end;
|
||||||
|
std::chrono::duration<double> elapsed_seconds(0.0);
|
||||||
|
top_block = gr::make_top_block("Acquisition test");
|
||||||
|
|
||||||
|
double expected_delay_samples = 3380;
|
||||||
|
double expected_doppler_hz = 700;
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
|
if (FLAGS_plot_acq_grid == true)
|
||||||
|
{
|
||||||
|
std::string data_str = "./tmp-acq-bds-b3i";
|
||||||
|
if (boost::filesystem::exists(data_str))
|
||||||
|
{
|
||||||
|
boost::filesystem::remove_all(data_str);
|
||||||
|
}
|
||||||
|
boost::filesystem::create_directory(data_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<BeidouB3iPcpsAcquisition> acquisition = std::make_shared<BeidouB3iPcpsAcquisition>(config.get(), "Acquisition_B3", 1, 0);
|
||||||
|
boost::shared_ptr<BeidouB3iPcpsAcquisitionTest_msg_rx> msg_rx = BeidouB3iPcpsAcquisitionTest_msg_rx_make();
|
||||||
|
|
||||||
|
ASSERT_NO_THROW({
|
||||||
|
acquisition->set_channel(1);
|
||||||
|
}) << "Failure setting channel.";
|
||||||
|
|
||||||
|
ASSERT_NO_THROW({
|
||||||
|
acquisition->set_gnss_synchro(&gnss_synchro);
|
||||||
|
}) << "Failure setting gnss_synchro.";
|
||||||
|
|
||||||
|
ASSERT_NO_THROW({
|
||||||
|
acquisition->set_threshold(0.0002);
|
||||||
|
}) << "Failure setting threshold.";
|
||||||
|
|
||||||
|
ASSERT_NO_THROW({
|
||||||
|
acquisition->set_doppler_max(doppler_max);
|
||||||
|
}) << "Failure setting doppler_max.";
|
||||||
|
|
||||||
|
ASSERT_NO_THROW({
|
||||||
|
acquisition->set_doppler_step(doppler_step);
|
||||||
|
}) << "Failure setting doppler_step.";
|
||||||
|
|
||||||
|
ASSERT_NO_THROW({
|
||||||
|
acquisition->connect(top_block);
|
||||||
|
}) << "Failure connecting acquisition to the top_block.";
|
||||||
|
|
||||||
|
ASSERT_NO_THROW({
|
||||||
|
std::string path = std::string(TEST_PATH);
|
||||||
|
std::string file = path + "signal_samples/BdsB3IStr01_fs50e6_if0_4ms.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);
|
||||||
|
top_block->connect(file_source, 0, acquisition->get_left_block(), 0);
|
||||||
|
top_block->msg_connect(acquisition->get_right_block(), pmt::mp("events"), msg_rx, pmt::mp("events"));
|
||||||
|
}) << "Failure connecting the blocks of acquisition test.";
|
||||||
|
|
||||||
|
acquisition->set_local_code();
|
||||||
|
acquisition->set_state(1); // Ensure that acquisition starts at the first sample
|
||||||
|
acquisition->init();
|
||||||
|
|
||||||
|
EXPECT_NO_THROW({
|
||||||
|
start = std::chrono::system_clock::now();
|
||||||
|
top_block->run(); // Start threads and wait
|
||||||
|
end = std::chrono::system_clock::now();
|
||||||
|
elapsed_seconds = end - start;
|
||||||
|
}) << "Failure running the top_block.";
|
||||||
|
|
||||||
|
uint64_t nsamples = gnss_synchro.Acq_samplestamp_samples;
|
||||||
|
std::cout << "Acquired " << nsamples << " samples in " << elapsed_seconds.count() * 1e6 << " microseconds" << std::endl;
|
||||||
|
ASSERT_EQ(1, msg_rx->rx_message) << "Acquisition failure. Expected message: 1=ACQ SUCCESS.";
|
||||||
|
|
||||||
|
double delay_error_samples = std::abs(expected_delay_samples - gnss_synchro.Acq_delay_samples);
|
||||||
|
auto delay_error_chips = static_cast<float>(delay_error_samples * BEIDOU_B3I_CODE_LENGTH_CHIPS / 50000);
|
||||||
|
double doppler_error_hz = std::abs(expected_doppler_hz - gnss_synchro.Acq_doppler_hz);
|
||||||
|
|
||||||
|
EXPECT_LE(doppler_error_hz, 666) << "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";
|
||||||
|
|
||||||
|
if (FLAGS_plot_acq_grid == true)
|
||||||
|
{
|
||||||
|
plot_grid();
|
||||||
|
}
|
||||||
|
}
|
@ -36,7 +36,7 @@ end
|
|||||||
|
|
||||||
samplingFreq = 25000000; %[Hz]
|
samplingFreq = 25000000; %[Hz]
|
||||||
coherent_integration_time_ms = 1; %[ms]
|
coherent_integration_time_ms = 1; %[ms]
|
||||||
channels = 10; % Number of channels
|
channels = 1; % Number of channels
|
||||||
first_channel = 0; % Number of the first channel
|
first_channel = 0; % Number of the first channel
|
||||||
|
|
||||||
path = '/home/dmiralles/Documents/gnss-sdr/'; %% CHANGE THIS PATH
|
path = '/home/dmiralles/Documents/gnss-sdr/'; %% CHANGE THIS PATH
|
||||||
|
@ -26,15 +26,12 @@
|
|||||||
% -------------------------------------------------------------------------
|
% -------------------------------------------------------------------------
|
||||||
%
|
%
|
||||||
|
|
||||||
%%%%%%%%% ?????? CONFIGURE !!! %%%%%%%%%%%%%
|
%% Configuration
|
||||||
|
path = '/home/dmiralles/Documents/gnss-sdr/';
|
||||||
path = '/home/dmiralles/Documents/Research/Publications/INSIDE_GNSS/bds_leg_pvt/Data/'; %% CHANGE THIS PATH
|
file = 'bds_acq';
|
||||||
file = 'bds_b3i_acq';
|
sat = 6;
|
||||||
|
|
||||||
sat = 27;
|
|
||||||
|
|
||||||
channel = 0;
|
channel = 0;
|
||||||
execution = 6;
|
execution = 4;
|
||||||
% Signal:
|
% Signal:
|
||||||
% 1 GPS L1
|
% 1 GPS L1
|
||||||
% 2 GPS L2M
|
% 2 GPS L2M
|
||||||
@ -42,17 +39,21 @@ execution = 6;
|
|||||||
% 4 Gal. E1B
|
% 4 Gal. E1B
|
||||||
% 5 Gal. E5
|
% 5 Gal. E5
|
||||||
% 6 Glo. 1G
|
% 6 Glo. 1G
|
||||||
% 7 BDS B1
|
% 7 Glo. 2G
|
||||||
|
% 8 BDS. B1
|
||||||
|
% 9 BDS. B3
|
||||||
|
% 10 BDS. B2a
|
||||||
|
|
||||||
signal_type = 8;
|
signal_type = 8;
|
||||||
|
|
||||||
%%% True for light acq_grid representation
|
%%% True for light grid representation
|
||||||
lite_view = true;
|
lite_view = true;
|
||||||
|
|
||||||
%%% If lite_view, it sets the number of samples per chip in the graphical representation
|
%%% If lite_view, it sets the number of samples per chip in the graphical representation
|
||||||
n_samples_per_chip = 3;
|
n_samples_per_chip = 3;
|
||||||
|
d_samples_per_code = 25000;
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%% Load data
|
||||||
|
|
||||||
switch(signal_type)
|
switch(signal_type)
|
||||||
case 1
|
case 1
|
||||||
@ -80,45 +81,59 @@ switch(signal_type)
|
|||||||
system = 'R';
|
system = 'R';
|
||||||
signal = '1G';
|
signal = '1G';
|
||||||
case 7
|
case 7
|
||||||
n_chips = 2046;
|
n_chips = 511;
|
||||||
|
system = 'R';
|
||||||
|
signal = '2G';
|
||||||
|
case 8
|
||||||
|
n_chips = 2048;
|
||||||
system = 'C';
|
system = 'C';
|
||||||
signal = 'B1';
|
signal = 'B1';
|
||||||
case 8
|
case 9
|
||||||
n_chips = 10230;
|
n_chips = 10230;
|
||||||
system = 'C';
|
system = 'C';
|
||||||
signal = 'B3';
|
signal = 'B3';
|
||||||
|
case 10
|
||||||
|
n_chips = 10230;
|
||||||
|
system = 'C';
|
||||||
|
signal = '5C';
|
||||||
end
|
end
|
||||||
filename = [path file '_' system '_' signal '_ch_' num2str(channel) '_' num2str(execution) '_sat_' num2str(sat) '.mat'];
|
filename = [path file '_' system '_' signal '_ch_' num2str(channel) '_' num2str(execution) '_sat_' num2str(sat) '.mat'];
|
||||||
load(filename);
|
load(filename);
|
||||||
[n_fft n_dop_bins] = size(acq_grid);
|
[n_fft, n_dop_bins] = size(acq_grid);
|
||||||
[d_max f_max] = find(acq_grid == max(max(acq_grid)));
|
[d_max, f_max] = find(acq_grid == max(max(acq_grid)));
|
||||||
freq = (0 : n_dop_bins - 1) * doppler_step - doppler_max;
|
freq = (0 : n_dop_bins - 1) * double(doppler_step) - double(doppler_max);
|
||||||
delay = (0 : n_fft - 1) / n_fft * n_chips;
|
delay = (0 : n_fft - 1) / n_fft * n_chips;
|
||||||
|
|
||||||
|
|
||||||
|
%% Plot data
|
||||||
|
%--- Acquisition grid (3D)
|
||||||
figure(1)
|
figure(1)
|
||||||
if(lite_view == false)
|
if(lite_view == false)
|
||||||
surf(freq, delay, acq_grid, 'FaceColor', 'interp', 'LineStyle', 'none')
|
surf(freq, delay, acq_grid, 'FaceColor', 'interp', 'LineStyle', 'none')
|
||||||
ylim([min(delay) max(delay)])
|
ylim([min(delay) max(delay)])
|
||||||
else
|
else
|
||||||
delay_interp = (0 : n_samples_per_chip * n_chips - 1) / n_samples_per_chip;
|
delay_interp = (0 : n_samples_per_chip * n_chips - 1) / n_samples_per_chip;
|
||||||
acq_grid_interp = spline(delay, acq_grid', delay_interp)';
|
grid_interp = spline(delay, acq_grid', delay_interp)';
|
||||||
surf(freq, delay_interp, acq_grid_interp, 'FaceColor', 'interp', 'LineStyle', 'none')
|
surf(freq, delay_interp, grid_interp, 'FaceColor', 'interp', 'LineStyle', 'none')
|
||||||
ylim([min(delay_interp) max(delay_interp)])
|
ylim([min(delay_interp) max(delay_interp)])
|
||||||
end
|
end
|
||||||
xlabel('Doppler shift / Hz')
|
xlabel('Doppler shift (Hz)')
|
||||||
xlim([min(freq) max(freq)])
|
xlim([min(freq) max(freq)])
|
||||||
ylabel('Code delay / chips')
|
ylabel('Code delay (chips)')
|
||||||
zlabel('Test statistics')
|
zlabel('Test Statistics')
|
||||||
|
|
||||||
|
%--- Acquisition grid (2D)
|
||||||
figure(2)
|
figure(2)
|
||||||
subplot(2,1,1)
|
subplot(2,1,1)
|
||||||
plot(freq, acq_grid(d_max, :))
|
plot(freq, acq_grid(d_max, :))
|
||||||
xlim([min(freq) max(freq)])
|
xlim([min(freq) max(freq)])
|
||||||
xlabel('Doppler shift / Hz')
|
xlabel('Doppler shift (Hz)')
|
||||||
ylabel('Test statistics')
|
ylabel('Test statistics')
|
||||||
title(['Fixed code delay to ' num2str((d_max - 1) / n_fft * n_chips) ' chips'])
|
title(['Fixed code delay to ' num2str((d_max - 1) / n_fft * n_chips) ' chips'])
|
||||||
subplot(2,1,2)
|
subplot(2,1,2)
|
||||||
normalization = (d_samples_per_code^4) * input_power;
|
normalization = (d_samples_per_code^4) * input_power;
|
||||||
plot(delay, acq_acq_grid(:, f_max)./normalization)
|
plot(delay, acq_grid(:, f_max)./normalization)
|
||||||
xlim([min(delay) max(delay)])
|
xlim([min(delay) max(delay)])
|
||||||
xlabel('Code delay / chips')
|
xlabel('Code delay (chips)')
|
||||||
ylabel('Test statistics')
|
ylabel('Test statistics')
|
||||||
title(['Doppler wipe-off = ' num2str((f_max - 1) * doppler_step - doppler_max) ' Hz'])
|
title(['Doppler wipe-off = ' num2str((f_max - 1) * doppler_step - doppler_max) ' Hz'])
|
||||||
|
Loading…
Reference in New Issue
Block a user