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