diff --git a/CMakeLists.txt b/CMakeLists.txt index 76c940237..11d3db749 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -510,6 +510,7 @@ else() endif() + ################################################################################ # Check if the compiler defines the architecture as ARM ################################################################################ @@ -2233,10 +2234,12 @@ endif() configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake - @ONLY) + @ONLY +) add_custom_target(uninstall - COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) + COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake +) diff --git a/README.md b/README.md index 65f84503f..3f9d5c33a 100644 --- a/README.md +++ b/README.md @@ -327,14 +327,14 @@ $ cd gnss-sdr/build Configure and build the application: ~~~~~~ -$ cmake ../ +$ cmake .. $ make ~~~~~~ By default, CMake will build the Release version, meaning that the compiler will generate a fast, optimized executable. This is the recommended build type when using an RF front-end and you need to attain real time. If working with a file (and thus without real-time constraints), you may want to obtain more information about the internals of the receiver, as well as more fine-grained logging. This can be done by building the Debug version, by doing: ~~~~~~ -$ cmake -DCMAKE_BUILD_TYPE=Debug ../ +$ cmake -DCMAKE_BUILD_TYPE=Debug .. $ make ~~~~~~ @@ -392,7 +392,7 @@ Install the GNU Radio module: ~~~~~~ $ git clone https://github.com/gnss-sdr/gr-gn3s $ cd gr-gn3s/build -$ cmake ../ +$ cmake .. $ make $ sudo make install $ sudo ldconfig @@ -402,7 +402,7 @@ Then configure GNSS-SDR to build the `GN3S_Signal_Source` by: ~~~~~~ $ cd gnss-sdr/build -$ cmake -DENABLE_GN3S=ON ../ +$ cmake -DENABLE_GN3S=ON .. $ make $ sudo make install ~~~~~~ @@ -425,16 +425,16 @@ $ git clone git://git.osmocom.org/osmo-sdr.git $ cd osmo-sdr/software/libosmosdr $ mkdir build $ cd build/ -$ cmake ../ +$ cmake .. $ make $ sudo make install $ sudo ldconfig -$ cd ../../ +$ cd ../.. $ git clone git://git.osmocom.org/gr-osmosdr $ cd gr-osmosdr $ mkdir build $ cd build -$ cmake ../ -Wno-dev +$ cmake .. -Wno-dev $ make $ sudo make install $ sudo ldconfig @@ -444,7 +444,7 @@ $ sudo ldconfig Then, configure GNSS-SDR to build the `Osmosdr_Signal_Source` by: ~~~~~~ -$ cmake -DENABLE_OSMOSDR=ON ../ +$ cmake -DENABLE_OSMOSDR=ON .. $ make $ sudo make install ~~~~~~ @@ -484,14 +484,14 @@ Then configure GNSS-SDR to build the `Fmcomms2_Signal_Source` implementation: ~~~~~~ $ cd gnss-sdr/build -$ cmake -DENABLE_FMCOMMS2=ON ../ +$ cmake -DENABLE_FMCOMMS2=ON .. $ make $ sudo make install ~~~~~~ or configure it to build `Plutosdr_Signal_Source`: ~~~~~~ -$ cmake -DENABLE_PLUTOSDR=ON ../ +$ cmake -DENABLE_PLUTOSDR=ON .. $ make $ sudo make install ~~~~~~ @@ -503,7 +503,7 @@ With `Fmcomms2_Signal_Source` you can use any SDR hardware based on [FMCOMMS2](h In order to enable the building of blocks that use OpenCL, type: ~~~~~~ -$ cmake -DENABLE_OPENCL=ON ../ +$ cmake -DENABLE_OPENCL=ON .. $ make $ sudo make install ~~~~~~ @@ -514,7 +514,7 @@ $ sudo make install In order to enable the building of blocks that use CUDA, NVIDIA's parallel programming model that enables graphics processing unit (GPU) acceleration for data-parallel computations, first you need to install the CUDA Toolkit from [NVIDIA Developers Download page](https://developer.nvidia.com/cuda-downloads "CUDA Downloads"). Make sure that the SDK samples build well. Then, build GNSS-SDR by doing: ~~~~~~ -$ cmake -DENABLE_CUDA=ON ../ +$ cmake -DENABLE_CUDA=ON .. $ make $ sudo make install ~~~~~~ @@ -527,7 +527,7 @@ Of course, you will also need a GPU that [supports CUDA](https://developer.nvidi In order to build an executable that not depends on the specific SIMD instruction set that is present in the processor of the compiling machine, so other users can execute it in other machines without those particular sets, use: ~~~~~~ -$ cmake -DENABLE_GENERIC_ARCH=ON ../ +$ cmake -DENABLE_GENERIC_ARCH=ON .. $ make $ sudo make install ~~~~~~ @@ -630,7 +630,7 @@ Finally, you are ready to clone the GNSS-SDR repository, configure and build the ~~~~~~ $ git clone https://github.com/gnss-sdr/gnss-sdr $ cd gnss-sdr/build -$ cmake ../ +$ cmake .. $ make ~~~~~~ @@ -661,18 +661,18 @@ GNSS-SDR comes with a library which is a module of the Vector-Optimized Library GNU Radio and other dependencies can also be installed using other package managers than Macports, such as [Fink](http://www.finkproject.org/ "Fink") or [Homebrew](https://brew.sh/ "Homebrew"). Since the version of Python that ships with OS X is great for learning but it is not good for development, you could have another Python executable in a non-standard location. If that is the case, you need to inform GNSS-SDR's configuration system by defining the `PYTHON_EXECUTABLE` variable as: ~~~~~~ -cmake -DPYTHON_EXECUTABLE=/path/to/bin/python ../ +cmake -DPYTHON_EXECUTABLE=/path/to/bin/python .. ~~~~~~ In case you have installed Macports in a non-standard location, you can use: ~~~~~~ -$ cmake -DCMAKE_PREFIX_PATH=/opt/local -DUSE_MACPORTS_PYTHON=/opt/local/bin/python ../ +$ cmake -DCMAKE_PREFIX_PATH=/opt/local -DUSE_MACPORTS_PYTHON=/opt/local/bin/python .. ~~~~~~ changing ```/opt/local``` by the base directory in which your software is installed. -The CMake script will create Makefiles that download, build and link Armadillo, Gflags, Glog and Google Test on the fly at compile time if they are not detected in your machine. +The CMake script will create Makefiles that download, build and link Armadillo, Gflags, Glog, Matio, PugiXML and Google Test on the fly at compile time if they are not detected in your machine. Other builds diff --git a/docs/changelog b/docs/changelog index 549c049c3..849d5518d 100644 --- a/docs/changelog +++ b/docs/changelog @@ -8,10 +8,18 @@ ### Improvements in Efficiency -- Improved preamble detection implementation in the decoding of navigation messages (acceleration by x1.6 on average). +- Improved preamble detection implementation in the decoding of navigation messages (acceleration by x1.6 on average per channel). +- Shortened Acquisition to Tracking transition time. - Applied clang-tidy checks and fixes related to performance: performance-faster-string-find, performance-inefficient-algorithm, performance-move-const-arg, performance-type-promotion-in-math-fn, performance-unnecessary-copy-initialization, performance-unnecessary-value-param, readability-string-compare. +### Improvements in Flexibility: + +- New Tracking parameters allow the configuration of PLL and DLL filters order. +- Added parameter to enable FLL during pull-in time. +- Configurable pull-in time in the Tracking loops. + + ### Improvements in Interoperability: - Added the BeiDou B1I receiver chain. @@ -30,7 +38,8 @@ ### Improvements in Portability: - Added interfaces for FPGA off-loading. -- CMake scripts now follow a modern approach (targets and properties) but still work in 2.8.12 +- CMake scripts now follow a modern approach (targets and properties) but still work with 2.8.12. +- Improvements for macOS users using Homebrew. ### Improvements in Reliability diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn.h index 131509411..ded912ed9 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn.h +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn.h @@ -102,9 +102,9 @@ static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn_g #endif } tmp32_1 = *in_common++ * (*phase); - phase_doppler *= phase_inc; phase_doppler_rate = cpowf(phase_inc_rate, lv_cmake(n * n, 0.0f)); + phase_doppler_rate /= hypotf(lv_creal(phase_doppler_rate), lv_cimag(phase_doppler_rate)); (*phase) = phase_doppler * phase_doppler_rate; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) @@ -117,11 +117,13 @@ static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn_g #ifdef LV_HAVE_GENERIC -static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn_generic_acc(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, const lv_32fc_t phase_inc_rate, lv_32fc_t* phase, const float** in_a, int num_a_vectors, unsigned int num_points) +static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn_generic_arg(lv_32fc_t* result, const lv_32fc_t* in_common, const lv_32fc_t phase_inc, const lv_32fc_t phase_inc_rate, lv_32fc_t* phase, const float** in_a, int num_a_vectors, unsigned int num_points) { - lv_32fc_t tmp32_1 = lv_cmake(0.0f, 0.0f); - lv_32fc_t phase_rate_acc = lv_cmake(1.0f, 0.0f); + lv_32fc_t tmp32_1; + lv_32fc_t phase_doppler_rate = lv_cmake(1.0f, 0.0f); + lv_32fc_t phase_doppler = (*phase); int n_vec; + const float arga = cargf(phase_inc_rate); unsigned int n; for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { @@ -138,8 +140,12 @@ static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn_g (*phase) /= hypotf(lv_creal(*phase), lv_cimag(*phase)); #endif } - phase_rate_acc += phase_inc_rate; - (*phase) *= lv_cmake(cosf(phase_rate_acc), sinf(phase_rate_acc)); + tmp32_1 = *in_common++ * (*phase); + phase_doppler *= phase_inc; + const float theta = (float)(n * n) * arga; + phase_doppler_rate = lv_cmake(cosf(theta), sinf(theta)); + (*phase) = phase_doppler * phase_doppler_rate; + for (n_vec = 0; n_vec < num_a_vectors; n_vec++) { result[n_vec] += (tmp32_1 * in_a[n_vec][n]); diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32fc.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32fc.h index bb3c8d9f8..b05485e1c 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32fc.h +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32fc.h @@ -49,11 +49,11 @@ static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32 float rem_carrier_phase_in_rad = 0.25; float phase_step_rad = 0.1; lv_32fc_t phase[1]; - phase[0] = lv_cmake(cos(rem_carrier_phase_in_rad), sin(rem_carrier_phase_in_rad)); + phase[0] = lv_cmake(cosf(rem_carrier_phase_in_rad), sinf(rem_carrier_phase_in_rad)); lv_32fc_t phase_inc[1]; - phase_inc[0] = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)); + phase_inc[0] = lv_cmake(cosf(phase_step_rad), sinf(phase_step_rad)); lv_32fc_t phase_inc_rate[1]; - phase_inc_rate[0] = lv_cmake(cos(phase_step_rad * 0.001), sin(phase_step_rad * 0.001)); + phase_inc_rate[0] = lv_cmake(cosf(phase_step_rad * 0.001), sinf(phase_step_rad * 0.001)); int n; int num_a_vectors = 3; float** in_a = (float**)volk_gnsssdr_malloc(sizeof(float*) * num_a_vectors, volk_gnsssdr_get_alignment()); @@ -74,17 +74,17 @@ static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32 #endif // Generic #ifdef LV_HAVE_GENERIC -static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32fc_generic_acc(lv_32fc_t* result, const lv_32fc_t* local_code, const float* in, unsigned int num_points) +static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32fc_generic_arg(lv_32fc_t* result, const lv_32fc_t* local_code, const float* in, unsigned int num_points) { // phases must be normalized. Phase rotator expects a complex exponential input! float rem_carrier_phase_in_rad = 0.25; float phase_step_rad = 0.1; lv_32fc_t phase[1]; - phase[0] = lv_cmake(cos(rem_carrier_phase_in_rad), sin(rem_carrier_phase_in_rad)); + phase[0] = lv_cmake(cosf(rem_carrier_phase_in_rad), sinf(rem_carrier_phase_in_rad)); lv_32fc_t phase_inc[1]; - phase_inc[0] = lv_cmake(cos(phase_step_rad), sin(phase_step_rad)); + phase_inc[0] = lv_cmake(cosf(phase_step_rad), sinf(phase_step_rad)); lv_32fc_t phase_inc_rate[1]; - phase_inc_rate[0] = lv_cmake(cos(phase_step_rad * 0.001), sin(phase_step_rad * 0.001)); + phase_inc_rate[0] = lv_cmake(cosf(phase_step_rad * 0.001), sinf(phase_step_rad * 0.001)); int n; int num_a_vectors = 3; float** in_a = (float**)volk_gnsssdr_malloc(sizeof(float*) * num_a_vectors, volk_gnsssdr_get_alignment()); @@ -94,7 +94,7 @@ static inline void volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32 memcpy((float*)in_a[n], (float*)in, sizeof(float) * num_points); } - volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn_generic_acc(result, local_code, phase_inc[0], phase_inc_rate[0], phase, (const float**)in_a, num_a_vectors, num_points); + volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn_generic_arg(result, local_code, phase_inc[0], phase_inc_rate[0], phase, (const float**)in_a, num_a_vectors, num_points); for (n = 0; n < num_a_vectors; n++) { diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn.h index c08591deb..6c4eb5a58 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn.h +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/kernels/volk_gnsssdr/volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn.h @@ -313,7 +313,7 @@ static inline void volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn_u_avx(lv_32fc_ number = sixteenthPoints * 16; for (; number < num_points; number++) { - wo = (*aPtr++) * _phase; + wo = in_common[number] * _phase; _phase *= phase_inc; for (vec_ind = 0; vec_ind < num_a_vectors; ++vec_ind) @@ -477,7 +477,7 @@ static inline void volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn_a_avx(lv_32fc_ number = sixteenthPoints * 16; for (; number < num_points; number++) { - wo = (*aPtr++) * _phase; + wo = in_common[number] * _phase; _phase *= phase_inc; for (vec_ind = 0; vec_ind < num_a_vectors; ++vec_ind) diff --git a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h index 86b20b5e0..f2973a074 100644 --- a/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h +++ b/src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/lib/kernel_tests.h @@ -97,9 +97,9 @@ std::vector init_test_list(volk_gnsssdr_test_params_t QA(VOLK_INIT_PUPP(volk_gnsssdr_16ic_x2_dotprodxnpuppet_16ic, volk_gnsssdr_16ic_x2_dot_prod_16ic_xn, test_params)) QA(VOLK_INIT_PUPP(volk_gnsssdr_16ic_x2_rotator_dotprodxnpuppet_16ic, volk_gnsssdr_16ic_x2_rotator_dot_prod_16ic_xn, test_params_int16)) QA(VOLK_INIT_PUPP(volk_gnsssdr_16ic_16i_rotator_dotprodxnpuppet_16ic, volk_gnsssdr_16ic_16i_rotator_dot_prod_16ic_xn, test_params_int16)) - QA(VOLK_INIT_PUPP(volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc, volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn, test_params_int1)) - QA(VOLK_INIT_PUPP(volk_gnsssdr_32fc_32f_rotator_dotprodxnpuppet_32fc, volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn, test_params_int1)); - QA(VOLK_INIT_PUPP(volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32fc, volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn, test_params_int1)); + QA(VOLK_INIT_PUPP(volk_gnsssdr_32fc_x2_rotator_dotprodxnpuppet_32fc, volk_gnsssdr_32fc_x2_rotator_dot_prod_32fc_xn, test_params_inacc)) + QA(VOLK_INIT_PUPP(volk_gnsssdr_32fc_32f_rotator_dotprodxnpuppet_32fc, volk_gnsssdr_32fc_32f_rotator_dot_prod_32fc_xn, test_params_inacc)); + QA(VOLK_INIT_PUPP(volk_gnsssdr_32fc_32f_high_dynamic_rotator_dotprodxnpuppet_32fc, volk_gnsssdr_32fc_32f_high_dynamic_rotator_dot_prod_32fc_xn, test_params_inacc)); return test_cases; }