mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2025-01-15 11:45:47 +00:00
More usage of volk_gnsssdr::vector
This commit is contained in:
parent
8df7d82ba2
commit
b4e4c849b1
@ -38,7 +38,7 @@
|
||||
#include <gnuradio/fft/fft.h> // for fft_complex
|
||||
#include <gnuradio/gr_complex.h> // for gr_complex
|
||||
#include <volk/volk.h> // for volk_32fc_conjugate_32fc
|
||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <algorithm> // for copy_n
|
||||
#include <cmath> // for abs, pow, floor
|
||||
#include <complex> // for complex
|
||||
@ -99,8 +99,8 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga(
|
||||
// compute all the GALILEO E1 PRN Codes (this is done only once in the class constructor in order to avoid re-computing the PRN codes every time
|
||||
// a channel is assigned)
|
||||
auto fft_if = std::unique_ptr<gr::fft::fft_complex>(new gr::fft::fft_complex(nsamples_total, true)); // Direct FFT
|
||||
std::vector<std::complex<float>> code(nsamples_total); // buffer for the local code
|
||||
auto* fft_codes_padded = static_cast<gr_complex*>(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment()));
|
||||
volk_gnsssdr::vector<std::complex<float>> code(nsamples_total); // buffer for the local code
|
||||
volk_gnsssdr::vector<gr_complex> fft_codes_padded(nsamples_total);
|
||||
d_all_fft_codes_ = std::vector<uint32_t>(nsamples_total * GALILEO_E1_NUMBER_OF_CODES); // memory containing all the possible fft codes for PRN 0 to 32
|
||||
|
||||
float max; // temporary maxima search
|
||||
@ -140,7 +140,7 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga(
|
||||
|
||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||
fft_if->execute(); // Run the FFT of local code
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded.data(), fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
|
||||
// normalize the code
|
||||
max = 0; // initialize maximum value
|
||||
@ -182,9 +182,6 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga(
|
||||
doppler_step_ = 0;
|
||||
gnss_synchro_ = nullptr;
|
||||
|
||||
// temporary buffers that we can release
|
||||
volk_gnsssdr_free(fft_codes_padded);
|
||||
|
||||
if (in_streams_ > 1)
|
||||
{
|
||||
LOG(ERROR) << "This implementation only supports one input stream";
|
||||
|
@ -38,7 +38,7 @@
|
||||
#include <gnuradio/fft/fft.h> // for fft_complex
|
||||
#include <gnuradio/gr_complex.h> // for gr_complex
|
||||
#include <volk/volk.h> // for volk_32fc_conjugate_32fc
|
||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <algorithm> // for copy_n
|
||||
#include <cmath> // for abs, pow, floor
|
||||
#include <complex> // for complex
|
||||
@ -100,8 +100,8 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf
|
||||
// compute all the GALILEO E5 PRN Codes (this is done only once in the class constructor in order to avoid re-computing the PRN codes every time
|
||||
// a channel is assigned)
|
||||
auto fft_if = std::unique_ptr<gr::fft::fft_complex>(new gr::fft::fft_complex(nsamples_total, true)); // Direct FFT
|
||||
std::vector<std::complex<float>> code(nsamples_total); // buffer for the local code
|
||||
auto* fft_codes_padded = static_cast<gr_complex*>(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment()));
|
||||
volk_gnsssdr::vector<std::complex<float>> code(nsamples_total);
|
||||
volk_gnsssdr::vector<std::complex<float>> fft_codes_padded(nsamples_total);
|
||||
d_all_fft_codes_ = std::vector<uint32_t>(nsamples_total * GALILEO_E5A_NUMBER_OF_CODES); // memory containing all the possible fft codes for PRN 0 to 32
|
||||
|
||||
float max; // temporary maxima search
|
||||
@ -144,7 +144,7 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf
|
||||
|
||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||
fft_if->execute(); // Run the FFT of local code
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded.data(), fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
|
||||
max = 0; // initialize maximum value
|
||||
for (uint32_t i = 0; i < nsamples_total; i++) // search for maxima
|
||||
@ -185,9 +185,6 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(ConfigurationInterf
|
||||
doppler_step_ = 0;
|
||||
gnss_synchro_ = nullptr;
|
||||
|
||||
// temporary buffers that we can release
|
||||
volk_gnsssdr_free(fft_codes_padded);
|
||||
|
||||
if (in_streams_ > 1)
|
||||
{
|
||||
LOG(ERROR) << "This implementation only supports one input stream";
|
||||
|
@ -41,7 +41,7 @@
|
||||
#include <gnuradio/fft/fft.h>
|
||||
#include <gnuradio/gr_complex.h> // for gr_complex
|
||||
#include <volk/volk.h> // for volk_32fc_conjugate_32fc
|
||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <algorithm> // for copy_n
|
||||
#include <cmath> // for abs, pow, floor
|
||||
#include <complex> // for complex
|
||||
@ -93,8 +93,8 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga(
|
||||
// a channel is assigned)
|
||||
auto fft_if = std::unique_ptr<gr::fft::fft_complex>(new gr::fft::fft_complex(nsamples_total, true));
|
||||
// allocate memory to compute all the PRNs and compute all the possible codes
|
||||
std::vector<std::complex<float>> code(nsamples_total); // buffer for the local code
|
||||
auto* fft_codes_padded = static_cast<gr_complex*>(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment()));
|
||||
volk_gnsssdr::vector<std::complex<float>> code(nsamples_total);
|
||||
volk_gnsssdr::vector<std::complex<float>> fft_codes_padded(nsamples_total);
|
||||
d_all_fft_codes_ = std::vector<uint32_t>(nsamples_total * NUM_PRNs); // memory containing all the possible fft codes for PRN 0 to 32
|
||||
float max;
|
||||
int32_t tmp;
|
||||
@ -119,7 +119,7 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga(
|
||||
|
||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||
fft_if->execute(); // Run the FFT of local code
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded.data(), fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
|
||||
max = 0; // initialize maximum value
|
||||
for (uint32_t i = 0; i < nsamples_total; i++) // search for maxima
|
||||
@ -161,9 +161,6 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga(
|
||||
doppler_step_ = 0;
|
||||
gnss_synchro_ = nullptr;
|
||||
|
||||
// temporary buffers that we can release
|
||||
volk_gnsssdr_free(fft_codes_padded);
|
||||
|
||||
if (in_streams_ > 1)
|
||||
{
|
||||
LOG(ERROR) << "This implementation only supports one input stream";
|
||||
|
@ -41,7 +41,7 @@
|
||||
#include <gnuradio/fft/fft.h> // for fft_complex
|
||||
#include <gnuradio/gr_complex.h> // for gr_complex
|
||||
#include <volk/volk.h> // for volk_32fc_conjugate_32fc
|
||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <algorithm> // for copy_n
|
||||
#include <cmath> // for abs, pow, floor
|
||||
#include <complex> // for complex
|
||||
@ -94,8 +94,8 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga(
|
||||
// a channel is assigned)
|
||||
auto fft_if = std::unique_ptr<gr::fft::fft_complex>(new gr::fft::fft_complex(nsamples_total, true)); // Direct FFT
|
||||
// allocate memory to compute all the PRNs and compute all the possible codes
|
||||
std::vector<std::complex<float>> code(nsamples_total); // buffer for the local code
|
||||
auto* fft_codes_padded = static_cast<gr_complex*>(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment()));
|
||||
volk_gnsssdr::vector<std::complex<float>> code(nsamples_total);
|
||||
volk_gnsssdr::vector<std::complex<float>> fft_codes_padded(nsamples_total);
|
||||
d_all_fft_codes_ = std::vector<uint32_t>(nsamples_total * NUM_PRNs); // memory containing all the possible fft codes for PRN 0 to 32
|
||||
|
||||
float max; // temporary maxima search
|
||||
@ -114,7 +114,7 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga(
|
||||
}
|
||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||
fft_if->execute(); // Run the FFT of local code
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded.data(), fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
max = 0; // initialize maximum value
|
||||
for (unsigned int i = 0; i < nsamples_total; i++) // search for maxima
|
||||
{
|
||||
@ -152,9 +152,6 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga(
|
||||
|
||||
threshold_ = 0.0;
|
||||
|
||||
// temporary buffers that we can release
|
||||
volk_gnsssdr_free(fft_codes_padded);
|
||||
|
||||
if (in_streams_ > 1)
|
||||
{
|
||||
LOG(ERROR) << "This implementation only supports one input stream";
|
||||
|
@ -41,7 +41,7 @@
|
||||
#include <gnuradio/fft/fft.h> // for fft_complex
|
||||
#include <gnuradio/gr_complex.h> // for gr_complex
|
||||
#include <volk/volk.h> // for volk_32fc_conjugate_32fc
|
||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <algorithm> // for copy_n
|
||||
#include <cmath> // for abs, pow, floor
|
||||
#include <complex> // for complex
|
||||
@ -97,8 +97,8 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga(
|
||||
// compute all the GPS L5 PRN Codes (this is done only once upon the class constructor in order to avoid re-computing the PRN codes every time
|
||||
// a channel is assigned)
|
||||
auto fft_if = std::unique_ptr<gr::fft::fft_complex>(new gr::fft::fft_complex(nsamples_total, true)); // Direct FFT
|
||||
std::vector<std::complex<float>> code(nsamples_total);
|
||||
auto* fft_codes_padded = static_cast<gr_complex*>(volk_gnsssdr_malloc(nsamples_total * sizeof(gr_complex), volk_gnsssdr_get_alignment()));
|
||||
volk_gnsssdr::vector<std::complex<float>> code(nsamples_total);
|
||||
volk_gnsssdr::vector<std::complex<float>> fft_codes_padded(nsamples_total);
|
||||
d_all_fft_codes_ = std::vector<uint32_t>(nsamples_total * NUM_PRNs); // memory containing all the possible fft codes for PRN 0 to 32
|
||||
|
||||
float max; // temporary maxima search
|
||||
@ -123,7 +123,7 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga(
|
||||
}
|
||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||
fft_if->execute(); // Run the FFT of local code
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded, fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
volk_32fc_conjugate_32fc(fft_codes_padded.data(), fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||
|
||||
max = 0; // initialize maximum value
|
||||
for (uint32_t i = 0; i < nsamples_total; i++) // search for maxima
|
||||
@ -164,9 +164,6 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga(
|
||||
doppler_step_ = 0;
|
||||
gnss_synchro_ = nullptr;
|
||||
|
||||
// temporary buffers that we can release
|
||||
volk_gnsssdr_free(fft_codes_padded);
|
||||
|
||||
if (in_streams_ > 1)
|
||||
{
|
||||
LOG(ERROR) << "This implementation only supports one input stream";
|
||||
|
@ -42,7 +42,7 @@
|
||||
#include "galileo_e1_signal_processing.h"
|
||||
#include "gnss_sdr_flags.h"
|
||||
#include <glog/logging.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <array>
|
||||
|
||||
GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga(
|
||||
@ -193,19 +193,18 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga(
|
||||
//################# PRE-COMPUTE ALL THE CODES #################
|
||||
uint32_t code_samples_per_chip = 2;
|
||||
d_ca_codes = static_cast<int32_t*>(volk_gnsssdr_malloc(static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip * GALILEO_E1_NUMBER_OF_CODES * sizeof(int32_t), volk_gnsssdr_get_alignment()));
|
||||
float* ca_codes_f;
|
||||
float* data_codes_f = nullptr;
|
||||
volk_gnsssdr::vector<float> ca_codes_f(static_cast<uint32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip);
|
||||
volk_gnsssdr::vector<float> data_codes_f;
|
||||
d_data_codes = nullptr;
|
||||
|
||||
if (d_track_pilot)
|
||||
{
|
||||
d_data_codes = static_cast<int32_t*>(volk_gnsssdr_malloc((static_cast<uint32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS)) * code_samples_per_chip * GALILEO_E1_NUMBER_OF_CODES * sizeof(int32_t), volk_gnsssdr_get_alignment()));
|
||||
}
|
||||
ca_codes_f = static_cast<float*>(volk_gnsssdr_malloc(static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip * sizeof(float), volk_gnsssdr_get_alignment()));
|
||||
|
||||
if (d_track_pilot)
|
||||
{
|
||||
data_codes_f = static_cast<float*>(volk_gnsssdr_malloc((static_cast<uint32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS)) * code_samples_per_chip * sizeof(float), volk_gnsssdr_get_alignment()));
|
||||
data_codes_f.resize(static_cast<uint32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip, 0.0);
|
||||
}
|
||||
|
||||
for (uint32_t PRN = 1; PRN <= GALILEO_E1_NUMBER_OF_CODES; PRN++)
|
||||
@ -214,8 +213,8 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga(
|
||||
if (d_track_pilot)
|
||||
{
|
||||
std::array<char, 3> pilot_signal = {'1', 'C', '\0'};
|
||||
galileo_e1_code_gen_sinboc11_float(gsl::span<float>(ca_codes_f, static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip), pilot_signal, PRN);
|
||||
galileo_e1_code_gen_sinboc11_float(gsl::span<float>(data_codes_f, static_cast<uint32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip), data_signal, PRN);
|
||||
galileo_e1_code_gen_sinboc11_float(ca_codes_f, pilot_signal, PRN);
|
||||
galileo_e1_code_gen_sinboc11_float(data_codes_f, data_signal, PRN);
|
||||
|
||||
// The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA
|
||||
for (uint32_t s = 0; s < 2 * GALILEO_E1_B_CODE_LENGTH_CHIPS; s++)
|
||||
@ -238,7 +237,7 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga(
|
||||
}
|
||||
else
|
||||
{
|
||||
galileo_e1_code_gen_sinboc11_float(gsl::span<float>(ca_codes_f, static_cast<int32_t>(GALILEO_E1_B_CODE_LENGTH_CHIPS) * code_samples_per_chip), data_signal, PRN);
|
||||
galileo_e1_code_gen_sinboc11_float(ca_codes_f, data_signal, PRN);
|
||||
|
||||
// The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA
|
||||
for (uint32_t s = 0; s < 2 * GALILEO_E1_B_CODE_LENGTH_CHIPS; s++)
|
||||
@ -254,11 +253,6 @@ GalileoE1DllPllVemlTrackingFpga::GalileoE1DllPllVemlTrackingFpga(
|
||||
}
|
||||
}
|
||||
|
||||
volk_gnsssdr_free(ca_codes_f);
|
||||
if (d_track_pilot)
|
||||
{
|
||||
volk_gnsssdr_free(data_codes_f);
|
||||
}
|
||||
trk_param_fpga.ca_codes = d_ca_codes;
|
||||
trk_param_fpga.data_codes = d_data_codes;
|
||||
trk_param_fpga.code_length_chips = GALILEO_E1_B_CODE_LENGTH_CHIPS;
|
||||
|
@ -37,7 +37,7 @@
|
||||
#include "galileo_e5_signal_processing.h"
|
||||
#include "gnss_sdr_flags.h"
|
||||
#include <glog/logging.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <array>
|
||||
|
||||
GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga(
|
||||
@ -193,7 +193,7 @@ GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga(
|
||||
uint32_t code_samples_per_chip = 1;
|
||||
auto code_length_chips = static_cast<uint32_t>(GALILEO_E5A_CODE_LENGTH_CHIPS);
|
||||
|
||||
auto *aux_code = static_cast<gr_complex *>(volk_gnsssdr_malloc(sizeof(gr_complex) * code_length_chips * code_samples_per_chip, volk_gnsssdr_get_alignment()));
|
||||
volk_gnsssdr::vector<gr_complex> aux_code(code_length_chips * code_samples_per_chip, gr_complex(0.0, 0.0));
|
||||
|
||||
d_ca_codes = static_cast<int32_t *>(volk_gnsssdr_malloc(static_cast<int32_t>(code_length_chips) * code_samples_per_chip * GALILEO_E5A_NUMBER_OF_CODES * sizeof(int32_t), volk_gnsssdr_get_alignment()));
|
||||
|
||||
@ -205,7 +205,7 @@ GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga(
|
||||
for (uint32_t PRN = 1; PRN <= GALILEO_E5A_NUMBER_OF_CODES; PRN++)
|
||||
{
|
||||
std::array<char, 3> sig_a = {'5', 'X', '\0'};
|
||||
galileo_e5_a_code_gen_complex_primary(gsl::span<gr_complex>(aux_code, code_length_chips * code_samples_per_chip), PRN, sig_a);
|
||||
galileo_e5_a_code_gen_complex_primary(aux_code, PRN, sig_a);
|
||||
|
||||
if (trk_param_fpga.track_pilot)
|
||||
{
|
||||
@ -245,7 +245,6 @@ GalileoE5aDllPllTrackingFpga::GalileoE5aDllPllTrackingFpga(
|
||||
}
|
||||
}
|
||||
|
||||
volk_gnsssdr_free(aux_code);
|
||||
trk_param_fpga.ca_codes = d_ca_codes;
|
||||
trk_param_fpga.data_codes = d_data_codes;
|
||||
trk_param_fpga.code_length_chips = code_length_chips;
|
||||
|
@ -44,7 +44,7 @@
|
||||
#include "gnss_synchro.h"
|
||||
#include "gps_l2c_signal.h"
|
||||
#include <glog/logging.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <array>
|
||||
#include <cmath> // for round
|
||||
#include <cstring> // for memcpy
|
||||
@ -123,22 +123,18 @@ GpsL2MDllPllTrackingFpga::GpsL2MDllPllTrackingFpga(
|
||||
// GNSS-SDR instantiates the tracking channels i L1, L2, L5, E1, E5a
|
||||
trk_param_fpga.num_prev_assigned_ch = configuration->property("Channels_1C.count", 0);
|
||||
|
||||
|
||||
auto* ca_codes_f = static_cast<float*>(volk_gnsssdr_malloc(static_cast<unsigned int>(GPS_L2_M_CODE_LENGTH_CHIPS) * sizeof(float), volk_gnsssdr_get_alignment()));
|
||||
|
||||
volk_gnsssdr::vector<float> ca_codes_f(static_cast<unsigned int>(GPS_L2_M_CODE_LENGTH_CHIPS), 0.0);
|
||||
// ################# PRE-COMPUTE ALL THE CODES #################
|
||||
d_ca_codes = static_cast<int*>(volk_gnsssdr_malloc(static_cast<int>(GPS_L2_M_CODE_LENGTH_CHIPS * NUM_PRNs) * sizeof(int), volk_gnsssdr_get_alignment()));
|
||||
for (uint32_t PRN = 1; PRN <= NUM_PRNs; PRN++)
|
||||
{
|
||||
gps_l2c_m_code_gen_float(gsl::span<float>(ca_codes_f, static_cast<unsigned int>(GPS_L2_M_CODE_LENGTH_CHIPS)), PRN);
|
||||
gps_l2c_m_code_gen_float(ca_codes_f, PRN);
|
||||
for (unsigned int s = 0; s < 2 * static_cast<unsigned int>(GPS_L2_M_CODE_LENGTH_CHIPS); s++)
|
||||
{
|
||||
d_ca_codes[static_cast<int>(GPS_L2_M_CODE_LENGTH_CHIPS) * (PRN - 1) + s] = static_cast<int>(ca_codes_f[s]);
|
||||
}
|
||||
}
|
||||
|
||||
volk_gnsssdr_free(ca_codes_f);
|
||||
|
||||
trk_param_fpga.ca_codes = d_ca_codes;
|
||||
trk_param_fpga.code_length_chips = GPS_L2_M_CODE_LENGTH_CHIPS;
|
||||
trk_param_fpga.code_samples_per_chip = 1; // 1 sample per chip
|
||||
|
@ -44,7 +44,7 @@
|
||||
#include "gnss_sdr_flags.h"
|
||||
#include "gps_l5_signal.h"
|
||||
#include <glog/logging.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <array>
|
||||
|
||||
GpsL5DllPllTrackingFpga::GpsL5DllPllTrackingFpga(
|
||||
@ -193,18 +193,12 @@ GpsL5DllPllTrackingFpga::GpsL5DllPllTrackingFpga(
|
||||
uint32_t code_samples_per_chip = 1;
|
||||
auto code_length_chips = static_cast<uint32_t>(GPS_L5I_CODE_LENGTH_CHIPS);
|
||||
|
||||
float *tracking_code;
|
||||
float *data_code = nullptr;
|
||||
|
||||
tracking_code = static_cast<float *>(volk_gnsssdr_malloc(code_length_chips * sizeof(float), volk_gnsssdr_get_alignment()));
|
||||
volk_gnsssdr::vector<float> data_code;
|
||||
volk_gnsssdr::vector<float> tracking_code(code_length_chips, 0.0);
|
||||
|
||||
if (track_pilot)
|
||||
{
|
||||
data_code = static_cast<float *>(volk_gnsssdr_malloc(code_length_chips * sizeof(float), volk_gnsssdr_get_alignment()));
|
||||
for (uint32_t i = 0; i < code_length_chips; i++)
|
||||
{
|
||||
data_code[i] = 0.0;
|
||||
}
|
||||
data_code.resize(code_length_chips, 0.0);
|
||||
}
|
||||
|
||||
d_ca_codes = static_cast<int32_t *>(volk_gnsssdr_malloc(static_cast<int32_t>(code_length_chips * NUM_PRNs) * sizeof(int32_t), volk_gnsssdr_get_alignment()));
|
||||
@ -219,8 +213,8 @@ GpsL5DllPllTrackingFpga::GpsL5DllPllTrackingFpga(
|
||||
{
|
||||
if (track_pilot)
|
||||
{
|
||||
gps_l5q_code_gen_float(gsl::span<float>(tracking_code, code_length_chips), PRN);
|
||||
gps_l5i_code_gen_float(gsl::span<float>(data_code, code_length_chips), PRN);
|
||||
gps_l5q_code_gen_float(tracking_code, PRN);
|
||||
gps_l5i_code_gen_float(data_code, PRN);
|
||||
|
||||
// The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA
|
||||
for (uint32_t s = 0; s < code_length_chips; s++)
|
||||
@ -244,7 +238,7 @@ GpsL5DllPllTrackingFpga::GpsL5DllPllTrackingFpga(
|
||||
}
|
||||
else
|
||||
{
|
||||
gps_l5i_code_gen_float(gsl::span<float>(tracking_code, code_length_chips), PRN);
|
||||
gps_l5i_code_gen_float(tracking_code, PRN);
|
||||
|
||||
// The code is generated as a series of 1s and -1s. In order to store the values using only one bit, a -1 is stored as a 0 in the FPGA
|
||||
for (uint32_t s = 0; s < code_length_chips; s++)
|
||||
@ -260,11 +254,6 @@ GpsL5DllPllTrackingFpga::GpsL5DllPllTrackingFpga(
|
||||
}
|
||||
}
|
||||
|
||||
volk_gnsssdr_free(tracking_code);
|
||||
if (track_pilot)
|
||||
{
|
||||
volk_gnsssdr_free(data_code);
|
||||
}
|
||||
trk_param_fpga.ca_codes = d_ca_codes;
|
||||
trk_param_fpga.data_codes = d_data_codes;
|
||||
trk_param_fpga.code_length_chips = code_length_chips;
|
||||
|
@ -61,9 +61,14 @@ const float PHASE_CARR_MAX_DIV_PI = 683565275.5764316; // 2^(31)/pi
|
||||
const float TWO_PI = 6.283185307179586;
|
||||
|
||||
Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators,
|
||||
const std::string &device_name, uint32_t dev_file_num, uint32_t num_prev_assigned_ch, int32_t *ca_codes, int32_t *data_codes, uint32_t code_length_chips, bool track_pilot,
|
||||
const std::string &device_name,
|
||||
uint32_t dev_file_num,
|
||||
uint32_t num_prev_assigned_ch,
|
||||
int32_t *ca_codes,
|
||||
int32_t *data_codes,
|
||||
uint32_t code_length_chips,
|
||||
bool track_pilot,
|
||||
uint32_t code_samples_per_chip)
|
||||
|
||||
{
|
||||
d_n_correlators = n_correlators;
|
||||
d_device_name = device_name;
|
||||
@ -77,17 +82,13 @@ Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators,
|
||||
// instantiate variable length vectors
|
||||
if (d_track_pilot)
|
||||
{
|
||||
d_initial_index = static_cast<uint32_t *>(volk_gnsssdr_malloc(
|
||||
(n_correlators + 1) * sizeof(uint32_t), volk_gnsssdr_get_alignment()));
|
||||
d_initial_interp_counter = static_cast<uint32_t *>(volk_gnsssdr_malloc(
|
||||
(n_correlators + 1) * sizeof(uint32_t), volk_gnsssdr_get_alignment()));
|
||||
d_initial_index.reserve(n_correlators + 1);
|
||||
d_initial_interp_counter.reserve(n_correlators + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
d_initial_index = static_cast<uint32_t *>(volk_gnsssdr_malloc(
|
||||
n_correlators * sizeof(uint32_t), volk_gnsssdr_get_alignment()));
|
||||
d_initial_interp_counter = static_cast<uint32_t *>(volk_gnsssdr_malloc(
|
||||
n_correlators * sizeof(uint32_t), volk_gnsssdr_get_alignment()));
|
||||
d_initial_index.reserve(n_correlators);
|
||||
d_initial_interp_counter.reserve(n_correlators);
|
||||
}
|
||||
d_shifts_chips = nullptr;
|
||||
d_prompt_data_shift = nullptr;
|
||||
@ -109,8 +110,6 @@ Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators,
|
||||
d_data_codes = data_codes;
|
||||
d_code_samples_per_chip = code_samples_per_chip;
|
||||
d_code_length_samples = d_code_length_chips * d_code_samples_per_chip;
|
||||
|
||||
|
||||
d_secondary_code_enabled = false;
|
||||
|
||||
DLOG(INFO) << "TRACKING FPGA CLASS CREATED";
|
||||
@ -120,14 +119,6 @@ Fpga_Multicorrelator_8sc::Fpga_Multicorrelator_8sc(int32_t n_correlators,
|
||||
Fpga_Multicorrelator_8sc::~Fpga_Multicorrelator_8sc()
|
||||
{
|
||||
close_device();
|
||||
if (d_initial_index != nullptr)
|
||||
{
|
||||
volk_gnsssdr_free(d_initial_index);
|
||||
}
|
||||
if (d_initial_interp_counter != nullptr)
|
||||
{
|
||||
volk_gnsssdr_free(d_initial_interp_counter);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -219,20 +210,6 @@ bool Fpga_Multicorrelator_8sc::free()
|
||||
{
|
||||
// unlock the channel
|
||||
Fpga_Multicorrelator_8sc::unlock_channel();
|
||||
|
||||
// free the FPGA dynamically created variables
|
||||
if (d_initial_index != nullptr)
|
||||
{
|
||||
volk_gnsssdr_free(d_initial_index);
|
||||
d_initial_index = nullptr;
|
||||
}
|
||||
|
||||
if (d_initial_interp_counter != nullptr)
|
||||
{
|
||||
volk_gnsssdr_free(d_initial_interp_counter);
|
||||
d_initial_interp_counter = nullptr;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -305,7 +282,6 @@ uint32_t Fpga_Multicorrelator_8sc::fpga_acquisition_test_register(
|
||||
void Fpga_Multicorrelator_8sc::fpga_configure_tracking_gps_local_code(int32_t PRN)
|
||||
{
|
||||
uint32_t k;
|
||||
|
||||
d_map_base[prog_mems_addr] = local_code_fpga_clear_address_counter;
|
||||
for (k = 0; k < d_code_length_samples; k++)
|
||||
{
|
||||
@ -339,7 +315,6 @@ void Fpga_Multicorrelator_8sc::fpga_compute_code_shift_parameters()
|
||||
}
|
||||
d_initial_index[i] = dec_part;
|
||||
|
||||
|
||||
frac_part = fmod(d_shifts_chips[i] - d_rem_code_phase_chips, 1.0);
|
||||
if (frac_part < 0)
|
||||
{
|
||||
@ -464,7 +439,6 @@ void Fpga_Multicorrelator_8sc::unlock_channel()
|
||||
// unlock the channel to let the next samples go through
|
||||
d_map_base[drop_samples_reg_addr] = drop_samples; // unlock the channel and disable secondary codes
|
||||
d_map_base[stop_tracking_reg_addr] = 1; // set the tracking module back to idle
|
||||
|
||||
d_secondary_code_enabled = false;
|
||||
}
|
||||
|
||||
@ -498,12 +472,14 @@ void Fpga_Multicorrelator_8sc::set_secondary_code_lengths(uint32_t secondary_cod
|
||||
d_map_base[secondary_code_lengths_reg_addr] = secondary_code_length_1_minus_1 * 256 + secondary_code_length_0_minus_1;
|
||||
}
|
||||
|
||||
|
||||
void Fpga_Multicorrelator_8sc::update_prn_code_length(uint32_t first_prn_length, uint32_t next_prn_length)
|
||||
{
|
||||
d_map_base[first_prn_length_minus_1_reg_addr] = first_prn_length - 1;
|
||||
d_map_base[next_prn_length_minus_1_reg_addr] = next_prn_length - 1;
|
||||
}
|
||||
|
||||
|
||||
void Fpga_Multicorrelator_8sc::initialize_secondary_code(uint32_t secondary_code, std::string *secondary_code_string)
|
||||
{
|
||||
uint32_t secondary_code_length;
|
||||
@ -566,12 +542,14 @@ void Fpga_Multicorrelator_8sc::write_secondary_code(uint32_t secondary_code_leng
|
||||
d_map_base[reg_addr] = write_val;
|
||||
}
|
||||
|
||||
|
||||
void Fpga_Multicorrelator_8sc::enable_secondary_codes()
|
||||
{
|
||||
d_map_base[drop_samples_reg_addr] = init_secondary_code_addresses | enable_secondary_code; // enable secondary codes and clear secondary code indices
|
||||
d_secondary_code_enabled = true;
|
||||
}
|
||||
|
||||
|
||||
void Fpga_Multicorrelator_8sc::disable_secondary_codes()
|
||||
{
|
||||
// this function is to be called before starting the tracking process in order to disable the secondary codes by default
|
||||
|
@ -38,6 +38,7 @@
|
||||
#define GNSS_SDR_FPGA_MULTICORRELATOR_H_
|
||||
|
||||
#include <gnuradio/block.h>
|
||||
#include <volk_gnsssdr/volk_gnsssdr_alloc.h>
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
@ -86,9 +87,11 @@ public:
|
||||
* \brief Perform a multicorrelation
|
||||
*/
|
||||
void Carrier_wipeoff_multicorrelator_resampler(
|
||||
float rem_carrier_phase_in_rad, float phase_step_rad,
|
||||
float rem_carrier_phase_in_rad,
|
||||
float phase_step_rad,
|
||||
float carrier_phase_rate_step_rad,
|
||||
float rem_code_phase_chips, float code_phase_step_chips,
|
||||
float rem_code_phase_chips,
|
||||
float code_phase_step_chips,
|
||||
float code_phase_rate_step_chips,
|
||||
int32_t signal_length_samples);
|
||||
|
||||
@ -226,8 +229,8 @@ private:
|
||||
bool d_track_pilot;
|
||||
|
||||
// configuration data computed in the format that the FPGA expects
|
||||
uint32_t *d_initial_index;
|
||||
uint32_t *d_initial_interp_counter;
|
||||
volk_gnsssdr::vector<uint32_t> d_initial_index;
|
||||
volk_gnsssdr::vector<uint32_t> d_initial_interp_counter;
|
||||
uint32_t d_code_phase_step_chips_num;
|
||||
uint32_t d_code_phase_rate_step_chips_num;
|
||||
int32_t d_rem_carr_phase_rad_int;
|
||||
|
Loading…
Reference in New Issue
Block a user