mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-11-14 13:54:57 +00:00
Merge branch 'mmajoral-optional_zero_padding' into next
This commit is contained in:
commit
ff11347a0d
@ -81,7 +81,6 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga(
|
|||||||
int32_t tmp2;
|
int32_t tmp2;
|
||||||
int32_t local_code;
|
int32_t local_code;
|
||||||
int32_t fft_data;
|
int32_t fft_data;
|
||||||
|
|
||||||
for (uint32_t PRN = 1; PRN <= GALILEO_E1_NUMBER_OF_CODES; PRN++)
|
for (uint32_t PRN = 1; PRN <= GALILEO_E1_NUMBER_OF_CODES; PRN++)
|
||||||
{
|
{
|
||||||
bool cboc = false; // cboc is set to 0 when using the FPGA
|
bool cboc = false; // cboc is set to 0 when using the FPGA
|
||||||
@ -100,16 +99,14 @@ GalileoE1PcpsAmbiguousAcquisitionFpga::GalileoE1PcpsAmbiguousAcquisitionFpga(
|
|||||||
cboc, PRN, fs_in_, 0, false);
|
cboc, PRN, fs_in_, 0, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t s = code_length; s < 2 * code_length; s++)
|
if (acq_parameters_.enable_zero_padding)
|
||||||
{
|
{
|
||||||
code[s] = code[s - code_length];
|
// Duplicate the code sequence
|
||||||
|
std::copy(code.begin(), code.begin() + code_length, code.begin() + code_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fill in zero padding
|
// Fill in zero padding for the rest
|
||||||
for (uint32_t s = 2 * code_length; s < nsamples_total; s++)
|
std::fill(code.begin() + (acq_parameters_.enable_zero_padding ? 2 * code_length : code_length), code.end(), std::complex<float>(0.0, 0.0));
|
||||||
{
|
|
||||||
code[s] = std::complex<float>(0.0, 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||||
fft_if->execute(); // Run the FFT of local code
|
fft_if->execute(); // Run the FFT of local code
|
||||||
|
@ -107,16 +107,14 @@ GalileoE5aPcpsAcquisitionFpga::GalileoE5aPcpsAcquisitionFpga(
|
|||||||
|
|
||||||
galileo_e5_a_code_gen_complex_sampled(code, PRN, signal_, fs_in_, 0);
|
galileo_e5_a_code_gen_complex_sampled(code, PRN, signal_, fs_in_, 0);
|
||||||
|
|
||||||
for (uint32_t s = code_length; s < 2 * code_length; s++)
|
if (acq_parameters_.enable_zero_padding)
|
||||||
{
|
{
|
||||||
code[s] = code[s - code_length];
|
// Duplicate the code sequence
|
||||||
|
std::copy(code.begin(), code.begin() + code_length, code.begin() + code_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fill in zero padding
|
// Fill in zero padding for the rest
|
||||||
for (uint32_t s = 2 * code_length; s < nsamples_total; s++)
|
std::fill(code.begin() + (acq_parameters_.enable_zero_padding ? 2 * code_length : code_length), code.end(), std::complex<float>(0.0, 0.0));
|
||||||
{
|
|
||||||
code[s] = std::complex<float>(0.0, 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||||
fft_if->execute(); // Run the FFT of local code
|
fft_if->execute(); // Run the FFT of local code
|
||||||
|
@ -106,16 +106,14 @@ GalileoE5bPcpsAcquisitionFpga::GalileoE5bPcpsAcquisitionFpga(const Configuration
|
|||||||
|
|
||||||
galileo_e5_b_code_gen_complex_sampled(code, PRN, signal_, fs_in_, 0);
|
galileo_e5_b_code_gen_complex_sampled(code, PRN, signal_, fs_in_, 0);
|
||||||
|
|
||||||
for (uint32_t s = code_length; s < 2 * code_length; s++)
|
if (acq_parameters_.enable_zero_padding)
|
||||||
{
|
{
|
||||||
code[s] = code[s - code_length];
|
// Duplicate the code sequence
|
||||||
|
std::copy(code.begin(), code.begin() + code_length, code.begin() + code_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fill in zero padding
|
// Fill in zero padding for the rest
|
||||||
for (uint32_t s = 2 * code_length; s < nsamples_total; s++)
|
std::fill(code.begin() + (acq_parameters_.enable_zero_padding ? 2 * code_length : code_length), code.end(), std::complex<float>(0.0, 0.0));
|
||||||
{
|
|
||||||
code[s] = std::complex<float>(0.0, 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||||
fft_if->execute(); // Run the FFT of local code
|
fft_if->execute(); // Run the FFT of local code
|
||||||
|
@ -87,16 +87,14 @@ GpsL1CaPcpsAcquisitionFpga::GpsL1CaPcpsAcquisitionFpga(
|
|||||||
{
|
{
|
||||||
gps_l1_ca_code_gen_complex_sampled(code, PRN, fs_in_, 0); // generate PRN code
|
gps_l1_ca_code_gen_complex_sampled(code, PRN, fs_in_, 0); // generate PRN code
|
||||||
|
|
||||||
for (uint32_t s = code_length; s < 2 * code_length; s++)
|
if (acq_parameters_.enable_zero_padding)
|
||||||
{
|
{
|
||||||
code[s] = code[s - code_length];
|
// Duplicate the code sequence
|
||||||
|
std::copy(code.begin(), code.begin() + code_length, code.begin() + code_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fill in zero padding
|
// Fill in zero padding for the rest
|
||||||
for (uint32_t s = 2 * code_length; s < nsamples_total; s++)
|
std::fill(code.begin() + (acq_parameters_.enable_zero_padding ? 2 * code_length : code_length), code.end(), std::complex<float>(0.0, 0.0));
|
||||||
{
|
|
||||||
code[s] = std::complex<float>(0.0, 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||||
fft_if->execute(); // Run the FFT of local code
|
fft_if->execute(); // Run the FFT of local code
|
||||||
|
@ -87,11 +87,16 @@ GpsL2MPcpsAcquisitionFpga::GpsL2MPcpsAcquisitionFpga(
|
|||||||
for (unsigned int PRN = 1; PRN <= NUM_PRNs; PRN++)
|
for (unsigned int PRN = 1; PRN <= NUM_PRNs; PRN++)
|
||||||
{
|
{
|
||||||
gps_l2c_m_code_gen_complex_sampled(code, PRN, fs_in_);
|
gps_l2c_m_code_gen_complex_sampled(code, PRN, fs_in_);
|
||||||
// fill in zero padding
|
|
||||||
for (unsigned int s = code_length; s < nsamples_total; s++)
|
if (acq_parameters_.enable_zero_padding)
|
||||||
{
|
{
|
||||||
code[s] = std::complex<float>(0.0, 0.0);
|
// Duplicate the code sequence
|
||||||
|
std::copy(code.begin(), code.begin() + code_length, code.begin() + code_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill in zero padding for the rest
|
||||||
|
std::fill(code.begin() + (acq_parameters_.enable_zero_padding ? 2 * code_length : code_length), code.end(), std::complex<float>(0.0, 0.0));
|
||||||
|
|
||||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||||
fft_if->execute(); // Run the FFT of local code
|
fft_if->execute(); // Run the FFT of local code
|
||||||
volk_32fc_conjugate_32fc(fft_codes_padded.data(), fft_if->get_outbuf(), nsamples_total); // conjugate values
|
volk_32fc_conjugate_32fc(fft_codes_padded.data(), fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||||
|
@ -88,16 +88,15 @@ GpsL5iPcpsAcquisitionFpga::GpsL5iPcpsAcquisitionFpga(
|
|||||||
{
|
{
|
||||||
gps_l5i_code_gen_complex_sampled(code, PRN, fs_in_);
|
gps_l5i_code_gen_complex_sampled(code, PRN, fs_in_);
|
||||||
|
|
||||||
for (uint32_t s = code_length; s < 2 * code_length; s++)
|
if (acq_parameters_.enable_zero_padding)
|
||||||
{
|
{
|
||||||
code[s] = code[s - code_length];
|
// Duplicate the code sequence
|
||||||
|
std::copy(code.begin(), code.begin() + code_length, code.begin() + code_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t s = 2 * code_length; s < nsamples_total; s++)
|
// Fill in zero padding for the rest
|
||||||
{
|
std::fill(code.begin() + (acq_parameters_.enable_zero_padding ? 2 * code_length : code_length), code.end(), std::complex<float>(0.0, 0.0));
|
||||||
// fill in zero padding
|
|
||||||
code[s] = std::complex<float>(0.0, 0.0);
|
|
||||||
}
|
|
||||||
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
std::copy_n(code.data(), nsamples_total, fft_if->get_inbuf()); // copy to FFT buffer
|
||||||
fft_if->execute(); // Run the FFT of local code
|
fft_if->execute(); // Run the FFT of local code
|
||||||
volk_32fc_conjugate_32fc(fft_codes_padded.data(), fft_if->get_outbuf(), nsamples_total); // conjugate values
|
volk_32fc_conjugate_32fc(fft_codes_padded.data(), fft_if->get_outbuf(), nsamples_total); // conjugate values
|
||||||
|
@ -46,9 +46,11 @@ void Acq_Conf_Fpga::SetFromConfiguration(const ConfigurationInterface *configura
|
|||||||
// code length in samples
|
// code length in samples
|
||||||
code_length = static_cast<uint32_t>(std::round(static_cast<double>(fs_in) / (chip_rate / code_length_chips)));
|
code_length = static_cast<uint32_t>(std::round(static_cast<double>(fs_in) / (chip_rate / code_length_chips)));
|
||||||
|
|
||||||
|
enable_zero_padding = configuration->property(role + ".enable_zero_padding", true);
|
||||||
|
|
||||||
// The FPGA can only use FFT lengths that are a power of two.
|
// The FPGA can only use FFT lengths that are a power of two.
|
||||||
float nbits = ceilf(log2f(static_cast<float>(code_length) * 2.0F));
|
float factor = enable_zero_padding ? 2.0F : 1.0F;
|
||||||
samples_per_code = pow(2, nbits);
|
samples_per_code = pow(2, ceilf(log2f(static_cast<float>(code_length) * factor)));
|
||||||
|
|
||||||
// repeat satellite
|
// repeat satellite
|
||||||
repeat_satellite = configuration->property(role + ".repeat_satellite", false);
|
repeat_satellite = configuration->property(role + ".repeat_satellite", false);
|
||||||
|
@ -57,6 +57,7 @@ public:
|
|||||||
uint32_t samples_per_code{1U};
|
uint32_t samples_per_code{1U};
|
||||||
uint32_t code_length{16000U};
|
uint32_t code_length{16000U};
|
||||||
bool make_2_steps{false};
|
bool make_2_steps{false};
|
||||||
|
bool enable_zero_padding{true};
|
||||||
bool repeat_satellite{false};
|
bool repeat_satellite{false};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
Reference in New Issue
Block a user