blob: 06be05f8577d423485e6a9be8919398288298642 [file] [log] [blame]
#include "jtest.h"
#include "arr_desc.h"
#include "arm_math.h"
#include "ref.h"
#include "type_abbrev.h"
#include "test_templates.h"
/*--------------------------------------------------------------------------------*/
/* Input Data */
/*--------------------------------------------------------------------------------*/
ARR_DESC_DEFINE(float32_t,
arm_sin_cos_degrees_f32,
9,
CURLY(
0,
17,
45,
90,
180,
360,
362,
-73,
-191.111
));
/* The Q31 version of the function maps numbers in the range [-1, 0.9999999]
* to degrees in the range [-180, 179]*/
ARR_DESC_DEFINE(q31_t,
arm_sin_cos_degrees_q31,
6,
CURLY(
0,
0x80000000, /* -1 */
0x7fffffff, /* 0.99999 */
/* Randoms */
0xf7badafa,
0x285954a1,
0xb9d09511
));
/*--------------------------------------------------------------------------------*/
/* Output Variables */
/*--------------------------------------------------------------------------------*/
float32_t sin_val_fut = 0;
float32_t cos_val_fut = 0;
float32_t sin_val_ref = 0;
float32_t cos_val_ref = 0;
/*--------------------------------------------------------------------------------*/
/* Test Definitions */
/*--------------------------------------------------------------------------------*/
#define MAX_DELTA_f32 50.0e-8f
#define ABS(x) ((x) > 0 ? (x) : -(x))
/*
Function to test correctness of sin_cos output by comparing it with reference library
*/
#define COMPARISON_INTERFACE(type, threshold) \
if ( (ABS((type) sin_val_ref - (type) sin_val_fut) > \
(type) threshold ) || \
(ABS((type) cos_val_ref - (type) cos_val_fut) > \
(type) threshold)) \
{ \
JTEST_DUMP_STRF("Error: %f %f\n", \
ABS((type) sin_val_ref - (type) sin_val_fut), \
ABS((type) cos_val_ref - (type) cos_val_fut)); \
return JTEST_TEST_FAILED; \
}
/*
Sine and cosine test function for float32_t input
*/
JTEST_DEFINE_TEST(arm_sin_cos_f32_test, arm_sin_cos_f32)
{
/* Test function for all input degree values */
TEMPLATE_DO_ARR_DESC(
degree_idx, TYPE_FROM_ABBREV(f32),
degree, arm_sin_cos_degrees_f32
,
/* Display cycle count and run test */
JTEST_COUNT_CYCLES(
arm_sin_cos_f32(
degree,
(TYPE_FROM_ABBREV(f32) *) &sin_val_fut,
(TYPE_FROM_ABBREV(f32) *) &cos_val_fut)
);
ref_sin_cos_f32(
degree,
(TYPE_FROM_ABBREV(f32) *) &sin_val_ref,
(TYPE_FROM_ABBREV(f32) *) &cos_val_ref);
/* Test correctness */
COMPARISON_INTERFACE(
TYPE_FROM_ABBREV(f32),
MAX_DELTA_f32));
return JTEST_TEST_PASSED;
}
/*
Sine and cosine test function for q31_t input
*/
JTEST_DEFINE_TEST(arm_sin_cos_q31_test,
arm_sin_cos_q31)
{
/* Test function for all input degree values */
TEMPLATE_DO_ARR_DESC(
degree_idx, TYPE_FROM_ABBREV(q31),
degree, arm_sin_cos_degrees_q31
,
/* Display cycle count and run test */
JTEST_COUNT_CYCLES(
arm_sin_cos_q31(
degree,
(TYPE_FROM_ABBREV(q31) *) &sin_val_fut,
(TYPE_FROM_ABBREV(q31) *) &cos_val_fut)
);
ref_sin_cos_q31(
degree,
(TYPE_FROM_ABBREV(q31) *) &sin_val_ref,
(TYPE_FROM_ABBREV(q31) *) &cos_val_ref);
/* Convert q31 numbers to float for comparison purposes. */
ref_q31_t_to_float((TYPE_FROM_ABBREV(q31) *) &sin_val_fut, &sin_val_fut, 1);
ref_q31_t_to_float((TYPE_FROM_ABBREV(q31) *) &cos_val_fut, &cos_val_fut, 1);
ref_q31_t_to_float((TYPE_FROM_ABBREV(q31) *) &sin_val_ref, &sin_val_ref, 1);
ref_q31_t_to_float((TYPE_FROM_ABBREV(q31) *) &cos_val_ref, &cos_val_ref, 1);
/* Test correctness */
COMPARISON_INTERFACE(
TYPE_FROM_ABBREV(f32),
MAX_DELTA_f32));
return JTEST_TEST_PASSED;
}
/*--------------------------------------------------------------------------------*/
/* Collect all tests in a group */
/*--------------------------------------------------------------------------------*/
JTEST_DEFINE_GROUP(sin_cos_tests)
{
/*
To skip a test, comment it out.
*/
JTEST_TEST_CALL(arm_sin_cos_f32_test);
JTEST_TEST_CALL(arm_sin_cos_q31_test);
}