[hamradio-commits] [gnss-sdr] 132/236: Integrating the new volk kernel in the multiple correlator (32 bits)
Carles Fernandez
carles_fernandez-guest at moszumanska.debian.org
Tue Apr 26 16:02:44 UTC 2016
This is an automated email from the git hooks/post-receive script.
carles_fernandez-guest pushed a commit to branch next
in repository gnss-sdr.
commit 1b9516fa8b70acc4b3ec978c1d0cdba63e62bb53
Author: Carles Fernandez <carles.fernandez at gmail.com>
Date: Mon Mar 28 16:35:55 2016 +0200
Integrating the new volk kernel in the multiple correlator (32 bits)
and some cleaning
---
.../tracking/libs/cpu_multicorrelator.cc | 80 ++++++++--------------
src/algorithms/tracking/libs/cpu_multicorrelator.h | 6 +-
.../tracking/libs/cpu_multicorrelator_16sc.cc | 62 ++++++++---------
.../tracking/libs/cpu_multicorrelator_16sc.h | 7 +-
4 files changed, 64 insertions(+), 91 deletions(-)
diff --git a/src/algorithms/tracking/libs/cpu_multicorrelator.cc b/src/algorithms/tracking/libs/cpu_multicorrelator.cc
index 0deea37..933d06e 100644
--- a/src/algorithms/tracking/libs/cpu_multicorrelator.cc
+++ b/src/algorithms/tracking/libs/cpu_multicorrelator.cc
@@ -35,8 +35,29 @@
#include "cpu_multicorrelator.h"
#include <cmath>
#include <iostream>
-#include <gnuradio/fxpt.h> // fixed point sine and cosine
#include <volk/volk.h>
+#include <volk_gnsssdr/volk_gnsssdr.h>
+
+
+cpu_multicorrelator::cpu_multicorrelator()
+{
+ d_sig_in = NULL;
+ d_local_code_in = NULL;
+ d_shifts_chips = NULL;
+ d_corr_out = NULL;
+ d_local_codes_resampled = NULL;
+ d_code_length_chips = 0;
+ d_n_correlators = 0;
+}
+
+
+cpu_multicorrelator::~cpu_multicorrelator()
+{
+ if(d_local_codes_resampled != NULL)
+ {
+ cpu_multicorrelator::free();
+ }
+}
bool cpu_multicorrelator::init(
@@ -47,13 +68,7 @@ bool cpu_multicorrelator::init(
// ALLOCATE MEMORY FOR INTERNAL vectors
size_t size = max_signal_length_samples * sizeof(std::complex<float>);
- // NCO signal
- d_nco_in = static_cast<std::complex<float>*>(volk_malloc(size, volk_get_alignment()));
-
- // Doppler-free signal
- d_sig_doppler_wiped = static_cast<std::complex<float>*>(volk_malloc(size, volk_get_alignment()));
-
- d_local_codes_resampled = new std::complex<float>*[n_correlators];
+ d_local_codes_resampled = static_cast<std::complex<float>**>(volk_malloc(n_correlators * sizeof(std::complex<float>), volk_get_alignment()));
for (int n = 0; n < n_correlators; n++)
{
d_local_codes_resampled[n] = static_cast<std::complex<float>*>(volk_malloc(size, volk_get_alignment()));
@@ -86,8 +101,7 @@ bool cpu_multicorrelator::set_input_output_vectors(std::complex<float>* corr_out
}
-
-void cpu_multicorrelator::update_local_code(int correlator_length_samples,float rem_code_phase_chips, float code_phase_step_chips)
+void cpu_multicorrelator::update_local_code(int correlator_length_samples, float rem_code_phase_chips, float code_phase_step_chips)
{
float local_code_chip_index;
for (int current_correlator_tap = 0; current_correlator_tap < d_n_correlators; current_correlator_tap++)
@@ -95,7 +109,7 @@ void cpu_multicorrelator::update_local_code(int correlator_length_samples,float
for (int n = 0; n < correlator_length_samples; n++)
{
// resample code for current tap
- local_code_chip_index = std::fmod(code_phase_step_chips*static_cast<float>(n)+ d_shifts_chips[current_correlator_tap] - rem_code_phase_chips, d_code_length_chips);
+ local_code_chip_index = std::fmod(code_phase_step_chips * static_cast<float>(n) + d_shifts_chips[current_correlator_tap] - rem_code_phase_chips, d_code_length_chips);
//Take into account that in multitap correlators, the shifts can be negative!
if (local_code_chip_index < 0.0) local_code_chip_index += d_code_length_chips;
d_local_codes_resampled[current_correlator_tap][n] = d_local_code_in[static_cast<int>(round(local_code_chip_index))];
@@ -104,20 +118,6 @@ void cpu_multicorrelator::update_local_code(int correlator_length_samples,float
}
-void cpu_multicorrelator::update_local_carrier(int correlator_length_samples, float rem_carr_phase_rad, float phase_step_rad)
-{
- float sin_f, cos_f;
- int phase_step_rad_i = gr::fxpt::float_to_fixed(phase_step_rad);
- int phase_rad_i = gr::fxpt::float_to_fixed(rem_carr_phase_rad);
-
- for(int i = 0; i < correlator_length_samples; i++)
- {
- gr::fxpt::sincos(phase_rad_i, &sin_f, &cos_f);
- d_nco_in[i] = std::complex<float>(cos_f, -sin_f);
- phase_rad_i += phase_step_rad_i;
- }
-}
-
bool cpu_multicorrelator::Carrier_wipeoff_multicorrelator_resampler(
float rem_carrier_phase_in_rad,
float phase_step_rad,
@@ -125,44 +125,24 @@ bool cpu_multicorrelator::Carrier_wipeoff_multicorrelator_resampler(
float code_phase_step_chips,
int signal_length_samples)
{
- //update_local_carrier(signal_length_samples, rem_carrier_phase_in_rad, phase_step_rad); //replaced by VOLK phase rotator
- //volk_32fc_x2_multiply_32fc(d_sig_doppler_wiped, d_sig_in, d_nco_in, signal_length_samples); //replaced by VOLK phase rotator
-
+ update_local_code(signal_length_samples, rem_code_phase_chips, code_phase_step_chips);
+ // Regenerate phase at each call in order to avoid numerical issues
lv_32fc_t phase_offset_as_complex[1];
phase_offset_as_complex[0] = lv_cmake(std::cos(rem_carrier_phase_in_rad), -std::sin(rem_carrier_phase_in_rad));
- volk_32fc_s32fc_x2_rotator_32fc(d_sig_doppler_wiped, d_sig_in, std::exp(lv_32fc_t(0, -phase_step_rad)), phase_offset_as_complex, signal_length_samples);
- update_local_code(signal_length_samples,rem_code_phase_chips, code_phase_step_chips);
- for (int current_correlator_tap = 0; current_correlator_tap < d_n_correlators; current_correlator_tap++)
- {
- volk_32fc_x2_dot_prod_32fc(&d_corr_out[current_correlator_tap], d_sig_doppler_wiped, d_local_codes_resampled[current_correlator_tap], signal_length_samples);
- }
+ // call VOLK_GNSSSDR kernel
+ volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn(d_corr_out, d_sig_in, std::exp(lv_32fc_t(0, - phase_step_rad)), phase_offset_as_complex, (const lv_32fc_t**)d_local_codes_resampled, d_n_correlators, signal_length_samples);
return true;
}
-cpu_multicorrelator::cpu_multicorrelator()
-{
- d_sig_in = NULL;
- d_nco_in = NULL;
- d_sig_doppler_wiped = NULL;
- d_local_code_in = NULL;
- d_shifts_chips = NULL;
- d_corr_out = NULL;
- d_local_codes_resampled = NULL;
- d_code_length_chips = 0;
- d_n_correlators = 0;
-}
-
bool cpu_multicorrelator::free()
{
// Free memory
- if (d_sig_doppler_wiped != NULL) volk_free(d_sig_doppler_wiped);
- if (d_nco_in != NULL) volk_free(d_nco_in);
for (int n = 0; n < d_n_correlators; n++)
{
volk_free(d_local_codes_resampled[n]);
}
- delete d_local_codes_resampled;
+ volk_free(d_local_codes_resampled);
return true;
}
diff --git a/src/algorithms/tracking/libs/cpu_multicorrelator.h b/src/algorithms/tracking/libs/cpu_multicorrelator.h
index 2c8c966..2174595 100644
--- a/src/algorithms/tracking/libs/cpu_multicorrelator.h
+++ b/src/algorithms/tracking/libs/cpu_multicorrelator.h
@@ -45,27 +45,23 @@ class cpu_multicorrelator
{
public:
cpu_multicorrelator();
+ ~cpu_multicorrelator();
bool init(int max_signal_length_samples, int n_correlators);
bool set_local_code_and_taps(int code_length_chips, const std::complex<float>* local_code_in, float *shifts_chips);
bool set_input_output_vectors(std::complex<float>* corr_out, const std::complex<float>* sig_in);
void update_local_code(int correlator_length_samples, float rem_code_phase_chips, float code_phase_step_chips);
- void update_local_carrier(int correlator_length_samples, float rem_carr_phase_rad, float phase_step_rad);
bool Carrier_wipeoff_multicorrelator_resampler(float rem_carrier_phase_in_rad, float phase_step_rad, float rem_code_phase_chips, float code_phase_step_chips, int signal_length_samples);
bool free();
private:
// Allocate the device input vectors
const std::complex<float> *d_sig_in;
- std::complex<float> *d_nco_in;
std::complex<float> **d_local_codes_resampled;
- std::complex<float> *d_sig_doppler_wiped;
const std::complex<float> *d_local_code_in;
std::complex<float> *d_corr_out;
float *d_shifts_chips;
int d_code_length_chips;
int d_n_correlators;
- bool update_local_code();
- bool update_local_carrier();
};
diff --git a/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.cc b/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.cc
index 8cbc574..6af6175 100644
--- a/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.cc
+++ b/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.cc
@@ -44,14 +44,10 @@ bool cpu_multicorrelator_16sc::init(
// ALLOCATE MEMORY FOR INTERNAL vectors
size_t size = max_signal_length_samples * sizeof(lv_16sc_t);
- // NCO signal (not needed if the rotator+dot_product kernel is used)
- //d_nco_in = static_cast<lv_16sc_t*>(volk_gnsssdr_malloc(size, volk_gnsssdr_get_alignment()));
- // Doppler-free signal (not needed if the rotator+dot_product kernel is used)
- //d_sig_doppler_wiped = static_cast<lv_16sc_t*>(volk_gnsssdr_malloc(size, volk_gnsssdr_get_alignment()));
-
d_n_correlators = n_correlators;
- d_tmp_code_phases_chips = static_cast<float*>(volk_gnsssdr_malloc(n_correlators*sizeof(float), volk_gnsssdr_get_alignment()));
- d_local_codes_resampled = new lv_16sc_t*[n_correlators];
+ d_tmp_code_phases_chips = static_cast<float*>(volk_gnsssdr_malloc(n_correlators * sizeof(float), volk_gnsssdr_get_alignment()));
+
+ d_local_codes_resampled = static_cast<lv_16sc_t**>(volk_gnsssdr_malloc(n_correlators * sizeof(lv_16sc_t), volk_gnsssdr_get_alignment()));
for (int n = 0; n < n_correlators; n++)
{
d_local_codes_resampled[n] = static_cast<lv_16sc_t*>(volk_gnsssdr_malloc(size, volk_gnsssdr_get_alignment()));
@@ -81,21 +77,21 @@ bool cpu_multicorrelator_16sc::set_input_output_vectors(lv_16sc_t* corr_out, con
return true;
}
-void cpu_multicorrelator_16sc::update_local_code(int correlator_length_samples,float rem_code_phase_chips, float code_phase_step_chips)
+
+void cpu_multicorrelator_16sc::update_local_code(int correlator_length_samples, float rem_code_phase_chips, float code_phase_step_chips)
{
+ for (int n = 0; n < d_n_correlators; n++)
+ {
+ d_tmp_code_phases_chips[n] = d_shifts_chips[n] - rem_code_phase_chips;
+ }
- for (int n = 0; n < d_n_correlators; n++)
- {
- d_tmp_code_phases_chips[n] = d_shifts_chips[n] - rem_code_phase_chips;
- }
-
- volk_gnsssdr_16ic_xn_resampler_16ic_xn(d_local_codes_resampled,
- d_local_code_in,
- d_tmp_code_phases_chips,
- code_phase_step_chips,
- correlator_length_samples,
- d_n_correlators,
- d_code_length_chips);
+ volk_gnsssdr_16ic_xn_resampler_16ic_xn(d_local_codes_resampled,
+ d_local_code_in,
+ d_tmp_code_phases_chips,
+ code_phase_step_chips,
+ correlator_length_samples,
+ d_n_correlators,
+ d_code_length_chips);
}
@@ -107,13 +103,11 @@ bool cpu_multicorrelator_16sc::Carrier_wipeoff_multicorrelator_resampler(
int signal_length_samples)
{
update_local_code(signal_length_samples, rem_code_phase_chips, code_phase_step_chips);
+ // Regenerate phase at each call in order to avoid numerical issues
lv_32fc_t phase_offset_as_complex[1];
phase_offset_as_complex[0] = lv_cmake(std::cos(rem_carrier_phase_in_rad), -std::sin(rem_carrier_phase_in_rad));
- //replaced by integrated rotator + dot_product kernel
- //volk_gnsssdr_16ic_s32fc_x2_rotator_16ic(d_sig_doppler_wiped, d_sig_in, std::exp(lv_32fc_t(0, -phase_step_rad)), phase_offset_as_complex, signal_length_samples);
- //volk_gnsssdr_16ic_x2_dot_prod_16ic_xn(d_corr_out, d_sig_doppler_wiped, (const lv_16sc_t**)d_local_codes_resampled, d_n_correlators, signal_length_samples);
- volk_gnsssdr_16ic_x2_rotator_dot_prod_16ic_xn(d_corr_out, d_sig_in, std::exp(lv_32fc_t(0, -phase_step_rad)), phase_offset_as_complex, (const lv_16sc_t**)d_local_codes_resampled, d_n_correlators, signal_length_samples);
-
+ // call VOLK_GNSSSDR kernel
+ volk_gnsssdr_16ic_x2_rotator_dot_prod_16ic_xn(d_corr_out, d_sig_in, std::exp(lv_32fc_t(0, -phase_step_rad)), phase_offset_as_complex, (const lv_16sc_t**)d_local_codes_resampled, d_n_correlators, signal_length_samples);
return true;
}
@@ -121,8 +115,6 @@ bool cpu_multicorrelator_16sc::Carrier_wipeoff_multicorrelator_resampler(
cpu_multicorrelator_16sc::cpu_multicorrelator_16sc()
{
d_sig_in = NULL;
- //d_nco_in = NULL;
- //d_sig_doppler_wiped = NULL;
d_local_code_in = NULL;
d_shifts_chips = NULL;
d_corr_out = NULL;
@@ -131,17 +123,25 @@ cpu_multicorrelator_16sc::cpu_multicorrelator_16sc()
d_n_correlators = 0;
}
+
+cpu_multicorrelator_16sc::~cpu_multicorrelator_16sc()
+{
+ if(d_local_codes_resampled != NULL)
+ {
+ cpu_multicorrelator_16sc::free();
+ }
+}
+
+
bool cpu_multicorrelator_16sc::free()
{
// Free memory
- //if (d_sig_doppler_wiped != NULL) volk_gnsssdr_free(d_sig_doppler_wiped);
- //if (d_nco_in != NULL) volk_gnsssdr_free(d_nco_in);
- if (d_tmp_code_phases_chips != NULL) volk_gnsssdr_free(d_tmp_code_phases_chips);
+ if (d_tmp_code_phases_chips != NULL) volk_gnsssdr_free(d_tmp_code_phases_chips);
for (int n = 0; n < d_n_correlators; n++)
{
volk_gnsssdr_free(d_local_codes_resampled[n]);
}
- delete d_local_codes_resampled;
+ volk_gnsssdr_free(d_local_codes_resampled);
return true;
}
diff --git a/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.h b/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.h
index 6a60821..280e2ab 100644
--- a/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.h
+++ b/src/algorithms/tracking/libs/cpu_multicorrelator_16sc.h
@@ -45,6 +45,7 @@ class cpu_multicorrelator_16sc
{
public:
cpu_multicorrelator_16sc();
+ ~cpu_multicorrelator_16sc();
bool init(int max_signal_length_samples, int n_correlators);
bool set_local_code_and_taps(int code_length_chips, const lv_16sc_t* local_code_in, float *shifts_chips);
bool set_input_output_vectors(lv_16sc_t* corr_out, const lv_16sc_t* sig_in);
@@ -55,18 +56,14 @@ public:
private:
// Allocate the device input vectors
const lv_16sc_t *d_sig_in;
- //lv_16sc_t *d_nco_in;
float *d_tmp_code_phases_chips;
lv_16sc_t **d_local_codes_resampled;
- //lv_16sc_t *d_sig_doppler_wiped;
const lv_16sc_t *d_local_code_in;
lv_16sc_t *d_corr_out;
float *d_shifts_chips;
int d_code_length_chips;
int d_n_correlators;
- bool update_local_code();
- bool update_local_carrier();
};
-#endif /* CPU_MULTICORRELATOR_H_ */
+#endif /* GNSS_SDR_CPU_MULTICORRELATOR_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