From d847d3fdcf3fafd7e2c69ea1dc4dd6c20e42a823 Mon Sep 17 00:00:00 2001 From: Carles Fernandez Date: Thu, 11 Jun 2020 12:09:55 +0200 Subject: [PATCH] Add test about preamble correlation implementations --- src/tests/test_main.cc | 1 + .../arithmetic/preamble_correlator_test.cc | 107 ++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 src/tests/unit-tests/arithmetic/preamble_correlator_test.cc diff --git a/src/tests/test_main.cc b/src/tests/test_main.cc index 3d54ce6bd..00639b3db 100644 --- a/src/tests/test_main.cc +++ b/src/tests/test_main.cc @@ -49,6 +49,7 @@ DECLARE_string(log_dir); #include "unit-tests/arithmetic/fft_speed_test.cc" #include "unit-tests/arithmetic/magnitude_squared_test.cc" #include "unit-tests/arithmetic/multiply_test.cc" +#include "unit-tests/arithmetic/preamble_correlator_test.cc" #include "unit-tests/control-plane/control_thread_test.cc" #include "unit-tests/control-plane/file_configuration_test.cc" #include "unit-tests/control-plane/gnss_block_factory_test.cc" diff --git a/src/tests/unit-tests/arithmetic/preamble_correlator_test.cc b/src/tests/unit-tests/arithmetic/preamble_correlator_test.cc new file mode 100644 index 000000000..76ca3d681 --- /dev/null +++ b/src/tests/unit-tests/arithmetic/preamble_correlator_test.cc @@ -0,0 +1,107 @@ +/*! + * \file preamble_correlator_test.cc + * \brief This file implements tests for preamble detection. + * \author Carles Fernandez-Prades, 2020. cfernandez(at)cttc.es + * + * + * ------------------------------------------------------------------------- + * + * Copyright (C) 2010-2019 (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. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + * ------------------------------------------------------------------------- + */ + +#include "GPS_L1_CA.h" +#include +#include +#include +#include +#include +#include + +TEST(PreambleCorrelationTest, TestMethods) +{ + int64_t n_iter = 100000; + int32_t corr_value = 0; + int32_t corr_value2 = 0; + + int32_t sum_corr1 = 0; + int32_t sum_corr2 = 0; + + std::vector d_symbol_history(GPS_CA_PREAMBLE_LENGTH_SYMBOLS, 0.0); + std::array d_preamble_samples{}; + + std::chrono::time_point start, end, start2, end2; + + // fill the inputs + std::random_device rd; + std::default_random_engine e2(rd()); + std::uniform_real_distribution<> dist(-1.0, 1.0); + for (int32_t i = 0; i < GPS_CA_PREAMBLE_LENGTH_SYMBOLS; i++) + { + d_symbol_history[i] = dist(e2); + } + + int32_t n = 0; + for (int32_t i = 0; i < GPS_CA_PREAMBLE_LENGTH_BITS; i++) + { + if (GPS_CA_PREAMBLE[i] == '1') + { + d_preamble_samples[n] = 1; + n++; + } + else + { + d_preamble_samples[n] = -1; + n++; + } + } + + // Compute correlation, method 1 + start = std::chrono::system_clock::now(); + for (int64_t kk = 0; kk < n_iter; kk++) + { + corr_value = 0; + for (int32_t i = 0; i < GPS_CA_PREAMBLE_LENGTH_BITS; i++) + { + if (d_symbol_history[i] < 0.0) + { + corr_value -= d_preamble_samples[i]; + } + else + { + corr_value += d_preamble_samples[i]; + } + } + sum_corr1 += corr_value; + } + end = std::chrono::system_clock::now(); + + // Compute correlation, method 2 + start2 = std::chrono::system_clock::now(); + for (int64_t kk = 0; kk < n_iter; kk++) + { + int32_t ii = -1; + corr_value2 = std::accumulate(d_symbol_history.begin(), + d_symbol_history.begin() + GPS_CA_PREAMBLE_LENGTH_BITS, + 0, + [&ii, &d_preamble_samples](float a, float b) { return (b > 0.0 ? a + d_preamble_samples[++ii] : a - d_preamble_samples[++ii]); }); + sum_corr2 += corr_value2; + } + end2 = std::chrono::system_clock::now(); + + EXPECT_EQ(corr_value, corr_value2); + EXPECT_EQ(sum_corr1, sum_corr2); + + std::chrono::duration elapsed_seconds = end - start; + std::chrono::duration elapsed_seconds2 = end2 - start2; + std::cout << "Correlation computed with 'C for': done in " << elapsed_seconds.count() * 1.0e9 / n_iter << " nanoseconds" << std::endl; + std::cout << "Correlation computed with lambda: done in " << elapsed_seconds2.count() * 1.0e9 / n_iter << " nanoseconds" << std::endl; +}