[hamradio-commits] [gnss-sdr] 07/251: Adding GPS L2C M code generators and PCPS Acquisition algorithms skeletons
Carles Fernandez
carles_fernandez-guest at moszumanska.debian.org
Wed Sep 2 00:22:30 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 75983a0471f867692b27bac3a8838c0446480d75
Author: Javier <jarribas at cttc.es>
Date: Thu Apr 23 16:20:06 2015 +0200
Adding GPS L2C M code generators and PCPS Acquisition algorithms
skeletons
---
.../adapters/gps_l2_m_pcps_acquisition.cc | 372 +++++++++++++++++++++
.../adapters/gps_l2_m_pcps_acquisition.h | 177 ++++++++++
src/algorithms/libs/gps_l2c_signal.cc | 107 ++++++
src/algorithms/libs/gps_l2c_signal.h | 49 +++
src/core/system_parameters/GPS_L2C.h | 85 +++++
5 files changed, 790 insertions(+)
diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc
new file mode 100644
index 0000000..9a38c2a
--- /dev/null
+++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.cc
@@ -0,0 +1,372 @@
+/*!
+ * \file gps_l1_ca_pcps_acquisition.cc
+ * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for
+ * GPS L1 C/A signals
+ * \authors <ul>
+ * <li> Javier Arribas, 2011. jarribas(at)cttc.es
+ * </ul>
+ *
+ * -------------------------------------------------------------------------
+ *
+ * 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_pcps_acquisition.h"
+#include <iostream>
+#include <stdexcept>
+#include <boost/math/distributions/exponential.hpp>
+#include <glog/logging.h>
+#include <gnuradio/msg_queue.h>
+#include "gps_sdr_signal_processing.h"
+#include "GPS_L1_CA.h"
+#include "configuration_interface.h"
+
+
+using google::LogMessage;
+
+GpsL2MPcpsAcquisition::GpsL2MPcpsAcquisition(
+ ConfigurationInterface* configuration, std::string role,
+ unsigned int in_streams, unsigned int out_streams,
+ gr::msg_queue::sptr queue) :
+ role_(role), in_streams_(in_streams), out_streams_(out_streams), queue_(queue)
+{
+ configuration_ = configuration;
+ std::string default_item_type = "gr_complex";
+ std::string default_dump_filename = "./data/acquisition.dat";
+
+ DLOG(INFO) << "role " << role;
+
+ item_type_ = configuration_->property(role + ".item_type",
+ default_item_type);
+ //float pfa = configuration_->property(role + ".pfa", 0.0);
+
+ fs_in_ = configuration_->property("GNSS-SDR.internal_fs_hz", 2048000);
+ if_ = configuration_->property(role + ".ifreq", 0);
+ dump_ = configuration_->property(role + ".dump", false);
+ shift_resolution_ = configuration_->property(role + ".doppler_max", 15);
+ sampled_ms_ = configuration_->property(role + ".coherent_integration_time_ms", 1);
+
+ bit_transition_flag_ = configuration_->property(role + ".bit_transition_flag", false);
+
+ if (!bit_transition_flag_)
+ {
+ max_dwells_ = configuration_->property(role + ".max_dwells", 1);
+ }
+ else
+ {
+ max_dwells_ = 2;
+ }
+
+ dump_filename_ = configuration_->property(role + ".dump_filename",
+ default_dump_filename);
+
+ //--- Find number of samples per spreading code -------------------------
+ code_length_ = round(fs_in_
+ / (GPS_L1_CA_CODE_RATE_HZ / GPS_L1_CA_CODE_LENGTH_CHIPS));
+
+ vector_length_ = code_length_ * sampled_ms_;
+
+ code_= new gr_complex[vector_length_];
+
+ // if (item_type_.compare("gr_complex") == 0 )
+ // {
+ item_size_ = sizeof(gr_complex);
+ acquisition_cc_ = pcps_make_acquisition_cc(sampled_ms_, max_dwells_,
+ shift_resolution_, if_, fs_in_, code_length_, code_length_,
+ bit_transition_flag_, queue_, dump_, dump_filename_);
+
+ stream_to_vector_ = gr::blocks::stream_to_vector::make(item_size_, vector_length_);
+
+ DLOG(INFO) << "stream_to_vector(" << stream_to_vector_->unique_id() << ")";
+ DLOG(INFO) << "acquisition(" << acquisition_cc_->unique_id() << ")";
+ // }
+
+ if (item_type_.compare("cshort") == 0)
+ {
+ cshort_to_float_x2_ = make_cshort_to_float_x2();
+ float_to_complex_ = gr::blocks::float_to_complex::make();
+ }
+
+ if (item_type_.compare("cbyte") == 0)
+ {
+ cbyte_to_float_x2_ = make_complex_byte_to_float_x2();
+ float_to_complex_ = gr::blocks::float_to_complex::make();
+ }
+ //}
+ //else
+ // {
+ // LOG(WARNING) << item_type_
+ // << " unknown acquisition item type";
+ // }
+}
+
+
+GpsL2MPcpsAcquisition::~GpsL2MPcpsAcquisition()
+{
+ delete[] code_;
+}
+
+
+void GpsL2MPcpsAcquisition::set_channel(unsigned int channel)
+{
+ channel_ = channel;
+ //if (item_type_.compare("gr_complex") == 0)
+ //{
+ acquisition_cc_->set_channel(channel_);
+ //}
+}
+
+
+void GpsL2MPcpsAcquisition::set_threshold(float threshold)
+{
+ float pfa = configuration_->property(role_ + boost::lexical_cast<std::string>(channel_) + ".pfa", 0.0);
+
+ if(pfa == 0.0)
+ {
+ pfa = configuration_->property(role_+".pfa", 0.0);
+ }
+ if(pfa == 0.0)
+ {
+ threshold_ = threshold;
+ }
+ else
+ {
+ threshold_ = calculate_threshold(pfa);
+ }
+
+ DLOG(INFO) <<"Channel "<<channel_<<" Threshold = " << threshold_;
+
+ // if (item_type_.compare("gr_complex") == 0)
+ // {
+ acquisition_cc_->set_threshold(threshold_);
+ // }
+}
+
+
+void GpsL2MPcpsAcquisition::set_doppler_max(unsigned int doppler_max)
+{
+ doppler_max_ = doppler_max;
+ // if (item_type_.compare("gr_complex") == 0)
+ // {
+ acquisition_cc_->set_doppler_max(doppler_max_);
+ // }
+}
+
+
+void GpsL2MPcpsAcquisition::set_doppler_step(unsigned int doppler_step)
+{
+ doppler_step_ = doppler_step;
+ // if (item_type_.compare("gr_complex") == 0)
+ // {
+ acquisition_cc_->set_doppler_step(doppler_step_);
+ // }
+
+}
+
+
+void GpsL2MPcpsAcquisition::set_channel_queue(
+ concurrent_queue<int> *channel_internal_queue)
+{
+ channel_internal_queue_ = channel_internal_queue;
+ // if (item_type_.compare("gr_complex") == 0)
+ // {
+ acquisition_cc_->set_channel_queue(channel_internal_queue_);
+ // }
+}
+
+
+void GpsL2MPcpsAcquisition::set_gnss_synchro(Gnss_Synchro* gnss_synchro)
+{
+ gnss_synchro_ = gnss_synchro;
+ // if (item_type_.compare("gr_complex") == 0)
+ // {
+ acquisition_cc_->set_gnss_synchro(gnss_synchro_);
+ // }
+}
+
+
+signed int GpsL2MPcpsAcquisition::mag()
+{
+ // // if (item_type_.compare("gr_complex") == 0)
+ // {
+ return acquisition_cc_->mag();
+ // }
+ // else
+ // {
+ // return 0;
+ // }
+}
+
+
+void GpsL2MPcpsAcquisition::init()
+{
+ acquisition_cc_->init();
+ set_local_code();
+}
+
+
+void GpsL2MPcpsAcquisition::set_local_code()
+{
+ // if (item_type_.compare("gr_complex") == 0)
+ // {
+ std::complex<float>* code = new std::complex<float>[code_length_];
+
+ gps_l1_ca_code_gen_complex_sampled(code, gnss_synchro_->PRN, fs_in_, 0);
+
+ for (unsigned int i = 0; i < sampled_ms_; i++)
+ {
+ memcpy(&(code_[i*code_length_]), code,
+ sizeof(gr_complex)*code_length_);
+ }
+
+ acquisition_cc_->set_local_code(code_);
+
+ delete[] code;
+ // }
+}
+
+
+void GpsL2MPcpsAcquisition::reset()
+{
+ // if (item_type_.compare("gr_complex") == 0)
+ // {
+ acquisition_cc_->set_active(true);
+ // }
+}
+
+void GpsL2MPcpsAcquisition::set_state(int state)
+{
+ // if (item_type_.compare("gr_complex") == 0)
+ // {
+ acquisition_cc_->set_state(state);
+ // }
+}
+
+
+
+float GpsL2MPcpsAcquisition::calculate_threshold(float pfa)
+{
+ //Calculate the threshold
+ unsigned int frequency_bins = 0;
+ for (int doppler = (int)(-doppler_max_); doppler <= (int)doppler_max_; doppler += doppler_step_)
+ {
+ frequency_bins++;
+ }
+ DLOG(INFO) << "Channel " << channel_<< " Pfa = " << pfa;
+ unsigned int ncells = vector_length_ * frequency_bins;
+ double exponent = 1 / static_cast<double>(ncells);
+ double val = pow(1.0 - pfa, exponent);
+ double lambda = double(vector_length_);
+ boost::math::exponential_distribution<double> mydist (lambda);
+ float threshold = (float)quantile(mydist,val);
+
+ return threshold;
+}
+
+
+void GpsL2MPcpsAcquisition::connect(gr::top_block_sptr top_block)
+{
+ if (item_type_.compare("gr_complex") == 0)
+ {
+ top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0);
+ }
+ else if (item_type_.compare("cshort") == 0)
+ {
+ top_block->connect(cshort_to_float_x2_, 0, float_to_complex_, 0);
+ top_block->connect(cshort_to_float_x2_, 1, float_to_complex_, 1);
+ top_block->connect(float_to_complex_, 0, stream_to_vector_, 0);
+ top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0);
+ }
+ else if (item_type_.compare("cbyte") == 0)
+ {
+ top_block->connect(cbyte_to_float_x2_, 0, float_to_complex_, 0);
+ top_block->connect(cbyte_to_float_x2_, 1, float_to_complex_, 1);
+ top_block->connect(float_to_complex_, 0, stream_to_vector_, 0);
+ top_block->connect(stream_to_vector_, 0, acquisition_cc_, 0);
+ }
+ else
+ {
+ LOG(WARNING) << item_type_ << " unknown acquisition item type";
+ }
+
+}
+
+
+void GpsL2MPcpsAcquisition::disconnect(gr::top_block_sptr top_block)
+{
+ if (item_type_.compare("gr_complex") == 0)
+ {
+ top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0);
+ }
+ else if (item_type_.compare("cshort") == 0)
+ {
+ // Since a short-based acq implementation is not available,
+ // we just convert cshorts to gr_complex
+ top_block->disconnect(cshort_to_float_x2_, 0, float_to_complex_, 0);
+ top_block->disconnect(cshort_to_float_x2_, 1, float_to_complex_, 1);
+ top_block->disconnect(float_to_complex_, 0, stream_to_vector_, 0);
+ top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0);
+ }
+ else if (item_type_.compare("cbyte") == 0)
+ {
+ // Since a byte-based acq implementation is not available,
+ // we just convert cshorts to gr_complex
+ top_block->disconnect(cbyte_to_float_x2_, 0, float_to_complex_, 0);
+ top_block->disconnect(cbyte_to_float_x2_, 1, float_to_complex_, 1);
+ top_block->disconnect(float_to_complex_, 0, stream_to_vector_, 0);
+ top_block->disconnect(stream_to_vector_, 0, acquisition_cc_, 0);
+ }
+ else
+ {
+ LOG(WARNING) << item_type_ << " unknown acquisition item type";
+ }
+}
+
+
+gr::basic_block_sptr GpsL2MPcpsAcquisition::get_left_block()
+{
+ if (item_type_.compare("gr_complex") == 0)
+ {
+ return stream_to_vector_;
+ }
+ else if (item_type_.compare("cshort") == 0)
+ {
+ return cshort_to_float_x2_;
+ }
+ else if (item_type_.compare("cbyte") == 0)
+ {
+ return cbyte_to_float_x2_;
+ }
+ else
+ {
+ LOG(WARNING) << item_type_ << " unknown acquisition item type";
+ return nullptr;
+ }
+}
+
+
+gr::basic_block_sptr GpsL2MPcpsAcquisition::get_right_block()
+{
+ return acquisition_cc_;
+}
+
diff --git a/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h
new file mode 100644
index 0000000..684ff66
--- /dev/null
+++ b/src/algorithms/acquisition/adapters/gps_l2_m_pcps_acquisition.h
@@ -0,0 +1,177 @@
+/*!
+ * \file gps_l2_m_pcps_acquisition.h
+ * \brief Adapts a PCPS acquisition block to an AcquisitionInterface for
+ * GPS L2 M signals
+ * \authors <ul>
+ * <li> Javier Arribas, 2015. jarribas(at)cttc.es
+ * </ul>
+ *
+ * -------------------------------------------------------------------------
+ *
+ * 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_PCPS_ACQUISITION_H_
+#define GNSS_SDR_GPS_L2_M_PCPS_ACQUISITION_H_
+
+#include <string>
+#include <gnuradio/msg_queue.h>
+#include <gnuradio/blocks/stream_to_vector.h>
+#include <gnuradio/blocks/float_to_complex.h>
+#include "gnss_synchro.h"
+#include "acquisition_interface.h"
+#include "pcps_acquisition_cc.h"
+#include "cshort_to_float_x2.h"
+#include "complex_byte_to_float_x2.h"
+
+
+
+class ConfigurationInterface;
+
+/*!
+ * \brief This class adapts a PCPS acquisition block to an AcquisitionInterface
+ * for GPS L2 M signals
+ */
+class GpsL2MPcpsAcquisition: public AcquisitionInterface
+{
+public:
+ GpsL2MPcpsAcquisition(ConfigurationInterface* configuration,
+ std::string role, unsigned int in_streams,
+ unsigned int out_streams, boost::shared_ptr<gr::msg_queue> queue);
+
+ virtual ~GpsL2MPcpsAcquisition();
+
+ std::string role()
+ {
+ return role_;
+ }
+
+ /*!
+ * \brief Returns "GPS_L2_M_PCPS_Acquisition"
+ */
+ std::string implementation()
+ {
+ return "GPS_L2_M_PCPS_Acquisition";
+ }
+ 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 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 acquisition channel unique ID
+ */
+ void set_channel(unsigned int channel);
+
+ /*!
+ * \brief Set statistics threshold of PCPS algorithm
+ */
+ void set_threshold(float threshold);
+
+ /*!
+ * \brief Set maximum Doppler off grid search
+ */
+ void set_doppler_max(unsigned int doppler_max);
+
+ /*!
+ * \brief Set Doppler steps for the grid search
+ */
+ void set_doppler_step(unsigned int doppler_step);
+
+ /*!
+ * \brief Set tracking channel internal queue
+ */
+ void set_channel_queue(concurrent_queue<int> *channel_internal_queue);
+
+ /*!
+ * \brief Initializes acquisition algorithm.
+ */
+ void init();
+
+ /*!
+ * \brief Sets local code for GPS L2/M PCPS acquisition algorithm.
+ */
+ void set_local_code();
+
+ /*!
+ * \brief Returns the maximum peak of grid search
+ */
+ signed int mag();
+
+ /*!
+ * \brief Restart acquisition algorithm
+ */
+ void reset();
+
+ /*!
+ * \brief If state = 1, it forces the block to start acquiring from the first sample
+ */
+ void set_state(int state);
+
+private:
+ ConfigurationInterface* configuration_;
+ pcps_acquisition_cc_sptr acquisition_cc_;
+ gr::blocks::stream_to_vector::sptr stream_to_vector_;
+ gr::blocks::float_to_complex::sptr float_to_complex_;
+ cshort_to_float_x2_sptr cshort_to_float_x2_;
+ complex_byte_to_float_x2_sptr cbyte_to_float_x2_;
+ size_t item_size_;
+ std::string item_type_;
+ unsigned int vector_length_;
+ unsigned int code_length_;
+ bool bit_transition_flag_;
+ unsigned int channel_;
+ float threshold_;
+ unsigned int doppler_max_;
+ unsigned int doppler_step_;
+ unsigned int shift_resolution_;
+ unsigned int sampled_ms_;
+ unsigned int max_dwells_;
+ long fs_in_;
+ long if_;
+ bool dump_;
+ std::string dump_filename_;
+ std::complex<float> * code_;
+ Gnss_Synchro * gnss_synchro_;
+ std::string role_;
+ unsigned int in_streams_;
+ unsigned int out_streams_;
+ boost::shared_ptr<gr::msg_queue> queue_;
+ concurrent_queue<int> *channel_internal_queue_;
+
+ float calculate_threshold(float pfa);
+};
+
+#endif /* GNSS_SDR_GPS_L2_M_PCPS_ACQUISITION_H_ */
diff --git a/src/algorithms/libs/gps_l2c_signal.cc b/src/algorithms/libs/gps_l2c_signal.cc
new file mode 100644
index 0000000..9d8e610
--- /dev/null
+++ b/src/algorithms/libs/gps_l2c_signal.cc
@@ -0,0 +1,107 @@
+/*!
+ * \file gps_l2c_signal.cc
+ * \brief This class implements signal generators for the GPS L2C signals
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * Detailed description of the file here if needed.
+ *
+ * -------------------------------------------------------------------------
+ *
+ * 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_L2C.h"
+#include <stdlib.h>
+#include <stdint.h>
+#include <cmath>
+
+
+int8_t gps_l2c_m_shift(int x)
+{
+ int8_t a;
+ return (int8_t)((x>>1)^(x&1)*0445112474);
+}
+
+void gps_l2c_m_code(int8_t * _dest, int _prn)
+{
+ int x;
+ x= GPS_L2C_M_INIT_REG[_prn];
+ for (int n=0; n<GPS_L2_M_CODE_LENGTH_CHIPS; n++)
+ {
+ x= gps_l2c_m_shift(x);
+ _dest[n]=(int8_t)(x&1);
+ }
+}
+
+/*
+ * Generates complex GPS L1 C/A code for the desired SV ID and sampled to specific sampling frequency
+ */
+void gps_l1_ca_code_gen_complex_sampled(std::complex<float>* _dest, unsigned int _prn, signed int _fs)
+{
+ int8_t _code[GPS_L2_M_CODE_LENGTH_CHIPS];
+
+
+ signed int _samplesPerCode, _codeValueIndex;
+ float _ts;
+ float _tc;
+ const signed int _codeFreqBasis = GPS_L2_M_CODE_RATE_HZ; //Hz
+ const signed int _codeLength = GPS_L2_M_CODE_LENGTH_CHIPS;
+
+ //--- Find number of samples per spreading code ----------------------------
+ _samplesPerCode = round(_fs / (_codeFreqBasis / _codeLength));
+
+ //--- Find time constants --------------------------------------------------
+ _ts = 1/(float)_fs; // Sampling period in sec
+ _tc = 1/(float)_codeFreqBasis; // C/A chip period in sec
+ //gps_l1_ca_code_gen_complex(_code,_prn); //generate C/A code 1 sample per chip
+
+ for (signed int i=0; i<_samplesPerCode; i++)
+ {
+ //=== Digitizing =======================================================
+
+ //--- Make index array to read C/A code values -------------------------
+ // The length of the index array depends on the sampling frequency -
+ // number of samples per millisecond (because one C/A code period is one
+ // millisecond).
+
+ _codeValueIndex = ceil((_ts * ((float)i + 1)) / _tc) - 1;
+
+ //--- Make the digitized version of the C/A code -----------------------
+ // The "upsampled" code is made by selecting values form the CA code
+ // chip array (caCode) for the time instances of each sample.
+ if (i == _samplesPerCode - 1)
+ {
+ //--- Correct the last index (due to number rounding issues) -----------
+ _dest[i] = std::complex(1.0-2.0*_code[_codeLength - 1],0);
+
+ }
+ else
+ {
+ _dest[i] = std::complex(1.0-2.0*_code[_codeValueIndex],0);; //repeat the chip -> upsample
+ }
+ }
+}
+
+
+
+
diff --git a/src/algorithms/libs/gps_l2c_signal.h b/src/algorithms/libs/gps_l2c_signal.h
new file mode 100644
index 0000000..9049805
--- /dev/null
+++ b/src/algorithms/libs/gps_l2c_signal.h
@@ -0,0 +1,49 @@
+/*!
+ * \file gps_l2c_signal.h
+ * \brief This class implements signal generators for the GPS L2C signals
+ * \author Javier Arribas, 2015. jarribas(at)cttc.es
+ *
+ * Detailed description of the file here if needed.
+ *
+ * -------------------------------------------------------------------------
+ *
+ * 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_GPS_L2C_SIGNAL_H_
+#define GNSS_GPS_L2C_SIGNAL_H_
+
+#include <complex>
+#include <iostream>
+#include "GPS_L2C.h"
+
+//!Generates complex GPS L2C M code for the desired SV ID and code shift, and sampled to specific sampling frequency
+void gps_l2_m_code_gen_complex(std::complex<float>* _dest, signed int _prn, unsigned int _chip_shift);
+
+//! Generates N complex GPS L2C M codes for the desired SV ID and code shift
+void gps_l2_m_code_gen_complex_sampled(std::complex<float>* _dest, unsigned int _prn, signed int _fs, unsigned int _chip_shift, unsigned int _ncodes);
+
+//! Generates complex GPS L2C M code for the desired SV ID and code shift
+void gps_l2_m_code_gen_complex_sampled(std::complex<float>* _dest, unsigned int _prn, signed int _fs, unsigned int _chip_shift);
+
+#endif /* GNSS_GPS_L2C_SIGNAL_H_ */
diff --git a/src/core/system_parameters/GPS_L2C.h b/src/core/system_parameters/GPS_L2C.h
new file mode 100644
index 0000000..e14cd37
--- /dev/null
+++ b/src/core/system_parameters/GPS_L2C.h
@@ -0,0 +1,85 @@
+/*!
+ * \file GPS_L2C.h
+ * \brief Defines system parameters for GPS L1 C/A signal and NAV data
+ * \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_L2C_H_
+#define GNSS_SDR_GPS_L2C_H_
+
+#include <complex>
+#include <vector>
+#include <utility> // std::pair
+#include <gnss_satellite.h>
+#include "MATH_CONSTANTS.h"
+
+
+// carrier and code frequencies
+const double GPS_L2_FREQ_HZ = 1.2276e9; //!< L2 [Hz]
+
+const double GPS_L2_M_CODE_RATE_HZ = 0.5115e6; //!< GPS L2 M code rate [chips/s]
+const int GPS_L2_M_CODE_LENGTH_CHIPS = 10230; //!< GPS L2 M code length [chips]
+const double GPS_L2_M_PERIOD = 0.02; //!< GPS L2 M code period [seconds]
+
+const double GPS_L2_L_CODE_RATE_HZ = 0.5115e6; //!< GPS L2 L code rate [chips/s]
+const int GPS_L2_L_CODE_LENGTH_CHIPS = 767250; //!< GPS L2 L code length [chips]
+const double GPS_L2_L_PERIOD = 1.5; //!< GPS L2 L code period [seconds]
+
+
+const int GPS_L2C_M_INIT_REG[115] =
+{0742417664, 0756014035,0002747144,0066265724, // 1:4
+0601403471, 0703232733, 0124510070,0617316361, // 5:8
+0047541621, 0733031046, 0713512145, 0024437606,
+0021264003, 0230655351, 0001314400, 0222021506,
+0540264026, 0205521705, 0064022144, 0120161274,
+0044023533, 0724744327, 0045743577, 0741201660,
+0700274134, 0010247261, 0713433445, 0737324162,
+0311627434, 0710452007, 0722462133, 0050172213,
+0500653703, 0755077436, 0136717361, 0756675453,
+0435506112, 0771353753, 0226107701, 0022025110,
+0402466344, 0752566114, 0702011164, 0041216771,
+0047457275, 0266333164, 0713167356, 0060546335,
+0355173035, 0617201036, 0157465571, 0767360553,
+0023127030, 0431343777, 0747317317, 0045706125,
+0002744276, 0060036467, 0217744147, 0603340174,//57:60
+0326616775, 0063240065, 0111460621, //61:63
+0604055104, 0157065232, 0013305707, 0603552017,//159:162
+0230461355, 0603653437, 0652346475, 0743107103,
+0401521277, 0167335110, 0014013575, 0362051132,
+0617753265, 0216363634, 0755561123, 0365304033,
+0625025543, 0054420334, 0415473671, 0662364360,
+0373446602, 0417564100, 0000526452, 0226631300,
+0113752074, 0706134401, 0041352546, 0664630154,
+0276524255, 0714720530, 0714051771, 0044526647,
+0207164322, 0262120161, 0204244652, 0202133131,
+0714351204, 0657127260, 0130567507, 0670517677,
+0607275514, 0045413633, 0212645405, 0613700455,
+0706202440, 0705056276, 0020373522, 0746013617,
+0132720621, 0434015513, 0566721727, 0140633660};
+
+#endif /* GNSS_SDR_GPS_L2C_H_ */
--
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