mirror of https://github.com/gnss-sdr/gnss-sdr
462 lines
20 KiB
C
462 lines
20 KiB
C
/*!
|
|
* \file volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3.h
|
|
* \brief Volk protokernel: performs the carrier wipe-off mixing and the Early, Prompt, and Late correlation with 32 bits vectors
|
|
* \authors <ul>
|
|
* <li> Andrés Cecilia, 2014. a.cecilia.luque(at)gmail.com
|
|
* </ul>
|
|
*
|
|
* Volk protokernel that performs the carrier wipe-off mixing and the
|
|
* Early, Prompt, and Late correlation with 32 bits vectors (16 bits the
|
|
* real part and 16 bits the imaginary part):
|
|
* - The carrier wipe-off is done by multiplying the input signal by the
|
|
* carrier (multiplication of 32 bits vectors) It returns the input
|
|
* signal in base band (BB)
|
|
* - Early values are calculated by multiplying the input signal in BB by the
|
|
* early code (multiplication of 32 bits vectors), accumulating the results
|
|
* - Prompt values are calculated by multiplying the input signal in BB by the
|
|
* prompt code (multiplication of 32 bits vectors), accumulating the results
|
|
* - Late values are calculated by multiplying the input signal in BB by the
|
|
* late code (multiplication of 32 bits vectors), accumulating the results
|
|
*
|
|
* -------------------------------------------------------------------------
|
|
*
|
|
* Copyright (C) 2010-2014 (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_gnsssdr_volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_u_H
|
|
#define INCLUDED_gnsssdr_volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_u_H
|
|
|
|
#include <inttypes.h>
|
|
#include <stdio.h>
|
|
#include <volk_gnsssdr/volk_gnsssdr_complex.h>
|
|
#include <float.h>
|
|
#include <string.h>
|
|
|
|
#ifdef LV_HAVE_SSE4_1
|
|
#include <smmintrin.h>
|
|
#include "CommonMacros/CommonMacros_16ic_cw_epl_corr_32fc.h"
|
|
#include "CommonMacros/CommonMacros.h"
|
|
/*!
|
|
\brief Performs the carrier wipe-off mixing and the Early, Prompt, and Late correlation
|
|
\param input The input signal input
|
|
\param carrier The carrier signal input
|
|
\param E_code Early PRN code replica input
|
|
\param P_code Early PRN code replica input
|
|
\param L_code Early PRN code replica input
|
|
\param E_out Early correlation output
|
|
\param P_out Early correlation output
|
|
\param L_out Early correlation output
|
|
\param num_points The number of complex values in vectors
|
|
*/
|
|
static inline void volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_u_sse4_1(lv_32fc_t* E_out, lv_32fc_t* P_out, lv_32fc_t* L_out, const lv_16sc_t* input, const lv_16sc_t* carrier, const lv_16sc_t* E_code, const lv_16sc_t* P_code, const lv_16sc_t* L_code, unsigned int num_points)
|
|
{
|
|
const unsigned int sse_iters = num_points / 8;
|
|
|
|
__m128i x1, x2, y1, y2, real_bb_signal_sample, imag_bb_signal_sample;
|
|
__m128i mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_output, imag_output;
|
|
|
|
__m128 real_E_code_acc, imag_E_code_acc, real_P_code_acc, imag_P_code_acc, real_L_code_acc, imag_L_code_acc;
|
|
__m128i input_i_1, input_i_2, output_i32;
|
|
__m128 real_output_ps, imag_output_ps;
|
|
|
|
float E_out_real = 0;
|
|
float E_out_imag = 0;
|
|
float P_out_real = 0;
|
|
float P_out_imag = 0;
|
|
float L_out_real = 0;
|
|
float L_out_imag = 0;
|
|
|
|
const lv_16sc_t* input_ptr = input;
|
|
const lv_16sc_t* carrier_ptr = carrier;
|
|
|
|
const lv_16sc_t* E_code_ptr = E_code;
|
|
lv_32fc_t* E_out_ptr = E_out;
|
|
const lv_16sc_t* L_code_ptr = L_code;
|
|
lv_32fc_t* L_out_ptr = L_out;
|
|
const lv_16sc_t* P_code_ptr = P_code;
|
|
lv_32fc_t* P_out_ptr = P_out;
|
|
|
|
*E_out_ptr = 0;
|
|
*P_out_ptr = 0;
|
|
*L_out_ptr = 0;
|
|
|
|
mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255);
|
|
|
|
real_E_code_acc = _mm_setzero_ps();
|
|
imag_E_code_acc = _mm_setzero_ps();
|
|
real_P_code_acc = _mm_setzero_ps();
|
|
imag_P_code_acc = _mm_setzero_ps();
|
|
real_L_code_acc = _mm_setzero_ps();
|
|
imag_L_code_acc = _mm_setzero_ps();
|
|
|
|
if (sse_iters>0)
|
|
{
|
|
for(unsigned int number = 0;number < sse_iters; number++){
|
|
|
|
//Perform the carrier wipe-off
|
|
x1 = _mm_lddqu_si128((__m128i*)input_ptr);
|
|
input_ptr += 4;
|
|
x2 = _mm_lddqu_si128((__m128i*)input_ptr);
|
|
|
|
y1 = _mm_lddqu_si128((__m128i*)carrier_ptr);
|
|
carrier_ptr += 4;
|
|
y2 = _mm_lddqu_si128((__m128i*)carrier_ptr);
|
|
|
|
CM_16IC_X2_REARRANGE_VECTOR_INTO_REAL_IMAG_16IC_X2_U_SSE4_1(x1, x2, realx, imagx)
|
|
CM_16IC_X2_REARRANGE_VECTOR_INTO_REAL_IMAG_16IC_X2_U_SSE4_1(y1, y2, realy, imagy)
|
|
CM_16IC_X4_SCALAR_PRODUCT_16IC_X2_U_SSE2(realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_bb_signal_sample, imag_bb_signal_sample)
|
|
|
|
//Get early values
|
|
y1 = _mm_lddqu_si128((__m128i*)E_code_ptr);
|
|
E_code_ptr += 4;
|
|
y2 = _mm_lddqu_si128((__m128i*)E_code_ptr);
|
|
|
|
CM_16IC_X2_CW_CORR_32FC_X2_U_SSE4_1(y1, y2, realy, imagy, real_bb_signal_sample, imag_bb_signal_sample,realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_output, imag_output, input_i_1, input_i_2, output_i32, real_output_ps, imag_output_ps)
|
|
|
|
//Adds the float 32 results
|
|
real_E_code_acc = _mm_add_ps (real_E_code_acc, real_output_ps);
|
|
imag_E_code_acc = _mm_add_ps (imag_E_code_acc, imag_output_ps);
|
|
|
|
//Get prompt values
|
|
y1 = _mm_lddqu_si128((__m128i*)P_code_ptr);
|
|
P_code_ptr += 4;
|
|
y2 = _mm_lddqu_si128((__m128i*)P_code_ptr);
|
|
|
|
CM_16IC_X2_CW_CORR_32FC_X2_U_SSE4_1(y1, y2, realy, imagy, real_bb_signal_sample, imag_bb_signal_sample,realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_output, imag_output, input_i_1, input_i_2, output_i32, real_output_ps, imag_output_ps)
|
|
|
|
real_P_code_acc = _mm_add_ps (real_P_code_acc, real_output_ps);
|
|
imag_P_code_acc = _mm_add_ps (imag_P_code_acc, imag_output_ps);
|
|
|
|
//Get late values
|
|
y1 = _mm_lddqu_si128((__m128i*)L_code_ptr);
|
|
L_code_ptr += 4;
|
|
y2 = _mm_lddqu_si128((__m128i*)L_code_ptr);
|
|
|
|
CM_16IC_X2_CW_CORR_32FC_X2_U_SSE4_1(y1, y2, realy, imagy, real_bb_signal_sample, imag_bb_signal_sample,realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_output, imag_output, input_i_1, input_i_2, output_i32, real_output_ps, imag_output_ps)
|
|
|
|
real_L_code_acc = _mm_add_ps (real_L_code_acc, real_output_ps);
|
|
imag_L_code_acc = _mm_add_ps (imag_L_code_acc, imag_output_ps);
|
|
|
|
input_ptr += 4;
|
|
carrier_ptr += 4;
|
|
E_code_ptr += 4;
|
|
P_code_ptr += 4;
|
|
L_code_ptr += 4;
|
|
}
|
|
|
|
__VOLK_ATTR_ALIGNED(16) float real_E_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float imag_E_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float real_P_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float imag_P_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float real_L_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float imag_L_dotProductVector[4];
|
|
|
|
_mm_storeu_ps((float*)real_E_dotProductVector,real_E_code_acc); // Store the results back into the dot product vector
|
|
_mm_storeu_ps((float*)imag_E_dotProductVector,imag_E_code_acc); // Store the results back into the dot product vector
|
|
_mm_storeu_ps((float*)real_P_dotProductVector,real_P_code_acc); // Store the results back into the dot product vector
|
|
_mm_storeu_ps((float*)imag_P_dotProductVector,imag_P_code_acc); // Store the results back into the dot product vector
|
|
_mm_storeu_ps((float*)real_L_dotProductVector,real_L_code_acc); // Store the results back into the dot product vector
|
|
_mm_storeu_ps((float*)imag_L_dotProductVector,imag_L_code_acc); // Store the results back into the dot product vector
|
|
|
|
for (int i = 0; i<4; ++i)
|
|
{
|
|
E_out_real += real_E_dotProductVector[i];
|
|
E_out_imag += imag_E_dotProductVector[i];
|
|
P_out_real += real_P_dotProductVector[i];
|
|
P_out_imag += imag_P_dotProductVector[i];
|
|
L_out_real += real_L_dotProductVector[i];
|
|
L_out_imag += imag_L_dotProductVector[i];
|
|
}
|
|
*E_out_ptr = lv_cmake(E_out_real, E_out_imag);
|
|
*P_out_ptr = lv_cmake(P_out_real, P_out_imag);
|
|
*L_out_ptr = lv_cmake(L_out_real, L_out_imag);
|
|
}
|
|
|
|
lv_16sc_t bb_signal_sample;
|
|
for(unsigned int i=0; i < num_points%8; ++i)
|
|
{
|
|
//Perform the carrier wipe-off
|
|
bb_signal_sample = (*input_ptr++) * (*carrier_ptr++);
|
|
// Now get early, late, and prompt values for each
|
|
*E_out_ptr += (lv_32fc_t) (bb_signal_sample * (*E_code_ptr++));
|
|
*P_out_ptr += (lv_32fc_t) (bb_signal_sample * (*P_code_ptr++));
|
|
*L_out_ptr += (lv_32fc_t) (bb_signal_sample * (*L_code_ptr++));
|
|
}
|
|
|
|
}
|
|
#endif /* LV_HAVE_SSE4_1 */
|
|
|
|
#ifdef LV_HAVE_GENERIC
|
|
/*!
|
|
\brief Performs the carrier wipe-off mixing and the Early, Prompt, and Late correlation
|
|
\param input The input signal input
|
|
\param carrier The carrier signal input
|
|
\param E_code Early PRN code replica input
|
|
\param P_code Early PRN code replica input
|
|
\param L_code Early PRN code replica input
|
|
\param E_out Early correlation output
|
|
\param P_out Early correlation output
|
|
\param L_out Early correlation output
|
|
\param num_points The number of complex values in vectors
|
|
*/
|
|
static inline void volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_generic(lv_32fc_t* E_out, lv_32fc_t* P_out, lv_32fc_t* L_out, const lv_16sc_t* input, const lv_16sc_t* carrier, const lv_16sc_t* E_code, const lv_16sc_t* P_code, const lv_16sc_t* L_code, unsigned int num_points)
|
|
{
|
|
lv_16sc_t bb_signal_sample;
|
|
lv_16sc_t tmp1;
|
|
lv_16sc_t tmp2;
|
|
lv_16sc_t tmp3;
|
|
|
|
bb_signal_sample = lv_cmake(0, 0);
|
|
|
|
*E_out = 0;
|
|
*P_out = 0;
|
|
*L_out = 0;
|
|
// perform Early, Prompt and Late correlation
|
|
|
|
for(unsigned int i=0; i < num_points; ++i)
|
|
{
|
|
//Perform the carrier wipe-off
|
|
bb_signal_sample = input[i] * carrier[i];
|
|
|
|
tmp1 = bb_signal_sample * E_code[i];
|
|
tmp2 = bb_signal_sample * P_code[i];
|
|
tmp3 = bb_signal_sample * L_code[i];
|
|
|
|
// Now get early, late, and prompt values for each
|
|
*E_out += (lv_32fc_t)tmp1;
|
|
*P_out += (lv_32fc_t)tmp2;
|
|
*L_out += (lv_32fc_t)tmp3;
|
|
}
|
|
}
|
|
#endif /* LV_HAVE_GENERIC */
|
|
#endif /* INCLUDED_gnsssdr_volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_u_H */
|
|
|
|
|
|
#ifndef INCLUDED_gnsssdr_volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_a_H
|
|
#define INCLUDED_gnsssdr_volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_a_H
|
|
|
|
#include <inttypes.h>
|
|
#include <stdio.h>
|
|
#include <volk_gnsssdr/volk_gnsssdr_complex.h>
|
|
#include <float.h>
|
|
#include <string.h>
|
|
|
|
#ifdef LV_HAVE_SSE4_1
|
|
#include <smmintrin.h>
|
|
#include "CommonMacros/CommonMacros_16ic_cw_epl_corr_32fc.h"
|
|
#include "CommonMacros/CommonMacros.h"
|
|
/*!
|
|
\brief Performs the carrier wipe-off mixing and the Early, Prompt, and Late correlation
|
|
\param input The input signal input
|
|
\param carrier The carrier signal input
|
|
\param E_code Early PRN code replica input
|
|
\param P_code Early PRN code replica input
|
|
\param L_code Early PRN code replica input
|
|
\param E_out Early correlation output
|
|
\param P_out Early correlation output
|
|
\param L_out Early correlation output
|
|
\param num_points The number of complex values in vectors
|
|
*/
|
|
static inline void volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_a_sse4_1(lv_32fc_t* E_out, lv_32fc_t* P_out, lv_32fc_t* L_out, const lv_16sc_t* input, const lv_16sc_t* carrier, const lv_16sc_t* E_code, const lv_16sc_t* P_code, const lv_16sc_t* L_code, unsigned int num_points)
|
|
{
|
|
const unsigned int sse_iters = num_points / 8;
|
|
|
|
__m128i x1, x2, y1, y2, real_bb_signal_sample, imag_bb_signal_sample;
|
|
__m128i mult1, realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_output, imag_output;
|
|
|
|
__m128 real_E_code_acc, imag_E_code_acc, real_P_code_acc, imag_P_code_acc, real_L_code_acc, imag_L_code_acc;
|
|
__m128i input_i_1, input_i_2, output_i32;
|
|
__m128 real_output_ps, imag_output_ps;
|
|
|
|
float E_out_real = 0;
|
|
float E_out_imag = 0;
|
|
float P_out_real = 0;
|
|
float P_out_imag = 0;
|
|
float L_out_real = 0;
|
|
float L_out_imag = 0;
|
|
|
|
const lv_16sc_t* input_ptr = input;
|
|
const lv_16sc_t* carrier_ptr = carrier;
|
|
|
|
const lv_16sc_t* E_code_ptr = E_code;
|
|
lv_32fc_t* E_out_ptr = E_out;
|
|
const lv_16sc_t* L_code_ptr = L_code;
|
|
lv_32fc_t* L_out_ptr = L_out;
|
|
const lv_16sc_t* P_code_ptr = P_code;
|
|
lv_32fc_t* P_out_ptr = P_out;
|
|
|
|
*E_out_ptr = 0;
|
|
*P_out_ptr = 0;
|
|
*L_out_ptr = 0;
|
|
|
|
mult1 = _mm_set_epi8(0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255);
|
|
|
|
real_E_code_acc = _mm_setzero_ps();
|
|
imag_E_code_acc = _mm_setzero_ps();
|
|
real_P_code_acc = _mm_setzero_ps();
|
|
imag_P_code_acc = _mm_setzero_ps();
|
|
real_L_code_acc = _mm_setzero_ps();
|
|
imag_L_code_acc = _mm_setzero_ps();
|
|
|
|
if (sse_iters>0)
|
|
{
|
|
for(unsigned int number = 0;number < sse_iters; number++){
|
|
|
|
//Perform the carrier wipe-off
|
|
x1 = _mm_load_si128((__m128i*)input_ptr);
|
|
input_ptr += 4;
|
|
x2 = _mm_load_si128((__m128i*)input_ptr);
|
|
|
|
y1 = _mm_load_si128((__m128i*)carrier_ptr);
|
|
carrier_ptr += 4;
|
|
y2 = _mm_load_si128((__m128i*)carrier_ptr);
|
|
|
|
CM_16IC_X2_REARRANGE_VECTOR_INTO_REAL_IMAG_16IC_X2_U_SSE4_1(x1, x2, realx, imagx)
|
|
CM_16IC_X2_REARRANGE_VECTOR_INTO_REAL_IMAG_16IC_X2_U_SSE4_1(y1, y2, realy, imagy)
|
|
CM_16IC_X4_SCALAR_PRODUCT_16IC_X2_U_SSE2(realx, imagx, realy, imagy, realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_bb_signal_sample, imag_bb_signal_sample)
|
|
|
|
//Get early values
|
|
y1 = _mm_load_si128((__m128i*)E_code_ptr);
|
|
E_code_ptr += 4;
|
|
y2 = _mm_load_si128((__m128i*)E_code_ptr);
|
|
|
|
CM_16IC_X2_CW_CORR_32FC_X2_U_SSE4_1(y1, y2, realy, imagy, real_bb_signal_sample, imag_bb_signal_sample,realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_output, imag_output, input_i_1, input_i_2, output_i32, real_output_ps, imag_output_ps)
|
|
|
|
//Adds the float 32 results
|
|
real_E_code_acc = _mm_add_ps (real_E_code_acc, real_output_ps);
|
|
imag_E_code_acc = _mm_add_ps (imag_E_code_acc, imag_output_ps);
|
|
|
|
//Get prompt values
|
|
y1 = _mm_load_si128((__m128i*)P_code_ptr);
|
|
P_code_ptr += 4;
|
|
y2 = _mm_load_si128((__m128i*)P_code_ptr);
|
|
|
|
CM_16IC_X2_CW_CORR_32FC_X2_U_SSE4_1(y1, y2, realy, imagy, real_bb_signal_sample, imag_bb_signal_sample,realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_output, imag_output, input_i_1, input_i_2, output_i32, real_output_ps, imag_output_ps)
|
|
|
|
real_P_code_acc = _mm_add_ps (real_P_code_acc, real_output_ps);
|
|
imag_P_code_acc = _mm_add_ps (imag_P_code_acc, imag_output_ps);
|
|
|
|
//Get late values
|
|
y1 = _mm_load_si128((__m128i*)L_code_ptr);
|
|
L_code_ptr += 4;
|
|
y2 = _mm_load_si128((__m128i*)L_code_ptr);
|
|
|
|
CM_16IC_X2_CW_CORR_32FC_X2_U_SSE4_1(y1, y2, realy, imagy, real_bb_signal_sample, imag_bb_signal_sample,realx_mult_realy, imagx_mult_imagy, realx_mult_imagy, imagx_mult_realy, real_output, imag_output, input_i_1, input_i_2, output_i32, real_output_ps, imag_output_ps)
|
|
|
|
real_L_code_acc = _mm_add_ps (real_L_code_acc, real_output_ps);
|
|
imag_L_code_acc = _mm_add_ps (imag_L_code_acc, imag_output_ps);
|
|
|
|
input_ptr += 4;
|
|
carrier_ptr += 4;
|
|
E_code_ptr += 4;
|
|
P_code_ptr += 4;
|
|
L_code_ptr += 4;
|
|
}
|
|
|
|
__VOLK_ATTR_ALIGNED(16) float real_E_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float imag_E_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float real_P_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float imag_P_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float real_L_dotProductVector[4];
|
|
__VOLK_ATTR_ALIGNED(16) float imag_L_dotProductVector[4];
|
|
|
|
_mm_store_ps((float*)real_E_dotProductVector,real_E_code_acc); // Store the results back into the dot product vector
|
|
_mm_store_ps((float*)imag_E_dotProductVector,imag_E_code_acc); // Store the results back into the dot product vector
|
|
_mm_store_ps((float*)real_P_dotProductVector,real_P_code_acc); // Store the results back into the dot product vector
|
|
_mm_store_ps((float*)imag_P_dotProductVector,imag_P_code_acc); // Store the results back into the dot product vector
|
|
_mm_store_ps((float*)real_L_dotProductVector,real_L_code_acc); // Store the results back into the dot product vector
|
|
_mm_store_ps((float*)imag_L_dotProductVector,imag_L_code_acc); // Store the results back into the dot product vector
|
|
|
|
for (int i = 0; i<4; ++i)
|
|
{
|
|
E_out_real += real_E_dotProductVector[i];
|
|
E_out_imag += imag_E_dotProductVector[i];
|
|
P_out_real += real_P_dotProductVector[i];
|
|
P_out_imag += imag_P_dotProductVector[i];
|
|
L_out_real += real_L_dotProductVector[i];
|
|
L_out_imag += imag_L_dotProductVector[i];
|
|
}
|
|
*E_out_ptr = lv_cmake(E_out_real, E_out_imag);
|
|
*P_out_ptr = lv_cmake(P_out_real, P_out_imag);
|
|
*L_out_ptr = lv_cmake(L_out_real, L_out_imag);
|
|
}
|
|
|
|
lv_16sc_t bb_signal_sample;
|
|
for(unsigned int i=0; i < num_points%8; ++i)
|
|
{
|
|
//Perform the carrier wipe-off
|
|
bb_signal_sample = (*input_ptr++) * (*carrier_ptr++);
|
|
// Now get early, late, and prompt values for each
|
|
*E_out_ptr += (lv_32fc_t) (bb_signal_sample * (*E_code_ptr++));
|
|
*P_out_ptr += (lv_32fc_t) (bb_signal_sample * (*P_code_ptr++));
|
|
*L_out_ptr += (lv_32fc_t) (bb_signal_sample * (*L_code_ptr++));
|
|
}
|
|
|
|
}
|
|
#endif /* LV_HAVE_SSE4_1 */
|
|
|
|
#ifdef LV_HAVE_GENERIC
|
|
/*!
|
|
\brief Performs the carrier wipe-off mixing and the Early, Prompt, and Late correlation
|
|
\param input The input signal input
|
|
\param carrier The carrier signal input
|
|
\param E_code Early PRN code replica input
|
|
\param P_code Early PRN code replica input
|
|
\param L_code Early PRN code replica input
|
|
\param E_out Early correlation output
|
|
\param P_out Early correlation output
|
|
\param L_out Early correlation output
|
|
\param num_points The number of complex values in vectors
|
|
*/
|
|
static inline void volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_a_generic(lv_32fc_t* E_out, lv_32fc_t* P_out, lv_32fc_t* L_out, const lv_16sc_t* input, const lv_16sc_t* carrier, const lv_16sc_t* E_code, const lv_16sc_t* P_code, const lv_16sc_t* L_code, unsigned int num_points)
|
|
{
|
|
lv_16sc_t bb_signal_sample;
|
|
lv_16sc_t tmp1;
|
|
lv_16sc_t tmp2;
|
|
lv_16sc_t tmp3;
|
|
|
|
bb_signal_sample = lv_cmake(0, 0);
|
|
|
|
*E_out = 0;
|
|
*P_out = 0;
|
|
*L_out = 0;
|
|
// perform Early, Prompt and Late correlation
|
|
|
|
for(unsigned int i=0; i < num_points; ++i)
|
|
{
|
|
//Perform the carrier wipe-off
|
|
bb_signal_sample = input[i] * carrier[i];
|
|
|
|
tmp1 = bb_signal_sample * E_code[i];
|
|
tmp2 = bb_signal_sample * P_code[i];
|
|
tmp3 = bb_signal_sample * L_code[i];
|
|
|
|
// Now get early, late, and prompt values for each
|
|
*E_out += (lv_32fc_t)tmp1;
|
|
*P_out += (lv_32fc_t)tmp2;
|
|
*L_out += (lv_32fc_t)tmp3;
|
|
}
|
|
}
|
|
#endif /* LV_HAVE_GENERIC */
|
|
#endif /* INCLUDED_gnsssdr_volk_gnsssdr_16ic_x5_cw_epl_corr_32fc_x3_a_H */
|