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 <zephyr/dsp/dsp.h>
9 #include <zephyr/ztest.h>
10 #include <zephyr/kernel.h>
11 #include <stdlib.h>
12 #include "common/test_common.h"
13
14 #include "q15.pat"
15
16 #define SNR_ERROR_THRESH ((float32_t)70)
17 #define SNR_ERROR_THRESH_HIGH ((float32_t)60)
18 #define ABS_ERROR_THRESH_Q15 ((q15_t)2)
19 #define ABS_ERROR_THRESH_Q63 ((q63_t)(1 << 17))
20
test_zdsp_add_q15(const DSP_DATA q15_t * input1,const DSP_DATA q15_t * input2,const q15_t * ref,size_t length)21 static void test_zdsp_add_q15(
22 const DSP_DATA q15_t *input1, const DSP_DATA q15_t *input2, const q15_t *ref,
23 size_t length)
24 {
25 DSP_DATA q15_t *output;
26
27 /* Allocate output buffer */
28 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
29 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
30
31 /* Run test function */
32 zdsp_add_q15(input1, input2, output, length);
33
34 /* Validate output */
35 zassert_true(
36 test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
37 ASSERT_MSG_SNR_LIMIT_EXCEED);
38
39 zassert_true(
40 test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
41 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
42
43 /* Free output buffer */
44 free(output);
45 }
46
47 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15, 7, in_com1, in_com2, ref_add, 7);
48 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15, 16, in_com1, in_com2, ref_add, 16);
49 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15, 23, in_com1, in_com2, ref_add, 23);
50 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15, possat, in_maxpos, in_maxpos, ref_add_possat,
51 17);
52 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15, negsat, in_maxneg, in_maxneg, ref_add_negsat,
53 17);
54 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15, long, in_com1, in_com2, ref_add,
55 ARRAY_SIZE(in_com1));
56
test_zdsp_add_q15_in_place(const DSP_DATA q15_t * input1,const DSP_DATA q15_t * input2,const q15_t * ref,size_t length)57 static void test_zdsp_add_q15_in_place(const DSP_DATA q15_t *input1, const DSP_DATA q15_t *input2,
58 const q15_t *ref, size_t length)
59 {
60 DSP_DATA q15_t *output;
61
62 /* Allocate output buffer */
63 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
64 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
65
66 /* Copy input data to output*/
67 memcpy(output, input1, length * sizeof(q15_t));
68
69 /* Run test function */
70 zdsp_add_q15(output, input2, output, length);
71
72 /* Validate output */
73 zassert_true(test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
74 ASSERT_MSG_SNR_LIMIT_EXCEED);
75
76 zassert_true(test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
77 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
78
79 /* Free output buffer */
80 free(output);
81 }
82
83 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15_in_place, 7, in_com1, in_com2, ref_add, 7);
84 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15_in_place, 16, in_com1, in_com2, ref_add, 16);
85 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15_in_place, 23, in_com1, in_com2, ref_add, 23);
86 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15_in_place, possat, in_maxpos, in_maxpos,
87 ref_add_possat, 17);
88 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15_in_place, negsat, in_maxneg, in_maxneg,
89 ref_add_negsat, 17);
90 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_add_q15_in_place, long, in_com1, in_com2, ref_add,
91 ARRAY_SIZE(in_com1));
92
test_zdsp_sub_q15(const DSP_DATA q15_t * input1,const DSP_DATA q15_t * input2,const q15_t * ref,size_t length)93 static void test_zdsp_sub_q15(
94 const DSP_DATA q15_t *input1, const DSP_DATA q15_t *input2, const q15_t *ref,
95 size_t length)
96 {
97 DSP_DATA q15_t *output;
98
99 /* Allocate output buffer */
100 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
101 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
102
103 /* Run test function */
104 zdsp_sub_q15(input1, input2, output, length);
105
106 /* Validate output */
107 zassert_true(
108 test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
109 ASSERT_MSG_SNR_LIMIT_EXCEED);
110
111 zassert_true(
112 test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
113 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
114
115 /* Free output buffer */
116 free(output);
117 }
118
119 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15, 7, in_com1, in_com2, ref_sub, 7);
120 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15, 16, in_com1, in_com2, ref_sub, 16);
121 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15, 23, in_com1, in_com2, ref_sub, 23);
122 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15, possat, in_maxpos, in_maxneg, ref_sub_possat,
123 17);
124 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15, negsat, in_maxneg, in_maxpos, ref_sub_negsat,
125 17);
126 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15, long, in_com1, in_com2, ref_sub,
127 ARRAY_SIZE(in_com1));
128
test_zdsp_sub_q15_in_place(const DSP_DATA q15_t * input1,const DSP_DATA q15_t * input2,const q15_t * ref,size_t length)129 static void test_zdsp_sub_q15_in_place(const DSP_DATA q15_t *input1, const DSP_DATA q15_t *input2,
130 const q15_t *ref, size_t length)
131 {
132 DSP_DATA q15_t *output;
133
134 /* Allocate output buffer */
135 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
136 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
137
138 /* Copy input data to output*/
139 memcpy(output, input1, length * sizeof(q15_t));
140
141 /* Run test function */
142 zdsp_sub_q15(output, input2, output, length);
143
144 /* Validate output */
145 zassert_true(test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
146 ASSERT_MSG_SNR_LIMIT_EXCEED);
147
148 zassert_true(test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
149 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
150
151 /* Free output buffer */
152 free(output);
153 }
154
155 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15_in_place, 7, in_com1, in_com2, ref_sub, 7);
156 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15_in_place, 16, in_com1, in_com2, ref_sub, 16);
157 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15_in_place, 23, in_com1, in_com2, ref_sub, 23);
158 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15_in_place, possat, in_maxpos, in_maxneg,
159 ref_sub_possat, 17);
160 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15_in_place, negsat, in_maxneg, in_maxpos,
161 ref_sub_negsat, 17);
162 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_sub_q15_in_place, long, in_com1, in_com2, ref_sub,
163 ARRAY_SIZE(in_com1));
164
test_zdsp_mult_q15(const DSP_DATA q15_t * input1,const DSP_DATA q15_t * input2,const q15_t * ref,size_t length)165 static void test_zdsp_mult_q15(
166 const DSP_DATA q15_t *input1, const DSP_DATA q15_t *input2, const q15_t *ref,
167 size_t length)
168 {
169 DSP_DATA q15_t *output;
170
171 /* Allocate output buffer */
172 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
173 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
174
175 /* Run test function */
176 zdsp_mult_q15(input1, input2, output, length);
177
178 /* Validate output */
179 zassert_true(
180 test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH_HIGH),
181 ASSERT_MSG_SNR_LIMIT_EXCEED);
182
183 zassert_true(
184 test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
185 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
186
187 /* Free output buffer */
188 free(output);
189 }
190
191 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15, 7, in_com1, in_com2, ref_mult, 7);
192 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15, 16, in_com1, in_com2, ref_mult, 16);
193 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15, 23, in_com1, in_com2, ref_mult, 23);
194 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15, possat, in_maxneg2, in_maxneg2, ref_mult_possat,
195 17);
196 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15, long, in_com1, in_com2, ref_mult,
197 ARRAY_SIZE(in_com1));
198
test_zdsp_mult_q15_in_place(const DSP_DATA q15_t * input1,const DSP_DATA q15_t * input2,const q15_t * ref,size_t length)199 static void test_zdsp_mult_q15_in_place(const DSP_DATA q15_t *input1, const DSP_DATA q15_t *input2,
200 const q15_t *ref, size_t length)
201 {
202 DSP_DATA q15_t *output;
203
204 /* Allocate output buffer */
205 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
206 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
207
208 /* Copy input data to output*/
209 memcpy(output, input1, length * sizeof(q15_t));
210
211 /* Run test function */
212 zdsp_mult_q15(output, input2, output, length);
213
214 /* Validate output */
215 zassert_true(test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH_HIGH),
216 ASSERT_MSG_SNR_LIMIT_EXCEED);
217
218 zassert_true(test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
219 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
220
221 /* Free output buffer */
222 free(output);
223 }
224
225 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15_in_place, 7, in_com1, in_com2, ref_mult, 7);
226 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15_in_place, 16, in_com1, in_com2, ref_mult, 16);
227 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15_in_place, 23, in_com1, in_com2, ref_mult, 23);
228 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15_in_place, possat, in_maxneg2, in_maxneg2,
229 ref_mult_possat, 17);
230 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_mult_q15_in_place, long, in_com1, in_com2, ref_mult,
231 ARRAY_SIZE(in_com1));
232
test_zdsp_negate_q15(const DSP_DATA q15_t * input1,const q15_t * ref,size_t length)233 static void test_zdsp_negate_q15(
234 const DSP_DATA q15_t *input1, const q15_t *ref, size_t length)
235 {
236 DSP_DATA q15_t *output;
237
238 /* Allocate output buffer */
239 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
240 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
241
242 /* Run test function */
243 zdsp_negate_q15(input1, output, length);
244
245 /* Validate output */
246 zassert_true(
247 test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
248 ASSERT_MSG_SNR_LIMIT_EXCEED);
249
250 zassert_true(
251 test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
252 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
253
254 /* Free output buffer */
255 free(output);
256 }
257
258 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15, 7, in_com1, ref_negate, 7);
259 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15, 16, in_com1, ref_negate, 16);
260 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15, 23, in_com1, ref_negate, 23);
261 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15, possat, in_maxneg2, ref_negate_possat, 17);
262 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15, long, in_com1, ref_negate,
263 ARRAY_SIZE(in_com1));
264
test_zdsp_negate_q15_in_place(const DSP_DATA q15_t * input1,const q15_t * ref,size_t length)265 static void test_zdsp_negate_q15_in_place(const DSP_DATA q15_t *input1, const q15_t *ref,
266 size_t length)
267 {
268 DSP_DATA q15_t *output;
269
270 /* Allocate output buffer */
271 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
272 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
273
274 /* Copy input data to output*/
275 memcpy(output, input1, length * sizeof(q15_t));
276
277 /* Run test function */
278 zdsp_negate_q15(output, output, length);
279
280 /* Validate output */
281 zassert_true(test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
282 ASSERT_MSG_SNR_LIMIT_EXCEED);
283
284 zassert_true(test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
285 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
286
287 /* Free output buffer */
288 free(output);
289 }
290
291 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15_in_place, 7, in_com1, ref_negate, 7);
292 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15_in_place, 16, in_com1, ref_negate, 16);
293 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15_in_place, 23, in_com1, ref_negate, 23);
294 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15_in_place, possat, in_maxneg2,
295 ref_negate_possat, 17);
296 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_negate_q15_in_place, long, in_com1, ref_negate,
297 ARRAY_SIZE(in_com1));
298
test_zdsp_offset_q15(const DSP_DATA q15_t * input1,q15_t scalar,const q15_t * ref,size_t length)299 static void test_zdsp_offset_q15(
300 const DSP_DATA q15_t *input1, q15_t scalar, const q15_t *ref, size_t length)
301 {
302 DSP_DATA q15_t *output;
303
304 /* Allocate output buffer */
305 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
306 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
307
308 /* Run test function */
309 zdsp_offset_q15(input1, scalar, output, length);
310
311 /* Validate output */
312 zassert_true(
313 test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
314 ASSERT_MSG_SNR_LIMIT_EXCEED);
315
316 zassert_true(
317 test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
318 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
319
320 /* Free output buffer */
321 free(output);
322 }
323
324 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15, 0p5_7, in_com1, 0x4000, ref_offset, 7);
325 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15, 0p5_16, in_com1, 0x4000, ref_offset, 16);
326 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15, 0p5_23, in_com1, 0x4000, ref_offset, 23);
327 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15, possat, in_maxpos, 0x7333, ref_offset_possat,
328 17);
329 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15, negsat, in_maxneg, 0x8ccd, ref_offset_negsat,
330 17);
331 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15, long, in_com1, 0x4000, ref_offset,
332 ARRAY_SIZE(in_com1));
333
test_zdsp_offset_q15_in_place(const DSP_DATA q15_t * input1,q15_t scalar,const q15_t * ref,size_t length)334 static void test_zdsp_offset_q15_in_place(const DSP_DATA q15_t *input1, q15_t scalar,
335 const q15_t *ref, size_t length)
336 {
337 DSP_DATA q15_t *output;
338
339 /* Allocate output buffer */
340 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
341 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
342
343 /* Copy input data to output*/
344 memcpy(output, input1, length * sizeof(q15_t));
345
346 /* Run test function */
347 zdsp_offset_q15(output, scalar, output, length);
348
349 /* Validate output */
350 zassert_true(test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
351 ASSERT_MSG_SNR_LIMIT_EXCEED);
352
353 zassert_true(test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
354 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
355
356 /* Free output buffer */
357 free(output);
358 }
359
360 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15_in_place, 0p5_7, in_com1, 0x4000, ref_offset,
361 7);
362 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15_in_place, 0p5_16, in_com1, 0x4000, ref_offset,
363 16);
364 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15_in_place, 0p5_23, in_com1, 0x4000, ref_offset,
365 23);
366 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15_in_place, possat, in_maxpos, 0x7333,
367 ref_offset_possat, 17);
368 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15_in_place, negsat, in_maxneg, 0x8ccd,
369 ref_offset_negsat, 17);
370 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_offset_q15_in_place, long, in_com1, 0x4000, ref_offset,
371 ARRAY_SIZE(in_com1));
372
test_zdsp_scale_q15(const DSP_DATA q15_t * input1,q15_t scalar,const q15_t * ref,size_t length)373 static void test_zdsp_scale_q15(
374 const DSP_DATA q15_t *input1, q15_t scalar, const q15_t *ref, size_t length)
375 {
376 DSP_DATA q15_t *output;
377
378 /* Allocate output buffer */
379 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
380 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
381
382 /* Run test function */
383 zdsp_scale_q15(input1, scalar, 0, output, length);
384
385 /* Validate output */
386 zassert_true(
387 test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
388 ASSERT_MSG_SNR_LIMIT_EXCEED);
389
390 zassert_true(
391 test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
392 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
393
394 /* Free output buffer */
395 free(output);
396 }
397
398 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15, 0p5_7, in_com1, 0x4000, ref_scale, 7);
399 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15, 0p5_16, in_com1, 0x4000, ref_scale, 16);
400 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15, 0p5_23, in_com1, 0x4000, ref_scale, 23);
401 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15, possat, in_maxneg2, 0x8000, ref_scale_possat,
402 17);
403 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15, long, in_com1, 0x4000, ref_scale,
404 ARRAY_SIZE(in_com1));
405
test_zdsp_scale_q15_in_place(const DSP_DATA q15_t * input1,q15_t scalar,const q15_t * ref,size_t length)406 static void test_zdsp_scale_q15_in_place(const DSP_DATA q15_t *input1, q15_t scalar,
407 const q15_t *ref, size_t length)
408 {
409 DSP_DATA q15_t *output;
410
411 /* Allocate output buffer */
412 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
413 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
414
415 /* Copy input data to output*/
416 memcpy(output, input1, length * sizeof(q15_t));
417
418 /* Run test function */
419 zdsp_scale_q15(output, scalar, 0, output, length);
420
421 /* Validate output */
422 zassert_true(test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
423 ASSERT_MSG_SNR_LIMIT_EXCEED);
424
425 zassert_true(test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
426 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
427
428 /* Free output buffer */
429 free(output);
430 }
431
432 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15_in_place, 0p5_7, in_com1, 0x4000, ref_scale, 7);
433 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15_in_place, 0p5_16, in_com1, 0x4000, ref_scale,
434 16);
435 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15_in_place, 0p5_23, in_com1, 0x4000, ref_scale,
436 23);
437 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15_in_place, possat, in_maxneg2, 0x8000,
438 ref_scale_possat, 17);
439 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_scale_q15_in_place, long, in_com1, 0x4000, ref_scale,
440 ARRAY_SIZE(in_com1));
441
test_zdsp_dot_prod_q15(const DSP_DATA q15_t * input1,const DSP_DATA q15_t * input2,const q63_t * ref,size_t length)442 static void test_zdsp_dot_prod_q15(
443 const DSP_DATA q15_t *input1, const DSP_DATA q15_t *input2, const q63_t *ref,
444 size_t length)
445 {
446 DSP_DATA q63_t *output;
447
448 /* Allocate output buffer */
449 output = (DSP_DATA q63_t *)malloc(1 * sizeof(q63_t));
450 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
451
452 /* Run test function */
453 zdsp_dot_prod_q15(input1, input2, length, &output[0]);
454
455 /* Validate output */
456 zassert_true(
457 test_snr_error_q63(1, output, ref, SNR_ERROR_THRESH_HIGH),
458 ASSERT_MSG_SNR_LIMIT_EXCEED);
459
460 zassert_true(
461 test_near_equal_q63(1, output, ref, ABS_ERROR_THRESH_Q63),
462 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
463
464 /* Free output buffer */
465 free(output);
466 }
467
468 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_dot_prod_q15, 7, in_com1, in_com2, ref_dot_prod_3, 7);
469 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_dot_prod_q15, 16, in_com1, in_com2, ref_dot_prod_4, 16);
470 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_dot_prod_q15, 23, in_com1, in_com2, ref_dot_prod_4n1, 23);
471 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_dot_prod_q15, long, in_com1, in_com2, ref_dot_prod_long,
472 ARRAY_SIZE(in_com1));
473
test_zdsp_abs_q15(const DSP_DATA q15_t * input1,const q15_t * ref,size_t length)474 static void test_zdsp_abs_q15(
475 const DSP_DATA q15_t *input1, const q15_t *ref, size_t length)
476 {
477 DSP_DATA q15_t *output;
478
479 /* Allocate output buffer */
480 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
481 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
482
483 /* Run test function */
484 zdsp_abs_q15(input1, output, length);
485
486 /* Validate output */
487 zassert_true(
488 test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
489 ASSERT_MSG_SNR_LIMIT_EXCEED);
490
491 zassert_true(
492 test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
493 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
494
495 /* Free output buffer */
496 free(output);
497 }
498
499 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_abs_q15, 7, in_com1, ref_abs, 7);
500 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_abs_q15, 16, in_com1, ref_abs, 16);
501 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_abs_q15, 23, in_com1, ref_abs, 23);
502 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_abs_q15, long, in_com1, ref_abs, ARRAY_SIZE(in_com1));
503
test_zdsp_abs_q15_in_place(const DSP_DATA q15_t * input1,const q15_t * ref,size_t length)504 static void test_zdsp_abs_q15_in_place(
505 const DSP_DATA q15_t *input1, const q15_t *ref, size_t length)
506 {
507 DSP_DATA q15_t *output;
508
509 /* Allocate output buffer */
510 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
511 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
512
513 /* Copy input data to output*/
514 memcpy(output, input1, length * sizeof(q15_t));
515
516 /* Run test function */
517 zdsp_abs_q15(output, output, length);
518
519 /* Validate output */
520 zassert_true(test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
521 ASSERT_MSG_SNR_LIMIT_EXCEED);
522
523 zassert_true(test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
524 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
525
526 /* Free output buffer */
527 free(output);
528 }
529
530 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_abs_q15_in_place, 7, in_com1, ref_abs, 7);
531 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_abs_q15_in_place, 16, in_com1, ref_abs, 16);
532 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_abs_q15_in_place, 23, in_com1, ref_abs, 23);
533 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_abs_q15_in_place, long, in_com1, ref_abs,
534 ARRAY_SIZE(in_com1));
535
test_zdsp_shift_q15(const DSP_DATA q15_t * input1,const q15_t * ref,size_t length)536 static void test_zdsp_shift_q15(
537 const DSP_DATA q15_t *input1, const q15_t *ref, size_t length)
538 {
539 DSP_DATA q15_t *output;
540
541 /* Allocate output buffer */
542 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
543 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
544
545 /* Run test function */
546 zdsp_shift_q15(input1, 1, output, length);
547
548 /* Validate output */
549 zassert_true(
550 test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
551 ASSERT_MSG_SNR_LIMIT_EXCEED);
552
553 zassert_true(
554 test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
555 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
556
557 /* Free output buffer */
558 free(output);
559 }
560
561 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_shift_q15, rand, in_rand, ref_shift, 17);
562 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_shift_q15, possat, in_maxpos, ref_shift_possat, 17);
563 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_shift_q15, negsat, in_maxneg, ref_shift_negsat, 17);
564
test_zdsp_shift_q15_in_place(const DSP_DATA q15_t * input1,const q15_t * ref,size_t length)565 static void test_zdsp_shift_q15_in_place(
566 const DSP_DATA q15_t *input1, const q15_t *ref, size_t length)
567 {
568 DSP_DATA q15_t *output;
569
570 /* Allocate output buffer */
571 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
572 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
573
574 /* Copy input data to output*/
575 memcpy(output, input1, length * sizeof(q15_t));
576
577 /* Run test function */
578 zdsp_shift_q15(output, 1, output, length);
579
580 /* Validate output */
581 zassert_true(test_snr_error_q15(length, output, ref, SNR_ERROR_THRESH),
582 ASSERT_MSG_SNR_LIMIT_EXCEED);
583
584 zassert_true(test_near_equal_q15(length, output, ref, ABS_ERROR_THRESH_Q15),
585 ASSERT_MSG_ABS_ERROR_LIMIT_EXCEED);
586
587 /* Free output buffer */
588 free(output);
589 }
590
591 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_shift_q15_in_place, rand, in_rand, ref_shift, 17);
592 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_shift_q15_in_place, possat, in_maxpos, ref_shift_possat,
593 17);
594 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_shift_q15_in_place, negsat, in_maxneg, ref_shift_negsat,
595 17);
596
test_zdsp_and_u16(const DSP_DATA uint16_t * input1,const DSP_DATA uint16_t * input2,const uint16_t * ref,size_t length)597 static void test_zdsp_and_u16(
598 const DSP_DATA uint16_t *input1, const DSP_DATA uint16_t *input2, const uint16_t *ref,
599 size_t length)
600 {
601 DSP_DATA uint16_t *output;
602
603 /* Allocate output buffer */
604 output = (DSP_DATA q15_t *)malloc(length * sizeof(uint16_t));
605 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
606
607 /* Run test function */
608 zdsp_and_u16(input1, input2, output, length);
609
610 /* Validate output */
611 zassert_true(
612 test_equal_q15(length, output, ref),
613 ASSERT_MSG_INCORRECT_COMP_RESULT);
614
615 /* Free output buffer */
616 free(output);
617 }
618
619 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_and_u16, 7, in_bitwise1, in_bitwise2, ref_and, 7);
620 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_and_u16, 16, in_bitwise1, in_bitwise2, ref_and, 16);
621 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_and_u16, 23, in_bitwise1, in_bitwise2, ref_and, 23);
622
test_zdsp_and_u16_in_place(const DSP_DATA uint16_t * input1,const DSP_DATA uint16_t * input2,const uint16_t * ref,size_t length)623 static void test_zdsp_and_u16_in_place(
624 const DSP_DATA uint16_t *input1, const DSP_DATA uint16_t *input2, const uint16_t *ref,
625 size_t length)
626 {
627 DSP_DATA uint16_t *output;
628
629 /* Allocate output buffer */
630 output = (DSP_DATA q15_t *)malloc(length * sizeof(uint16_t));
631 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
632
633 /* Copy input data to output*/
634 memcpy(output, input1, length * sizeof(q15_t));
635
636 /* Run test function */
637 zdsp_and_u16(output, input2, output, length);
638
639 /* Validate output */
640 zassert_true(test_equal_q15(length, output, ref), ASSERT_MSG_INCORRECT_COMP_RESULT);
641
642 /* Free output buffer */
643 free(output);
644 }
645
646 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_and_u16_in_place, 7, in_bitwise1, in_bitwise2, ref_and,
647 7);
648 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_and_u16_in_place, 16, in_bitwise1, in_bitwise2, ref_and,
649 16);
650 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_and_u16_in_place, 23, in_bitwise1, in_bitwise2, ref_and,
651 23);
652
test_zdsp_or_u16(const DSP_DATA uint16_t * input1,const DSP_DATA uint16_t * input2,const uint16_t * ref,size_t length)653 static void test_zdsp_or_u16(
654 const DSP_DATA uint16_t *input1, const DSP_DATA uint16_t *input2, const uint16_t *ref,
655 size_t length)
656 {
657 DSP_DATA uint16_t *output;
658
659 /* Allocate output buffer */
660 output = (DSP_DATA q15_t *)malloc(length * sizeof(uint16_t));
661 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
662
663 /* Run test function */
664 zdsp_or_u16(input1, input2, output, length);
665
666 /* Validate output */
667 zassert_true(
668 test_equal_q15(length, output, ref),
669 ASSERT_MSG_INCORRECT_COMP_RESULT);
670
671 /* Free output buffer */
672 free(output);
673 }
674
675 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_or_u16, 7, in_bitwise1, in_bitwise2, ref_or, 7);
676 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_or_u16, 16, in_bitwise1, in_bitwise2, ref_or, 16);
677 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_or_u16, 23, in_bitwise1, in_bitwise2, ref_or, 23);
678
test_zdsp_or_u16_in_place(const DSP_DATA uint16_t * input1,const DSP_DATA uint16_t * input2,const uint16_t * ref,size_t length)679 static void test_zdsp_or_u16_in_place(
680 const DSP_DATA uint16_t *input1, const DSP_DATA uint16_t *input2, const uint16_t *ref,
681 size_t length)
682 {
683 DSP_DATA uint16_t *output;
684
685 /* Allocate output buffer */
686 output = (DSP_DATA q15_t *)malloc(length * sizeof(uint16_t));
687 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
688
689 /* Copy input data to output*/
690 memcpy(output, input1, length * sizeof(q15_t));
691
692 /* Run test function */
693 zdsp_or_u16(output, input2, output, length);
694
695 /* Validate output */
696 zassert_true(test_equal_q15(length, output, ref), ASSERT_MSG_INCORRECT_COMP_RESULT);
697
698 /* Free output buffer */
699 free(output);
700 }
701
702 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_or_u16_in_place, 7, in_bitwise1, in_bitwise2, ref_or, 7);
703 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_or_u16_in_place, 16, in_bitwise1, in_bitwise2, ref_or,
704 16);
705 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_or_u16_in_place, 23, in_bitwise1, in_bitwise2, ref_or,
706 23);
707
test_zdsp_not_u16(const DSP_DATA uint16_t * input1,const uint16_t * ref,size_t length)708 static void test_zdsp_not_u16(
709 const DSP_DATA uint16_t *input1, const uint16_t *ref, size_t length)
710 {
711 DSP_DATA uint16_t *output;
712
713 /* Allocate output buffer */
714 output = (DSP_DATA q15_t *)malloc(length * sizeof(uint16_t));
715 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
716
717 /* Run test function */
718 zdsp_not_u16(input1, output, length);
719
720 /* Validate output */
721 zassert_true(
722 test_equal_q15(length, output, ref),
723 ASSERT_MSG_INCORRECT_COMP_RESULT);
724
725 /* Free output buffer */
726 free(output);
727 }
728
729 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_not_u16, 7, in_bitwise1, ref_not, 7);
730 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_not_u16, 16, in_bitwise1, ref_not, 16);
731 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_not_u16, 23, in_bitwise1, ref_not, 23);
732
test_zdsp_not_u16_in_place(const DSP_DATA uint16_t * input1,const uint16_t * ref,size_t length)733 static void test_zdsp_not_u16_in_place(
734 const DSP_DATA uint16_t *input1, const uint16_t *ref, size_t length)
735 {
736 DSP_DATA uint16_t *output;
737
738 /* Allocate output buffer */
739 output = (DSP_DATA q15_t *)malloc(length * sizeof(uint16_t));
740 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
741
742 /* Copy input data to output*/
743 memcpy(output, input1, length * sizeof(q15_t));
744
745 /* Run test function */
746 zdsp_not_u16(output, output, length);
747
748 /* Validate output */
749 zassert_true(test_equal_q15(length, output, ref), ASSERT_MSG_INCORRECT_COMP_RESULT);
750
751 /* Free output buffer */
752 free(output);
753 }
754
755 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_not_u16_in_place, 7, in_bitwise1, ref_not, 7);
756 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_not_u16_in_place, 16, in_bitwise1, ref_not, 16);
757 DEFINE_TEST_VARIANT3(basic_math_q15, zdsp_not_u16_in_place, 23, in_bitwise1, ref_not, 23);
758
test_zdsp_xor_u16(const DSP_DATA uint16_t * input1,const DSP_DATA uint16_t * input2,const uint16_t * ref,size_t length)759 static void test_zdsp_xor_u16(
760 const DSP_DATA uint16_t *input1, const DSP_DATA uint16_t *input2, const uint16_t *ref,
761 size_t length)
762 {
763 DSP_DATA uint16_t *output;
764
765 /* Allocate output buffer */
766 output = (DSP_DATA q15_t *)malloc(length * sizeof(uint16_t));
767 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
768
769 /* Run test function */
770 zdsp_xor_u16(input1, input2, output, length);
771
772 /* Validate output */
773 zassert_true(
774 test_equal_q15(length, output, ref),
775 ASSERT_MSG_INCORRECT_COMP_RESULT);
776
777 /* Free output buffer */
778 free(output);
779 }
780
781 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_xor_u16, 7, in_bitwise1, in_bitwise2, ref_xor, 7);
782 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_xor_u16, 16, in_bitwise1, in_bitwise2, ref_xor, 16);
783 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_xor_u16, 23, in_bitwise1, in_bitwise2, ref_xor, 23);
784
test_zdsp_xor_u16_in_place(const DSP_DATA uint16_t * input1,const DSP_DATA uint16_t * input2,const uint16_t * ref,size_t length)785 static void test_zdsp_xor_u16_in_place(
786 const DSP_DATA uint16_t *input1, const DSP_DATA uint16_t *input2, const uint16_t *ref,
787 size_t length)
788 {
789 DSP_DATA uint16_t *output;
790
791 /* Allocate output buffer */
792 output = (DSP_DATA q15_t *)malloc(length * sizeof(uint16_t));
793 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
794
795 /* Copy input data to output*/
796 memcpy(output, input1, length * sizeof(q15_t));
797
798 /* Run test function */
799 zdsp_xor_u16(output, input2, output, length);
800
801 /* Validate output */
802 zassert_true(test_equal_q15(length, output, ref), ASSERT_MSG_INCORRECT_COMP_RESULT);
803
804 /* Free output buffer */
805 free(output);
806 }
807
808 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_xor_u16_in_place, 7, in_bitwise1, in_bitwise2, ref_xor,
809 7);
810 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_xor_u16_in_place, 16, in_bitwise1, in_bitwise2, ref_xor,
811 16);
812 DEFINE_TEST_VARIANT4(basic_math_q15, zdsp_xor_u16_in_place, 23, in_bitwise1, in_bitwise2, ref_xor,
813 23);
814
test_zdsp_clip_q15(const DSP_DATA q15_t * input,const q15_t * ref,q15_t min,q15_t max,size_t length)815 static void test_zdsp_clip_q15(
816 const DSP_DATA q15_t *input, const q15_t *ref, q15_t min, q15_t max, size_t length)
817 {
818 DSP_DATA q15_t *output;
819
820 /* Allocate output buffer */
821 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
822 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
823
824 /* Run test function */
825 zdsp_clip_q15(input, output, min, max, length);
826
827 /* Validate output */
828 zassert_true(
829 test_equal_q15(length, output, ref),
830 ASSERT_MSG_INCORRECT_COMP_RESULT);
831
832 /* Free output buffer */
833 free(output);
834 }
835
836 DEFINE_TEST_VARIANT5(basic_math_q15, zdsp_clip_q15, c000_f333, in_clip, ref_clip1,
837 0xc000, 0xf333, ARRAY_SIZE(ref_clip1));
838 DEFINE_TEST_VARIANT5(basic_math_q15, zdsp_clip_q15, c000_4000, in_clip, ref_clip2,
839 0xc000, 0x4000, ARRAY_SIZE(ref_clip2));
840 DEFINE_TEST_VARIANT5(basic_math_q15, zdsp_clip_q15, 0ccd_4000, in_clip, ref_clip3,
841 0x0ccd, 0x4000, ARRAY_SIZE(ref_clip3));
842
test_zdsp_clip_q15_in_place(const DSP_DATA q15_t * input,const q15_t * ref,q15_t min,q15_t max,size_t length)843 static void test_zdsp_clip_q15_in_place(
844 const DSP_DATA q15_t *input, const q15_t *ref, q15_t min, q15_t max, size_t length)
845 {
846 DSP_DATA q15_t *output;
847
848 /* Allocate output buffer */
849 output = (DSP_DATA q15_t *)malloc(length * sizeof(q15_t));
850 zassert_not_null(output, ASSERT_MSG_BUFFER_ALLOC_FAILED);
851
852 /* Copy input data to output*/
853 memcpy(output, input, length * sizeof(q15_t));
854
855 /* Run test function */
856 zdsp_clip_q15(output, output, min, max, length);
857
858 /* Validate output */
859 zassert_true(test_equal_q15(length, output, ref), ASSERT_MSG_INCORRECT_COMP_RESULT);
860
861 /* Free output buffer */
862 free(output);
863 }
864
865 DEFINE_TEST_VARIANT5(basic_math_q15, zdsp_clip_q15_in_place, c000_f333, in_clip, ref_clip1, 0xc000,
866 0xf333, ARRAY_SIZE(ref_clip1));
867 DEFINE_TEST_VARIANT5(basic_math_q15, zdsp_clip_q15_in_place, c000_4000, in_clip, ref_clip2, 0xc000,
868 0x4000, ARRAY_SIZE(ref_clip2));
869 DEFINE_TEST_VARIANT5(basic_math_q15, zdsp_clip_q15_in_place, 0ccd_4000, in_clip, ref_clip3, 0x0ccd,
870 0x4000, ARRAY_SIZE(ref_clip3));
871
872 ZTEST_SUITE(basic_math_q15, NULL, NULL, NULL, NULL, NULL);
873