1 /*
2 * Copyright (c) 2021 Stephanos Ioannidis <root@stephanos.io>
3 * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 */
7
8 #include <ztest.h>
9 #include <zephyr.h>
10 #include <stdlib.h>
11 #include <arm_math.h>
12 #include "../../common/test_common.h"
13
14 #include "q15.pat"
15
16 #define SNR_ERROR_THRESH ((float32_t)50)
17 #define ABS_ERROR_THRESH_Q15 ((q15_t)100)
18 #define ABS_ERROR_THRESH_Q63 ((q63_t)(1 << 17))
19
test_arm_max_q15(const q15_t * input1,int ref_index,size_t length)20 static void test_arm_max_q15(
21 const q15_t *input1, int ref_index, size_t length)
22 {
23 q15_t val;
24 uint32_t index;
25
26 /* Run test function */
27 arm_max_q15(input1, length, &val, &index);
28
29 /* Validate output */
30 zassert_equal(val, ref_max_val[ref_index],
31 ASSERT_MSG_INCORRECT_COMP_RESULT);
32
33 zassert_equal(index, ref_max_idx[ref_index],
34 ASSERT_MSG_INCORRECT_COMP_RESULT);
35 }
36
37 DEFINE_TEST_VARIANT3(arm_max_q15, 7, in_com1, 0, 7);
38 DEFINE_TEST_VARIANT3(arm_max_q15, 16, in_com1, 1, 16);
39 DEFINE_TEST_VARIANT3(arm_max_q15, 23, in_com1, 2, 23);
40
test_arm_min_q15(const q15_t * input1,int ref_index,size_t length)41 static void test_arm_min_q15(
42 const q15_t *input1, int ref_index, size_t length)
43 {
44 q15_t val;
45 uint32_t index;
46
47 /* Run test function */
48 arm_min_q15(input1, length, &val, &index);
49
50 /* Validate output */
51 zassert_equal(val, ref_min_val[ref_index],
52 ASSERT_MSG_INCORRECT_COMP_RESULT);
53
54 zassert_equal(index, ref_min_idx[ref_index],
55 ASSERT_MSG_INCORRECT_COMP_RESULT);
56 }
57
58 DEFINE_TEST_VARIANT3(arm_min_q15, 7, in_com1, 0, 7);
59 DEFINE_TEST_VARIANT3(arm_min_q15, 16, in_com1, 1, 16);
60 DEFINE_TEST_VARIANT3(arm_min_q15, 23, in_com1, 2, 23);
61
test_arm_absmax_q15(const q15_t * input1,int ref_index,size_t length)62 static void test_arm_absmax_q15(
63 const q15_t *input1, int ref_index, size_t length)
64 {
65 q15_t val;
66 uint32_t index;
67
68 /* Run test function */
69 arm_absmax_q15(input1, length, &val, &index);
70
71 /* Validate output */
72 zassert_equal(val, ref_absmax_val[ref_index],
73 ASSERT_MSG_INCORRECT_COMP_RESULT);
74
75 zassert_equal(index, ref_absmax_idx[ref_index],
76 ASSERT_MSG_INCORRECT_COMP_RESULT);
77 }
78
79 DEFINE_TEST_VARIANT3(arm_absmax_q15, 7, in_absminmax, 0, 7);
80 DEFINE_TEST_VARIANT3(arm_absmax_q15, 16, in_absminmax, 1, 16);
81 DEFINE_TEST_VARIANT3(arm_absmax_q15, 23, in_absminmax, 2, 23);
82
test_arm_absmin_q15(const q15_t * input1,int ref_index,size_t length)83 static void test_arm_absmin_q15(
84 const q15_t *input1, int ref_index, size_t length)
85 {
86 q15_t val;
87 uint32_t index;
88
89 /* Run test function */
90 arm_absmin_q15(input1, length, &val, &index);
91
92 /* Validate output */
93 zassert_equal(val, ref_absmin_val[ref_index],
94 ASSERT_MSG_INCORRECT_COMP_RESULT);
95
96 zassert_equal(index, ref_absmin_idx[ref_index],
97 ASSERT_MSG_INCORRECT_COMP_RESULT);
98 }
99
100 DEFINE_TEST_VARIANT3(arm_absmin_q15, 7, in_absminmax, 0, 7);
101 DEFINE_TEST_VARIANT3(arm_absmin_q15, 16, in_absminmax, 1, 16);
102 DEFINE_TEST_VARIANT3(arm_absmin_q15, 23, in_absminmax, 2, 23);
103
test_arm_mean_q15(const q15_t * input1,int ref_index,size_t length)104 static void test_arm_mean_q15(
105 const q15_t *input1, int ref_index, size_t length)
106 {
107 q15_t ref[1];
108 q15_t *output;
109
110 /* Load reference */
111 ref[0] = ref_mean[ref_index];
112
113 /* Allocate output buffer */
114 output = malloc(1 * sizeof(q15_t));
115 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
116
117 /* Run test function */
118 arm_mean_q15(input1, length, &output[0]);
119
120 /* Validate output */
121 zassert_true(
122 test_snr_error_q15(1, output, ref, SNR_ERROR_THRESH),
123 ASSERT_MSG_SNR_LIMIT_EXCEED);
124
125 zassert_true(
126 test_near_equal_q15(1, output, ref, ABS_ERROR_THRESH_Q15),
127 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
128
129 /* Free output buffer */
130 free(output);
131 }
132
133 DEFINE_TEST_VARIANT3(arm_mean_q15, 7, in_com2, 0, 7);
134 DEFINE_TEST_VARIANT3(arm_mean_q15, 16, in_com2, 1, 16);
135 DEFINE_TEST_VARIANT3(arm_mean_q15, 23, in_com2, 2, 23);
136
test_arm_power_q15(const q15_t * input1,int ref_index,size_t length)137 static void test_arm_power_q15(
138 const q15_t *input1, int ref_index, size_t length)
139 {
140 q63_t ref[1];
141 q63_t *output;
142
143 /* Load reference */
144 ref[0] = ref_power[ref_index];
145
146 /* Allocate output buffer */
147 output = malloc(1 * sizeof(q63_t));
148 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
149
150 /* Run test function */
151 arm_power_q15(input1, length, &output[0]);
152
153 /* Validate output */
154 zassert_true(
155 test_snr_error_q63(1, output, ref, SNR_ERROR_THRESH),
156 ASSERT_MSG_SNR_LIMIT_EXCEED);
157
158 zassert_true(
159 test_near_equal_q63(1, output, ref, ABS_ERROR_THRESH_Q63),
160 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
161
162 /* Free output buffer */
163 free(output);
164 }
165
166 DEFINE_TEST_VARIANT3(arm_power_q15, 7, in_com1, 0, 7);
167 DEFINE_TEST_VARIANT3(arm_power_q15, 16, in_com1, 1, 16);
168 DEFINE_TEST_VARIANT3(arm_power_q15, 23, in_com1, 2, 23);
169
test_arm_rms_q15(const q15_t * input1,int ref_index,size_t length)170 static void test_arm_rms_q15(
171 const q15_t *input1, int ref_index, size_t length)
172 {
173 q15_t ref[1];
174 q15_t *output;
175
176 /* Load reference */
177 ref[0] = ref_rms[ref_index];
178
179 /* Allocate output buffer */
180 output = malloc(1 * sizeof(q15_t));
181 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
182
183 /* Run test function */
184 arm_rms_q15(input1, length, &output[0]);
185
186 /* Validate output */
187 zassert_true(
188 test_snr_error_q15(1, output, ref, SNR_ERROR_THRESH),
189 ASSERT_MSG_SNR_LIMIT_EXCEED);
190
191 zassert_true(
192 test_near_equal_q15(1, output, ref, ABS_ERROR_THRESH_Q15),
193 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
194
195 /* Free output buffer */
196 free(output);
197 }
198
199 DEFINE_TEST_VARIANT3(arm_rms_q15, 7, in_com1, 0, 7);
200 DEFINE_TEST_VARIANT3(arm_rms_q15, 16, in_com1, 1, 16);
201 DEFINE_TEST_VARIANT3(arm_rms_q15, 23, in_com1, 2, 23);
202
test_arm_std_q15(const q15_t * input1,int ref_index,size_t length)203 static void test_arm_std_q15(
204 const q15_t *input1, int ref_index, size_t length)
205 {
206 q15_t ref[1];
207 q15_t *output;
208
209 /* Load reference */
210 ref[0] = ref_std[ref_index];
211
212 /* Allocate output buffer */
213 output = malloc(1 * sizeof(q15_t));
214 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
215
216 /* Run test function */
217 arm_std_q15(input1, length, &output[0]);
218
219 /* Validate output */
220 zassert_true(
221 test_snr_error_q15(1, output, ref, SNR_ERROR_THRESH),
222 ASSERT_MSG_SNR_LIMIT_EXCEED);
223
224 zassert_true(
225 test_near_equal_q15(1, output, ref, ABS_ERROR_THRESH_Q15),
226 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
227
228 /* Free output buffer */
229 free(output);
230 }
231
232 DEFINE_TEST_VARIANT3(arm_std_q15, 7, in_com1, 0, 7);
233 DEFINE_TEST_VARIANT3(arm_std_q15, 16, in_com1, 1, 16);
234 DEFINE_TEST_VARIANT3(arm_std_q15, 23, in_com1, 2, 23);
235
test_arm_var_q15(const q15_t * input1,int ref_index,size_t length)236 static void test_arm_var_q15(
237 const q15_t *input1, int ref_index, size_t length)
238 {
239 q15_t ref[1];
240 q15_t *output;
241
242 /* Load reference */
243 ref[0] = ref_var[ref_index];
244
245 /* Allocate output buffer */
246 output = malloc(1 * sizeof(q15_t));
247 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
248
249 /* Run test function */
250 arm_var_q15(input1, length, &output[0]);
251
252 /* Validate output */
253 zassert_true(
254 test_snr_error_q15(1, output, ref, SNR_ERROR_THRESH),
255 ASSERT_MSG_SNR_LIMIT_EXCEED);
256
257 zassert_true(
258 test_near_equal_q15(1, output, ref, ABS_ERROR_THRESH_Q15),
259 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
260
261 /* Free output buffer */
262 free(output);
263 }
264
265 DEFINE_TEST_VARIANT3(arm_var_q15, 7, in_com1, 0, 7);
266 DEFINE_TEST_VARIANT3(arm_var_q15, 16, in_com1, 1, 16);
267 DEFINE_TEST_VARIANT3(arm_var_q15, 23, in_com1, 2, 23);
268
test_statistics_q15(void)269 void test_statistics_q15(void)
270 {
271 ztest_test_suite(statistics_q15,
272 ztest_unit_test(test_arm_max_q15_7),
273 ztest_unit_test(test_arm_max_q15_16),
274 ztest_unit_test(test_arm_max_q15_23),
275 ztest_unit_test(test_arm_min_q15_7),
276 ztest_unit_test(test_arm_min_q15_16),
277 ztest_unit_test(test_arm_min_q15_23),
278 ztest_unit_test(test_arm_absmax_q15_7),
279 ztest_unit_test(test_arm_absmax_q15_16),
280 ztest_unit_test(test_arm_absmax_q15_23),
281 ztest_unit_test(test_arm_absmin_q15_7),
282 ztest_unit_test(test_arm_absmin_q15_16),
283 ztest_unit_test(test_arm_absmin_q15_23),
284 ztest_unit_test(test_arm_mean_q15_7),
285 ztest_unit_test(test_arm_mean_q15_16),
286 ztest_unit_test(test_arm_mean_q15_23),
287 ztest_unit_test(test_arm_power_q15_7),
288 ztest_unit_test(test_arm_power_q15_16),
289 ztest_unit_test(test_arm_power_q15_23),
290 ztest_unit_test(test_arm_rms_q15_7),
291 ztest_unit_test(test_arm_rms_q15_16),
292 ztest_unit_test(test_arm_rms_q15_23),
293 ztest_unit_test(test_arm_std_q15_7),
294 ztest_unit_test(test_arm_std_q15_16),
295 ztest_unit_test(test_arm_std_q15_23),
296 ztest_unit_test(test_arm_var_q15_7),
297 ztest_unit_test(test_arm_var_q15_16),
298 ztest_unit_test(test_arm_var_q15_23)
299 );
300
301 ztest_run_test_suite(statistics_q15);
302 }
303