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