1 /******************************************************************************
2  * @file     basic_math_functions_f16.h
3  * @brief    Public header file for CMSIS DSP Library
4  * @version  V1.9.0
5  * @date     23 April 2021
6  * Target Processor: Cortex-M and Cortex-A cores
7  ******************************************************************************/
8 /*
9  * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
10  *
11  * SPDX-License-Identifier: Apache-2.0
12  *
13  * Licensed under the Apache License, Version 2.0 (the License); you may
14  * not use this file except in compliance with the License.
15  * You may obtain a copy of the License at
16  *
17  * www.apache.org/licenses/LICENSE-2.0
18  *
19  * Unless required by applicable law or agreed to in writing, software
20  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
21  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22  * See the License for the specific language governing permissions and
23  * limitations under the License.
24  */
25 
26 
27 #ifndef _BASIC_MATH_FUNCTIONS_F16_H_
28 #define _BASIC_MATH_FUNCTIONS_F16_H_
29 
30 #ifdef   __cplusplus
31 extern "C"
32 {
33 #endif
34 
35 #include "arm_math_types_f16.h"
36 #include "arm_math_memory.h"
37 
38 #include "dsp/none.h"
39 #include "dsp/utils.h"
40 
41 
42 #if defined(ARM_FLOAT16_SUPPORTED)
43 
44 
45   /**
46    * @brief Floating-point vector addition.
47    * @param[in]  pSrcA      points to the first input vector
48    * @param[in]  pSrcB      points to the second input vector
49    * @param[out] pDst       points to the output vector
50    * @param[in]  blockSize  number of samples in each vector
51    */
52   void arm_add_f16(
53   const float16_t * pSrcA,
54   const float16_t * pSrcB,
55         float16_t * pDst,
56         uint32_t blockSize);
57 
58   /**
59    * @brief Floating-point vector subtraction.
60    * @param[in]  pSrcA      points to the first input vector
61    * @param[in]  pSrcB      points to the second input vector
62    * @param[out] pDst       points to the output vector
63    * @param[in]  blockSize  number of samples in each vector
64    */
65   void arm_sub_f16(
66   const float16_t * pSrcA,
67   const float16_t * pSrcB,
68         float16_t * pDst,
69         uint32_t blockSize);
70 
71     /**
72    * @brief Multiplies a floating-point vector by a scalar.
73    * @param[in]  pSrc       points to the input vector
74    * @param[in]  scale      scale factor to be applied
75    * @param[out] pDst       points to the output vector
76    * @param[in]  blockSize  number of samples in the vector
77    */
78   void arm_scale_f16(
79   const float16_t * pSrc,
80         float16_t scale,
81         float16_t * pDst,
82         uint32_t blockSize);
83 
84     /**
85    * @brief Floating-point vector absolute value.
86    * @param[in]  pSrc       points to the input buffer
87    * @param[out] pDst       points to the output buffer
88    * @param[in]  blockSize  number of samples in each vector
89    */
90   void arm_abs_f16(
91   const float16_t * pSrc,
92         float16_t * pDst,
93         uint32_t blockSize);
94 
95 
96   /**
97    * @brief  Adds a constant offset to a floating-point vector.
98    * @param[in]  pSrc       points to the input vector
99    * @param[in]  offset     is the offset to be added
100    * @param[out] pDst       points to the output vector
101    * @param[in]  blockSize  number of samples in the vector
102    */
103   void arm_offset_f16(
104   const float16_t * pSrc,
105         float16_t offset,
106         float16_t * pDst,
107         uint32_t blockSize);
108 
109   /**
110    * @brief Dot product of floating-point vectors.
111    * @param[in]  pSrcA      points to the first input vector
112    * @param[in]  pSrcB      points to the second input vector
113    * @param[in]  blockSize  number of samples in each vector
114    * @param[out] result     output result returned here
115    */
116   void arm_dot_prod_f16(
117   const float16_t * pSrcA,
118   const float16_t * pSrcB,
119         uint32_t blockSize,
120         float16_t * result);
121 
122   /**
123    * @brief Floating-point vector multiplication.
124    * @param[in]  pSrcA      points to the first input vector
125    * @param[in]  pSrcB      points to the second input vector
126    * @param[out] pDst       points to the output vector
127    * @param[in]  blockSize  number of samples in each vector
128    */
129   void arm_mult_f16(
130   const float16_t * pSrcA,
131   const float16_t * pSrcB,
132         float16_t * pDst,
133         uint32_t blockSize);
134 
135   /**
136    * @brief  Negates the elements of a floating-point vector.
137    * @param[in]  pSrc       points to the input vector
138    * @param[out] pDst       points to the output vector
139    * @param[in]  blockSize  number of samples in the vector
140    */
141   void arm_negate_f16(
142   const float16_t * pSrc,
143         float16_t * pDst,
144         uint32_t blockSize);
145 
146   /**
147   @brief         Elementwise floating-point clipping
148   @param[in]     pSrc          points to input values
149   @param[out]    pDst          points to output clipped values
150   @param[in]     low           lower bound
151   @param[in]     high          higher bound
152   @param[in]     numSamples    number of samples to clip
153   @return        none
154  */
155 
156 void arm_clip_f16(const float16_t * pSrc,
157   float16_t * pDst,
158   float16_t low,
159   float16_t high,
160   uint32_t numSamples);
161 
162 #endif /* defined(ARM_FLOAT16_SUPPORTED)*/
163 
164 #ifdef   __cplusplus
165 }
166 #endif
167 
168 #endif /* ifndef _BASIC_MATH_FUNCTIONS_F16_H_ */
169