| /* |
| * Copyright (c) 2021 Stephanos Ioannidis <root@stephanos.io> |
| * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <ztest.h> |
| #include <zephyr.h> |
| #include <stdlib.h> |
| #include <arm_math.h> |
| #include "../../common/test_common.h" |
| |
| #include "misc_q31.pat" |
| |
| #define SNR_ERROR_THRESH ((float32_t)100) |
| #define ABS_ERROR_THRESH_Q31 ((q31_t)2) |
| #define ABS_ERROR_THRESH_FAST_Q31 ((q31_t)11) |
| #define ABS_ERROR_THRESH_LD_Q31 ((q31_t)30) |
| |
| static void test_arm_correlate_q31( |
| size_t in1_length, size_t in2_length, const q31_t *ref, |
| size_t ref_length) |
| { |
| q31_t *output; |
| |
| /* Allocate output buffer */ |
| output = calloc(ref_length, sizeof(q31_t)); |
| |
| /* Run test function */ |
| arm_correlate_q31(in_com1, in1_length, in_com2, in2_length, output); |
| |
| /* Validate output */ |
| zassert_true( |
| test_snr_error_q31(ref_length, ref, output, SNR_ERROR_THRESH), |
| ASSERT_MSG_SNR_LIMIT_EXCEED); |
| |
| zassert_true( |
| test_near_equal_q31(ref_length, ref, output, |
| ABS_ERROR_THRESH_Q31), |
| ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); |
| |
| /* Free output buffer */ |
| free(output); |
| } |
| |
| #define DEFINE_CORRELATE_TEST(a, b) \ |
| DEFINE_TEST_VARIANT4( \ |
| arm_correlate_q31, a##_##b, a, b, \ |
| ref_correlate_##a##_##b, ARRAY_SIZE(ref_correlate_##a##_##b)) |
| |
| DEFINE_CORRELATE_TEST(4, 1); |
| DEFINE_CORRELATE_TEST(4, 2); |
| DEFINE_CORRELATE_TEST(4, 3); |
| DEFINE_CORRELATE_TEST(4, 8); |
| DEFINE_CORRELATE_TEST(4, 11); |
| DEFINE_CORRELATE_TEST(5, 1); |
| DEFINE_CORRELATE_TEST(5, 2); |
| DEFINE_CORRELATE_TEST(5, 3); |
| DEFINE_CORRELATE_TEST(5, 8); |
| DEFINE_CORRELATE_TEST(5, 11); |
| DEFINE_CORRELATE_TEST(6, 1); |
| DEFINE_CORRELATE_TEST(6, 2); |
| DEFINE_CORRELATE_TEST(6, 3); |
| DEFINE_CORRELATE_TEST(6, 8); |
| DEFINE_CORRELATE_TEST(6, 11); |
| DEFINE_CORRELATE_TEST(9, 1); |
| DEFINE_CORRELATE_TEST(9, 2); |
| DEFINE_CORRELATE_TEST(9, 3); |
| DEFINE_CORRELATE_TEST(9, 8); |
| DEFINE_CORRELATE_TEST(9, 11); |
| DEFINE_CORRELATE_TEST(10, 1); |
| DEFINE_CORRELATE_TEST(10, 2); |
| DEFINE_CORRELATE_TEST(10, 3); |
| DEFINE_CORRELATE_TEST(10, 8); |
| DEFINE_CORRELATE_TEST(10, 11); |
| DEFINE_CORRELATE_TEST(11, 1); |
| DEFINE_CORRELATE_TEST(11, 2); |
| DEFINE_CORRELATE_TEST(11, 3); |
| DEFINE_CORRELATE_TEST(11, 8); |
| DEFINE_CORRELATE_TEST(11, 11); |
| DEFINE_CORRELATE_TEST(12, 1); |
| DEFINE_CORRELATE_TEST(12, 2); |
| DEFINE_CORRELATE_TEST(12, 3); |
| DEFINE_CORRELATE_TEST(12, 8); |
| DEFINE_CORRELATE_TEST(12, 11); |
| DEFINE_CORRELATE_TEST(13, 1); |
| DEFINE_CORRELATE_TEST(13, 2); |
| DEFINE_CORRELATE_TEST(13, 3); |
| DEFINE_CORRELATE_TEST(13, 8); |
| DEFINE_CORRELATE_TEST(13, 11); |
| |
| static void test_arm_conv_q31( |
| size_t in1_length, size_t in2_length, const q31_t *ref, |
| size_t ref_length) |
| { |
| q31_t *output; |
| |
| /* Allocate output buffer */ |
| output = calloc(ref_length, sizeof(q31_t)); |
| |
| /* Run test function */ |
| arm_conv_q31(in_com1, in1_length, in_com2, in2_length, output); |
| |
| /* Validate output */ |
| zassert_true( |
| test_snr_error_q31(ref_length, ref, output, SNR_ERROR_THRESH), |
| ASSERT_MSG_SNR_LIMIT_EXCEED); |
| |
| zassert_true( |
| test_near_equal_q31(ref_length, ref, output, |
| ABS_ERROR_THRESH_Q31), |
| ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); |
| |
| /* Free output buffer */ |
| free(output); |
| } |
| |
| #define DEFINE_CONV_TEST(a, b) \ |
| DEFINE_TEST_VARIANT4( \ |
| arm_conv_q31, a##_##b, a, b, \ |
| ref_conv_##a##_##b, ARRAY_SIZE(ref_conv_##a##_##b)) |
| |
| DEFINE_CONV_TEST(4, 1); |
| DEFINE_CONV_TEST(4, 2); |
| DEFINE_CONV_TEST(4, 3); |
| DEFINE_CONV_TEST(4, 8); |
| DEFINE_CONV_TEST(4, 11); |
| DEFINE_CONV_TEST(5, 1); |
| DEFINE_CONV_TEST(5, 2); |
| DEFINE_CONV_TEST(5, 3); |
| DEFINE_CONV_TEST(5, 8); |
| DEFINE_CONV_TEST(5, 11); |
| DEFINE_CONV_TEST(6, 1); |
| DEFINE_CONV_TEST(6, 2); |
| DEFINE_CONV_TEST(6, 3); |
| DEFINE_CONV_TEST(6, 8); |
| DEFINE_CONV_TEST(6, 11); |
| DEFINE_CONV_TEST(9, 1); |
| DEFINE_CONV_TEST(9, 2); |
| DEFINE_CONV_TEST(9, 3); |
| DEFINE_CONV_TEST(9, 8); |
| DEFINE_CONV_TEST(9, 11); |
| DEFINE_CONV_TEST(10, 1); |
| DEFINE_CONV_TEST(10, 2); |
| DEFINE_CONV_TEST(10, 3); |
| DEFINE_CONV_TEST(10, 8); |
| DEFINE_CONV_TEST(10, 11); |
| DEFINE_CONV_TEST(11, 1); |
| DEFINE_CONV_TEST(11, 2); |
| DEFINE_CONV_TEST(11, 3); |
| DEFINE_CONV_TEST(11, 8); |
| DEFINE_CONV_TEST(11, 11); |
| DEFINE_CONV_TEST(12, 1); |
| DEFINE_CONV_TEST(12, 2); |
| DEFINE_CONV_TEST(12, 3); |
| DEFINE_CONV_TEST(12, 8); |
| DEFINE_CONV_TEST(12, 11); |
| DEFINE_CONV_TEST(13, 1); |
| DEFINE_CONV_TEST(13, 2); |
| DEFINE_CONV_TEST(13, 3); |
| DEFINE_CONV_TEST(13, 8); |
| DEFINE_CONV_TEST(13, 11); |
| |
| #ifdef CONFIG_CMSIS_DSP_TEST_FILTERING_MISC_CONV_PARTIAL |
| static void test_arm_conv_partial_q31( |
| size_t first, size_t in1_length, size_t in2_length, const q31_t *ref, |
| size_t ref_length) |
| { |
| q31_t *output; |
| q31_t *temp; |
| arm_status status; |
| |
| /* Allocate output buffer */ |
| output = calloc(first + ref_length, sizeof(q31_t)); |
| temp = calloc(ref_length, sizeof(q31_t)); |
| |
| /* Run test function */ |
| status = arm_conv_partial_q31( |
| 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(q31_t)); |
| |
| /* Validate output */ |
| zassert_true( |
| test_snr_error_q31(ref_length, ref, temp, SNR_ERROR_THRESH), |
| ASSERT_MSG_SNR_LIMIT_EXCEED); |
| |
| zassert_true( |
| test_near_equal_q31(ref_length, ref, temp, |
| ABS_ERROR_THRESH_Q31), |
| ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); |
| |
| /* Free output buffer */ |
| free(output); |
| free(temp); |
| } |
| |
| static void test_arm_conv_partial_fast_q31( |
| size_t first, size_t in1_length, size_t in2_length, const q31_t *ref, |
| size_t ref_length) |
| { |
| q31_t *output; |
| q31_t *temp; |
| arm_status status; |
| |
| /* Allocate output buffer */ |
| output = calloc(first + ref_length, sizeof(q31_t)); |
| temp = calloc(ref_length, sizeof(q31_t)); |
| |
| /* Run test function */ |
| status = arm_conv_partial_fast_q31( |
| 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(q31_t)); |
| |
| /* Validate output */ |
| zassert_true( |
| test_snr_error_q31(ref_length, ref, temp, SNR_ERROR_THRESH), |
| ASSERT_MSG_SNR_LIMIT_EXCEED); |
| |
| zassert_true( |
| test_near_equal_q31(ref_length, ref, temp, |
| ABS_ERROR_THRESH_FAST_Q31), |
| ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); |
| |
| /* Free output buffer */ |
| free(output); |
| free(temp); |
| } |
| #else |
| static void test_arm_conv_partial_q31( |
| size_t first, size_t in1_length, size_t in2_length, const q31_t *ref, |
| size_t ref_length) |
| { |
| ztest_test_skip(); |
| } |
| |
| static void test_arm_conv_partial_fast_q31( |
| size_t first, size_t in1_length, size_t in2_length, const q31_t *ref, |
| size_t ref_length) |
| { |
| ztest_test_skip(); |
| } |
| #endif /* CONFIG_CMSIS_DSP_TEST_FILTERING_MISC_CONV_PARTIAL */ |
| |
| #define DEFINE_CONV_PARTIAL_TEST(a, b, c) \ |
| DEFINE_TEST_VARIANT5( \ |
| arm_conv_partial_q31, 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_q31, 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); |
| |
| static void test_arm_levinson_durbin_q31( |
| size_t in_length, size_t err_index, const q31_t *in, const q31_t *ref, |
| size_t ref_length) |
| { |
| q31_t *output; |
| q31_t err; |
| |
| /* Allocate output buffer */ |
| output = calloc(ref_length, sizeof(q31_t)); |
| |
| /* Run test function */ |
| arm_levinson_durbin_q31(in, output, &err, in_length); |
| |
| /* Validate output */ |
| zassert_true( |
| test_snr_error_q31(ref_length, ref, output, SNR_ERROR_THRESH), |
| ASSERT_MSG_SNR_LIMIT_EXCEED); |
| |
| zassert_true( |
| test_near_equal_q31(ref_length, ref, output, |
| ABS_ERROR_THRESH_LD_Q31), |
| ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); |
| |
| zassert_true( |
| test_near_equal_q31(1, &in_levinson_durbin_err[err_index], |
| &err, ABS_ERROR_THRESH_LD_Q31), |
| ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED); |
| |
| /* Free output buffer */ |
| free(output); |
| } |
| |
| #define DEFINE_LEVINSON_DURBIN_TEST(a, b) \ |
| DEFINE_TEST_VARIANT5( \ |
| arm_levinson_durbin_q31, a##_##b, a, b, \ |
| in_levinson_durbin_##a##_##b, \ |
| ref_levinson_durbin_##a##_##b, \ |
| ARRAY_SIZE(ref_levinson_durbin_##a##_##b)) |
| |
| DEFINE_LEVINSON_DURBIN_TEST(3, 0); |
| DEFINE_LEVINSON_DURBIN_TEST(8, 1); |
| DEFINE_LEVINSON_DURBIN_TEST(11, 2); |
| |
| void test_filtering_misc_q31(void) |
| { |
| ztest_test_suite(filtering_misc_q31, |
| ztest_unit_test(test_arm_correlate_q31_4_1), |
| ztest_unit_test(test_arm_correlate_q31_4_2), |
| ztest_unit_test(test_arm_correlate_q31_4_3), |
| ztest_unit_test(test_arm_correlate_q31_4_8), |
| ztest_unit_test(test_arm_correlate_q31_4_11), |
| ztest_unit_test(test_arm_correlate_q31_5_1), |
| ztest_unit_test(test_arm_correlate_q31_5_2), |
| ztest_unit_test(test_arm_correlate_q31_5_3), |
| ztest_unit_test(test_arm_correlate_q31_5_8), |
| ztest_unit_test(test_arm_correlate_q31_5_11), |
| ztest_unit_test(test_arm_correlate_q31_6_1), |
| ztest_unit_test(test_arm_correlate_q31_6_2), |
| ztest_unit_test(test_arm_correlate_q31_6_3), |
| ztest_unit_test(test_arm_correlate_q31_6_8), |
| ztest_unit_test(test_arm_correlate_q31_6_11), |
| ztest_unit_test(test_arm_correlate_q31_9_1), |
| ztest_unit_test(test_arm_correlate_q31_9_2), |
| ztest_unit_test(test_arm_correlate_q31_9_3), |
| ztest_unit_test(test_arm_correlate_q31_9_8), |
| ztest_unit_test(test_arm_correlate_q31_9_11), |
| ztest_unit_test(test_arm_correlate_q31_10_1), |
| ztest_unit_test(test_arm_correlate_q31_10_2), |
| ztest_unit_test(test_arm_correlate_q31_10_3), |
| ztest_unit_test(test_arm_correlate_q31_10_8), |
| ztest_unit_test(test_arm_correlate_q31_10_11), |
| ztest_unit_test(test_arm_correlate_q31_11_1), |
| ztest_unit_test(test_arm_correlate_q31_11_2), |
| ztest_unit_test(test_arm_correlate_q31_11_3), |
| ztest_unit_test(test_arm_correlate_q31_11_8), |
| ztest_unit_test(test_arm_correlate_q31_11_11), |
| ztest_unit_test(test_arm_correlate_q31_12_1), |
| ztest_unit_test(test_arm_correlate_q31_12_2), |
| ztest_unit_test(test_arm_correlate_q31_12_3), |
| ztest_unit_test(test_arm_correlate_q31_12_8), |
| ztest_unit_test(test_arm_correlate_q31_12_11), |
| ztest_unit_test(test_arm_correlate_q31_13_1), |
| ztest_unit_test(test_arm_correlate_q31_13_2), |
| ztest_unit_test(test_arm_correlate_q31_13_3), |
| ztest_unit_test(test_arm_correlate_q31_13_8), |
| ztest_unit_test(test_arm_correlate_q31_13_11), |
| ztest_unit_test(test_arm_conv_q31_4_1), |
| ztest_unit_test(test_arm_conv_q31_4_2), |
| ztest_unit_test(test_arm_conv_q31_4_3), |
| ztest_unit_test(test_arm_conv_q31_4_8), |
| ztest_unit_test(test_arm_conv_q31_4_11), |
| ztest_unit_test(test_arm_conv_q31_5_1), |
| ztest_unit_test(test_arm_conv_q31_5_2), |
| ztest_unit_test(test_arm_conv_q31_5_3), |
| ztest_unit_test(test_arm_conv_q31_5_8), |
| ztest_unit_test(test_arm_conv_q31_5_11), |
| ztest_unit_test(test_arm_conv_q31_6_1), |
| ztest_unit_test(test_arm_conv_q31_6_2), |
| ztest_unit_test(test_arm_conv_q31_6_3), |
| ztest_unit_test(test_arm_conv_q31_6_8), |
| ztest_unit_test(test_arm_conv_q31_6_11), |
| ztest_unit_test(test_arm_conv_q31_9_1), |
| ztest_unit_test(test_arm_conv_q31_9_2), |
| ztest_unit_test(test_arm_conv_q31_9_3), |
| ztest_unit_test(test_arm_conv_q31_9_8), |
| ztest_unit_test(test_arm_conv_q31_9_11), |
| ztest_unit_test(test_arm_conv_q31_10_1), |
| ztest_unit_test(test_arm_conv_q31_10_2), |
| ztest_unit_test(test_arm_conv_q31_10_3), |
| ztest_unit_test(test_arm_conv_q31_10_8), |
| ztest_unit_test(test_arm_conv_q31_10_11), |
| ztest_unit_test(test_arm_conv_q31_11_1), |
| ztest_unit_test(test_arm_conv_q31_11_2), |
| ztest_unit_test(test_arm_conv_q31_11_3), |
| ztest_unit_test(test_arm_conv_q31_11_8), |
| ztest_unit_test(test_arm_conv_q31_11_11), |
| ztest_unit_test(test_arm_conv_q31_12_1), |
| ztest_unit_test(test_arm_conv_q31_12_2), |
| ztest_unit_test(test_arm_conv_q31_12_3), |
| ztest_unit_test(test_arm_conv_q31_12_8), |
| ztest_unit_test(test_arm_conv_q31_12_11), |
| ztest_unit_test(test_arm_conv_q31_13_1), |
| ztest_unit_test(test_arm_conv_q31_13_2), |
| ztest_unit_test(test_arm_conv_q31_13_3), |
| ztest_unit_test(test_arm_conv_q31_13_8), |
| ztest_unit_test(test_arm_conv_q31_13_11), |
| ztest_unit_test(test_arm_conv_partial_q31_3_6_8), |
| ztest_unit_test(test_arm_conv_partial_q31_9_6_8), |
| ztest_unit_test(test_arm_conv_partial_q31_7_6_8), |
| ztest_unit_test(test_arm_conv_partial_fast_q31_3_6_8), |
| ztest_unit_test(test_arm_conv_partial_fast_q31_9_6_8), |
| ztest_unit_test(test_arm_conv_partial_fast_q31_7_6_8), |
| ztest_unit_test(test_arm_levinson_durbin_q31_3_0), |
| ztest_unit_test(test_arm_levinson_durbin_q31_8_1), |
| ztest_unit_test(test_arm_levinson_durbin_q31_11_2) |
| ); |
| |
| ztest_run_test_suite(filtering_misc_q31); |
| } |