mirror of
https://github.com/gnss-sdr/gnss-sdr
synced 2024-12-14 20:20:35 +00:00
Still some bugs to fix in 16sc dot product. All fixed now.
This commit is contained in:
parent
fd2af02aec
commit
4ba75a3fbe
@ -40,7 +40,6 @@
|
|||||||
#include <volk_gnsssdr/volk_gnsssdr_common.h>
|
#include <volk_gnsssdr/volk_gnsssdr_common.h>
|
||||||
#include <volk_gnsssdr/volk_gnsssdr_complex.h>
|
#include <volk_gnsssdr/volk_gnsssdr_complex.h>
|
||||||
#include <volk_gnsssdr/saturation_arithmetic.h>
|
#include <volk_gnsssdr/saturation_arithmetic.h>
|
||||||
//#include <stdio.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef LV_HAVE_GENERIC
|
#ifdef LV_HAVE_GENERIC
|
||||||
@ -56,11 +55,9 @@ static inline void volk_gnsssdr_16ic_x2_dot_prod_16ic_generic(lv_16sc_t* result,
|
|||||||
result[0] = lv_cmake((int16_t)0, (int16_t)0);
|
result[0] = lv_cmake((int16_t)0, (int16_t)0);
|
||||||
for (unsigned int n = 0; n < num_points; n++)
|
for (unsigned int n = 0; n < num_points; n++)
|
||||||
{
|
{
|
||||||
//r*a.r - i*a.i, i*a.r + r*a.i
|
|
||||||
lv_16sc_t tmp = in_a[n] * in_b[n];
|
lv_16sc_t tmp = in_a[n] * in_b[n];
|
||||||
result[0] += lv_cmake(sat_adds16i(lv_creal(tmp), lv_creal(tmp)), sat_adds16i(lv_cimag(tmp), lv_cimag(tmp) ));
|
result[0] = lv_cmake(sat_adds16i(lv_creal(result[0]), lv_creal(tmp)), sat_adds16i(lv_cimag(result[0]), lv_cimag(tmp) ));
|
||||||
}
|
}
|
||||||
//printf("generic result = %i,%i", lv_creal(result[0]),lv_cimag(result[0]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /*LV_HAVE_GENERIC*/
|
#endif /*LV_HAVE_GENERIC*/
|
||||||
@ -70,7 +67,6 @@ static inline void volk_gnsssdr_16ic_x2_dot_prod_16ic_generic(lv_16sc_t* result,
|
|||||||
#include <emmintrin.h>
|
#include <emmintrin.h>
|
||||||
static inline void volk_gnsssdr_16ic_x2_dot_prod_16ic_a_sse2(lv_16sc_t* out, const lv_16sc_t* in_a, const lv_16sc_t* in_b, unsigned int num_points)
|
static inline void volk_gnsssdr_16ic_x2_dot_prod_16ic_a_sse2(lv_16sc_t* out, const lv_16sc_t* in_a, const lv_16sc_t* in_b, unsigned int num_points)
|
||||||
{
|
{
|
||||||
|
|
||||||
lv_16sc_t dotProduct = lv_cmake((int16_t)0, (int16_t)0);
|
lv_16sc_t dotProduct = lv_cmake((int16_t)0, (int16_t)0);
|
||||||
|
|
||||||
const unsigned int sse_iters = num_points / 4;
|
const unsigned int sse_iters = num_points / 4;
|
||||||
@ -127,14 +123,14 @@ static inline void volk_gnsssdr_16ic_x2_dot_prod_16ic_a_sse2(lv_16sc_t* out, con
|
|||||||
|
|
||||||
for (int i = 0; i < 4; ++i)
|
for (int i = 0; i < 4; ++i)
|
||||||
{
|
{
|
||||||
dotProduct += lv_cmake(sat_adds16i(lv_creal(dotProductVector[i]), lv_creal(dotProductVector[i])), sat_adds16i(lv_cimag(dotProductVector[i]), lv_cimag(dotProductVector[i])));
|
dotProduct = lv_cmake(sat_adds16i(lv_creal(dotProduct), lv_creal(dotProductVector[i])), sat_adds16i(lv_cimag(dotProduct), lv_cimag(dotProductVector[i])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned int i = sse_iters * 4; i < num_points; ++i)
|
for (unsigned int i = 0; i < (num_points % 4); ++i)
|
||||||
{
|
{
|
||||||
lv_16sc_t tmp = (*_in_a++) * (*_in_b++);
|
lv_16sc_t tmp = (*_in_a++) * (*_in_b++);
|
||||||
dotProduct += lv_cmake( sat_adds16i(lv_creal(tmp), lv_creal(tmp)), sat_adds16i(lv_cimag(tmp), lv_cimag(tmp)));
|
dotProduct = lv_cmake( sat_adds16i(lv_creal(dotProduct), lv_creal(tmp)), sat_adds16i(lv_cimag(dotProduct), lv_cimag(tmp)));
|
||||||
}
|
}
|
||||||
|
|
||||||
*_out = dotProduct;
|
*_out = dotProduct;
|
||||||
|
Loading…
Reference in New Issue
Block a user