summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--volk/include/volk/Makefile.am2
-rw-r--r--volk/include/volk/volk_16ic_deinterleave_real_8i_a16.h6
-rw-r--r--volk/include/volk/volk_32fc_s32f_deinterleave_real_16i_a16.h (renamed from volk/include/volk/volk_32fc_deinterleave_real_16i_a16.h)10
-rw-r--r--volk/lib/qa_utils.cc51
-rw-r--r--volk/lib/testqa.cc34
5 files changed, 68 insertions, 35 deletions
diff --git a/volk/include/volk/Makefile.am b/volk/include/volk/Makefile.am
index 83f386c6c..79da0effb 100644
--- a/volk/include/volk/Makefile.am
+++ b/volk/include/volk/Makefile.am
@@ -68,7 +68,7 @@ volkinclude_HEADERS = \
volk_32fc_x2_conjugate_dot_prod_32fc_a16.h \
volk_32fc_deinterleave_32f_x2_a16.h \
volk_32fc_deinterleave_64f_x2_a16.h \
- volk_32fc_deinterleave_real_16i_a16.h \
+ volk_32fc_s32f_deinterleave_real_16i_a16.h \
volk_32fc_deinterleave_real_32f_a16.h \
volk_32fc_deinterleave_real_64f_a16.h \
volk_32fc_x2_dot_prod_32fc_a16.h \
diff --git a/volk/include/volk/volk_16ic_deinterleave_real_8i_a16.h b/volk/include/volk/volk_16ic_deinterleave_real_8i_a16.h
index 437d5ab6b..55a25702e 100644
--- a/volk/include/volk/volk_16ic_deinterleave_real_8i_a16.h
+++ b/volk/include/volk/volk_16ic_deinterleave_real_8i_a16.h
@@ -53,7 +53,7 @@ static inline void volk_16ic_deinterleave_real_8i_a16_ssse3(int8_t* iBuffer, con
number = sixteenthPoints * 16;
int16_t* int16ComplexVectorPtr = (int16_t*)complexVectorPtr;
for(; number < num_points; number++){
- *iBufferPtr++ = ((int8_t)(*int16ComplexVectorPtr++ / 256));
+ *iBufferPtr++ = ((int8_t)(*int16ComplexVectorPtr++ >> 8));
int16ComplexVectorPtr++;
}
}
@@ -68,10 +68,10 @@ static inline void volk_16ic_deinterleave_real_8i_a16_ssse3(int8_t* iBuffer, con
*/
static inline void volk_16ic_deinterleave_real_8i_a16_generic(int8_t* iBuffer, const lv_16sc_t* complexVector, unsigned int num_points){
unsigned int number = 0;
- const int16_t* complexVectorPtr = (int16_t*)complexVector;
+ int16_t* complexVectorPtr = (int16_t*)complexVector;
int8_t* iBufferPtr = iBuffer;
for(number = 0; number < num_points; number++){
- *iBufferPtr++ = (int8_t)(*complexVectorPtr++ / 256);
+ *iBufferPtr++ = ((int8_t)(*complexVectorPtr++ >> 8));
complexVectorPtr++;
}
}
diff --git a/volk/include/volk/volk_32fc_deinterleave_real_16i_a16.h b/volk/include/volk/volk_32fc_s32f_deinterleave_real_16i_a16.h
index 6042e6d62..31465bff9 100644
--- a/volk/include/volk/volk_32fc_deinterleave_real_16i_a16.h
+++ b/volk/include/volk/volk_32fc_s32f_deinterleave_real_16i_a16.h
@@ -1,5 +1,5 @@
-#ifndef INCLUDED_volk_32fc_deinterleave_real_16i_a16_H
-#define INCLUDED_volk_32fc_deinterleave_real_16i_a16_H
+#ifndef INCLUDED_volk_32fc_s32f_deinterleave_real_16i_a16_H
+#define INCLUDED_volk_32fc_s32f_deinterleave_real_16i_a16_H
#include <inttypes.h>
#include <stdio.h>
@@ -13,7 +13,7 @@
\param iBuffer The I buffer output data
\param num_points The number of complex data values to be deinterleaved
*/
-static inline void volk_32fc_deinterleave_real_16i_a16_sse(int16_t* iBuffer, const lv_32fc_t* complexVector, const float scalar, unsigned int num_points){
+static inline void volk_32fc_s32f_deinterleave_real_16i_a16_sse(int16_t* iBuffer, const lv_32fc_t* complexVector, const float scalar, unsigned int num_points){
unsigned int number = 0;
const unsigned int quarterPoints = num_points / 4;
@@ -62,7 +62,7 @@ static inline void volk_32fc_deinterleave_real_16i_a16_sse(int16_t* iBuffer, con
\param iBuffer The I buffer output data
\param num_points The number of complex data values to be deinterleaved
*/
-static inline void volk_32fc_deinterleave_real_16i_a16_generic(int16_t* iBuffer, const lv_32fc_t* complexVector, const float scalar, unsigned int num_points){
+static inline void volk_32fc_s32f_deinterleave_real_16i_a16_generic(int16_t* iBuffer, const lv_32fc_t* complexVector, const float scalar, unsigned int num_points){
const float* complexVectorPtr = (float*)complexVector;
int16_t* iBufferPtr = iBuffer;
unsigned int number = 0;
@@ -77,4 +77,4 @@ static inline void volk_32fc_deinterleave_real_16i_a16_generic(int16_t* iBuffer,
-#endif /* INCLUDED_volk_32fc_deinterleave_real_16i_a16_H */
+#endif /* INCLUDED_volk_32fc_s32f_deinterleave_real_16i_a16_H */
diff --git a/volk/lib/qa_utils.cc b/volk/lib/qa_utils.cc
index 4c151bd6f..8f57a9b90 100644
--- a/volk/lib/qa_utils.cc
+++ b/volk/lib/qa_utils.cc
@@ -253,6 +253,7 @@ bool fcompare(t *in1, t *in2, unsigned int vlen, float tol) {
bool fail = false;
int print_max_errs = 10;
for(int i=0; i<vlen; i++) {
+ if(((t *)(in1))[i] < 1e-30) continue; //below around here we'll start to get roundoff errors due to float precision
if(fabs(((t *)(in1))[i] - ((t *)(in2))[i])/(((t *)in1)[i]) > tol) {
fail=true;
if(print_max_errs-- > 0) {
@@ -265,14 +266,14 @@ bool fcompare(t *in1, t *in2, unsigned int vlen, float tol) {
}
template <class t>
-bool icompare(t *in1, t *in2, unsigned int vlen, float tol) {
+bool icompare(t *in1, t *in2, unsigned int vlen, unsigned int tol) {
bool fail = false;
int print_max_errs = 10;
for(int i=0; i<vlen; i++) {
- if(((t *)(in1))[i] != ((t *)(in2))[i]) {
+ if(abs(((t *)(in1))[i] - ((t *)(in2))[i]) > tol) {
fail=true;
if(print_max_errs-- > 0) {
- std::cout << "offset " << i << " in1: " << int(((t *)(in1))[i]) << " in2: " << int(((t *)(in2))[i]) << std::endl;
+ std::cout << "offset " << i << " in1: " << static_cast<int>(t(((t *)(in1))[i])) << " in2: " << static_cast<int>(t(((t *)(in2))[i])) << std::endl;
}
}
}
@@ -339,21 +340,21 @@ bool run_volk_tests(const int archs[], void (*manual_func)(), std::string name,
if(inputsc.size() == 0) {
run_cast_test1((volk_fn_1arg)(manual_func), outbuffs[i], vlen, iter, arch_list[i]);
} else if(inputsc.size() == 1 && inputsc[0].is_float) {
- run_cast_test1_s32f((volk_fn_1arg_s32f)(manual_func), outbuffs[i], 255.0, vlen, iter, arch_list[i]);
+ run_cast_test1_s32f((volk_fn_1arg_s32f)(manual_func), outbuffs[i], 127.0, vlen, iter, arch_list[i]);
} else throw "unsupported 1 arg function >1 scalars";
break;
case 2:
if(inputsc.size() == 0) {
run_cast_test2((volk_fn_2arg)(manual_func), outbuffs[i], inbuffs, vlen, iter, arch_list[i]);
} else if(inputsc.size() == 1 && inputsc[0].is_float) {
- run_cast_test2_s32f((volk_fn_2arg_s32f)(manual_func), outbuffs[i], inbuffs, 255.0, vlen, iter, arch_list[i]);
+ run_cast_test2_s32f((volk_fn_2arg_s32f)(manual_func), outbuffs[i], inbuffs, 127.0, vlen, iter, arch_list[i]);
} else throw "unsupported 2 arg function >1 scalars";
break;
case 3:
if(inputsc.size() == 0) {
run_cast_test3((volk_fn_3arg)(manual_func), outbuffs[i], inbuffs, vlen, iter, arch_list[i]);
} else if(inputsc.size() == 1 && inputsc[0].is_float) {
- run_cast_test3_s32f((volk_fn_3arg_s32f)(manual_func), outbuffs[i], inbuffs, 255.0, vlen, iter, arch_list[i]);
+ run_cast_test3_s32f((volk_fn_3arg_s32f)(manual_func), outbuffs[i], inbuffs, 127.0, vlen, iter, arch_list[i]);
} else throw "unsupported 3 arg function >1 scalars";
break;
case 4:
@@ -375,7 +376,7 @@ bool run_volk_tests(const int archs[], void (*manual_func)(), std::string name,
//now compare
if(outputsig.size() == 0) outputsig = inputsig; //a hack, i know
-
+ //TODO: loop over the output signature as well
bool fail = false;
for(int i=0; i<arch_list.size(); i++) {
if(i != generic_offset) {
@@ -386,7 +387,41 @@ bool run_volk_tests(const int archs[], void (*manual_func)(), std::string name,
fail = fcompare((float *) outbuffs[generic_offset], (float *) outbuffs[i], vlen*(outputsig[0].is_complex ? 2 : 1), tol);
}
} else {
- fail = memcmp(outbuffs[generic_offset], outbuffs[i], outputsig[0].size * vlen * (outputsig[0].is_complex ? 2:1));
+ //i could replace this whole switch statement with a memcmp if i wasn't interested in printing the outputs where they differ
+ switch(outputsig[0].size) {
+ case 8:
+ if(outputsig[0].is_signed) {
+ fail = icompare((int64_t *) outbuffs[generic_offset], (int64_t *) outbuffs[i], vlen*(outputsig[0].is_complex ? 2 : 1), tol);
+ } else {
+ fail = icompare((uint64_t *) outbuffs[generic_offset], (uint64_t *) outbuffs[i], vlen*(outputsig[0].is_complex ? 2 : 1), tol);
+ }
+ break;
+ case 4:
+ if(outputsig[0].is_signed) {
+ fail = icompare((int32_t *) outbuffs[generic_offset], (int32_t *) outbuffs[i], vlen*(outputsig[0].is_complex ? 2 : 1), tol);
+ } else {
+ fail = icompare((uint32_t *) outbuffs[generic_offset], (uint32_t *) outbuffs[i], vlen*(outputsig[0].is_complex ? 2 : 1), tol);
+ }
+ break;
+ case 2:
+ if(outputsig[0].is_signed) {
+ fail = icompare((int16_t *) outbuffs[generic_offset], (int16_t *) outbuffs[i], vlen*(outputsig[0].is_complex ? 2 : 1), tol);
+ } else {
+ fail = icompare((uint16_t *) outbuffs[generic_offset], (uint16_t *) outbuffs[i], vlen*(outputsig[0].is_complex ? 2 : 1), tol);
+ }
+ break;
+ case 1:
+ if(outputsig[0].is_signed) {
+ fail = icompare((int8_t *) outbuffs[generic_offset], (int8_t *) outbuffs[i], vlen*(outputsig[0].is_complex ? 2 : 1), tol);
+ } else {
+ fail = icompare((uint8_t *) outbuffs[generic_offset], (uint8_t *) outbuffs[i], vlen*(outputsig[0].is_complex ? 2 : 1), tol);
+ }
+ break;
+ default:
+ fail=1;
+ }
+
+ //fail = memcmp(outbuffs[generic_offset], outbuffs[i], outputsig[0].size * vlen * (outputsig[0].is_complex ? 2:1));
}
if(fail) {
std::cout << name << ": fail on arch " << arch_list[i] << std::endl;
diff --git a/volk/lib/testqa.cc b/volk/lib/testqa.cc
index 1ee264fb4..f813e843f 100644
--- a/volk/lib/testqa.cc
+++ b/volk/lib/testqa.cc
@@ -11,18 +11,16 @@ BOOST_AUTO_TEST_CASE(volk_test_all) {
// VOLK_RUN_TESTS(volk_16ic_s32f_deinterleave_32f_x2_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_16ic_deinterleave_real_16i_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_16ic_s32f_deinterleave_real_32f_a16, 1e-5, 2046, 10000);
- VOLK_RUN_TESTS(volk_16ic_deinterleave_real_8i_a16, 1e-4, 2046, 10000);
+ VOLK_RUN_TESTS(volk_16ic_deinterleave_real_8i_a16, 0, 2046, 10000);
// VOLK_RUN_TESTS(volk_16ic_deinterleave_16i_x2_a16, 1e-4, 2046, 10000);
// VOLK_RUN_TESTS(volk_16ic_s32f_deinterleave_32f_x2_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_16ic_deinterleave_real_16i_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_16ic_s32f_deinterleave_real_32f_a16, 1e-5, 2046, 10000);
- VOLK_RUN_TESTS(volk_16ic_deinterleave_real_8i_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_16ic_magnitude_16i_a16, 1e-4, 2046, 10000);
+ VOLK_RUN_TESTS(volk_16ic_magnitude_16i_a16, 1, 2046, 10000);
VOLK_RUN_TESTS(volk_16ic_s32f_magnitude_32f_a16, 1e-5, 2046, 10000);
VOLK_RUN_TESTS(volk_16i_s32f_convert_32f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_16i_s32f_convert_32f_u, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_16i_convert_8i_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_16i_convert_8i_u, 1e-4, 2046, 10000);
+ VOLK_RUN_TESTS(volk_16i_convert_8i_a16, 0, 2046, 10000);
+ VOLK_RUN_TESTS(volk_16i_convert_8i_u, 0, 2046, 10000);
// VOLK_RUN_TESTS(volk_16i_max_star_16i_a16, 1e-4, 2046, 10000);
// VOLK_RUN_TESTS(volk_16i_max_star_horizontal_16i_a16, 1e-4, 2046, 10000);
// VOLK_RUN_TESTS(volk_16i_permute_and_scalar_add_a16, 1e-4, 2046, 10000);
@@ -37,7 +35,7 @@ BOOST_AUTO_TEST_CASE(volk_test_all) {
VOLK_RUN_TESTS(volk_32fc_x2_conjugate_dot_prod_32fc_a16, 1e-4, 2046, 10000);
// VOLK_RUN_TESTS(volk_32fc_deinterleave_32f_x2_a16, 1e-4, 2046, 10000);
// VOLK_RUN_TESTS(volk_32fc_deinterleave_64f_x2_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32fc_deinterleave_real_16i_a16, 1e-4, 2046, 10000);
+ VOLK_RUN_TESTS(volk_32fc_s32f_deinterleave_real_16i_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32fc_deinterleave_real_32f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32fc_deinterleave_real_64f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32fc_x2_dot_prod_32fc_a16, 1e-4, 2046, 10000);
@@ -45,25 +43,25 @@ BOOST_AUTO_TEST_CASE(volk_test_all) {
VOLK_RUN_TESTS(volk_32fc_s32f_magnitude_16i_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32fc_magnitude_32f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32fc_x2_multiply_32fc_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_s32f_convert_16i_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_s32f_convert_16i_u, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_s32f_convert_32i_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_s32f_convert_32i_u, 1e-4, 2046, 10000);
+ VOLK_RUN_TESTS(volk_32f_s32f_convert_16i_a16, 1, 2046, 10000);
+ VOLK_RUN_TESTS(volk_32f_s32f_convert_16i_u, 1, 2046, 10000);
+ VOLK_RUN_TESTS(volk_32f_s32f_convert_32i_a16, 1, 2046, 10000);
+ VOLK_RUN_TESTS(volk_32f_s32f_convert_32i_u, 1, 2046, 10000);
VOLK_RUN_TESTS(volk_32f_convert_64f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32f_convert_64f_u, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_s32f_convert_8i_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_s32f_convert_8i_u, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32fc_s32f_x2_power_spectral_density_32f_a16, 1e-4, 2046, 10000);
+ VOLK_RUN_TESTS(volk_32f_s32f_convert_8i_a16, 1, 2046, 10000);
+ VOLK_RUN_TESTS(volk_32f_s32f_convert_8i_u, 1, 2046, 10000);
+// VOLK_RUN_TESTS(volk_32fc_s32f_x2_power_spectral_density_32f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32fc_s32f_power_spectrum_32f_a16, 1e-4, 2046, 10000);
// VOLK_RUN_TESTS(volk_32fc_x2_square_dist_32f_a16, 1e-4, 2046, 10000);
// VOLK_RUN_TESTS(volk_32fc_x2_s32f_square_dist_scalar_mult_32f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32f_x2_divide_32f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32f_x2_dot_prod_32f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32f_x2_dot_prod_32f_u, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_s32f_32f_fm_detect_32f_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_index_max_16u_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_x2_s32f_interleave_16ic_a16, 1e-4, 2046, 10000);
- VOLK_RUN_TESTS(volk_32f_x2_interleave_32fc_a16, 1e-4, 2046, 10000);
+ //VOLK_RUN_TESTS(volk_32f_s32f_32f_fm_detect_32f_a16, 1e-4, 2046, 10000);
+ //VOLK_RUN_TESTS(volk_32f_index_max_16u_a16, 1e-4, 2046, 10000);
+ VOLK_RUN_TESTS(volk_32f_x2_s32f_interleave_16ic_a16, 1, 2046, 10000);
+ VOLK_RUN_TESTS(volk_32f_x2_interleave_32fc_a16, 1, 2046, 10000);
VOLK_RUN_TESTS(volk_32f_x2_max_32f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32f_x2_min_32f_a16, 1e-4, 2046, 10000);
VOLK_RUN_TESTS(volk_32f_x2_multiply_32f_a16, 1e-4, 2046, 10000);