From 53f148de84f3f31d352460e70cb70df55a5546a8 Mon Sep 17 00:00:00 2001 From: Stephanos Ioannidis Date: Fri, 20 Aug 2021 16:59:42 +0900 Subject: [PATCH] tests: lib: cmsis_dsp: filtering: Update MISC Q15 tests for 1.9.0 This commit updates the filtering MISC Q15 test patterns and implementations for the CMSIS-DSP 1.9.0. Signed-off-by: Stephanos Ioannidis --- tests/lib/cmsis_dsp/filtering/src/misc_q15.c | 205 +++++++++++++++++- .../lib/cmsis_dsp/filtering/src/misc_q15.pat | 50 +++++ 2 files changed, 250 insertions(+), 5 deletions(-) diff --git a/tests/lib/cmsis_dsp/filtering/src/misc_q15.c b/tests/lib/cmsis_dsp/filtering/src/misc_q15.c index f31ba9f8d33..2cde1e03b20 100644 --- a/tests/lib/cmsis_dsp/filtering/src/misc_q15.c +++ b/tests/lib/cmsis_dsp/filtering/src/misc_q15.c @@ -1,6 +1,6 @@ /* - * Copyright (c) 2020 Stephanos Ioannidis - * Copyright (C) 2010-2020 ARM Limited or its affiliates. All rights reserved. + * Copyright (c) 2021 Stephanos Ioannidis + * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 */ @@ -13,8 +13,9 @@ #include "misc_q15.pat" -#define SNR_ERROR_THRESH ((float32_t)70) -#define ABS_ERROR_THRESH_Q15 ((q15_t)10) +#define SNR_ERROR_THRESH ((float32_t)70) +#define ABS_ERROR_THRESH_Q15 ((q15_t)10) +#define ABS_ERROR_THRESH_FAST_Q15 ((q15_t)20) static void test_arm_correlate_q15( size_t in1_length, size_t in2_length, const q15_t *ref, @@ -130,6 +131,188 @@ DEFINE_CONV_TEST(32, 17); DEFINE_CONV_TEST(32, 18); DEFINE_CONV_TEST(32, 33); +static void test_arm_conv_partial_q15( + size_t first, size_t in1_length, size_t in2_length, const q15_t *ref, + size_t ref_length) +{ + q15_t *output; + q15_t *temp; + arm_status status; + + /* Allocate output buffer */ + output = calloc(first + ref_length, sizeof(q15_t)); + temp = calloc(ref_length, sizeof(q15_t)); + + /* Run test function */ + status = arm_conv_partial_q15( + in_partial1, in1_length, in_partial2, in2_length, + output, first, ref_length); + + zassert_equal(status, ARM_MATH_SUCCESS, + ASSERT_MSG_INCORRECT_COMP_RESULT); + + memcpy(temp, &output[first], ref_length * sizeof(q15_t)); + + /* Validate output */ + zassert_true( + test_snr_error_q15(ref_length, ref, temp, SNR_ERROR_THRESH), + ASSERT_MSG_SNR_LIMIT_EXCEED); + + zassert_true( + test_near_equal_q15(ref_length, ref, temp, + ABS_ERROR_THRESH_Q15), + ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); + + /* Free output buffer */ + free(output); + free(temp); +} + +static void test_arm_conv_partial_fast_q15( + size_t first, size_t in1_length, size_t in2_length, const q15_t *ref, + size_t ref_length) +{ + q15_t *output; + q15_t *temp; + arm_status status; + + /* Allocate output buffer */ + output = calloc(first + ref_length, sizeof(q15_t)); + temp = calloc(ref_length, sizeof(q15_t)); + + /* Run test function */ + status = arm_conv_partial_fast_q15( + in_partial1, in1_length, in_partial2, in2_length, + output, first, ref_length); + + zassert_equal(status, ARM_MATH_SUCCESS, + ASSERT_MSG_INCORRECT_COMP_RESULT); + + memcpy(temp, &output[first], ref_length * sizeof(q15_t)); + + /* Validate output */ + zassert_true( + test_snr_error_q15(ref_length, ref, temp, SNR_ERROR_THRESH), + ASSERT_MSG_SNR_LIMIT_EXCEED); + + zassert_true( + test_near_equal_q15(ref_length, ref, temp, + ABS_ERROR_THRESH_FAST_Q15), + ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); + + /* Free output buffer */ + free(output); + free(temp); +} + +static void test_arm_conv_partial_opt_q15( + size_t first, size_t in1_length, size_t in2_length, const q15_t *ref, + size_t ref_length) +{ + q15_t *output; + q15_t *temp; + q15_t *scratch1, *scratch2; + arm_status status; + + /* Allocate output buffer */ + output = calloc(first + ref_length, sizeof(q15_t)); + temp = calloc(ref_length, sizeof(q15_t)); + scratch1 = calloc(24, sizeof(q15_t)); + scratch2 = calloc(24, sizeof(q15_t)); + + /* Run test function */ + status = arm_conv_partial_opt_q15( + in_partial1, in1_length, in_partial2, in2_length, + output, first, ref_length, + scratch1, scratch2); + + zassert_equal(status, ARM_MATH_SUCCESS, + ASSERT_MSG_INCORRECT_COMP_RESULT); + + memcpy(temp, &output[first], ref_length * sizeof(q15_t)); + + /* Validate output */ + zassert_true( + test_snr_error_q15(ref_length, ref, temp, SNR_ERROR_THRESH), + ASSERT_MSG_SNR_LIMIT_EXCEED); + + zassert_true( + test_near_equal_q15(ref_length, ref, temp, + ABS_ERROR_THRESH_FAST_Q15), + ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); + + /* Free output buffer */ + free(output); + free(temp); + free(scratch1); + free(scratch2); +} + +static void test_arm_conv_partial_fast_opt_q15( + size_t first, size_t in1_length, size_t in2_length, const q15_t *ref, + size_t ref_length) +{ + q15_t *output; + q15_t *temp; + q15_t *scratch1, *scratch2; + arm_status status; + + /* Allocate output buffer */ + output = calloc(first + ref_length, sizeof(q15_t)); + temp = calloc(ref_length, sizeof(q15_t)); + scratch1 = calloc(24, sizeof(q15_t)); + scratch2 = calloc(24, sizeof(q15_t)); + + /* Run test function */ + status = arm_conv_partial_fast_opt_q15( + in_partial1, in1_length, in_partial2, in2_length, + output, first, ref_length, + scratch1, scratch2); + + zassert_equal(status, ARM_MATH_SUCCESS, + ASSERT_MSG_INCORRECT_COMP_RESULT); + + memcpy(temp, &output[first], ref_length * sizeof(q15_t)); + + /* Validate output */ + zassert_true( + test_snr_error_q15(ref_length, ref, temp, SNR_ERROR_THRESH), + ASSERT_MSG_SNR_LIMIT_EXCEED); + + zassert_true( + test_near_equal_q15(ref_length, ref, temp, + ABS_ERROR_THRESH_FAST_Q15), + ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); + + /* Free output buffer */ + free(output); + free(temp); + free(scratch1); + free(scratch2); +} + +#define DEFINE_CONV_PARTIAL_TEST(a, b, c) \ + DEFINE_TEST_VARIANT5( \ + arm_conv_partial_q15, a##_##b##_##c, a, b, c, \ + ref_conv_partial_##a##_##b##_##c, \ + ARRAY_SIZE(ref_conv_partial_##a##_##b##_##c)) \ + DEFINE_TEST_VARIANT5( \ + arm_conv_partial_fast_q15, a##_##b##_##c, a, b, c, \ + ref_conv_partial_##a##_##b##_##c, \ + ARRAY_SIZE(ref_conv_partial_##a##_##b##_##c)) \ + DEFINE_TEST_VARIANT5( \ + arm_conv_partial_opt_q15, a##_##b##_##c, a, b, c, \ + ref_conv_partial_##a##_##b##_##c, \ + ARRAY_SIZE(ref_conv_partial_##a##_##b##_##c)) \ + DEFINE_TEST_VARIANT5( \ + arm_conv_partial_fast_opt_q15, a##_##b##_##c, a, b, c, \ + ref_conv_partial_##a##_##b##_##c, \ + ARRAY_SIZE(ref_conv_partial_##a##_##b##_##c)) + +DEFINE_CONV_PARTIAL_TEST(3, 6, 8); +DEFINE_CONV_PARTIAL_TEST(9, 6, 8); +DEFINE_CONV_PARTIAL_TEST(7, 6, 8); + void test_filtering_misc_q15(void) { ztest_test_suite(filtering_misc_q15, @@ -182,7 +365,19 @@ void test_filtering_misc_q15(void) ztest_unit_test(test_arm_conv_q15_32_16), ztest_unit_test(test_arm_conv_q15_32_17), ztest_unit_test(test_arm_conv_q15_32_18), - ztest_unit_test(test_arm_conv_q15_32_33) + ztest_unit_test(test_arm_conv_q15_32_33), + ztest_unit_test(test_arm_conv_partial_q15_3_6_8), + ztest_unit_test(test_arm_conv_partial_q15_9_6_8), + ztest_unit_test(test_arm_conv_partial_q15_7_6_8), + ztest_unit_test(test_arm_conv_partial_fast_q15_3_6_8), + ztest_unit_test(test_arm_conv_partial_fast_q15_9_6_8), + ztest_unit_test(test_arm_conv_partial_fast_q15_7_6_8), + ztest_unit_test(test_arm_conv_partial_opt_q15_3_6_8), + ztest_unit_test(test_arm_conv_partial_opt_q15_9_6_8), + ztest_unit_test(test_arm_conv_partial_opt_q15_7_6_8), + ztest_unit_test(test_arm_conv_partial_fast_opt_q15_3_6_8), + ztest_unit_test(test_arm_conv_partial_fast_opt_q15_9_6_8), + ztest_unit_test(test_arm_conv_partial_fast_opt_q15_7_6_8) ); ztest_run_test_suite(filtering_misc_q15); diff --git a/tests/lib/cmsis_dsp/filtering/src/misc_q15.pat b/tests/lib/cmsis_dsp/filtering/src/misc_q15.pat index 29748bc6a30..6c3191c83e5 100644 --- a/tests/lib/cmsis_dsp/filtering/src/misc_q15.pat +++ b/tests/lib/cmsis_dsp/filtering/src/misc_q15.pat @@ -36,6 +36,44 @@ static const q15_t in_com2[128] = { 0xE2B5, 0x3A7F, 0xDC23, 0xF699, 0xE13B, 0x146F, 0x2BA2, 0xE3AC }; +static const q15_t in_partial1[128] = { + 0x6FB3, 0x0F54, 0x7FFF, 0x0E22, 0x05CB, 0xA8EF, 0x1CA1, 0x1186, + 0xDC25, 0xF8E1, 0x2F69, 0x1EDC, 0x0AB5, 0x2FE2, 0x33BA, 0x6A94, + 0xEB74, 0x34BF, 0xC92F, 0x3C78, 0x1BBD, 0x4F33, 0xD9BF, 0x2150, + 0x1696, 0xEC42, 0xFD13, 0xD3E2, 0x2459, 0x225C, 0x30FC, 0x2BC9, + 0xD37E, 0x2953, 0x573A, 0x1A1C, 0x1BD0, 0x2048, 0xA7AA, 0xD25B, + 0x19BC, 0x1A02, 0xFC2C, 0x2111, 0xE7D8, 0x3BB0, 0x19A7, 0xD890, + 0x56E5, 0x149C, 0xE617, 0x0515, 0x0E13, 0x2B88, 0x0B3D, 0x322F, + 0x23AB, 0x1208, 0x1038, 0xE696, 0x19BD, 0x1674, 0xE7B1, 0x1562, + 0x45B4, 0xFB05, 0xF2A4, 0xBBD4, 0xD1E8, 0xBE66, 0x3804, 0xFC48, + 0xE403, 0x34C8, 0x1801, 0xDE4C, 0xFD27, 0x1B1C, 0xBFFB, 0x1F08, + 0xE61F, 0x166A, 0x2390, 0x0D02, 0x186F, 0x12AA, 0x1031, 0x0BD5, + 0x1C4E, 0x4ED0, 0xE999, 0xD919, 0xE21F, 0x1FB6, 0xACE8, 0xC400, + 0xE780, 0x10BA, 0xA6FF, 0x07C7, 0x9AD8, 0x6A71, 0x0C40, 0x3015, + 0xDC29, 0xBFB3, 0xCCCA, 0x222E, 0x051E, 0xDA07, 0x502D, 0x0866, + 0xD162, 0xFFE5, 0x0E2A, 0xF858, 0x18B0, 0xBE37, 0xFB5A, 0xDC92, + 0xFD95, 0x3709, 0x1687, 0xCE71, 0x0578, 0xC542, 0x0112, 0xEC46 + }; + +static const q15_t in_partial2[128] = { + 0x1641, 0x52F0, 0x1B50, 0x2507, 0xD6A1, 0xD60C, 0x21F8, 0x3324, + 0xEE6F, 0xF2D6, 0xAC64, 0x3783, 0x2EF4, 0xC46B, 0xB3CB, 0xDB05, + 0xC429, 0xE63D, 0xF672, 0x2602, 0xEA6A, 0xF10B, 0xD974, 0xCBE7, + 0x9AC7, 0x5E5D, 0x06A9, 0x1A5F, 0x33E3, 0xEBE5, 0xEAD9, 0xE37C, + 0xDA86, 0xF0ED, 0x1E21, 0x0F69, 0xB999, 0x2D58, 0x26AC, 0x4000, + 0xBC47, 0xFD45, 0x3270, 0xCBBE, 0x2E9C, 0xDB5E, 0xF991, 0xB49C, + 0xF2F1, 0xF68B, 0xAD3A, 0x4EB7, 0xC9CE, 0x4D4C, 0xFDB6, 0x1047, + 0xF693, 0xD66D, 0x1CC9, 0x0271, 0xF998, 0x276D, 0x05C9, 0x01EB, + 0x464C, 0xF9F7, 0xF5D2, 0x368B, 0x374E, 0x0DA5, 0xDF99, 0x0CB8, + 0x6031, 0x0677, 0xFD6B, 0xB882, 0xF267, 0xD799, 0xEDFE, 0x8000, + 0xD780, 0x04F9, 0x4E9F, 0xA875, 0x8FF0, 0xEED7, 0x18CC, 0x1B45, + 0x9B33, 0xF73D, 0x0CF3, 0x05FF, 0x2C07, 0xFAC8, 0xDB2A, 0x1B0A, + 0xE6A5, 0xF5D1, 0xC3B6, 0x1533, 0xF0AF, 0xDF2A, 0xF586, 0x1136, + 0x38F6, 0xF003, 0x3704, 0x1C10, 0xC4B7, 0x093F, 0xA87B, 0x4A42, + 0xDCB6, 0xB6DC, 0xD61A, 0x3DEB, 0x08A0, 0x398C, 0xE67C, 0x16E7, + 0x0DDD, 0x3F0B, 0x1039, 0xA885, 0xE47A, 0x0AA8, 0x1BBF, 0xC9A2 + }; + static const q15_t ref_correlate_14_15[29] = { 0xFF46, 0x0BF7, 0xEC48, 0xE15E, 0x20E5, 0x06E3, 0x036D, 0xFEE6, 0xF728, 0x39EA, 0x56F4, 0xDF7E, 0x1A7F, 0xBCDB, 0x13EE, 0x249C, @@ -462,3 +500,15 @@ static const q15_t ref_conv_32_33[64] = { 0xCB86, 0xFFFD, 0x11F8, 0xED32, 0xF40C, 0x0853, 0x05CC, 0x00CD }; +static const q15_t ref_conv_partial_3_6_8[4] = { + 0x78FA, 0x05CF, 0xF317, 0xBC29 + }; + +static const q15_t ref_conv_partial_9_6_8[4] = { + 0x5122, 0x23B9, 0xEB35, 0xDD37 + }; + +static const q15_t ref_conv_partial_7_6_8[4] = { + 0xF146, 0x0868, 0x5122, 0x23B9 + }; +