Line data Source code
1 1 : /* Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
2 : * SPDX-License-Identifier: Apache-2.0
3 : */
4 :
5 : /**
6 : * @file zephyr/dsp/basicmath.h
7 : *
8 : * @brief Public APIs for DSP basicmath
9 : */
10 :
11 : #ifndef ZEPHYR_INCLUDE_DSP_BASICMATH_H_
12 : #define ZEPHYR_INCLUDE_DSP_BASICMATH_H_
13 :
14 : #include <zephyr/dsp/dsp.h>
15 :
16 : #ifdef __cplusplus
17 : extern "C" {
18 : #endif
19 :
20 : /**
21 : * @ingroup math_dsp
22 : * @defgroup math_dsp_basic Basic Math Functions
23 : */
24 :
25 : /**
26 : * @ingroup math_dsp_basic
27 : * @addtogroup math_dsp_basic_mult Vector Multiplication
28 : *
29 : * Element-by-element multiplication of two vectors.
30 : * <pre>
31 : * dst[n] = src_a[n] * src_b[n], 0 <= n < block_size.
32 : * </pre>
33 : * There are separate functions for floating-point, Q7, Q15, and Q31 data types.
34 : * @{
35 : */
36 :
37 : /**
38 : * @brief Q7 vector multiplication.
39 : *
40 : * @par Scaling and Overflow Behavior
41 : * The function uses saturating arithmetic.
42 : * Results outside of the allowable Q7 range [0x80 0x7F] are saturated.
43 : *
44 : * @param[in] src_a points to the first input vector
45 : * @param[in] src_b points to the second input vector
46 : * @param[out] dst points to the output vector
47 : * @param[in] block_size number of samples in each vector
48 : */
49 1 : DSP_FUNC_SCOPE void zdsp_mult_q7(const DSP_DATA q7_t *src_a, const DSP_DATA q7_t *src_b,
50 : DSP_DATA q7_t *dst, uint32_t block_size);
51 :
52 : /**
53 : * @brief Q15 vector multiplication.
54 : *
55 : * @par Scaling and Overflow Behavior
56 : * The function uses saturating arithmetic.
57 : * Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
58 : *
59 : * @param[in] src_a points to the first input vector
60 : * @param[in] src_b points to the second input vector
61 : * @param[out] dst points to the output vector
62 : * @param[in] block_size number of samples in each vector
63 : */
64 1 : DSP_FUNC_SCOPE void zdsp_mult_q15(const DSP_DATA q15_t *src_a, const DSP_DATA q15_t *src_b,
65 : DSP_DATA q15_t *dst, uint32_t block_size);
66 :
67 : /**
68 : * @brief Q31 vector multiplication.
69 : *
70 : * @par Scaling and Overflow Behavior
71 : * The function uses saturating arithmetic.
72 : * Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] are saturated.
73 : *
74 : * @param[in] src_a points to the first input vector
75 : * @param[in] src_b points to the second input vector
76 : * @param[out] dst points to the output vector
77 : * @param[in] block_size number of samples in each vector
78 : */
79 1 : DSP_FUNC_SCOPE void zdsp_mult_q31(const DSP_DATA q31_t *src_a, const DSP_DATA q31_t *src_b,
80 : DSP_DATA q31_t *dst, uint32_t block_size);
81 :
82 : /**
83 : * @brief Floating-point vector multiplication.
84 : * @param[in] src_a points to the first input vector
85 : * @param[in] src_b points to the second input vector
86 : * @param[out] dst points to the output vector
87 : * @param[in] block_size number of samples in each vector
88 : */
89 1 : DSP_FUNC_SCOPE void zdsp_mult_f32(const DSP_DATA float32_t *src_a, const DSP_DATA float32_t *src_b,
90 : DSP_DATA float32_t *dst, uint32_t block_size);
91 :
92 : /**
93 : * @}
94 : */
95 :
96 : /**
97 : * @ingroup math_dsp_basic
98 : * @addtogroup math_dsp_basic_add Vector Addition
99 : *
100 : * Element-by-element addition of two vectors.
101 : * <pre>
102 : * dst[n] = src_a[n] + src_b[n], 0 <= n < block_size.
103 : * </pre>
104 : * There are separate functions for floating-point, Q7, Q15, and Q31 data types.
105 : * @{
106 : */
107 :
108 : /**
109 : * @brief Floating-point vector addition.
110 : * @param[in] src_a points to the first input vector
111 : * @param[in] src_b points to the second input vector
112 : * @param[out] dst points to the output vector
113 : * @param[in] block_size number of samples in each vector
114 : */
115 1 : DSP_FUNC_SCOPE void zdsp_add_f32(const DSP_DATA float32_t *src_a, const DSP_DATA float32_t *src_b,
116 : DSP_DATA float32_t *dst, uint32_t block_size);
117 :
118 : /**
119 : * @brief Q7 vector addition.
120 : *
121 : * @par Scaling and Overflow Behavior
122 : * The function uses saturating arithmetic.
123 : * Results outside of the allowable Q7 range [0x80 0x7F] are saturated.
124 : *
125 : * @param[in] src_a points to the first input vector
126 : * @param[in] src_b points to the second input vector
127 : * @param[out] dst points to the output vector
128 : * @param[in] block_size number of samples in each vector
129 : */
130 1 : DSP_FUNC_SCOPE void zdsp_add_q7(const DSP_DATA q7_t *src_a, const DSP_DATA q7_t *src_b,
131 : DSP_DATA q7_t *dst, uint32_t block_size);
132 :
133 : /**
134 : * @brief Q15 vector addition.
135 : *
136 : * @par Scaling and Overflow Behavior
137 : * The function uses saturating arithmetic.
138 : * Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
139 : *
140 : * @param[in] src_a points to the first input vector
141 : * @param[in] src_b points to the second input vector
142 : * @param[out] dst points to the output vector
143 : * @param[in] block_size number of samples in each vector
144 : */
145 1 : DSP_FUNC_SCOPE void zdsp_add_q15(const DSP_DATA q15_t *src_a, const DSP_DATA q15_t *src_b,
146 : DSP_DATA q15_t *dst, uint32_t block_size);
147 :
148 : /**
149 : * @brief Q31 vector addition.
150 : *
151 : * @par Scaling and Overflow Behavior
152 : * The function uses saturating arithmetic.
153 : * Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated.
154 : *
155 : * @param[in] src_a points to the first input vector
156 : * @param[in] src_b points to the second input vector
157 : * @param[out] dst points to the output vector
158 : * @param[in] block_size number of samples in each vector
159 : */
160 1 : DSP_FUNC_SCOPE void zdsp_add_q31(const DSP_DATA q31_t *src_a, const DSP_DATA q31_t *src_b,
161 : DSP_DATA q31_t *dst, uint32_t block_size);
162 :
163 : /**
164 : * @}
165 : */
166 :
167 : /**
168 : * @ingroup math_dsp_basic
169 : * @addtogroup math_dsp_basic_sub Vector Subtraction
170 : *
171 : * Element-by-element subtraction of two vectors.
172 : * <pre>
173 : * dst[n] = src_a[n] - src_b[n], 0 <= n < block_size.
174 : * </pre>
175 : * There are separate functions for floating-point, Q7, Q15, and Q31 data types.
176 : * @{
177 : */
178 :
179 : /**
180 : * @brief Floating-point vector subtraction.
181 : * @param[in] src_a points to the first input vector
182 : * @param[in] src_b points to the second input vector
183 : * @param[out] dst points to the output vector
184 : * @param[in] block_size number of samples in each vector
185 : */
186 1 : DSP_FUNC_SCOPE void zdsp_sub_f32(const DSP_DATA float32_t *src_a, const DSP_DATA float32_t *src_b,
187 : DSP_DATA float32_t *dst, uint32_t block_size);
188 :
189 : /**
190 : * @brief Q7 vector subtraction.
191 : *
192 : * @par Scaling and Overflow Behavior
193 : * The function uses saturating arithmetic.
194 : * Results outside of the allowable Q7 range [0x80 0x7F] will be saturated.
195 : *
196 : * @param[in] src_a points to the first input vector
197 : * @param[in] src_b points to the second input vector
198 : * @param[out] dst points to the output vector
199 : * @param[in] block_size number of samples in each vector
200 : */
201 1 : DSP_FUNC_SCOPE void zdsp_sub_q7(const DSP_DATA q7_t *src_a, const DSP_DATA q7_t *src_b,
202 : DSP_DATA q7_t *dst, uint32_t block_size);
203 :
204 : /**
205 : * @brief Q15 vector subtraction.
206 : *
207 : * @par Scaling and Overflow Behavior
208 : * The function uses saturating arithmetic.
209 : * Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
210 : *
211 : * @param[in] src_a points to the first input vector
212 : * @param[in] src_b points to the second input vector
213 : * @param[out] dst points to the output vector
214 : * @param[in] block_size number of samples in each vector
215 : */
216 1 : DSP_FUNC_SCOPE void zdsp_sub_q15(const DSP_DATA q15_t *src_a, const DSP_DATA q15_t *src_b,
217 : DSP_DATA q15_t *dst, uint32_t block_size);
218 :
219 : /**
220 : * @brief Q31 vector subtraction.
221 : *
222 : * @par Scaling and Overflow Behavior
223 : * The function uses saturating arithmetic.
224 : * Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated.
225 : *
226 : * @param[in] src_a points to the first input vector
227 : * @param[in] src_b points to the second input vector
228 : * @param[out] dst points to the output vector
229 : * @param[in] block_size number of samples in each vector
230 : */
231 1 : DSP_FUNC_SCOPE void zdsp_sub_q31(const DSP_DATA q31_t *src_a, const DSP_DATA q31_t *src_b,
232 : DSP_DATA q31_t *dst, uint32_t block_size);
233 :
234 : /**
235 : * @}
236 : */
237 :
238 : /**
239 : * @ingroup math_dsp_basic
240 : * @addtogroup math_dsp_basic_scale Vector Scale
241 : *
242 : * Multiply a vector by a scalar value. For floating-point data, the algorithm used is:
243 : * <pre>
244 : * dst[n] = src[n] * scale, 0 <= n < block_size.
245 : * </pre>
246 : *
247 : * In the fixed-point Q7, Q15, and Q31 functions, scale is represented by a fractional
248 : * multiplication <code>scale_fract</code> and an arithmetic shift <code>shift</code>. The shift
249 : * allows the gain of the scaling operation to exceed 1.0. The algorithm used with fixed-point data
250 : * is:
251 : * <pre>
252 : * dst[n] = (src[n] * scale_fract) << shift, 0 <= n < block_size.
253 : * </pre>
254 : *
255 : * The overall scale factor applied to the fixed-point data is
256 : * <pre>
257 : * scale = scale_fract * 2^shift.
258 : * </pre>
259 : * The functions support in-place computation allowing the source and destination pointers to
260 : * reference the same memory buffer.
261 : * @{
262 : */
263 :
264 : /**
265 : * @brief Multiplies a floating-point vector by a scalar.
266 : * @param[in] src points to the input vector
267 : * @param[in] scale scale factor to be applied
268 : * @param[out] dst points to the output vector
269 : * @param[in] block_size number of samples in the vector
270 : */
271 1 : DSP_FUNC_SCOPE void zdsp_scale_f32(const DSP_DATA float32_t *src, float32_t scale,
272 : DSP_DATA float32_t *dst, uint32_t block_size);
273 :
274 : /**
275 : * @brief Multiplies a Q7 vector by a scalar.
276 : *
277 : * @par Scaling and Overflow Behavior
278 : * The input data <code>*src</code> and <code>scale_fract</code> are in 1.7 format.
279 : * These are multiplied to yield a 2.14 intermediate result and this is shifted with saturation to
280 : * 1.7 format.
281 : *
282 : * @param[in] src points to the input vector
283 : * @param[in] scale_fract fractional portion of the scale value
284 : * @param[in] shift number of bits to shift the result by
285 : * @param[out] dst points to the output vector
286 : * @param[in] block_size number of samples in the vector
287 : */
288 1 : DSP_FUNC_SCOPE void zdsp_scale_q7(const DSP_DATA q7_t *src, q7_t scale_fract, int8_t shift,
289 : DSP_DATA q7_t *dst, uint32_t block_size);
290 :
291 : /**
292 : * @brief Multiplies a Q15 vector by a scalar.
293 : *
294 : * @par Scaling and Overflow Behavior
295 : * The input data <code>*src</code> and <code>scale_fract</code> are in 1.15 format.
296 : * These are multiplied to yield a 2.30 intermediate result and this is shifted with saturation to
297 : * 1.15 format.
298 : *
299 : * @param[in] src points to the input vector
300 : * @param[in] scale_fract fractional portion of the scale value
301 : * @param[in] shift number of bits to shift the result by
302 : * @param[out] dst points to the output vector
303 : * @param[in] block_size number of samples in the vector
304 : */
305 1 : DSP_FUNC_SCOPE void zdsp_scale_q15(const DSP_DATA q15_t *src, q15_t scale_fract, int8_t shift,
306 : DSP_DATA q15_t *dst, uint32_t block_size);
307 :
308 : /**
309 : * @brief Multiplies a Q31 vector by a scalar.
310 : *
311 : * @par Scaling and Overflow Behavior
312 : * The input data <code>*src</code> and <code>scale_fract</code> are in 1.31 format.
313 : * These are multiplied to yield a 2.62 intermediate result and this is shifted with saturation to
314 : * 1.31 format.
315 : *
316 : * @param[in] src points to the input vector
317 : * @param[in] scale_fract fractional portion of the scale value
318 : * @param[in] shift number of bits to shift the result by
319 : * @param[out] dst points to the output vector
320 : * @param[in] block_size number of samples in the vector
321 : */
322 1 : DSP_FUNC_SCOPE void zdsp_scale_q31(const DSP_DATA q31_t *src, q31_t scale_fract, int8_t shift,
323 : DSP_DATA q31_t *dst, uint32_t block_size);
324 :
325 : /**
326 : * @}
327 : */
328 :
329 : /**
330 : * @ingroup math_dsp_basic
331 : * @addtogroup math_dsp_basic_abs Vector Absolute Value
332 : *
333 : * Computes the absolute value of a vector on an element-by-element basis.
334 : * <pre>
335 : * dst[n] = abs(src[n]), 0 <= n < block_size.
336 : * </pre>
337 : * The functions support in-place computation allowing the source and destination pointers to
338 : * reference the same memory buffer. There are separate functions for floating-point, Q7, Q15, and
339 : * Q31 data types.
340 : * @{
341 : */
342 :
343 : /**
344 : * @brief Floating-point vector absolute value.
345 : * @param[in] src points to the input buffer
346 : * @param[out] dst points to the output buffer
347 : * @param[in] block_size number of samples in each vector
348 : */
349 1 : DSP_FUNC_SCOPE void zdsp_abs_f32(const DSP_DATA float32_t *src, DSP_DATA float32_t *dst,
350 : uint32_t block_size);
351 :
352 : /**
353 : * @brief Q7 vector absolute value.
354 : *
355 : * @par Scaling and Overflow Behavior
356 : * The function uses saturating arithmetic.
357 : * The Q7 value -1 (0x80) will be saturated to the maximum allowable positive value 0x7F.
358 : *
359 : * @param[in] src points to the input buffer
360 : * @param[out] dst points to the output buffer
361 : * @param[in] block_size number of samples in each vector
362 : */
363 1 : DSP_FUNC_SCOPE void zdsp_abs_q7(const DSP_DATA q7_t *src, DSP_DATA q7_t *dst, uint32_t block_size);
364 :
365 : /**
366 : * @brief Q15 vector absolute value.
367 : *
368 : * @par Scaling and Overflow Behavior
369 : * The function uses saturating arithmetic.
370 : * The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF.
371 : *
372 : * @param[in] src points to the input buffer
373 : * @param[out] dst points to the output buffer
374 : * @param[in] block_size number of samples in each vector
375 : */
376 1 : DSP_FUNC_SCOPE void zdsp_abs_q15(const DSP_DATA q15_t *src, DSP_DATA q15_t *dst,
377 : uint32_t block_size);
378 :
379 : /**
380 : * @brief Q31 vector absolute value.
381 : *
382 : * @par Scaling and Overflow Behavior
383 : * The function uses saturating arithmetic.
384 : * The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value
385 : * 0x7FFFFFFF.
386 : *
387 : * @param[in] src points to the input buffer
388 : * @param[out] dst points to the output buffer
389 : * @param[in] block_size number of samples in each vector
390 : */
391 1 : DSP_FUNC_SCOPE void zdsp_abs_q31(const DSP_DATA q31_t *src, DSP_DATA q31_t *dst,
392 : uint32_t block_size);
393 :
394 : /**
395 : * @}
396 : */
397 :
398 : /**
399 : * @ingroup math_dsp_basic
400 : * @addtogroup math_dsp_basic_dot Vector Dot Product
401 : *
402 : * Computes the dot product of two vectors. The vectors are multiplied element-by-element and then
403 : * summed.
404 : * <pre>
405 : * sum = src_a[0]*src_b[0] + src_a[1]*src_b[1] + ... + src_a[block_size-1]*src_b[block_size-1]
406 : * </pre>
407 : * There are separate functions for floating-point, Q7, Q15, and Q31 data types.
408 : * @{
409 : */
410 :
411 : /**
412 : * @brief Dot product of floating-point vectors.
413 : * @param[in] src_a points to the first input vector
414 : * @param[in] src_b points to the second input vector
415 : * @param[in] block_size number of samples in each vector
416 : * @param[out] result output result returned here
417 : */
418 1 : DSP_FUNC_SCOPE void zdsp_dot_prod_f32(const DSP_DATA float32_t *src_a,
419 : const DSP_DATA float32_t *src_b, uint32_t block_size,
420 : DSP_DATA float32_t *result);
421 :
422 : /**
423 : * @brief Dot product of Q7 vectors.
424 : *
425 : * @par Scaling and Overflow Behavior
426 : * The intermediate multiplications are in 1.7 x 1.7 = 2.14 format and these results are added to
427 : * an accumulator in 18.14 format. Nonsaturating additions are used and there is no danger of wrap
428 : * around as long as the vectors are less than 2^18 elements long. The return result is in 18.14
429 : * format.
430 : *
431 : * @param[in] src_a points to the first input vector
432 : * @param[in] src_b points to the second input vector
433 : * @param[in] block_size number of samples in each vector
434 : * @param[out] result output result returned here
435 : */
436 1 : DSP_FUNC_SCOPE void zdsp_dot_prod_q7(const DSP_DATA q7_t *src_a, const DSP_DATA q7_t *src_b,
437 : uint32_t block_size, DSP_DATA q31_t *result);
438 :
439 : /**
440 : * @brief Dot product of Q15 vectors.
441 : *
442 : * @par Scaling and Overflow Behavior
443 : * The intermediate multiplications are in 1.15 x 1.15 = 2.30 format and these results are added
444 : * to a 64-bit accumulator in 34.30 format. Nonsaturating additions are used and given that there
445 : * are 33 guard bits in the accumulator there is no risk of overflow. The return result is in
446 : * 34.30 format.
447 : *
448 : * @param[in] src_a points to the first input vector
449 : * @param[in] src_b points to the second input vector
450 : * @param[in] block_size number of samples in each vector
451 : * @param[out] result output result returned here
452 : */
453 1 : DSP_FUNC_SCOPE void zdsp_dot_prod_q15(const DSP_DATA q15_t *src_a, const DSP_DATA q15_t *src_b,
454 : uint32_t block_size, DSP_DATA q63_t *result);
455 :
456 : /**
457 : * @brief Dot product of Q31 vectors.
458 : *
459 : * @par Scaling and Overflow Behavior
460 : * The intermediate multiplications are in 1.31 x 1.31 = 2.62 format and these are truncated to
461 : * 2.48 format by discarding the lower 14 bits. The 2.48 result is then added without saturation
462 : * to a 64-bit accumulator in 16.48 format. There are 15 guard bits in the accumulator and there
463 : * is no risk of overflow as long as the length of the vectors is less than 2^16 elements. The
464 : * return result is in 16.48 format.
465 : *
466 : * @param[in] src_a points to the first input vector
467 : * @param[in] src_b points to the second input vector
468 : * @param[in] block_size number of samples in each vector
469 : * @param[out] result output result returned here
470 : */
471 1 : DSP_FUNC_SCOPE void zdsp_dot_prod_q31(const DSP_DATA q31_t *src_a, const DSP_DATA q31_t *src_b,
472 : uint32_t block_size, DSP_DATA q63_t *result);
473 :
474 : /**
475 : * @}
476 : */
477 :
478 : /**
479 : * @ingroup math_dsp_basic
480 : * @addtogroup math_dsp_basic_shift Vector Shift
481 : *
482 : * Shifts the elements of a fixed-point vector by a specified number of bits.
483 : * There are separate functions for Q7, Q15, and Q31 data types. The underlying algorithm used is:
484 : * <pre>
485 : * dst[n] = src[n] << shift, 0 <= n < block_size.
486 : * </pre>
487 : * If <code>shift</code> is positive then the elements of the vector are shifted to the left.
488 : * If <code>shift</code> is negative then the elements of the vector are shifted to the right.
489 : *
490 : * The functions support in-place computation allowing the source and destination pointers to
491 : * reference the same memory buffer.
492 : * @{
493 : */
494 :
495 : /**
496 : * @brief Shifts the elements of a Q7 vector a specified number of bits.
497 : *
498 : * @par Scaling and Overflow Behavior
499 : * The function uses saturating arithmetic.
500 : * Results outside of the allowable Q7 range [0x80 0x7F] are saturated.
501 : *
502 : * @param[in] src points to the input vector
503 : * @param[in] shift_bits number of bits to shift. A positive value shifts left; a negative value
504 : * shifts right.
505 : * @param[out] dst points to the output vector
506 : * @param[in] block_size number of samples in the vector
507 : */
508 1 : DSP_FUNC_SCOPE void zdsp_shift_q7(const DSP_DATA q7_t *src, int8_t shift_bits, DSP_DATA q7_t *dst,
509 : uint32_t block_size);
510 :
511 : /**
512 : * @brief Shifts the elements of a Q15 vector a specified number of bits.
513 : *
514 : * @pre Scaling and Overflow Behavior
515 : * The function uses saturating arithmetic.
516 : * Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
517 : *
518 : * @param[in] src points to the input vector
519 : * @param[in] shift_bits number of bits to shift. A positive value shifts left; a negative value
520 : * shifts right.
521 : * @param[out] dst points to the output vector
522 : * @param[in] block_size number of samples in the vector
523 : */
524 1 : DSP_FUNC_SCOPE void zdsp_shift_q15(const DSP_DATA q15_t *src, int8_t shift_bits,
525 : DSP_DATA q15_t *dst, uint32_t block_size);
526 :
527 : /**
528 : * @brief Shifts the elements of a Q31 vector a specified number of bits.
529 : *
530 : * @par Scaling and Overflow Behavior
531 : * The function uses saturating arithmetic.
532 : * Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated.
533 : *
534 : * @param[in] src points to the input vector
535 : * @param[in] shift_bits number of bits to shift. A positive value shifts left; a negative value
536 : * shifts right.
537 : * @param[out] dst points to the output vector
538 : * @param[in] block_size number of samples in the vector
539 : */
540 1 : DSP_FUNC_SCOPE void zdsp_shift_q31(const DSP_DATA q31_t *src, int8_t shift_bits,
541 : DSP_DATA q31_t *dst, uint32_t block_size);
542 :
543 : /**
544 : * @}
545 : */
546 :
547 : /**
548 : * @ingroup math_dsp_basic
549 : * @addtogroup math_dsp_basic_offset Vector Offset
550 : *
551 : * Adds a constant offset to each element of a vector.
552 : * <pre>
553 : * dst[n] = src[n] + offset, 0 <= n < block_size.
554 : * </pre>
555 : * The functions support in-place computation allowing the source and destination pointers to
556 : * reference the same memory buffer. There are separate functions for floating-point, Q7, Q15, and
557 : * Q31 data types.
558 : *
559 : * @{
560 : */
561 :
562 : /**
563 : * @brief Adds a constant offset to a floating-point vector.
564 : * @param[in] src points to the input vector
565 : * @param[in] offset is the offset to be added
566 : * @param[out] dst points to the output vector
567 : * @param[in] block_size number of samples in the vector
568 : */
569 1 : DSP_FUNC_SCOPE void zdsp_offset_f32(const DSP_DATA float32_t *src, float32_t offset,
570 : DSP_DATA float32_t *dst, uint32_t block_size);
571 :
572 : /**
573 : * @brief Adds a constant offset to a Q7 vector.
574 : *
575 : * @par Scaling and Overflow Behavior
576 : * The function uses saturating arithmetic.
577 : * Results outside of the allowable Q7 range [0x80 0x7F] are saturated.
578 : *
579 : * @param[in] src points to the input vector
580 : * @param[in] offset is the offset to be added
581 : * @param[out] dst points to the output vector
582 : * @param[in] block_size number of samples in the vector
583 : */
584 1 : DSP_FUNC_SCOPE void zdsp_offset_q7(const DSP_DATA q7_t *src, q7_t offset, DSP_DATA q7_t *dst,
585 : uint32_t block_size);
586 :
587 : /**
588 : * @brief Adds a constant offset to a Q15 vector.
589 : *
590 : * @par Scaling and Overflow Behavior
591 : * The function uses saturating arithmetic.
592 : * Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
593 : *
594 : * @param[in] src points to the input vector
595 : * @param[in] offset is the offset to be added
596 : * @param[out] dst points to the output vector
597 : * @param[in] block_size number of samples in the vector
598 : */
599 1 : DSP_FUNC_SCOPE void zdsp_offset_q15(const DSP_DATA q15_t *src, q15_t offset, DSP_DATA q15_t *dst,
600 : uint32_t block_size);
601 :
602 : /**
603 : * @brief Adds a constant offset to a Q31 vector.
604 : *
605 : * @par Scaling and Overflow Behavior
606 : * The function uses saturating arithmetic.
607 : * Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated.
608 : *
609 : * @param[in] src points to the input vector
610 : * @param[in] offset is the offset to be added
611 : * @param[out] dst points to the output vector
612 : * @param[in] block_size number of samples in the vector
613 : */
614 1 : DSP_FUNC_SCOPE void zdsp_offset_q31(const DSP_DATA q31_t *src, q31_t offset, DSP_DATA q31_t *dst,
615 : uint32_t block_size);
616 :
617 : /**
618 : * @}
619 : */
620 :
621 : /**
622 : * @ingroup math_dsp_basic
623 : * @addtogroup math_dsp_basic_negate Vector Negate
624 : *
625 : * Negates the elements of a vector.
626 : * <pre>
627 : * dst[n] = -src[n], 0 <= n < block_size.
628 : * </pre>
629 : * The functions support in-place computation allowing the source and destination pointers to
630 : * reference the same memory buffer. There are separate functions for floating-point, Q7, Q15, and
631 : * Q31 data types.
632 : *
633 : * @{
634 : */
635 :
636 : /**
637 : * @brief Negates the elements of a floating-point vector.
638 : * @param[in] src points to the input vector
639 : * @param[out] dst points to the output vector
640 : * @param[in] block_size number of samples in the vector
641 : */
642 1 : DSP_FUNC_SCOPE void zdsp_negate_f32(const DSP_DATA float32_t *src, DSP_DATA float32_t *dst,
643 : uint32_t block_size);
644 :
645 : /**
646 : * @brief Negates the elements of a Q7 vector.
647 : *
648 : * @par Scaling and Overflow Behavior
649 : * The function uses saturating arithmetic.
650 : * The Q7 value -1 (0x80) is saturated to the maximum allowable positive value 0x7F.
651 : *
652 : * @param[in] src points to the input vector
653 : * @param[out] dst points to the output vector
654 : * @param[in] block_size number of samples in the vector
655 : */
656 1 : DSP_FUNC_SCOPE void zdsp_negate_q7(const DSP_DATA q7_t *src, DSP_DATA q7_t *dst,
657 : uint32_t block_size);
658 :
659 : /**
660 : * @brief Negates the elements of a Q15 vector.
661 : *
662 : * @par Scaling and Overflow Behavior
663 : * The function uses saturating arithmetic.
664 : * The Q15 value -1 (0x8000) is saturated to the maximum allowable positive value 0x7FFF.
665 : *
666 : * @param[in] src points to the input vector
667 : * @param[out] dst points to the output vector
668 : * @param[in] block_size number of samples in the vector
669 : */
670 1 : DSP_FUNC_SCOPE void zdsp_negate_q15(const DSP_DATA q15_t *src, DSP_DATA q15_t *dst,
671 : uint32_t block_size);
672 :
673 : /**
674 : * @brief Negates the elements of a Q31 vector.
675 : *
676 : * @par Scaling and Overflow Behavior
677 : * The function uses saturating arithmetic.
678 : * The Q31 value -1 (0x80000000) is saturated to the maximum allowable positive value 0x7FFFFFFF.
679 : *
680 : * @param[in] src points to the input vector
681 : * @param[out] dst points to the output vector
682 : * @param[in] block_size number of samples in the vector
683 : */
684 1 : DSP_FUNC_SCOPE void zdsp_negate_q31(const DSP_DATA q31_t *src, DSP_DATA q31_t *dst,
685 : uint32_t block_size);
686 :
687 : /**
688 : * @}
689 : */
690 :
691 : /**
692 : * @ingroup math_dsp_basic
693 : * @addtogroup math_dsp_basic_and Vector bitwise AND
694 : *
695 : * Compute the logical bitwise AND.
696 : *
697 : * There are separate functions for uint32_t, uint16_t, and uint7_t data types.
698 : * @{
699 : */
700 :
701 : /**
702 : * @brief Compute the logical bitwise AND of two fixed-point vectors.
703 : * @param[in] src_a points to input vector A
704 : * @param[in] src_b points to input vector B
705 : * @param[out] dst points to output vector
706 : * @param[in] block_size number of samples in each vector
707 : */
708 1 : DSP_FUNC_SCOPE void zdsp_and_u8(const DSP_DATA uint8_t *src_a, const DSP_DATA uint8_t *src_b,
709 : DSP_DATA uint8_t *dst, uint32_t block_size);
710 :
711 : /**
712 : * @brief Compute the logical bitwise AND of two fixed-point vectors.
713 : * @param[in] src_a points to input vector A
714 : * @param[in] src_b points to input vector B
715 : * @param[out] dst points to output vector
716 : * @param[in] block_size number of samples in each vector
717 : */
718 1 : DSP_FUNC_SCOPE void zdsp_and_u16(const DSP_DATA uint16_t *src_a, const DSP_DATA uint16_t *src_b,
719 : DSP_DATA uint16_t *dst, uint32_t block_size);
720 :
721 : /**
722 : * @brief Compute the logical bitwise AND of two fixed-point vectors.
723 : * @param[in] src_a points to input vector A
724 : * @param[in] src_b points to input vector B
725 : * @param[out] dst points to output vector
726 : * @param[in] block_size number of samples in each vector
727 : */
728 1 : DSP_FUNC_SCOPE void zdsp_and_u32(const DSP_DATA uint32_t *src_a, const DSP_DATA uint32_t *src_b,
729 : DSP_DATA uint32_t *dst, uint32_t block_size);
730 :
731 : /**
732 : * @}
733 : */
734 :
735 : /**
736 : * @ingroup math_dsp_basic
737 : * @addtogroup math_dsp_basic_or Vector bitwise OR
738 : *
739 : * Compute the logical bitwise OR.
740 : *
741 : * There are separate functions for uint32_t, uint16_t, and uint7_t data types.
742 : * @{
743 : */
744 :
745 : /**
746 : * @brief Compute the logical bitwise OR of two fixed-point vectors.
747 : * @param[in] src_a points to input vector A
748 : * @param[in] src_b points to input vector B
749 : * @param[out] dst points to output vector
750 : * @param[in] block_size number of samples in each vector
751 : */
752 1 : DSP_FUNC_SCOPE void zdsp_or_u8(const DSP_DATA uint8_t *src_a, const DSP_DATA uint8_t *src_b,
753 : DSP_DATA uint8_t *dst, uint32_t block_size);
754 :
755 : /**
756 : * @brief Compute the logical bitwise OR of two fixed-point vectors.
757 : * @param[in] src_a points to input vector A
758 : * @param[in] src_b points to input vector B
759 : * @param[out] dst points to output vector
760 : * @param[in] block_size number of samples in each vector
761 : */
762 1 : DSP_FUNC_SCOPE void zdsp_or_u16(const DSP_DATA uint16_t *src_a, const DSP_DATA uint16_t *src_b,
763 : DSP_DATA uint16_t *dst, uint32_t block_size);
764 :
765 : /**
766 : * @brief Compute the logical bitwise OR of two fixed-point vectors.
767 : * @param[in] src_a points to input vector A
768 : * @param[in] src_b points to input vector B
769 : * @param[out] dst points to output vector
770 : * @param[in] block_size number of samples in each vector
771 : */
772 1 : DSP_FUNC_SCOPE void zdsp_or_u32(const DSP_DATA uint32_t *src_a, const DSP_DATA uint32_t *src_b,
773 : DSP_DATA uint32_t *dst, uint32_t block_size);
774 :
775 : /**
776 : * @}
777 : */
778 :
779 : /**
780 : * @ingroup math_dsp_basic
781 : * @addtogroup math_dsp_basic_not Vector bitwise NOT
782 : *
783 : * Compute the logical bitwise NOT.
784 : *
785 : * There are separate functions for uint32_t, uint16_t, and uint7_t data types.
786 : * @{
787 : */
788 :
789 : /**
790 : * @brief Compute the logical bitwise NOT of a fixed-point vector.
791 : * @param[in] src points to input vector
792 : * @param[out] dst points to output vector
793 : * @param[in] block_size number of samples in each vector
794 : */
795 1 : DSP_FUNC_SCOPE void zdsp_not_u8(const DSP_DATA uint8_t *src, DSP_DATA uint8_t *dst,
796 : uint32_t block_size);
797 :
798 : /**
799 : * @brief Compute the logical bitwise NOT of a fixed-point vector.
800 : * @param[in] src points to input vector
801 : * @param[out] dst points to output vector
802 : * @param[in] block_size number of samples in each vector
803 : */
804 1 : DSP_FUNC_SCOPE void zdsp_not_u16(const DSP_DATA uint16_t *src, DSP_DATA uint16_t *dst,
805 : uint32_t block_size);
806 :
807 : /**
808 : * @brief Compute the logical bitwise NOT of a fixed-point vector.
809 : * @param[in] src points to input vector
810 : * @param[out] dst points to output vector
811 : * @param[in] block_size number of samples in each vector
812 : */
813 1 : DSP_FUNC_SCOPE void zdsp_not_u32(const DSP_DATA uint32_t *src, DSP_DATA uint32_t *dst,
814 : uint32_t block_size);
815 :
816 : /**
817 : * @}
818 : */
819 :
820 : /**
821 : * @ingroup math_dsp_basic
822 : * @addtogroup math_dsp_basic_xor Vector bitwise XOR
823 : *
824 : * Compute the logical bitwise XOR.
825 : *
826 : * There are separate functions for uint32_t, uint16_t, and uint7_t data types.
827 : * @{
828 : */
829 :
830 : /**
831 : * @brief Compute the logical bitwise XOR of two fixed-point vectors.
832 : * @param[in] src_a points to input vector A
833 : * @param[in] src_b points to input vector B
834 : * @param[out] dst points to output vector
835 : * @param[in] block_size number of samples in each vector
836 : */
837 1 : DSP_FUNC_SCOPE void zdsp_xor_u8(const DSP_DATA uint8_t *src_a, const DSP_DATA uint8_t *src_b,
838 : DSP_DATA uint8_t *dst, uint32_t block_size);
839 :
840 : /**
841 : * @brief Compute the logical bitwise XOR of two fixed-point vectors.
842 : * @param[in] src_a points to input vector A
843 : * @param[in] src_b points to input vector B
844 : * @param[out] dst points to output vector
845 : * @param[in] block_size number of samples in each vector
846 : */
847 1 : DSP_FUNC_SCOPE void zdsp_xor_u16(const DSP_DATA uint16_t *src_a, const DSP_DATA uint16_t *src_b,
848 : DSP_DATA uint16_t *dst, uint32_t block_size);
849 :
850 : /**
851 : * @brief Compute the logical bitwise XOR of two fixed-point vectors.
852 : * @param[in] src_a points to input vector A
853 : * @param[in] src_b points to input vector B
854 : * @param[out] dst points to output vector
855 : * @param[in] block_size number of samples in each vector
856 : */
857 1 : DSP_FUNC_SCOPE void zdsp_xor_u32(const DSP_DATA uint32_t *src_a, const DSP_DATA uint32_t *src_b,
858 : DSP_DATA uint32_t *dst, uint32_t block_size);
859 :
860 : /**
861 : * @}
862 : */
863 :
864 : /**
865 : * @ingroup math_dsp_basic
866 : * @addtogroup math_dsp_basic_clip Vector Clipping
867 : *
868 : * Element-by-element clipping of a value.
869 : *
870 : * The value is constrained between 2 bounds.
871 : *
872 : * There are separate functions for floating-point, Q7, Q15, and Q31 data types.
873 : * @{
874 : */
875 :
876 : /**
877 : * @brief Elementwise floating-point clipping
878 : * @param[in] src points to input values
879 : * @param[out] dst points to output clipped values
880 : * @param[in] low lower bound
881 : * @param[in] high higher bound
882 : * @param[in] num_samples number of samples to clip
883 : */
884 1 : DSP_FUNC_SCOPE void zdsp_clip_f32(const DSP_DATA float32_t *src, DSP_DATA float32_t *dst,
885 : float32_t low, float32_t high, uint32_t num_samples);
886 :
887 : /**
888 : * @brief Elementwise fixed-point clipping
889 : * @param[in] src points to input values
890 : * @param[out] dst points to output clipped values
891 : * @param[in] low lower bound
892 : * @param[in] high higher bound
893 : * @param[in] num_samples number of samples to clip
894 : */
895 1 : DSP_FUNC_SCOPE void zdsp_clip_q31(const DSP_DATA q31_t *src, DSP_DATA q31_t *dst, q31_t low,
896 : q31_t high, uint32_t num_samples);
897 :
898 : /**
899 : * @brief Elementwise fixed-point clipping
900 : * @param[in] src points to input values
901 : * @param[out] dst points to output clipped values
902 : * @param[in] low lower bound
903 : * @param[in] high higher bound
904 : * @param[in] num_samples number of samples to clip
905 : */
906 1 : DSP_FUNC_SCOPE void zdsp_clip_q15(const DSP_DATA q15_t *src, DSP_DATA q15_t *dst, q15_t low,
907 : q15_t high, uint32_t num_samples);
908 :
909 : /**
910 : * @brief Elementwise fixed-point clipping
911 : * @param[in] src points to input values
912 : * @param[out] dst points to output clipped values
913 : * @param[in] low lower bound
914 : * @param[in] high higher bound
915 : * @param[in] num_samples number of samples to clip
916 : */
917 1 : DSP_FUNC_SCOPE void zdsp_clip_q7(const DSP_DATA q7_t *src, DSP_DATA q7_t *dst, q7_t low, q7_t high,
918 : uint32_t num_samples);
919 :
920 : /**
921 : * @}
922 : */
923 :
924 : #ifdef __cplusplus
925 : }
926 : #endif
927 :
928 : #ifdef CONFIG_FP16
929 : #include <zephyr/dsp/basicmath_f16.h>
930 : #endif /* CONFIG_FP16 */
931 :
932 : #endif /* ZEPHYR_INCLUDE_DSP_BASICMATH_H_ */
|