#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); }