mirror of
				https://github.com/gnss-sdr/gnss-sdr
				synced 2025-10-31 15:23:04 +00:00 
			
		
		
		
	Introducing a new resampler kernel for comparison
This commit is contained in:
		| @@ -0,0 +1,282 @@ | ||||
| /*! | ||||
|  * \file volk_gnsssdr_16ic_resamplerxnpuppet_16ic.h | ||||
|  * \brief VOLK_GNSSSDR puppet for the multiple 16-bit complex vector resampler kernel. | ||||
|  * \authors <ul> | ||||
|  *          <li> Carles Fernandez Prades 2016 cfernandez at cttc dot cat | ||||
|  *          </ul> | ||||
|  * | ||||
|  * VOLK_GNSSSDR puppet for integrating the multiple resampler into the test system | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * Copyright (C) 2010-2015  (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. | ||||
|  * | ||||
|  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * GNSS-SDR is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  */ | ||||
|  | ||||
| #ifndef INCLUDED_volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_H | ||||
| #define INCLUDED_volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_H | ||||
|  | ||||
| #include "volk_gnsssdr/volk_gnsssdr_16ic_xn_resampler2_16ic_xn.h" | ||||
| #include <volk_gnsssdr/volk_gnsssdr_malloc.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr_complex.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr.h> | ||||
| #include <string.h> | ||||
|  | ||||
| #ifdef LV_HAVE_GENERIC | ||||
| static inline void volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_generic(lv_16sc_t* result, const lv_16sc_t* local_code, unsigned int num_points) | ||||
| { | ||||
|     float code_phase_step_chips = 0.6; | ||||
|     int code_length_chips = 2046; | ||||
|     int num_out_vectors = 3; | ||||
|     float rem_code_phase_chips = -0.234; | ||||
|  | ||||
|     float shifts_chips[3] = { -0.1, 0.0, 0.1  }; | ||||
|  | ||||
|     lv_16sc_t** result_aux =  (lv_16sc_t**)volk_gnsssdr_malloc(sizeof(lv_16sc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|        result_aux[n] = (lv_16sc_t*)volk_gnsssdr_malloc(sizeof(lv_16sc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_generic(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_16sc_t*)result, (lv_16sc_t*)result_aux[0], sizeof(lv_16sc_t) * num_points); | ||||
|  | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|         volk_gnsssdr_free(result_aux[n]); | ||||
|     } | ||||
|     volk_gnsssdr_free(result_aux); | ||||
| } | ||||
|  | ||||
| #endif /* LV_HAVE_GENERIC */ | ||||
|   | ||||
|  | ||||
| #ifdef LV_HAVE_SSE3 | ||||
| static inline void volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_a_sse3(lv_16sc_t* result, const lv_16sc_t* local_code, unsigned int num_points) | ||||
| { | ||||
|     float code_phase_step_chips = 0.6; | ||||
|     int code_length_chips = 2046; | ||||
|     int num_out_vectors = 3; | ||||
|     float rem_code_phase_chips = -0.234; | ||||
|  | ||||
|     float shifts_chips[3] = { -0.1, 0.0, 0.1 }; | ||||
|  | ||||
|     lv_16sc_t** result_aux =  (lv_16sc_t**)volk_gnsssdr_malloc(sizeof(lv_16sc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|        result_aux[n] = (lv_16sc_t*)volk_gnsssdr_malloc(sizeof(lv_16sc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_a_sse3(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_16sc_t*)result, (lv_16sc_t*)result_aux[0], sizeof(lv_16sc_t) * num_points); | ||||
|  | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|         volk_gnsssdr_free(result_aux[n]); | ||||
|     } | ||||
|     volk_gnsssdr_free(result_aux); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #ifdef LV_HAVE_SSE3 | ||||
| static inline void volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_u_sse3(lv_16sc_t* result, const lv_16sc_t* local_code, unsigned int num_points) | ||||
| { | ||||
|     float code_phase_step_chips = 0.6; | ||||
|     int code_length_chips = 2046; | ||||
|     int num_out_vectors = 3; | ||||
|     float rem_code_phase_chips = -0.234; | ||||
|  | ||||
|     float shifts_chips[3] = { -0.1, 0.0, 0.1 }; | ||||
|  | ||||
|     lv_16sc_t** result_aux =  (lv_16sc_t**)volk_gnsssdr_malloc(sizeof(lv_16sc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|        result_aux[n] = (lv_16sc_t*)volk_gnsssdr_malloc(sizeof(lv_16sc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_u_sse3(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_16sc_t*)result, (lv_16sc_t*)result_aux[0], sizeof(lv_16sc_t) * num_points); | ||||
|  | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|         volk_gnsssdr_free(result_aux[n]); | ||||
|     } | ||||
|     volk_gnsssdr_free(result_aux); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_SSE4_1 | ||||
| static inline void volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_u_sse4_1(lv_16sc_t* result, const lv_16sc_t* local_code, unsigned int num_points) | ||||
| { | ||||
|     float code_phase_step_chips = 0.6; | ||||
|     int code_length_chips = 2046; | ||||
|     int num_out_vectors = 3; | ||||
|     float rem_code_phase_chips = -0.234; | ||||
|  | ||||
|     float shifts_chips[3] = { -0.1, 0.0, 0.1 }; | ||||
|  | ||||
|     lv_16sc_t** result_aux =  (lv_16sc_t**)volk_gnsssdr_malloc(sizeof(lv_16sc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|        result_aux[n] = (lv_16sc_t*)volk_gnsssdr_malloc(sizeof(lv_16sc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_u_sse4_1(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_16sc_t*)result, (lv_16sc_t*)result_aux[0], sizeof(lv_16sc_t) * num_points); | ||||
|  | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|         volk_gnsssdr_free(result_aux[n]); | ||||
|     } | ||||
|     volk_gnsssdr_free(result_aux); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_SSE4_1 | ||||
| static inline void volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_a_sse4_1(lv_16sc_t* result, const lv_16sc_t* local_code, unsigned int num_points) | ||||
| { | ||||
|     float code_phase_step_chips = 0.6; | ||||
|     int code_length_chips = 2046; | ||||
|     int num_out_vectors = 3; | ||||
|     float rem_code_phase_chips = -0.234; | ||||
|  | ||||
|     float shifts_chips[3] = { -0.1, 0.0, 0.1 }; | ||||
|  | ||||
|     lv_16sc_t** result_aux =  (lv_16sc_t**)volk_gnsssdr_malloc(sizeof(lv_16sc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|        result_aux[n] = (lv_16sc_t*)volk_gnsssdr_malloc(sizeof(lv_16sc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_a_sse4_1(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_16sc_t*)result, (lv_16sc_t*)result_aux[0], sizeof(lv_16sc_t) * num_points); | ||||
|  | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|         volk_gnsssdr_free(result_aux[n]); | ||||
|     } | ||||
|     volk_gnsssdr_free(result_aux); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_AVX | ||||
| static inline void volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_u_avx(lv_16sc_t* result, const lv_16sc_t* local_code, unsigned int num_points) | ||||
| { | ||||
|     float code_phase_step_chips = 0.6; | ||||
|     int code_length_chips = 2046; | ||||
|     int num_out_vectors = 3; | ||||
|     float rem_code_phase_chips = -0.234; | ||||
|  | ||||
|     float shifts_chips[3] = { -0.1, 0.0, 0.1 }; | ||||
|  | ||||
|     lv_16sc_t** result_aux =  (lv_16sc_t**)volk_gnsssdr_malloc(sizeof(lv_16sc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|        result_aux[n] = (lv_16sc_t*)volk_gnsssdr_malloc(sizeof(lv_16sc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_u_avx(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_16sc_t*)result, (lv_16sc_t*)result_aux[0], sizeof(lv_16sc_t) * num_points); | ||||
|  | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|         volk_gnsssdr_free(result_aux[n]); | ||||
|     } | ||||
|     volk_gnsssdr_free(result_aux); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_AVX | ||||
| static inline void volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_a_avx(lv_16sc_t* result, const lv_16sc_t* local_code, unsigned int num_points) | ||||
| { | ||||
|     float code_phase_step_chips = 0.6; | ||||
|     int code_length_chips = 2046; | ||||
|     int num_out_vectors = 3; | ||||
|     float rem_code_phase_chips = -0.234; | ||||
|  | ||||
|     float shifts_chips[3] = { -0.1, 0.0, 0.1 }; | ||||
|  | ||||
|     lv_16sc_t** result_aux =  (lv_16sc_t**)volk_gnsssdr_malloc(sizeof(lv_16sc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|        result_aux[n] = (lv_16sc_t*)volk_gnsssdr_malloc(sizeof(lv_16sc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_a_avx(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_16sc_t*)result, (lv_16sc_t*)result_aux[0], sizeof(lv_16sc_t) * num_points); | ||||
|  | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|         volk_gnsssdr_free(result_aux[n]); | ||||
|     } | ||||
|     volk_gnsssdr_free(result_aux); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_NEON | ||||
| static inline void volk_gnsssdr_16ic_resamplerxnpuppet2_16ic_neon(lv_16sc_t* result, const lv_16sc_t* local_code, unsigned int num_points) | ||||
| { | ||||
|     float code_phase_step_chips = 0.6; | ||||
|     int code_length_chips = 2046; | ||||
|     int num_out_vectors = 3; | ||||
|     float rem_code_phase_chips = -0.234; | ||||
|  | ||||
|     float shifts_chips[3] = { -0.1, 0.0, 0.1 }; | ||||
|  | ||||
|     lv_16sc_t** result_aux =  (lv_16sc_t**)volk_gnsssdr_malloc(sizeof(lv_16sc_t*) * num_out_vectors, volk_gnsssdr_get_alignment()); | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|        result_aux[n] = (lv_16sc_t*)volk_gnsssdr_malloc(sizeof(lv_16sc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_neon(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_16sc_t*)result, (lv_16sc_t*)result_aux[0], sizeof(lv_16sc_t) * num_points); | ||||
|  | ||||
|     for(unsigned int n = 0; n < num_out_vectors; n++) | ||||
|     { | ||||
|         volk_gnsssdr_free(result_aux[n]); | ||||
|     } | ||||
|     volk_gnsssdr_free(result_aux); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #endif // INCLUDED_volk_gnsssdr_16ic_resamplerpuppet_16ic_H | ||||
| @@ -0,0 +1,397 @@ | ||||
| /*! | ||||
|  * \file volk_gnsssdr_16ic_xn_resampler_16ic_xn.h | ||||
|  * \brief VOLK_GNSSSDR kernel: Resamples N 16 bits integer short complex vectors using zero hold resample algorithm. | ||||
|  * \authors <ul> | ||||
|  *          <li> Javier Arribas, 2015. jarribas(at)cttc.es | ||||
|  *          </ul> | ||||
|  * | ||||
|  * VOLK_GNSSSDR kernel that esamples N 16 bits integer short complex vectors using zero hold resample algorithm. | ||||
|  * It is optimized to resample a sigle GNSS local code signal replica into N vectors fractional-resampled and fractional-delayed | ||||
|  * (i.e. it creates the Early, Prompt, and Late code replicas) | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  * | ||||
|  * Copyright (C) 2010-2015  (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. | ||||
|  * | ||||
|  * GNSS-SDR is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * GNSS-SDR is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * ------------------------------------------------------------------------- | ||||
|  */ | ||||
|  | ||||
| /*! | ||||
|  * \page volk_gnsssdr_16ic_xn_resampler_16ic_xn | ||||
|  * | ||||
|  * \b Overview | ||||
|  * | ||||
|  * Resamples a complex vector (16-bit integer each component), providing \p num_out_vectors outputs. | ||||
|  * | ||||
|  * <b>Dispatcher Prototype</b> | ||||
|  * \code | ||||
|  * void volk_gnsssdr_16ic_xn_resampler_16ic_xn(lv_16sc_t** result, const lv_16sc_t* local_code, float* rem_code_phase_chips, float code_phase_step_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
|  * \endcode | ||||
|  * | ||||
|  * \b Inputs | ||||
|  * \li local_code:            One of the vectors to be multiplied. | ||||
|  * \li rem_code_phase_chips:  Remnant code phase [chips]. | ||||
|  * \li code_phase_step_chips: Phase increment per sample [chips/sample]. | ||||
|  * \li code_length_chips:     Code length in chips. | ||||
|  * \li num_out_vectors        Number of output vectors. | ||||
|  * \li num_output_samples:    The number of data values to be in the resampled vector. | ||||
|  * | ||||
|  * \b Outputs | ||||
|  * \li result:                Pointer to a vector of pointers where the results will be stored. | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef INCLUDED_volk_gnsssdr_16ic_xn_resampler2_16ic_xn_H | ||||
| #define INCLUDED_volk_gnsssdr_16ic_xn_resampler2_16ic_xn_H | ||||
|  | ||||
| #include <math.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr_common.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr_complex.h> | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_GENERIC | ||||
|  | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler2_16ic_xn_generic(lv_16sc_t** result, const lv_16sc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     int local_code_chip_index; | ||||
|     for (int current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) | ||||
|         { | ||||
|             for (int n = 0; n < num_output_samples; n++) | ||||
|                 { | ||||
|                     // resample code for current tap | ||||
|                     local_code_chip_index = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); | ||||
|                     local_code_chip_index = local_code_chip_index % code_length_chips; | ||||
|                     //Take into account that in multitap correlators, the shifts can be negative! | ||||
|                     if (local_code_chip_index < 0) local_code_chip_index += code_length_chips; | ||||
|                     result[current_correlator_tap][n] = local_code[local_code_chip_index]; | ||||
|                 } | ||||
|         } | ||||
| } | ||||
|  | ||||
| #endif /*LV_HAVE_GENERIC*/ | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_SSE4_1 | ||||
| #include <smmintrin.h> | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler2_16ic_xn_a_sse4_1(lv_16sc_t** result, const lv_16sc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     lv_16sc_t** _result = result; | ||||
|     const unsigned int quarterPoints = num_output_samples / 4; | ||||
|  | ||||
|     const __m128 fours = _mm_set1_ps(4.0f); | ||||
|     const __m128 rem_code_phase_chips_reg = _mm_set_ps1(rem_code_phase_chips); | ||||
|     const __m128 code_phase_step_chips_reg = _mm_set_ps1(code_phase_step_chips); | ||||
|  | ||||
|     __VOLK_ATTR_ALIGNED(16) int local_code_chip_index[4]; | ||||
|     int local_code_chip_index_; | ||||
|  | ||||
|     const __m128i zeros = _mm_setzero_si128(); | ||||
|     const __m128 code_length_chips_reg_f = _mm_set_ps1((float)code_length_chips); | ||||
|     const __m128i code_length_chips_reg_i = _mm_set1_epi32((int)code_length_chips); | ||||
|     __m128i local_code_chip_index_reg, aux_i, negatives, i; | ||||
|     __m128 aux, aux2, shifts_chips_reg, c, cTrunc, base; | ||||
|  | ||||
|     for (int current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) | ||||
|         { | ||||
|             shifts_chips_reg = _mm_set_ps1((float)shifts_chips[current_correlator_tap]); | ||||
|             aux2 = _mm_sub_ps(shifts_chips_reg, rem_code_phase_chips_reg); | ||||
|             __m128 indexn = _mm_set_ps(3.0f, 2.0f, 1.0f, 0.0f); | ||||
|             for(unsigned int n = 0; n < quarterPoints; n++) | ||||
|                 { | ||||
|                     aux = _mm_mul_ps(code_phase_step_chips_reg, indexn); | ||||
|                     aux = _mm_add_ps(aux, aux2); | ||||
|                     // floor | ||||
|                     aux = _mm_floor_ps(aux); | ||||
|  | ||||
|                     // fmod | ||||
|                     c = _mm_div_ps(aux, code_length_chips_reg_f); | ||||
|                     i = _mm_cvttps_epi32(c); | ||||
|                     cTrunc = _mm_cvtepi32_ps(i); | ||||
|                     base = _mm_mul_ps(cTrunc, code_length_chips_reg_f); | ||||
|                     local_code_chip_index_reg = _mm_cvtps_epi32(_mm_sub_ps(aux, base)); | ||||
|  | ||||
|                     negatives = _mm_cmplt_epi32(local_code_chip_index_reg, zeros); | ||||
|                     aux_i = _mm_and_si128(code_length_chips_reg_i, negatives); | ||||
|                     local_code_chip_index_reg = _mm_add_epi32(local_code_chip_index_reg, aux_i); | ||||
|                     _mm_store_si128((__m128i*)local_code_chip_index, local_code_chip_index_reg); | ||||
|                     for(unsigned int k = 0; k < 4; ++k) | ||||
|                         { | ||||
|                             _result[current_correlator_tap][n * 4 + k] = local_code[local_code_chip_index[k]]; | ||||
|                         } | ||||
|                     indexn = _mm_add_ps(indexn, fours); | ||||
|                 } | ||||
|             for(unsigned int n = quarterPoints * 4; n < num_output_samples; n++) | ||||
|                 { | ||||
|                     // resample code for current tap | ||||
|                     local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); | ||||
|                     local_code_chip_index_ = local_code_chip_index_ % code_length_chips; | ||||
|                     //Take into account that in multitap correlators, the shifts can be negative! | ||||
|                     if (local_code_chip_index_ < 0) local_code_chip_index_ += code_length_chips; | ||||
|                     _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; | ||||
|                 } | ||||
|         } | ||||
| } | ||||
| #endif  | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_SSE4_1 | ||||
| #include <smmintrin.h> | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler2_16ic_xn_u_sse4_1(lv_16sc_t** result, const lv_16sc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_a_sse4_1(result, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_output_samples); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_SSE3 | ||||
| #include <pmmintrin.h> | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler2_16ic_xn_a_sse3(lv_16sc_t** result, const lv_16sc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     lv_16sc_t** _result = result; | ||||
|     const unsigned int quarterPoints = num_output_samples / 4; | ||||
|  | ||||
|     const __m128 ones = _mm_set1_ps(1.0f); | ||||
|     const __m128 fours = _mm_set1_ps(4.0f); | ||||
|     const __m128 rem_code_phase_chips_reg = _mm_set_ps1(rem_code_phase_chips); | ||||
|     const __m128 code_phase_step_chips_reg = _mm_set_ps1(code_phase_step_chips); | ||||
|  | ||||
|     __VOLK_ATTR_ALIGNED(16) int local_code_chip_index[4]; | ||||
|     int local_code_chip_index_; | ||||
|  | ||||
|     const __m128i zeros = _mm_setzero_si128(); | ||||
|     const __m128 code_length_chips_reg_f = _mm_set_ps1((float)code_length_chips); | ||||
|     const __m128i code_length_chips_reg_i = _mm_set1_epi32((int)code_length_chips); | ||||
|     __m128i local_code_chip_index_reg, aux_i, negatives, i; | ||||
|     __m128 aux, aux2, shifts_chips_reg, fi, igx, j, c, cTrunc, base; | ||||
|  | ||||
|     for (int current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) | ||||
|         { | ||||
|             shifts_chips_reg = _mm_set_ps1((float)shifts_chips[current_correlator_tap]); | ||||
|             aux2 = _mm_sub_ps(shifts_chips_reg, rem_code_phase_chips_reg); | ||||
|             __m128 indexn = _mm_set_ps(3.0f, 2.0f, 1.0f, 0.0f); | ||||
|             for(unsigned int n = 0; n < quarterPoints; n++) | ||||
|                 { | ||||
|                     aux = _mm_mul_ps(code_phase_step_chips_reg, indexn); | ||||
|                     aux = _mm_add_ps(aux, aux2); | ||||
|                     // floor | ||||
|                     i = _mm_cvttps_epi32(aux); | ||||
|                     fi = _mm_cvtepi32_ps(i); | ||||
|                     igx = _mm_cmpgt_ps(fi, aux); | ||||
|                     j = _mm_and_ps(igx, ones); | ||||
|                     aux = _mm_sub_ps(fi, j); | ||||
|                     // fmod | ||||
|                     c = _mm_div_ps(aux, code_length_chips_reg_f); | ||||
|                     i = _mm_cvttps_epi32(c); | ||||
|                     cTrunc = _mm_cvtepi32_ps(i); | ||||
|                     base = _mm_mul_ps(cTrunc, code_length_chips_reg_f); | ||||
|                     local_code_chip_index_reg = _mm_cvtps_epi32(_mm_sub_ps(aux, base)); | ||||
|  | ||||
|                     negatives = _mm_cmplt_epi32(local_code_chip_index_reg, zeros); | ||||
|                     aux_i = _mm_and_si128(code_length_chips_reg_i, negatives); | ||||
|                     local_code_chip_index_reg = _mm_add_epi32(local_code_chip_index_reg, aux_i); | ||||
|                     _mm_store_si128((__m128i*)local_code_chip_index, local_code_chip_index_reg); | ||||
|                     for(unsigned int k = 0; k < 4; ++k) | ||||
|                         { | ||||
|                             _result[current_correlator_tap][n * 4 + k] = local_code[local_code_chip_index[k]]; | ||||
|                         } | ||||
|                     indexn = _mm_add_ps(indexn, fours); | ||||
|                 } | ||||
|             for(unsigned int n = quarterPoints * 4; n < num_output_samples; n++) | ||||
|                 { | ||||
|                     // resample code for current tap | ||||
|                     local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); | ||||
|                     local_code_chip_index_ = local_code_chip_index_ % code_length_chips; | ||||
|                     //Take into account that in multitap correlators, the shifts can be negative! | ||||
|                     if (local_code_chip_index_ < 0) local_code_chip_index_ += code_length_chips; | ||||
|                     _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; | ||||
|                 } | ||||
|         } | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_SSE3 | ||||
| #include <pmmintrin.h> | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler2_16ic_xn_u_sse3(lv_16sc_t** result, const lv_16sc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_a_sse3(result, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_output_samples); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_AVX | ||||
| #include <immintrin.h> | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler2_16ic_xn_a_avx(lv_16sc_t** result, const lv_16sc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     lv_16sc_t** _result = result; | ||||
|     const unsigned int avx_iters = num_output_samples / 8; | ||||
|  | ||||
|     const __m256 eights = _mm256_set1_ps(8.0f); | ||||
|     const __m256 rem_code_phase_chips_reg = _mm256_set1_ps(rem_code_phase_chips); | ||||
|     const __m256 code_phase_step_chips_reg = _mm256_set1_ps(code_phase_step_chips); | ||||
|  | ||||
|     __VOLK_ATTR_ALIGNED(32) int local_code_chip_index[8]; | ||||
|     int local_code_chip_index_; | ||||
|  | ||||
|     const __m256 zeros = _mm256_setzero_ps(); | ||||
|     const __m256 code_length_chips_reg_f = _mm256_set1_ps((float)code_length_chips); | ||||
|  | ||||
|     __m256i local_code_chip_index_reg, i; | ||||
|     __m256 aux, aux2, shifts_chips_reg, c, cTrunc, base, negatives; | ||||
|  | ||||
|     for (int current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) | ||||
|         { | ||||
|             shifts_chips_reg = _mm256_set1_ps((float)shifts_chips[current_correlator_tap]); | ||||
|             aux2 = _mm256_sub_ps(shifts_chips_reg, rem_code_phase_chips_reg); | ||||
|             __m256 indexn = _mm256_set_ps(7.0f, 6.0f, 5.0f, 4.0f, 3.0f, 2.0f, 1.0f, 0.0f); | ||||
|             for(unsigned int n = 0; n < avx_iters; n++) | ||||
|                 { | ||||
|                     aux = _mm256_mul_ps(code_phase_step_chips_reg, indexn); | ||||
|                     aux = _mm256_add_ps(aux, aux2); | ||||
|                     // floor | ||||
|                     aux = _mm256_floor_ps(aux); | ||||
|  | ||||
|                     // fmod | ||||
|                     c = _mm256_div_ps(aux, code_length_chips_reg_f); | ||||
|                     i = _mm256_cvttps_epi32(c); | ||||
|                     cTrunc = _mm256_cvtepi32_ps(i); | ||||
|                     base = _mm256_mul_ps(cTrunc, code_length_chips_reg_f); | ||||
|                     aux = _mm256_sub_ps(aux, base); | ||||
|  | ||||
|                     negatives = _mm256_cmp_ps(aux, zeros, 0x01); | ||||
|                     aux2 = _mm256_and_ps(code_length_chips_reg_f, negatives); | ||||
|                     local_code_chip_index_reg = _mm256_cvtps_epi32(_mm256_add_ps(aux, aux2)); | ||||
|                     _mm256_store_si256((__m256i*)local_code_chip_index, local_code_chip_index_reg); | ||||
|                     for(unsigned int k = 0; k < 8; ++k) | ||||
|                         { | ||||
|                             _result[current_correlator_tap][n * 8 + k] = local_code[local_code_chip_index[k]]; | ||||
|                         } | ||||
|                     indexn = _mm256_add_ps(indexn, eights); | ||||
|                 } | ||||
|  | ||||
|             for(unsigned int n = avx_iters * 8; n < num_output_samples; n++) | ||||
|                 { | ||||
|                     // resample code for current tap | ||||
|                     local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); | ||||
|                     local_code_chip_index_ = local_code_chip_index_ % code_length_chips; | ||||
|                     //Take into account that in multitap correlators, the shifts can be negative! | ||||
|                     if (local_code_chip_index_ < 0) local_code_chip_index_ += code_length_chips; | ||||
|                     _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; | ||||
|                 } | ||||
|         } | ||||
|     _mm256_zeroupper(); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_AVX | ||||
| #include <immintrin.h> | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler2_16ic_xn_u_avx(lv_16sc_t** result, const lv_16sc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     volk_gnsssdr_16ic_xn_resampler2_16ic_xn_a_avx(result, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_output_samples); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #ifdef LV_HAVE_NEON | ||||
| #include <arm_neon.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr_neon_intrinsics.h> | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler2_16ic_xn_neon(lv_16sc_t** result, const lv_16sc_t* local_code, float rem_code_phase_chips, float code_phase_step_chips, float* shifts_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     lv_16sc_t** _result = result; | ||||
|     const unsigned int neon_iters = num_output_samples / 4; | ||||
|     const int32x4_t ones = vdupq_n_s32(1); | ||||
|     const float32x4_t fours = vdupq_n_f32(4.0f); | ||||
|     const float32x4_t rem_code_phase_chips_reg = vdupq_n_f32(rem_code_phase_chips); | ||||
|     const float32x4_t code_phase_step_chips_reg = vdupq_n_f32(code_phase_step_chips); | ||||
|  | ||||
|     __attribute__((aligned(16))) int local_code_chip_index[4]; | ||||
|     int local_code_chip_index_; | ||||
|  | ||||
|     const int32x4_t zeros = vdupq_n_s32(0); | ||||
|     const float32x4_t code_length_chips_reg_f = vdupq_n_f32((float)code_length_chips); | ||||
|     const int32x4_t code_length_chips_reg_i = vdupq_n_s32((int)code_length_chips); | ||||
|     int32x4_t local_code_chip_index_reg, aux_i, negatives, i; | ||||
|     float32x4_t aux, aux2, shifts_chips_reg, fi, c, j, cTrunc, base; | ||||
|     __attribute__((aligned(16))) float vec[4] = { 3.0f, 2.0f, 1.0f, 0.0f }; | ||||
|     uint32x4_t igx; | ||||
|     float32x4_t half = vdupq_n_f32(0.5f); | ||||
|     float32x4_t sign, PlusHalf, Round; | ||||
|     for (int current_correlator_tap = 0; current_correlator_tap < num_out_vectors; current_correlator_tap++) | ||||
|         { | ||||
|             shifts_chips_reg = vdupq_n_f32((float)shifts_chips[current_correlator_tap]); | ||||
|             aux2 = vsubq_f32(shifts_chips_reg, rem_code_phase_chips_reg); | ||||
|             float32x4_t indexn = vld1q_f32((float*)vec); | ||||
|  | ||||
|             for(unsigned int n = 0; n < neon_iters; n++) | ||||
|                 { | ||||
|                     aux = vmulq_f32(code_phase_step_chips_reg, indexn); | ||||
|                     aux = vaddq_f32(aux, aux2); | ||||
|                     // floor | ||||
|                     i = vcvtq_s32_f32(aux); | ||||
|                     fi = vcvtq_f32_s32(i); | ||||
|                     igx = vcgtq_f32(fi, aux); | ||||
|                     j = vreinterpretq_f32_s32(vandq_s32(vreinterpretq_s32_u32(igx), ones)); | ||||
|                     aux = vsubq_f32(fi, j); | ||||
|  | ||||
|                     // fmod | ||||
|                     c = vdivq_f32(aux, code_length_chips_reg_f); | ||||
|                     i =  vcvtq_s32_f32(c); | ||||
|                     cTrunc = vcvtq_f32_s32(i); | ||||
|                     base = vmulq_f32(cTrunc, code_length_chips_reg_f); | ||||
|                     aux = vsubq_f32(aux, base); | ||||
|                     sign = vcvtq_f32_u32((vshrq_n_u32(vreinterpretq_u32_f32(aux), 31))); | ||||
|                     PlusHalf = vaddq_f32(aux, half); | ||||
|                     Round = vsubq_f32(PlusHalf, sign); | ||||
|                     local_code_chip_index_reg = vcvtq_s32_f32(Round); | ||||
|  | ||||
|                     negatives = vreinterpretq_s32_u32(vcltq_s32(local_code_chip_index_reg, zeros)); | ||||
|                     aux_i = vandq_s32(code_length_chips_reg_i, negatives); | ||||
|                     local_code_chip_index_reg = vaddq_s32(local_code_chip_index_reg, aux_i); | ||||
|                     vst1q_s32((int32_t*)local_code_chip_index, local_code_chip_index_reg); | ||||
|                     for(unsigned int k = 0; k < 4; ++k) | ||||
|                         { | ||||
|                             _result[current_correlator_tap][n * 4 + k] = local_code[local_code_chip_index[k]]; | ||||
|                         } | ||||
|                     indexn = vaddq_f32(indexn, fours); | ||||
|                 } | ||||
|             for(unsigned int n = neon_iters * 4; n < num_output_samples; n++) | ||||
|                 { | ||||
|                     // resample code for current tap | ||||
|                     local_code_chip_index_ = (int)floor(code_phase_step_chips * (float)n + shifts_chips[current_correlator_tap] - rem_code_phase_chips); | ||||
|                     local_code_chip_index_ = local_code_chip_index_ % code_length_chips; | ||||
|                     //Take into account that in multitap correlators, the shifts can be negative! | ||||
|                     if (local_code_chip_index_ < 0) local_code_chip_index_ += code_length_chips; | ||||
|                     _result[current_correlator_tap][n] = local_code[local_code_chip_index_]; | ||||
|                 } | ||||
|         } | ||||
| } | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif /*INCLUDED_volk_gnsssdr_16ic_xn_resampler_16ic_xn_H*/ | ||||
|  | ||||
| @@ -66,15 +66,9 @@ | ||||
| #include <volk_gnsssdr/volk_gnsssdr_common.h> | ||||
| #include <volk_gnsssdr/volk_gnsssdr_complex.h> | ||||
|  | ||||
| //#pragma STDC FENV_ACCESS ON | ||||
|  | ||||
| #ifdef LV_HAVE_GENERIC | ||||
|  | ||||
| //int round_int( float r ) { | ||||
| //    return (r > 0.0) ? (r + 0.5) : (r - 0.5); | ||||
| //} | ||||
|  | ||||
|  | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler_16ic_xn_generic(lv_16sc_t** result, const lv_16sc_t* local_code, float* rem_code_phase_chips, float code_phase_step_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     int local_code_chip_index; | ||||
| @@ -91,7 +85,6 @@ static inline void volk_gnsssdr_16ic_xn_resampler_16ic_xn_generic(lv_16sc_t** re | ||||
|                     result[current_vector][n] = local_code[local_code_chip_index]; | ||||
|                 } | ||||
|         } | ||||
|     //std::cout<<std::endl; | ||||
| } | ||||
|  | ||||
| #endif /*LV_HAVE_GENERIC*/ | ||||
| @@ -102,7 +95,7 @@ static inline void volk_gnsssdr_16ic_xn_resampler_16ic_xn_generic(lv_16sc_t** re | ||||
|  | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler_16ic_xn_a_sse2(lv_16sc_t** result, const lv_16sc_t* local_code, float* rem_code_phase_chips ,float code_phase_step_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     _MM_SET_ROUNDING_MODE (_MM_ROUND_NEAREST);//_MM_ROUND_NEAREST, _MM_ROUND_DOWN, _MM_ROUND_UP, _MM_ROUND_TOWARD_ZERO | ||||
|     _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST);//_MM_ROUND_NEAREST, _MM_ROUND_DOWN, _MM_ROUND_UP, _MM_ROUND_TOWARD_ZERO | ||||
|     unsigned int number; | ||||
|     const unsigned int quarterPoints = num_output_samples / 4; | ||||
|  | ||||
| @@ -195,7 +188,7 @@ static inline void volk_gnsssdr_16ic_xn_resampler_16ic_xn_a_sse2(lv_16sc_t** res | ||||
|  | ||||
| static inline void volk_gnsssdr_16ic_xn_resampler_16ic_xn_u_sse2(lv_16sc_t** result, const lv_16sc_t* local_code, float* rem_code_phase_chips ,float code_phase_step_chips, unsigned int code_length_chips, int num_out_vectors, unsigned int num_output_samples) | ||||
| { | ||||
|     _MM_SET_ROUNDING_MODE (_MM_ROUND_NEAREST);//_MM_ROUND_NEAREST, _MM_ROUND_DOWN, _MM_ROUND_UP, _MM_ROUND_TOWARD_ZERO | ||||
|     _MM_SET_ROUNDING_MODE(_MM_ROUND_NEAREST);//_MM_ROUND_NEAREST, _MM_ROUND_DOWN, _MM_ROUND_UP, _MM_ROUND_TOWARD_ZERO | ||||
|     unsigned int number; | ||||
|     const unsigned int quarterPoints = num_output_samples / 4; | ||||
|  | ||||
|   | ||||
| @@ -116,7 +116,7 @@ static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_u_sse3(lv_32fc_t* re | ||||
|        result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_32fc_xn_resampler_32fc_xn_a_sse3(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|     volk_gnsssdr_32fc_xn_resampler_32fc_xn_u_sse3(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); | ||||
|  | ||||
| @@ -146,7 +146,7 @@ static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_u_sse4_1(lv_32fc_t* | ||||
|        result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_32fc_xn_resampler_32fc_xn_a_sse4_1(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|     volk_gnsssdr_32fc_xn_resampler_32fc_xn_u_sse4_1(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); | ||||
|  | ||||
| @@ -233,7 +233,7 @@ static inline void volk_gnsssdr_32fc_resamplerxnpuppet_32fc_u_avx(lv_32fc_t* res | ||||
|        result_aux[n] = (lv_32fc_t*)volk_gnsssdr_malloc(sizeof(lv_32fc_t) * num_points, volk_gnsssdr_get_alignment()); | ||||
|     } | ||||
|  | ||||
|     volk_gnsssdr_32fc_xn_resampler_32fc_xn_a_avx(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|     volk_gnsssdr_32fc_xn_resampler_32fc_xn_u_avx(result_aux, local_code, rem_code_phase_chips, code_phase_step_chips, shifts_chips, code_length_chips, num_out_vectors, num_points); | ||||
|  | ||||
|     memcpy((lv_32fc_t*)result, (lv_32fc_t*)result_aux[0], sizeof(lv_32fc_t) * num_points); | ||||
|  | ||||
|   | ||||
| @@ -87,6 +87,7 @@ std::vector<volk_gnsssdr_test_case_t> init_test_list(volk_gnsssdr_test_params_t | ||||
|         (VOLK_INIT_PUPP(volk_gnsssdr_16ic_rotatorpuppet_16ic, volk_gnsssdr_16ic_s32fc_x2_rotator_16ic, test_params_int1)) | ||||
|         (VOLK_INIT_PUPP(volk_gnsssdr_16ic_resamplerpuppet_16ic, volk_gnsssdr_16ic_resampler_16ic, test_params)) | ||||
|         (VOLK_INIT_PUPP(volk_gnsssdr_16ic_resamplerxnpuppet_16ic, volk_gnsssdr_16ic_xn_resampler_16ic_xn, test_params)) | ||||
|         (VOLK_INIT_PUPP(volk_gnsssdr_16ic_resamplerxnpuppet2_16ic, volk_gnsssdr_16ic_xn_resampler2_16ic_xn, test_params)) | ||||
|         (VOLK_INIT_PUPP(volk_gnsssdr_32fc_resamplerxnpuppet_32fc, volk_gnsssdr_32fc_xn_resampler_32fc_xn, test_params)) | ||||
|         (VOLK_INIT_PUPP(volk_gnsssdr_16ic_x2_dotprodxnpuppet_16ic, volk_gnsssdr_16ic_x2_dot_prod_16ic_xn, test_params)) | ||||
|         (VOLK_INIT_PUPP(volk_gnsssdr_16ic_x2_rotator_dotprodxnpuppet_16ic, volk_gnsssdr_16ic_x2_rotator_dot_prod_16ic_xn, test_params_int16)) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Carles Fernandez
					Carles Fernandez