xref: /btstack/port/stm32-l073rz-nucleo-em9304/Drivers/CMSIS/Include/arm_math.h (revision e838079242074edcbcbb400962776e15fe6ca6cb)
1*e8380792SMatthias Ringwald /* ----------------------------------------------------------------------
2*e8380792SMatthias Ringwald * Copyright (C) 2010-2015 ARM Limited. All rights reserved.
3*e8380792SMatthias Ringwald *
4*e8380792SMatthias Ringwald * $Date:        20. October 2015
5*e8380792SMatthias Ringwald * $Revision:    V1.4.5 b
6*e8380792SMatthias Ringwald *
7*e8380792SMatthias Ringwald * Project:      CMSIS DSP Library
8*e8380792SMatthias Ringwald * Title:        arm_math.h
9*e8380792SMatthias Ringwald *
10*e8380792SMatthias Ringwald * Description:  Public header file for CMSIS DSP Library
11*e8380792SMatthias Ringwald *
12*e8380792SMatthias Ringwald * Target Processor: Cortex-M7/Cortex-M4/Cortex-M3/Cortex-M0
13*e8380792SMatthias Ringwald *
14*e8380792SMatthias Ringwald * Redistribution and use in source and binary forms, with or without
15*e8380792SMatthias Ringwald * modification, are permitted provided that the following conditions
16*e8380792SMatthias Ringwald * are met:
17*e8380792SMatthias Ringwald *   - Redistributions of source code must retain the above copyright
18*e8380792SMatthias Ringwald *     notice, this list of conditions and the following disclaimer.
19*e8380792SMatthias Ringwald *   - Redistributions in binary form must reproduce the above copyright
20*e8380792SMatthias Ringwald *     notice, this list of conditions and the following disclaimer in
21*e8380792SMatthias Ringwald *     the documentation and/or other materials provided with the
22*e8380792SMatthias Ringwald *     distribution.
23*e8380792SMatthias Ringwald *   - Neither the name of ARM LIMITED nor the names of its contributors
24*e8380792SMatthias Ringwald *     may be used to endorse or promote products derived from this
25*e8380792SMatthias Ringwald *     software without specific prior written permission.
26*e8380792SMatthias Ringwald *
27*e8380792SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28*e8380792SMatthias Ringwald * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29*e8380792SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
30*e8380792SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
31*e8380792SMatthias Ringwald * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
32*e8380792SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
33*e8380792SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
34*e8380792SMatthias Ringwald * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
35*e8380792SMatthias Ringwald * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36*e8380792SMatthias Ringwald * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
37*e8380792SMatthias Ringwald * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38*e8380792SMatthias Ringwald * POSSIBILITY OF SUCH DAMAGE.
39*e8380792SMatthias Ringwald  * -------------------------------------------------------------------- */
40*e8380792SMatthias Ringwald 
41*e8380792SMatthias Ringwald /**
42*e8380792SMatthias Ringwald    \mainpage CMSIS DSP Software Library
43*e8380792SMatthias Ringwald    *
44*e8380792SMatthias Ringwald    * Introduction
45*e8380792SMatthias Ringwald    * ------------
46*e8380792SMatthias Ringwald    *
47*e8380792SMatthias Ringwald    * This user manual describes the CMSIS DSP software library,
48*e8380792SMatthias Ringwald    * a suite of common signal processing functions for use on Cortex-M processor based devices.
49*e8380792SMatthias Ringwald    *
50*e8380792SMatthias Ringwald    * The library is divided into a number of functions each covering a specific category:
51*e8380792SMatthias Ringwald    * - Basic math functions
52*e8380792SMatthias Ringwald    * - Fast math functions
53*e8380792SMatthias Ringwald    * - Complex math functions
54*e8380792SMatthias Ringwald    * - Filters
55*e8380792SMatthias Ringwald    * - Matrix functions
56*e8380792SMatthias Ringwald    * - Transforms
57*e8380792SMatthias Ringwald    * - Motor control functions
58*e8380792SMatthias Ringwald    * - Statistical functions
59*e8380792SMatthias Ringwald    * - Support functions
60*e8380792SMatthias Ringwald    * - Interpolation functions
61*e8380792SMatthias Ringwald    *
62*e8380792SMatthias Ringwald    * The library has separate functions for operating on 8-bit integers, 16-bit integers,
63*e8380792SMatthias Ringwald    * 32-bit integer and 32-bit floating-point values.
64*e8380792SMatthias Ringwald    *
65*e8380792SMatthias Ringwald    * Using the Library
66*e8380792SMatthias Ringwald    * ------------
67*e8380792SMatthias Ringwald    *
68*e8380792SMatthias Ringwald    * The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder.
69*e8380792SMatthias Ringwald    * - arm_cortexM7lfdp_math.lib (Little endian and Double Precision Floating Point Unit on Cortex-M7)
70*e8380792SMatthias Ringwald    * - arm_cortexM7bfdp_math.lib (Big endian and Double Precision Floating Point Unit on Cortex-M7)
71*e8380792SMatthias Ringwald    * - arm_cortexM7lfsp_math.lib (Little endian and Single Precision Floating Point Unit on Cortex-M7)
72*e8380792SMatthias Ringwald    * - arm_cortexM7bfsp_math.lib (Big endian and Single Precision Floating Point Unit on Cortex-M7)
73*e8380792SMatthias Ringwald    * - arm_cortexM7l_math.lib (Little endian on Cortex-M7)
74*e8380792SMatthias Ringwald    * - arm_cortexM7b_math.lib (Big endian on Cortex-M7)
75*e8380792SMatthias Ringwald    * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4)
76*e8380792SMatthias Ringwald    * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4)
77*e8380792SMatthias Ringwald    * - arm_cortexM4l_math.lib (Little endian on Cortex-M4)
78*e8380792SMatthias Ringwald    * - arm_cortexM4b_math.lib (Big endian on Cortex-M4)
79*e8380792SMatthias Ringwald    * - arm_cortexM3l_math.lib (Little endian on Cortex-M3)
80*e8380792SMatthias Ringwald    * - arm_cortexM3b_math.lib (Big endian on Cortex-M3)
81*e8380792SMatthias Ringwald    * - arm_cortexM0l_math.lib (Little endian on Cortex-M0 / CortexM0+)
82*e8380792SMatthias Ringwald    * - arm_cortexM0b_math.lib (Big endian on Cortex-M0 / CortexM0+)
83*e8380792SMatthias Ringwald    *
84*e8380792SMatthias Ringwald    * The library functions are declared in the public file <code>arm_math.h</code> which is placed in the <code>Include</code> folder.
85*e8380792SMatthias Ringwald    * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single
86*e8380792SMatthias Ringwald    * public header file <code> arm_math.h</code> for Cortex-M7/M4/M3/M0/M0+ with little endian and big endian. Same header file will be used for floating point unit(FPU) variants.
87*e8380792SMatthias Ringwald    * Define the appropriate pre processor MACRO ARM_MATH_CM7 or ARM_MATH_CM4 or  ARM_MATH_CM3 or
88*e8380792SMatthias Ringwald    * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application.
89*e8380792SMatthias Ringwald    *
90*e8380792SMatthias Ringwald    * Examples
91*e8380792SMatthias Ringwald    * --------
92*e8380792SMatthias Ringwald    *
93*e8380792SMatthias Ringwald    * The library ships with a number of examples which demonstrate how to use the library functions.
94*e8380792SMatthias Ringwald    *
95*e8380792SMatthias Ringwald    * Toolchain Support
96*e8380792SMatthias Ringwald    * ------------
97*e8380792SMatthias Ringwald    *
98*e8380792SMatthias Ringwald    * The library has been developed and tested with MDK-ARM version 5.14.0.0
99*e8380792SMatthias Ringwald    * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly.
100*e8380792SMatthias Ringwald    *
101*e8380792SMatthias Ringwald    * Building the Library
102*e8380792SMatthias Ringwald    * ------------
103*e8380792SMatthias Ringwald    *
104*e8380792SMatthias Ringwald    * The library installer contains a project file to re build libraries on MDK-ARM Tool chain in the <code>CMSIS\\DSP_Lib\\Source\\ARM</code> folder.
105*e8380792SMatthias Ringwald    * - arm_cortexM_math.uvprojx
106*e8380792SMatthias Ringwald    *
107*e8380792SMatthias Ringwald    *
108*e8380792SMatthias Ringwald    * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional pre processor MACROs detailed above.
109*e8380792SMatthias Ringwald    *
110*e8380792SMatthias Ringwald    * Pre-processor Macros
111*e8380792SMatthias Ringwald    * ------------
112*e8380792SMatthias Ringwald    *
113*e8380792SMatthias Ringwald    * Each library project have differant pre-processor macros.
114*e8380792SMatthias Ringwald    *
115*e8380792SMatthias Ringwald    * - UNALIGNED_SUPPORT_DISABLE:
116*e8380792SMatthias Ringwald    *
117*e8380792SMatthias Ringwald    * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access
118*e8380792SMatthias Ringwald    *
119*e8380792SMatthias Ringwald    * - ARM_MATH_BIG_ENDIAN:
120*e8380792SMatthias Ringwald    *
121*e8380792SMatthias Ringwald    * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets.
122*e8380792SMatthias Ringwald    *
123*e8380792SMatthias Ringwald    * - ARM_MATH_MATRIX_CHECK:
124*e8380792SMatthias Ringwald    *
125*e8380792SMatthias Ringwald    * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices
126*e8380792SMatthias Ringwald    *
127*e8380792SMatthias Ringwald    * - ARM_MATH_ROUNDING:
128*e8380792SMatthias Ringwald    *
129*e8380792SMatthias Ringwald    * Define macro ARM_MATH_ROUNDING for rounding on support functions
130*e8380792SMatthias Ringwald    *
131*e8380792SMatthias Ringwald    * - ARM_MATH_CMx:
132*e8380792SMatthias Ringwald    *
133*e8380792SMatthias Ringwald    * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target
134*e8380792SMatthias Ringwald    * and ARM_MATH_CM0 for building library on Cortex-M0 target, ARM_MATH_CM0PLUS for building library on Cortex-M0+ target, and
135*e8380792SMatthias Ringwald    * ARM_MATH_CM7 for building the library on cortex-M7.
136*e8380792SMatthias Ringwald    *
137*e8380792SMatthias Ringwald    * - __FPU_PRESENT:
138*e8380792SMatthias Ringwald    *
139*e8380792SMatthias Ringwald    * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries
140*e8380792SMatthias Ringwald    *
141*e8380792SMatthias Ringwald    * <hr>
142*e8380792SMatthias Ringwald    * CMSIS-DSP in ARM::CMSIS Pack
143*e8380792SMatthias Ringwald    * -----------------------------
144*e8380792SMatthias Ringwald    *
145*e8380792SMatthias Ringwald    * The following files relevant to CMSIS-DSP are present in the <b>ARM::CMSIS</b> Pack directories:
146*e8380792SMatthias Ringwald    * |File/Folder                   |Content                                                                 |
147*e8380792SMatthias Ringwald    * |------------------------------|------------------------------------------------------------------------|
148*e8380792SMatthias Ringwald    * |\b CMSIS\\Documentation\\DSP  | This documentation                                                     |
149*e8380792SMatthias Ringwald    * |\b CMSIS\\DSP_Lib             | Software license agreement (license.txt)                               |
150*e8380792SMatthias Ringwald    * |\b CMSIS\\DSP_Lib\\Examples   | Example projects demonstrating the usage of the library functions      |
151*e8380792SMatthias Ringwald    * |\b CMSIS\\DSP_Lib\\Source     | Source files for rebuilding the library                                |
152*e8380792SMatthias Ringwald    *
153*e8380792SMatthias Ringwald    * <hr>
154*e8380792SMatthias Ringwald    * Revision History of CMSIS-DSP
155*e8380792SMatthias Ringwald    * ------------
156*e8380792SMatthias Ringwald    * Please refer to \ref ChangeLog_pg.
157*e8380792SMatthias Ringwald    *
158*e8380792SMatthias Ringwald    * Copyright Notice
159*e8380792SMatthias Ringwald    * ------------
160*e8380792SMatthias Ringwald    *
161*e8380792SMatthias Ringwald    * Copyright (C) 2010-2015 ARM Limited. All rights reserved.
162*e8380792SMatthias Ringwald    */
163*e8380792SMatthias Ringwald 
164*e8380792SMatthias Ringwald 
165*e8380792SMatthias Ringwald /**
166*e8380792SMatthias Ringwald  * @defgroup groupMath Basic Math Functions
167*e8380792SMatthias Ringwald  */
168*e8380792SMatthias Ringwald 
169*e8380792SMatthias Ringwald /**
170*e8380792SMatthias Ringwald  * @defgroup groupFastMath Fast Math Functions
171*e8380792SMatthias Ringwald  * This set of functions provides a fast approximation to sine, cosine, and square root.
172*e8380792SMatthias Ringwald  * As compared to most of the other functions in the CMSIS math library, the fast math functions
173*e8380792SMatthias Ringwald  * operate on individual values and not arrays.
174*e8380792SMatthias Ringwald  * There are separate functions for Q15, Q31, and floating-point data.
175*e8380792SMatthias Ringwald  *
176*e8380792SMatthias Ringwald  */
177*e8380792SMatthias Ringwald 
178*e8380792SMatthias Ringwald /**
179*e8380792SMatthias Ringwald  * @defgroup groupCmplxMath Complex Math Functions
180*e8380792SMatthias Ringwald  * This set of functions operates on complex data vectors.
181*e8380792SMatthias Ringwald  * The data in the complex arrays is stored in an interleaved fashion
182*e8380792SMatthias Ringwald  * (real, imag, real, imag, ...).
183*e8380792SMatthias Ringwald  * In the API functions, the number of samples in a complex array refers
184*e8380792SMatthias Ringwald  * to the number of complex values; the array contains twice this number of
185*e8380792SMatthias Ringwald  * real values.
186*e8380792SMatthias Ringwald  */
187*e8380792SMatthias Ringwald 
188*e8380792SMatthias Ringwald /**
189*e8380792SMatthias Ringwald  * @defgroup groupFilters Filtering Functions
190*e8380792SMatthias Ringwald  */
191*e8380792SMatthias Ringwald 
192*e8380792SMatthias Ringwald /**
193*e8380792SMatthias Ringwald  * @defgroup groupMatrix Matrix Functions
194*e8380792SMatthias Ringwald  *
195*e8380792SMatthias Ringwald  * This set of functions provides basic matrix math operations.
196*e8380792SMatthias Ringwald  * The functions operate on matrix data structures.  For example,
197*e8380792SMatthias Ringwald  * the type
198*e8380792SMatthias Ringwald  * definition for the floating-point matrix structure is shown
199*e8380792SMatthias Ringwald  * below:
200*e8380792SMatthias Ringwald  * <pre>
201*e8380792SMatthias Ringwald  *     typedef struct
202*e8380792SMatthias Ringwald  *     {
203*e8380792SMatthias Ringwald  *       uint16_t numRows;     // number of rows of the matrix.
204*e8380792SMatthias Ringwald  *       uint16_t numCols;     // number of columns of the matrix.
205*e8380792SMatthias Ringwald  *       float32_t *pData;     // points to the data of the matrix.
206*e8380792SMatthias Ringwald  *     } arm_matrix_instance_f32;
207*e8380792SMatthias Ringwald  * </pre>
208*e8380792SMatthias Ringwald  * There are similar definitions for Q15 and Q31 data types.
209*e8380792SMatthias Ringwald  *
210*e8380792SMatthias Ringwald  * The structure specifies the size of the matrix and then points to
211*e8380792SMatthias Ringwald  * an array of data.  The array is of size <code>numRows X numCols</code>
212*e8380792SMatthias Ringwald  * and the values are arranged in row order.  That is, the
213*e8380792SMatthias Ringwald  * matrix element (i, j) is stored at:
214*e8380792SMatthias Ringwald  * <pre>
215*e8380792SMatthias Ringwald  *     pData[i*numCols + j]
216*e8380792SMatthias Ringwald  * </pre>
217*e8380792SMatthias Ringwald  *
218*e8380792SMatthias Ringwald  * \par Init Functions
219*e8380792SMatthias Ringwald  * There is an associated initialization function for each type of matrix
220*e8380792SMatthias Ringwald  * data structure.
221*e8380792SMatthias Ringwald  * The initialization function sets the values of the internal structure fields.
222*e8380792SMatthias Ringwald  * Refer to the function <code>arm_mat_init_f32()</code>, <code>arm_mat_init_q31()</code>
223*e8380792SMatthias Ringwald  * and <code>arm_mat_init_q15()</code> for floating-point, Q31 and Q15 types,  respectively.
224*e8380792SMatthias Ringwald  *
225*e8380792SMatthias Ringwald  * \par
226*e8380792SMatthias Ringwald  * Use of the initialization function is optional. However, if initialization function is used
227*e8380792SMatthias Ringwald  * then the instance structure cannot be placed into a const data section.
228*e8380792SMatthias Ringwald  * To place the instance structure in a const data
229*e8380792SMatthias Ringwald  * section, manually initialize the data structure.  For example:
230*e8380792SMatthias Ringwald  * <pre>
231*e8380792SMatthias Ringwald  * <code>arm_matrix_instance_f32 S = {nRows, nColumns, pData};</code>
232*e8380792SMatthias Ringwald  * <code>arm_matrix_instance_q31 S = {nRows, nColumns, pData};</code>
233*e8380792SMatthias Ringwald  * <code>arm_matrix_instance_q15 S = {nRows, nColumns, pData};</code>
234*e8380792SMatthias Ringwald  * </pre>
235*e8380792SMatthias Ringwald  * where <code>nRows</code> specifies the number of rows, <code>nColumns</code>
236*e8380792SMatthias Ringwald  * specifies the number of columns, and <code>pData</code> points to the
237*e8380792SMatthias Ringwald  * data array.
238*e8380792SMatthias Ringwald  *
239*e8380792SMatthias Ringwald  * \par Size Checking
240*e8380792SMatthias Ringwald  * By default all of the matrix functions perform size checking on the input and
241*e8380792SMatthias Ringwald  * output matrices.  For example, the matrix addition function verifies that the
242*e8380792SMatthias Ringwald  * two input matrices and the output matrix all have the same number of rows and
243*e8380792SMatthias Ringwald  * columns.  If the size check fails the functions return:
244*e8380792SMatthias Ringwald  * <pre>
245*e8380792SMatthias Ringwald  *     ARM_MATH_SIZE_MISMATCH
246*e8380792SMatthias Ringwald  * </pre>
247*e8380792SMatthias Ringwald  * Otherwise the functions return
248*e8380792SMatthias Ringwald  * <pre>
249*e8380792SMatthias Ringwald  *     ARM_MATH_SUCCESS
250*e8380792SMatthias Ringwald  * </pre>
251*e8380792SMatthias Ringwald  * There is some overhead associated with this matrix size checking.
252*e8380792SMatthias Ringwald  * The matrix size checking is enabled via the \#define
253*e8380792SMatthias Ringwald  * <pre>
254*e8380792SMatthias Ringwald  *     ARM_MATH_MATRIX_CHECK
255*e8380792SMatthias Ringwald  * </pre>
256*e8380792SMatthias Ringwald  * within the library project settings.  By default this macro is defined
257*e8380792SMatthias Ringwald  * and size checking is enabled.  By changing the project settings and
258*e8380792SMatthias Ringwald  * undefining this macro size checking is eliminated and the functions
259*e8380792SMatthias Ringwald  * run a bit faster.  With size checking disabled the functions always
260*e8380792SMatthias Ringwald  * return <code>ARM_MATH_SUCCESS</code>.
261*e8380792SMatthias Ringwald  */
262*e8380792SMatthias Ringwald 
263*e8380792SMatthias Ringwald /**
264*e8380792SMatthias Ringwald  * @defgroup groupTransforms Transform Functions
265*e8380792SMatthias Ringwald  */
266*e8380792SMatthias Ringwald 
267*e8380792SMatthias Ringwald /**
268*e8380792SMatthias Ringwald  * @defgroup groupController Controller Functions
269*e8380792SMatthias Ringwald  */
270*e8380792SMatthias Ringwald 
271*e8380792SMatthias Ringwald /**
272*e8380792SMatthias Ringwald  * @defgroup groupStats Statistics Functions
273*e8380792SMatthias Ringwald  */
274*e8380792SMatthias Ringwald /**
275*e8380792SMatthias Ringwald  * @defgroup groupSupport Support Functions
276*e8380792SMatthias Ringwald  */
277*e8380792SMatthias Ringwald 
278*e8380792SMatthias Ringwald /**
279*e8380792SMatthias Ringwald  * @defgroup groupInterpolation Interpolation Functions
280*e8380792SMatthias Ringwald  * These functions perform 1- and 2-dimensional interpolation of data.
281*e8380792SMatthias Ringwald  * Linear interpolation is used for 1-dimensional data and
282*e8380792SMatthias Ringwald  * bilinear interpolation is used for 2-dimensional data.
283*e8380792SMatthias Ringwald  */
284*e8380792SMatthias Ringwald 
285*e8380792SMatthias Ringwald /**
286*e8380792SMatthias Ringwald  * @defgroup groupExamples Examples
287*e8380792SMatthias Ringwald  */
288*e8380792SMatthias Ringwald #ifndef _ARM_MATH_H
289*e8380792SMatthias Ringwald #define _ARM_MATH_H
290*e8380792SMatthias Ringwald 
291*e8380792SMatthias Ringwald /* ignore some GCC warnings */
292*e8380792SMatthias Ringwald #if defined ( __GNUC__ )
293*e8380792SMatthias Ringwald #pragma GCC diagnostic push
294*e8380792SMatthias Ringwald #pragma GCC diagnostic ignored "-Wsign-conversion"
295*e8380792SMatthias Ringwald #pragma GCC diagnostic ignored "-Wconversion"
296*e8380792SMatthias Ringwald #pragma GCC diagnostic ignored "-Wunused-parameter"
297*e8380792SMatthias Ringwald #endif
298*e8380792SMatthias Ringwald 
299*e8380792SMatthias Ringwald #define __CMSIS_GENERIC         /* disable NVIC and Systick functions */
300*e8380792SMatthias Ringwald 
301*e8380792SMatthias Ringwald #if defined(ARM_MATH_CM7)
302*e8380792SMatthias Ringwald   #include "core_cm7.h"
303*e8380792SMatthias Ringwald #elif defined (ARM_MATH_CM4)
304*e8380792SMatthias Ringwald   #include "core_cm4.h"
305*e8380792SMatthias Ringwald #elif defined (ARM_MATH_CM3)
306*e8380792SMatthias Ringwald   #include "core_cm3.h"
307*e8380792SMatthias Ringwald #elif defined (ARM_MATH_CM0)
308*e8380792SMatthias Ringwald   #include "core_cm0.h"
309*e8380792SMatthias Ringwald   #define ARM_MATH_CM0_FAMILY
310*e8380792SMatthias Ringwald #elif defined (ARM_MATH_CM0PLUS)
311*e8380792SMatthias Ringwald   #include "core_cm0plus.h"
312*e8380792SMatthias Ringwald   #define ARM_MATH_CM0_FAMILY
313*e8380792SMatthias Ringwald #else
314*e8380792SMatthias Ringwald   #error "Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS or ARM_MATH_CM0"
315*e8380792SMatthias Ringwald #endif
316*e8380792SMatthias Ringwald 
317*e8380792SMatthias Ringwald #undef  __CMSIS_GENERIC         /* enable NVIC and Systick functions */
318*e8380792SMatthias Ringwald #include "string.h"
319*e8380792SMatthias Ringwald #include "math.h"
320*e8380792SMatthias Ringwald #ifdef   __cplusplus
321*e8380792SMatthias Ringwald extern "C"
322*e8380792SMatthias Ringwald {
323*e8380792SMatthias Ringwald #endif
324*e8380792SMatthias Ringwald 
325*e8380792SMatthias Ringwald 
326*e8380792SMatthias Ringwald   /**
327*e8380792SMatthias Ringwald    * @brief Macros required for reciprocal calculation in Normalized LMS
328*e8380792SMatthias Ringwald    */
329*e8380792SMatthias Ringwald 
330*e8380792SMatthias Ringwald #define DELTA_Q31          (0x100)
331*e8380792SMatthias Ringwald #define DELTA_Q15          0x5
332*e8380792SMatthias Ringwald #define INDEX_MASK         0x0000003F
333*e8380792SMatthias Ringwald #ifndef PI
334*e8380792SMatthias Ringwald #define PI                 3.14159265358979f
335*e8380792SMatthias Ringwald #endif
336*e8380792SMatthias Ringwald 
337*e8380792SMatthias Ringwald   /**
338*e8380792SMatthias Ringwald    * @brief Macros required for SINE and COSINE Fast math approximations
339*e8380792SMatthias Ringwald    */
340*e8380792SMatthias Ringwald 
341*e8380792SMatthias Ringwald #define FAST_MATH_TABLE_SIZE  512
342*e8380792SMatthias Ringwald #define FAST_MATH_Q31_SHIFT   (32 - 10)
343*e8380792SMatthias Ringwald #define FAST_MATH_Q15_SHIFT   (16 - 10)
344*e8380792SMatthias Ringwald #define CONTROLLER_Q31_SHIFT  (32 - 9)
345*e8380792SMatthias Ringwald #define TABLE_SIZE  256
346*e8380792SMatthias Ringwald #define TABLE_SPACING_Q31     0x400000
347*e8380792SMatthias Ringwald #define TABLE_SPACING_Q15     0x80
348*e8380792SMatthias Ringwald 
349*e8380792SMatthias Ringwald   /**
350*e8380792SMatthias Ringwald    * @brief Macros required for SINE and COSINE Controller functions
351*e8380792SMatthias Ringwald    */
352*e8380792SMatthias Ringwald   /* 1.31(q31) Fixed value of 2/360 */
353*e8380792SMatthias Ringwald   /* -1 to +1 is divided into 360 values so total spacing is (2/360) */
354*e8380792SMatthias Ringwald #define INPUT_SPACING         0xB60B61
355*e8380792SMatthias Ringwald 
356*e8380792SMatthias Ringwald   /**
357*e8380792SMatthias Ringwald    * @brief Macro for Unaligned Support
358*e8380792SMatthias Ringwald    */
359*e8380792SMatthias Ringwald #ifndef UNALIGNED_SUPPORT_DISABLE
360*e8380792SMatthias Ringwald     #define ALIGN4
361*e8380792SMatthias Ringwald #else
362*e8380792SMatthias Ringwald   #if defined  (__GNUC__)
363*e8380792SMatthias Ringwald     #define ALIGN4 __attribute__((aligned(4)))
364*e8380792SMatthias Ringwald   #else
365*e8380792SMatthias Ringwald     #define ALIGN4 __align(4)
366*e8380792SMatthias Ringwald   #endif
367*e8380792SMatthias Ringwald #endif   /* #ifndef UNALIGNED_SUPPORT_DISABLE */
368*e8380792SMatthias Ringwald 
369*e8380792SMatthias Ringwald   /**
370*e8380792SMatthias Ringwald    * @brief Error status returned by some functions in the library.
371*e8380792SMatthias Ringwald    */
372*e8380792SMatthias Ringwald 
373*e8380792SMatthias Ringwald   typedef enum
374*e8380792SMatthias Ringwald   {
375*e8380792SMatthias Ringwald     ARM_MATH_SUCCESS = 0,                /**< No error */
376*e8380792SMatthias Ringwald     ARM_MATH_ARGUMENT_ERROR = -1,        /**< One or more arguments are incorrect */
377*e8380792SMatthias Ringwald     ARM_MATH_LENGTH_ERROR = -2,          /**< Length of data buffer is incorrect */
378*e8380792SMatthias Ringwald     ARM_MATH_SIZE_MISMATCH = -3,         /**< Size of matrices is not compatible with the operation. */
379*e8380792SMatthias Ringwald     ARM_MATH_NANINF = -4,                /**< Not-a-number (NaN) or infinity is generated */
380*e8380792SMatthias Ringwald     ARM_MATH_SINGULAR = -5,              /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */
381*e8380792SMatthias Ringwald     ARM_MATH_TEST_FAILURE = -6           /**< Test Failed  */
382*e8380792SMatthias Ringwald   } arm_status;
383*e8380792SMatthias Ringwald 
384*e8380792SMatthias Ringwald   /**
385*e8380792SMatthias Ringwald    * @brief 8-bit fractional data type in 1.7 format.
386*e8380792SMatthias Ringwald    */
387*e8380792SMatthias Ringwald   typedef int8_t q7_t;
388*e8380792SMatthias Ringwald 
389*e8380792SMatthias Ringwald   /**
390*e8380792SMatthias Ringwald    * @brief 16-bit fractional data type in 1.15 format.
391*e8380792SMatthias Ringwald    */
392*e8380792SMatthias Ringwald   typedef int16_t q15_t;
393*e8380792SMatthias Ringwald 
394*e8380792SMatthias Ringwald   /**
395*e8380792SMatthias Ringwald    * @brief 32-bit fractional data type in 1.31 format.
396*e8380792SMatthias Ringwald    */
397*e8380792SMatthias Ringwald   typedef int32_t q31_t;
398*e8380792SMatthias Ringwald 
399*e8380792SMatthias Ringwald   /**
400*e8380792SMatthias Ringwald    * @brief 64-bit fractional data type in 1.63 format.
401*e8380792SMatthias Ringwald    */
402*e8380792SMatthias Ringwald   typedef int64_t q63_t;
403*e8380792SMatthias Ringwald 
404*e8380792SMatthias Ringwald   /**
405*e8380792SMatthias Ringwald    * @brief 32-bit floating-point type definition.
406*e8380792SMatthias Ringwald    */
407*e8380792SMatthias Ringwald   typedef float float32_t;
408*e8380792SMatthias Ringwald 
409*e8380792SMatthias Ringwald   /**
410*e8380792SMatthias Ringwald    * @brief 64-bit floating-point type definition.
411*e8380792SMatthias Ringwald    */
412*e8380792SMatthias Ringwald   typedef double float64_t;
413*e8380792SMatthias Ringwald 
414*e8380792SMatthias Ringwald   /**
415*e8380792SMatthias Ringwald    * @brief definition to read/write two 16 bit values.
416*e8380792SMatthias Ringwald    */
417*e8380792SMatthias Ringwald #if defined __CC_ARM
418*e8380792SMatthias Ringwald   #define __SIMD32_TYPE int32_t __packed
419*e8380792SMatthias Ringwald   #define CMSIS_UNUSED __attribute__((unused))
420*e8380792SMatthias Ringwald 
421*e8380792SMatthias Ringwald #elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
422*e8380792SMatthias Ringwald   #define __SIMD32_TYPE int32_t
423*e8380792SMatthias Ringwald   #define CMSIS_UNUSED __attribute__((unused))
424*e8380792SMatthias Ringwald 
425*e8380792SMatthias Ringwald #elif defined __GNUC__
426*e8380792SMatthias Ringwald   #define __SIMD32_TYPE int32_t
427*e8380792SMatthias Ringwald   #define CMSIS_UNUSED __attribute__((unused))
428*e8380792SMatthias Ringwald 
429*e8380792SMatthias Ringwald #elif defined __ICCARM__
430*e8380792SMatthias Ringwald   #define __SIMD32_TYPE int32_t __packed
431*e8380792SMatthias Ringwald   #define CMSIS_UNUSED
432*e8380792SMatthias Ringwald 
433*e8380792SMatthias Ringwald #elif defined __CSMC__
434*e8380792SMatthias Ringwald   #define __SIMD32_TYPE int32_t
435*e8380792SMatthias Ringwald   #define CMSIS_UNUSED
436*e8380792SMatthias Ringwald 
437*e8380792SMatthias Ringwald #elif defined __TASKING__
438*e8380792SMatthias Ringwald   #define __SIMD32_TYPE __unaligned int32_t
439*e8380792SMatthias Ringwald   #define CMSIS_UNUSED
440*e8380792SMatthias Ringwald 
441*e8380792SMatthias Ringwald #else
442*e8380792SMatthias Ringwald   #error Unknown compiler
443*e8380792SMatthias Ringwald #endif
444*e8380792SMatthias Ringwald 
445*e8380792SMatthias Ringwald #define __SIMD32(addr)        (*(__SIMD32_TYPE **) & (addr))
446*e8380792SMatthias Ringwald #define __SIMD32_CONST(addr)  ((__SIMD32_TYPE *)(addr))
447*e8380792SMatthias Ringwald #define _SIMD32_OFFSET(addr)  (*(__SIMD32_TYPE *)  (addr))
448*e8380792SMatthias Ringwald #define __SIMD64(addr)        (*(int64_t **) & (addr))
449*e8380792SMatthias Ringwald 
450*e8380792SMatthias Ringwald #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
451*e8380792SMatthias Ringwald   /**
452*e8380792SMatthias Ringwald    * @brief definition to pack two 16 bit values.
453*e8380792SMatthias Ringwald    */
454*e8380792SMatthias Ringwald #define __PKHBT(ARG1, ARG2, ARG3)      ( (((int32_t)(ARG1) <<  0) & (int32_t)0x0000FFFF) | \
455*e8380792SMatthias Ringwald                                          (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000)  )
456*e8380792SMatthias Ringwald #define __PKHTB(ARG1, ARG2, ARG3)      ( (((int32_t)(ARG1) <<  0) & (int32_t)0xFFFF0000) | \
457*e8380792SMatthias Ringwald                                          (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF)  )
458*e8380792SMatthias Ringwald 
459*e8380792SMatthias Ringwald #endif
460*e8380792SMatthias Ringwald 
461*e8380792SMatthias Ringwald 
462*e8380792SMatthias Ringwald    /**
463*e8380792SMatthias Ringwald    * @brief definition to pack four 8 bit values.
464*e8380792SMatthias Ringwald    */
465*e8380792SMatthias Ringwald #ifndef ARM_MATH_BIG_ENDIAN
466*e8380792SMatthias Ringwald 
467*e8380792SMatthias Ringwald #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) <<  0) & (int32_t)0x000000FF) | \
468*e8380792SMatthias Ringwald                                 (((int32_t)(v1) <<  8) & (int32_t)0x0000FF00) | \
469*e8380792SMatthias Ringwald                                 (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \
470*e8380792SMatthias Ringwald                                 (((int32_t)(v3) << 24) & (int32_t)0xFF000000)  )
471*e8380792SMatthias Ringwald #else
472*e8380792SMatthias Ringwald 
473*e8380792SMatthias Ringwald #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) <<  0) & (int32_t)0x000000FF) | \
474*e8380792SMatthias Ringwald                                 (((int32_t)(v2) <<  8) & (int32_t)0x0000FF00) | \
475*e8380792SMatthias Ringwald                                 (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \
476*e8380792SMatthias Ringwald                                 (((int32_t)(v0) << 24) & (int32_t)0xFF000000)  )
477*e8380792SMatthias Ringwald 
478*e8380792SMatthias Ringwald #endif
479*e8380792SMatthias Ringwald 
480*e8380792SMatthias Ringwald 
481*e8380792SMatthias Ringwald   /**
482*e8380792SMatthias Ringwald    * @brief Clips Q63 to Q31 values.
483*e8380792SMatthias Ringwald    */
clip_q63_to_q31(q63_t x)484*e8380792SMatthias Ringwald   static __INLINE q31_t clip_q63_to_q31(
485*e8380792SMatthias Ringwald   q63_t x)
486*e8380792SMatthias Ringwald   {
487*e8380792SMatthias Ringwald     return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
488*e8380792SMatthias Ringwald       ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x;
489*e8380792SMatthias Ringwald   }
490*e8380792SMatthias Ringwald 
491*e8380792SMatthias Ringwald   /**
492*e8380792SMatthias Ringwald    * @brief Clips Q63 to Q15 values.
493*e8380792SMatthias Ringwald    */
clip_q63_to_q15(q63_t x)494*e8380792SMatthias Ringwald   static __INLINE q15_t clip_q63_to_q15(
495*e8380792SMatthias Ringwald   q63_t x)
496*e8380792SMatthias Ringwald   {
497*e8380792SMatthias Ringwald     return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
498*e8380792SMatthias Ringwald       ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15);
499*e8380792SMatthias Ringwald   }
500*e8380792SMatthias Ringwald 
501*e8380792SMatthias Ringwald   /**
502*e8380792SMatthias Ringwald    * @brief Clips Q31 to Q7 values.
503*e8380792SMatthias Ringwald    */
clip_q31_to_q7(q31_t x)504*e8380792SMatthias Ringwald   static __INLINE q7_t clip_q31_to_q7(
505*e8380792SMatthias Ringwald   q31_t x)
506*e8380792SMatthias Ringwald   {
507*e8380792SMatthias Ringwald     return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ?
508*e8380792SMatthias Ringwald       ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x;
509*e8380792SMatthias Ringwald   }
510*e8380792SMatthias Ringwald 
511*e8380792SMatthias Ringwald   /**
512*e8380792SMatthias Ringwald    * @brief Clips Q31 to Q15 values.
513*e8380792SMatthias Ringwald    */
clip_q31_to_q15(q31_t x)514*e8380792SMatthias Ringwald   static __INLINE q15_t clip_q31_to_q15(
515*e8380792SMatthias Ringwald   q31_t x)
516*e8380792SMatthias Ringwald   {
517*e8380792SMatthias Ringwald     return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ?
518*e8380792SMatthias Ringwald       ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x;
519*e8380792SMatthias Ringwald   }
520*e8380792SMatthias Ringwald 
521*e8380792SMatthias Ringwald   /**
522*e8380792SMatthias Ringwald    * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format.
523*e8380792SMatthias Ringwald    */
524*e8380792SMatthias Ringwald 
mult32x64(q63_t x,q31_t y)525*e8380792SMatthias Ringwald   static __INLINE q63_t mult32x64(
526*e8380792SMatthias Ringwald   q63_t x,
527*e8380792SMatthias Ringwald   q31_t y)
528*e8380792SMatthias Ringwald   {
529*e8380792SMatthias Ringwald     return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) +
530*e8380792SMatthias Ringwald             (((q63_t) (x >> 32) * y)));
531*e8380792SMatthias Ringwald   }
532*e8380792SMatthias Ringwald 
533*e8380792SMatthias Ringwald /*
534*e8380792SMatthias Ringwald   #if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM   )
535*e8380792SMatthias Ringwald   #define __CLZ __clz
536*e8380792SMatthias Ringwald   #endif
537*e8380792SMatthias Ringwald  */
538*e8380792SMatthias Ringwald /* note: function can be removed when all toolchain support __CLZ for Cortex-M0 */
539*e8380792SMatthias Ringwald #if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__))  )
540*e8380792SMatthias Ringwald   static __INLINE uint32_t __CLZ(
541*e8380792SMatthias Ringwald   q31_t data);
542*e8380792SMatthias Ringwald 
__CLZ(q31_t data)543*e8380792SMatthias Ringwald   static __INLINE uint32_t __CLZ(
544*e8380792SMatthias Ringwald   q31_t data)
545*e8380792SMatthias Ringwald   {
546*e8380792SMatthias Ringwald     uint32_t count = 0;
547*e8380792SMatthias Ringwald     uint32_t mask = 0x80000000;
548*e8380792SMatthias Ringwald 
549*e8380792SMatthias Ringwald     while((data & mask) == 0)
550*e8380792SMatthias Ringwald     {
551*e8380792SMatthias Ringwald       count += 1u;
552*e8380792SMatthias Ringwald       mask = mask >> 1u;
553*e8380792SMatthias Ringwald     }
554*e8380792SMatthias Ringwald 
555*e8380792SMatthias Ringwald     return (count);
556*e8380792SMatthias Ringwald   }
557*e8380792SMatthias Ringwald #endif
558*e8380792SMatthias Ringwald 
559*e8380792SMatthias Ringwald   /**
560*e8380792SMatthias Ringwald    * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type.
561*e8380792SMatthias Ringwald    */
562*e8380792SMatthias Ringwald 
arm_recip_q31(q31_t in,q31_t * dst,q31_t * pRecipTable)563*e8380792SMatthias Ringwald   static __INLINE uint32_t arm_recip_q31(
564*e8380792SMatthias Ringwald   q31_t in,
565*e8380792SMatthias Ringwald   q31_t * dst,
566*e8380792SMatthias Ringwald   q31_t * pRecipTable)
567*e8380792SMatthias Ringwald   {
568*e8380792SMatthias Ringwald     q31_t out;
569*e8380792SMatthias Ringwald     uint32_t tempVal;
570*e8380792SMatthias Ringwald     uint32_t index, i;
571*e8380792SMatthias Ringwald     uint32_t signBits;
572*e8380792SMatthias Ringwald 
573*e8380792SMatthias Ringwald     if(in > 0)
574*e8380792SMatthias Ringwald     {
575*e8380792SMatthias Ringwald       signBits = ((uint32_t) (__CLZ( in) - 1));
576*e8380792SMatthias Ringwald     }
577*e8380792SMatthias Ringwald     else
578*e8380792SMatthias Ringwald     {
579*e8380792SMatthias Ringwald       signBits = ((uint32_t) (__CLZ(-in) - 1));
580*e8380792SMatthias Ringwald     }
581*e8380792SMatthias Ringwald 
582*e8380792SMatthias Ringwald     /* Convert input sample to 1.31 format */
583*e8380792SMatthias Ringwald     in = (in << signBits);
584*e8380792SMatthias Ringwald 
585*e8380792SMatthias Ringwald     /* calculation of index for initial approximated Val */
586*e8380792SMatthias Ringwald     index = (uint32_t)(in >> 24);
587*e8380792SMatthias Ringwald     index = (index & INDEX_MASK);
588*e8380792SMatthias Ringwald 
589*e8380792SMatthias Ringwald     /* 1.31 with exp 1 */
590*e8380792SMatthias Ringwald     out = pRecipTable[index];
591*e8380792SMatthias Ringwald 
592*e8380792SMatthias Ringwald     /* calculation of reciprocal value */
593*e8380792SMatthias Ringwald     /* running approximation for two iterations */
594*e8380792SMatthias Ringwald     for (i = 0u; i < 2u; i++)
595*e8380792SMatthias Ringwald     {
596*e8380792SMatthias Ringwald       tempVal = (uint32_t) (((q63_t) in * out) >> 31);
597*e8380792SMatthias Ringwald       tempVal = 0x7FFFFFFFu - tempVal;
598*e8380792SMatthias Ringwald       /*      1.31 with exp 1 */
599*e8380792SMatthias Ringwald       /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */
600*e8380792SMatthias Ringwald       out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30);
601*e8380792SMatthias Ringwald     }
602*e8380792SMatthias Ringwald 
603*e8380792SMatthias Ringwald     /* write output */
604*e8380792SMatthias Ringwald     *dst = out;
605*e8380792SMatthias Ringwald 
606*e8380792SMatthias Ringwald     /* return num of signbits of out = 1/in value */
607*e8380792SMatthias Ringwald     return (signBits + 1u);
608*e8380792SMatthias Ringwald   }
609*e8380792SMatthias Ringwald 
610*e8380792SMatthias Ringwald 
611*e8380792SMatthias Ringwald   /**
612*e8380792SMatthias Ringwald    * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type.
613*e8380792SMatthias Ringwald    */
arm_recip_q15(q15_t in,q15_t * dst,q15_t * pRecipTable)614*e8380792SMatthias Ringwald   static __INLINE uint32_t arm_recip_q15(
615*e8380792SMatthias Ringwald   q15_t in,
616*e8380792SMatthias Ringwald   q15_t * dst,
617*e8380792SMatthias Ringwald   q15_t * pRecipTable)
618*e8380792SMatthias Ringwald   {
619*e8380792SMatthias Ringwald     q15_t out = 0;
620*e8380792SMatthias Ringwald     uint32_t tempVal = 0;
621*e8380792SMatthias Ringwald     uint32_t index = 0, i = 0;
622*e8380792SMatthias Ringwald     uint32_t signBits = 0;
623*e8380792SMatthias Ringwald 
624*e8380792SMatthias Ringwald     if(in > 0)
625*e8380792SMatthias Ringwald     {
626*e8380792SMatthias Ringwald       signBits = ((uint32_t)(__CLZ( in) - 17));
627*e8380792SMatthias Ringwald     }
628*e8380792SMatthias Ringwald     else
629*e8380792SMatthias Ringwald     {
630*e8380792SMatthias Ringwald       signBits = ((uint32_t)(__CLZ(-in) - 17));
631*e8380792SMatthias Ringwald     }
632*e8380792SMatthias Ringwald 
633*e8380792SMatthias Ringwald     /* Convert input sample to 1.15 format */
634*e8380792SMatthias Ringwald     in = (in << signBits);
635*e8380792SMatthias Ringwald 
636*e8380792SMatthias Ringwald     /* calculation of index for initial approximated Val */
637*e8380792SMatthias Ringwald     index = (uint32_t)(in >>  8);
638*e8380792SMatthias Ringwald     index = (index & INDEX_MASK);
639*e8380792SMatthias Ringwald 
640*e8380792SMatthias Ringwald     /*      1.15 with exp 1  */
641*e8380792SMatthias Ringwald     out = pRecipTable[index];
642*e8380792SMatthias Ringwald 
643*e8380792SMatthias Ringwald     /* calculation of reciprocal value */
644*e8380792SMatthias Ringwald     /* running approximation for two iterations */
645*e8380792SMatthias Ringwald     for (i = 0u; i < 2u; i++)
646*e8380792SMatthias Ringwald     {
647*e8380792SMatthias Ringwald       tempVal = (uint32_t) (((q31_t) in * out) >> 15);
648*e8380792SMatthias Ringwald       tempVal = 0x7FFFu - tempVal;
649*e8380792SMatthias Ringwald       /*      1.15 with exp 1 */
650*e8380792SMatthias Ringwald       out = (q15_t) (((q31_t) out * tempVal) >> 14);
651*e8380792SMatthias Ringwald       /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */
652*e8380792SMatthias Ringwald     }
653*e8380792SMatthias Ringwald 
654*e8380792SMatthias Ringwald     /* write output */
655*e8380792SMatthias Ringwald     *dst = out;
656*e8380792SMatthias Ringwald 
657*e8380792SMatthias Ringwald     /* return num of signbits of out = 1/in value */
658*e8380792SMatthias Ringwald     return (signBits + 1);
659*e8380792SMatthias Ringwald   }
660*e8380792SMatthias Ringwald 
661*e8380792SMatthias Ringwald 
662*e8380792SMatthias Ringwald   /*
663*e8380792SMatthias Ringwald    * @brief C custom defined intrinisic function for only M0 processors
664*e8380792SMatthias Ringwald    */
665*e8380792SMatthias Ringwald #if defined(ARM_MATH_CM0_FAMILY)
__SSAT(q31_t x,uint32_t y)666*e8380792SMatthias Ringwald   static __INLINE q31_t __SSAT(
667*e8380792SMatthias Ringwald   q31_t x,
668*e8380792SMatthias Ringwald   uint32_t y)
669*e8380792SMatthias Ringwald   {
670*e8380792SMatthias Ringwald     int32_t posMax, negMin;
671*e8380792SMatthias Ringwald     uint32_t i;
672*e8380792SMatthias Ringwald 
673*e8380792SMatthias Ringwald     posMax = 1;
674*e8380792SMatthias Ringwald     for (i = 0; i < (y - 1); i++)
675*e8380792SMatthias Ringwald     {
676*e8380792SMatthias Ringwald       posMax = posMax * 2;
677*e8380792SMatthias Ringwald     }
678*e8380792SMatthias Ringwald 
679*e8380792SMatthias Ringwald     if(x > 0)
680*e8380792SMatthias Ringwald     {
681*e8380792SMatthias Ringwald       posMax = (posMax - 1);
682*e8380792SMatthias Ringwald 
683*e8380792SMatthias Ringwald       if(x > posMax)
684*e8380792SMatthias Ringwald       {
685*e8380792SMatthias Ringwald         x = posMax;
686*e8380792SMatthias Ringwald       }
687*e8380792SMatthias Ringwald     }
688*e8380792SMatthias Ringwald     else
689*e8380792SMatthias Ringwald     {
690*e8380792SMatthias Ringwald       negMin = -posMax;
691*e8380792SMatthias Ringwald 
692*e8380792SMatthias Ringwald       if(x < negMin)
693*e8380792SMatthias Ringwald       {
694*e8380792SMatthias Ringwald         x = negMin;
695*e8380792SMatthias Ringwald       }
696*e8380792SMatthias Ringwald     }
697*e8380792SMatthias Ringwald     return (x);
698*e8380792SMatthias Ringwald   }
699*e8380792SMatthias Ringwald #endif /* end of ARM_MATH_CM0_FAMILY */
700*e8380792SMatthias Ringwald 
701*e8380792SMatthias Ringwald 
702*e8380792SMatthias Ringwald   /*
703*e8380792SMatthias Ringwald    * @brief C custom defined intrinsic function for M3 and M0 processors
704*e8380792SMatthias Ringwald    */
705*e8380792SMatthias Ringwald #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
706*e8380792SMatthias Ringwald 
707*e8380792SMatthias Ringwald   /*
708*e8380792SMatthias Ringwald    * @brief C custom defined QADD8 for M3 and M0 processors
709*e8380792SMatthias Ringwald    */
__QADD8(uint32_t x,uint32_t y)710*e8380792SMatthias Ringwald   static __INLINE uint32_t __QADD8(
711*e8380792SMatthias Ringwald   uint32_t x,
712*e8380792SMatthias Ringwald   uint32_t y)
713*e8380792SMatthias Ringwald   {
714*e8380792SMatthias Ringwald     q31_t r, s, t, u;
715*e8380792SMatthias Ringwald 
716*e8380792SMatthias Ringwald     r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF;
717*e8380792SMatthias Ringwald     s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF;
718*e8380792SMatthias Ringwald     t = __SSAT(((((q31_t)x <<  8) >> 24) + (((q31_t)y <<  8) >> 24)), 8) & (int32_t)0x000000FF;
719*e8380792SMatthias Ringwald     u = __SSAT(((((q31_t)x      ) >> 24) + (((q31_t)y      ) >> 24)), 8) & (int32_t)0x000000FF;
720*e8380792SMatthias Ringwald 
721*e8380792SMatthias Ringwald     return ((uint32_t)((u << 24) | (t << 16) | (s <<  8) | (r      )));
722*e8380792SMatthias Ringwald   }
723*e8380792SMatthias Ringwald 
724*e8380792SMatthias Ringwald 
725*e8380792SMatthias Ringwald   /*
726*e8380792SMatthias Ringwald    * @brief C custom defined QSUB8 for M3 and M0 processors
727*e8380792SMatthias Ringwald    */
__QSUB8(uint32_t x,uint32_t y)728*e8380792SMatthias Ringwald   static __INLINE uint32_t __QSUB8(
729*e8380792SMatthias Ringwald   uint32_t x,
730*e8380792SMatthias Ringwald   uint32_t y)
731*e8380792SMatthias Ringwald   {
732*e8380792SMatthias Ringwald     q31_t r, s, t, u;
733*e8380792SMatthias Ringwald 
734*e8380792SMatthias Ringwald     r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF;
735*e8380792SMatthias Ringwald     s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF;
736*e8380792SMatthias Ringwald     t = __SSAT(((((q31_t)x <<  8) >> 24) - (((q31_t)y <<  8) >> 24)), 8) & (int32_t)0x000000FF;
737*e8380792SMatthias Ringwald     u = __SSAT(((((q31_t)x      ) >> 24) - (((q31_t)y      ) >> 24)), 8) & (int32_t)0x000000FF;
738*e8380792SMatthias Ringwald 
739*e8380792SMatthias Ringwald     return ((uint32_t)((u << 24) | (t << 16) | (s <<  8) | (r      )));
740*e8380792SMatthias Ringwald   }
741*e8380792SMatthias Ringwald 
742*e8380792SMatthias Ringwald 
743*e8380792SMatthias Ringwald   /*
744*e8380792SMatthias Ringwald    * @brief C custom defined QADD16 for M3 and M0 processors
745*e8380792SMatthias Ringwald    */
__QADD16(uint32_t x,uint32_t y)746*e8380792SMatthias Ringwald   static __INLINE uint32_t __QADD16(
747*e8380792SMatthias Ringwald   uint32_t x,
748*e8380792SMatthias Ringwald   uint32_t y)
749*e8380792SMatthias Ringwald   {
750*e8380792SMatthias Ringwald /*  q31_t r,     s;  without initialisation 'arm_offset_q15 test' fails  but 'intrinsic' tests pass! for armCC */
751*e8380792SMatthias Ringwald     q31_t r = 0, s = 0;
752*e8380792SMatthias Ringwald 
753*e8380792SMatthias Ringwald     r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
754*e8380792SMatthias Ringwald     s = __SSAT(((((q31_t)x      ) >> 16) + (((q31_t)y      ) >> 16)), 16) & (int32_t)0x0000FFFF;
755*e8380792SMatthias Ringwald 
756*e8380792SMatthias Ringwald     return ((uint32_t)((s << 16) | (r      )));
757*e8380792SMatthias Ringwald   }
758*e8380792SMatthias Ringwald 
759*e8380792SMatthias Ringwald 
760*e8380792SMatthias Ringwald   /*
761*e8380792SMatthias Ringwald    * @brief C custom defined SHADD16 for M3 and M0 processors
762*e8380792SMatthias Ringwald    */
__SHADD16(uint32_t x,uint32_t y)763*e8380792SMatthias Ringwald   static __INLINE uint32_t __SHADD16(
764*e8380792SMatthias Ringwald   uint32_t x,
765*e8380792SMatthias Ringwald   uint32_t y)
766*e8380792SMatthias Ringwald   {
767*e8380792SMatthias Ringwald     q31_t r, s;
768*e8380792SMatthias Ringwald 
769*e8380792SMatthias Ringwald     r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
770*e8380792SMatthias Ringwald     s = (((((q31_t)x      ) >> 16) + (((q31_t)y      ) >> 16)) >> 1) & (int32_t)0x0000FFFF;
771*e8380792SMatthias Ringwald 
772*e8380792SMatthias Ringwald     return ((uint32_t)((s << 16) | (r      )));
773*e8380792SMatthias Ringwald   }
774*e8380792SMatthias Ringwald 
775*e8380792SMatthias Ringwald 
776*e8380792SMatthias Ringwald   /*
777*e8380792SMatthias Ringwald    * @brief C custom defined QSUB16 for M3 and M0 processors
778*e8380792SMatthias Ringwald    */
__QSUB16(uint32_t x,uint32_t y)779*e8380792SMatthias Ringwald   static __INLINE uint32_t __QSUB16(
780*e8380792SMatthias Ringwald   uint32_t x,
781*e8380792SMatthias Ringwald   uint32_t y)
782*e8380792SMatthias Ringwald   {
783*e8380792SMatthias Ringwald     q31_t r, s;
784*e8380792SMatthias Ringwald 
785*e8380792SMatthias Ringwald     r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
786*e8380792SMatthias Ringwald     s = __SSAT(((((q31_t)x      ) >> 16) - (((q31_t)y      ) >> 16)), 16) & (int32_t)0x0000FFFF;
787*e8380792SMatthias Ringwald 
788*e8380792SMatthias Ringwald     return ((uint32_t)((s << 16) | (r      )));
789*e8380792SMatthias Ringwald   }
790*e8380792SMatthias Ringwald 
791*e8380792SMatthias Ringwald 
792*e8380792SMatthias Ringwald   /*
793*e8380792SMatthias Ringwald    * @brief C custom defined SHSUB16 for M3 and M0 processors
794*e8380792SMatthias Ringwald    */
__SHSUB16(uint32_t x,uint32_t y)795*e8380792SMatthias Ringwald   static __INLINE uint32_t __SHSUB16(
796*e8380792SMatthias Ringwald   uint32_t x,
797*e8380792SMatthias Ringwald   uint32_t y)
798*e8380792SMatthias Ringwald   {
799*e8380792SMatthias Ringwald     q31_t r, s;
800*e8380792SMatthias Ringwald 
801*e8380792SMatthias Ringwald     r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
802*e8380792SMatthias Ringwald     s = (((((q31_t)x      ) >> 16) - (((q31_t)y      ) >> 16)) >> 1) & (int32_t)0x0000FFFF;
803*e8380792SMatthias Ringwald 
804*e8380792SMatthias Ringwald     return ((uint32_t)((s << 16) | (r      )));
805*e8380792SMatthias Ringwald   }
806*e8380792SMatthias Ringwald 
807*e8380792SMatthias Ringwald 
808*e8380792SMatthias Ringwald   /*
809*e8380792SMatthias Ringwald    * @brief C custom defined QASX for M3 and M0 processors
810*e8380792SMatthias Ringwald    */
__QASX(uint32_t x,uint32_t y)811*e8380792SMatthias Ringwald   static __INLINE uint32_t __QASX(
812*e8380792SMatthias Ringwald   uint32_t x,
813*e8380792SMatthias Ringwald   uint32_t y)
814*e8380792SMatthias Ringwald   {
815*e8380792SMatthias Ringwald     q31_t r, s;
816*e8380792SMatthias Ringwald 
817*e8380792SMatthias Ringwald     r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y      ) >> 16)), 16) & (int32_t)0x0000FFFF;
818*e8380792SMatthias Ringwald     s = __SSAT(((((q31_t)x      ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
819*e8380792SMatthias Ringwald 
820*e8380792SMatthias Ringwald     return ((uint32_t)((s << 16) | (r      )));
821*e8380792SMatthias Ringwald   }
822*e8380792SMatthias Ringwald 
823*e8380792SMatthias Ringwald 
824*e8380792SMatthias Ringwald   /*
825*e8380792SMatthias Ringwald    * @brief C custom defined SHASX for M3 and M0 processors
826*e8380792SMatthias Ringwald    */
__SHASX(uint32_t x,uint32_t y)827*e8380792SMatthias Ringwald   static __INLINE uint32_t __SHASX(
828*e8380792SMatthias Ringwald   uint32_t x,
829*e8380792SMatthias Ringwald   uint32_t y)
830*e8380792SMatthias Ringwald   {
831*e8380792SMatthias Ringwald     q31_t r, s;
832*e8380792SMatthias Ringwald 
833*e8380792SMatthias Ringwald     r = (((((q31_t)x << 16) >> 16) - (((q31_t)y      ) >> 16)) >> 1) & (int32_t)0x0000FFFF;
834*e8380792SMatthias Ringwald     s = (((((q31_t)x      ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
835*e8380792SMatthias Ringwald 
836*e8380792SMatthias Ringwald     return ((uint32_t)((s << 16) | (r      )));
837*e8380792SMatthias Ringwald   }
838*e8380792SMatthias Ringwald 
839*e8380792SMatthias Ringwald 
840*e8380792SMatthias Ringwald   /*
841*e8380792SMatthias Ringwald    * @brief C custom defined QSAX for M3 and M0 processors
842*e8380792SMatthias Ringwald    */
__QSAX(uint32_t x,uint32_t y)843*e8380792SMatthias Ringwald   static __INLINE uint32_t __QSAX(
844*e8380792SMatthias Ringwald   uint32_t x,
845*e8380792SMatthias Ringwald   uint32_t y)
846*e8380792SMatthias Ringwald   {
847*e8380792SMatthias Ringwald     q31_t r, s;
848*e8380792SMatthias Ringwald 
849*e8380792SMatthias Ringwald     r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y      ) >> 16)), 16) & (int32_t)0x0000FFFF;
850*e8380792SMatthias Ringwald     s = __SSAT(((((q31_t)x      ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;
851*e8380792SMatthias Ringwald 
852*e8380792SMatthias Ringwald     return ((uint32_t)((s << 16) | (r      )));
853*e8380792SMatthias Ringwald   }
854*e8380792SMatthias Ringwald 
855*e8380792SMatthias Ringwald 
856*e8380792SMatthias Ringwald   /*
857*e8380792SMatthias Ringwald    * @brief C custom defined SHSAX for M3 and M0 processors
858*e8380792SMatthias Ringwald    */
__SHSAX(uint32_t x,uint32_t y)859*e8380792SMatthias Ringwald   static __INLINE uint32_t __SHSAX(
860*e8380792SMatthias Ringwald   uint32_t x,
861*e8380792SMatthias Ringwald   uint32_t y)
862*e8380792SMatthias Ringwald   {
863*e8380792SMatthias Ringwald     q31_t r, s;
864*e8380792SMatthias Ringwald 
865*e8380792SMatthias Ringwald     r = (((((q31_t)x << 16) >> 16) + (((q31_t)y      ) >> 16)) >> 1) & (int32_t)0x0000FFFF;
866*e8380792SMatthias Ringwald     s = (((((q31_t)x      ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;
867*e8380792SMatthias Ringwald 
868*e8380792SMatthias Ringwald     return ((uint32_t)((s << 16) | (r      )));
869*e8380792SMatthias Ringwald   }
870*e8380792SMatthias Ringwald 
871*e8380792SMatthias Ringwald 
872*e8380792SMatthias Ringwald   /*
873*e8380792SMatthias Ringwald    * @brief C custom defined SMUSDX for M3 and M0 processors
874*e8380792SMatthias Ringwald    */
__SMUSDX(uint32_t x,uint32_t y)875*e8380792SMatthias Ringwald   static __INLINE uint32_t __SMUSDX(
876*e8380792SMatthias Ringwald   uint32_t x,
877*e8380792SMatthias Ringwald   uint32_t y)
878*e8380792SMatthias Ringwald   {
879*e8380792SMatthias Ringwald     return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) -
880*e8380792SMatthias Ringwald                        ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16))   ));
881*e8380792SMatthias Ringwald   }
882*e8380792SMatthias Ringwald 
883*e8380792SMatthias Ringwald   /*
884*e8380792SMatthias Ringwald    * @brief C custom defined SMUADX for M3 and M0 processors
885*e8380792SMatthias Ringwald    */
__SMUADX(uint32_t x,uint32_t y)886*e8380792SMatthias Ringwald   static __INLINE uint32_t __SMUADX(
887*e8380792SMatthias Ringwald   uint32_t x,
888*e8380792SMatthias Ringwald   uint32_t y)
889*e8380792SMatthias Ringwald   {
890*e8380792SMatthias Ringwald     return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) +
891*e8380792SMatthias Ringwald                        ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16))   ));
892*e8380792SMatthias Ringwald   }
893*e8380792SMatthias Ringwald 
894*e8380792SMatthias Ringwald 
895*e8380792SMatthias Ringwald   /*
896*e8380792SMatthias Ringwald    * @brief C custom defined QADD for M3 and M0 processors
897*e8380792SMatthias Ringwald    */
__QADD(int32_t x,int32_t y)898*e8380792SMatthias Ringwald   static __INLINE int32_t __QADD(
899*e8380792SMatthias Ringwald   int32_t x,
900*e8380792SMatthias Ringwald   int32_t y)
901*e8380792SMatthias Ringwald   {
902*e8380792SMatthias Ringwald     return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y)));
903*e8380792SMatthias Ringwald   }
904*e8380792SMatthias Ringwald 
905*e8380792SMatthias Ringwald 
906*e8380792SMatthias Ringwald   /*
907*e8380792SMatthias Ringwald    * @brief C custom defined QSUB for M3 and M0 processors
908*e8380792SMatthias Ringwald    */
__QSUB(int32_t x,int32_t y)909*e8380792SMatthias Ringwald   static __INLINE int32_t __QSUB(
910*e8380792SMatthias Ringwald   int32_t x,
911*e8380792SMatthias Ringwald   int32_t y)
912*e8380792SMatthias Ringwald   {
913*e8380792SMatthias Ringwald     return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y)));
914*e8380792SMatthias Ringwald   }
915*e8380792SMatthias Ringwald 
916*e8380792SMatthias Ringwald 
917*e8380792SMatthias Ringwald   /*
918*e8380792SMatthias Ringwald    * @brief C custom defined SMLAD for M3 and M0 processors
919*e8380792SMatthias Ringwald    */
__SMLAD(uint32_t x,uint32_t y,uint32_t sum)920*e8380792SMatthias Ringwald   static __INLINE uint32_t __SMLAD(
921*e8380792SMatthias Ringwald   uint32_t x,
922*e8380792SMatthias Ringwald   uint32_t y,
923*e8380792SMatthias Ringwald   uint32_t sum)
924*e8380792SMatthias Ringwald   {
925*e8380792SMatthias Ringwald     return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) +
926*e8380792SMatthias Ringwald                        ((((q31_t)x      ) >> 16) * (((q31_t)y      ) >> 16)) +
927*e8380792SMatthias Ringwald                        ( ((q31_t)sum    )                                  )   ));
928*e8380792SMatthias Ringwald   }
929*e8380792SMatthias Ringwald 
930*e8380792SMatthias Ringwald 
931*e8380792SMatthias Ringwald   /*
932*e8380792SMatthias Ringwald    * @brief C custom defined SMLADX for M3 and M0 processors
933*e8380792SMatthias Ringwald    */
__SMLADX(uint32_t x,uint32_t y,uint32_t sum)934*e8380792SMatthias Ringwald   static __INLINE uint32_t __SMLADX(
935*e8380792SMatthias Ringwald   uint32_t x,
936*e8380792SMatthias Ringwald   uint32_t y,
937*e8380792SMatthias Ringwald   uint32_t sum)
938*e8380792SMatthias Ringwald   {
939*e8380792SMatthias Ringwald     return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) +
940*e8380792SMatthias Ringwald                        ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16)) +
941*e8380792SMatthias Ringwald                        ( ((q31_t)sum    )                                  )   ));
942*e8380792SMatthias Ringwald   }
943*e8380792SMatthias Ringwald 
944*e8380792SMatthias Ringwald 
945*e8380792SMatthias Ringwald   /*
946*e8380792SMatthias Ringwald    * @brief C custom defined SMLSDX for M3 and M0 processors
947*e8380792SMatthias Ringwald    */
__SMLSDX(uint32_t x,uint32_t y,uint32_t sum)948*e8380792SMatthias Ringwald   static __INLINE uint32_t __SMLSDX(
949*e8380792SMatthias Ringwald   uint32_t x,
950*e8380792SMatthias Ringwald   uint32_t y,
951*e8380792SMatthias Ringwald   uint32_t sum)
952*e8380792SMatthias Ringwald   {
953*e8380792SMatthias Ringwald     return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) -
954*e8380792SMatthias Ringwald                        ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16)) +
955*e8380792SMatthias Ringwald                        ( ((q31_t)sum    )                                  )   ));
956*e8380792SMatthias Ringwald   }
957*e8380792SMatthias Ringwald 
958*e8380792SMatthias Ringwald 
959*e8380792SMatthias Ringwald   /*
960*e8380792SMatthias Ringwald    * @brief C custom defined SMLALD for M3 and M0 processors
961*e8380792SMatthias Ringwald    */
__SMLALD(uint32_t x,uint32_t y,uint64_t sum)962*e8380792SMatthias Ringwald   static __INLINE uint64_t __SMLALD(
963*e8380792SMatthias Ringwald   uint32_t x,
964*e8380792SMatthias Ringwald   uint32_t y,
965*e8380792SMatthias Ringwald   uint64_t sum)
966*e8380792SMatthias Ringwald   {
967*e8380792SMatthias Ringwald /*  return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */
968*e8380792SMatthias Ringwald     return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) +
969*e8380792SMatthias Ringwald                        ((((q31_t)x      ) >> 16) * (((q31_t)y      ) >> 16)) +
970*e8380792SMatthias Ringwald                        ( ((q63_t)sum    )                                  )   ));
971*e8380792SMatthias Ringwald   }
972*e8380792SMatthias Ringwald 
973*e8380792SMatthias Ringwald 
974*e8380792SMatthias Ringwald   /*
975*e8380792SMatthias Ringwald    * @brief C custom defined SMLALDX for M3 and M0 processors
976*e8380792SMatthias Ringwald    */
__SMLALDX(uint32_t x,uint32_t y,uint64_t sum)977*e8380792SMatthias Ringwald   static __INLINE uint64_t __SMLALDX(
978*e8380792SMatthias Ringwald   uint32_t x,
979*e8380792SMatthias Ringwald   uint32_t y,
980*e8380792SMatthias Ringwald   uint64_t sum)
981*e8380792SMatthias Ringwald   {
982*e8380792SMatthias Ringwald /*  return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */
983*e8380792SMatthias Ringwald     return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) +
984*e8380792SMatthias Ringwald                        ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16)) +
985*e8380792SMatthias Ringwald                        ( ((q63_t)sum    )                                  )   ));
986*e8380792SMatthias Ringwald   }
987*e8380792SMatthias Ringwald 
988*e8380792SMatthias Ringwald 
989*e8380792SMatthias Ringwald   /*
990*e8380792SMatthias Ringwald    * @brief C custom defined SMUAD for M3 and M0 processors
991*e8380792SMatthias Ringwald    */
__SMUAD(uint32_t x,uint32_t y)992*e8380792SMatthias Ringwald   static __INLINE uint32_t __SMUAD(
993*e8380792SMatthias Ringwald   uint32_t x,
994*e8380792SMatthias Ringwald   uint32_t y)
995*e8380792SMatthias Ringwald   {
996*e8380792SMatthias Ringwald     return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) +
997*e8380792SMatthias Ringwald                        ((((q31_t)x      ) >> 16) * (((q31_t)y      ) >> 16))   ));
998*e8380792SMatthias Ringwald   }
999*e8380792SMatthias Ringwald 
1000*e8380792SMatthias Ringwald 
1001*e8380792SMatthias Ringwald   /*
1002*e8380792SMatthias Ringwald    * @brief C custom defined SMUSD for M3 and M0 processors
1003*e8380792SMatthias Ringwald    */
__SMUSD(uint32_t x,uint32_t y)1004*e8380792SMatthias Ringwald   static __INLINE uint32_t __SMUSD(
1005*e8380792SMatthias Ringwald   uint32_t x,
1006*e8380792SMatthias Ringwald   uint32_t y)
1007*e8380792SMatthias Ringwald   {
1008*e8380792SMatthias Ringwald     return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) -
1009*e8380792SMatthias Ringwald                        ((((q31_t)x      ) >> 16) * (((q31_t)y      ) >> 16))   ));
1010*e8380792SMatthias Ringwald   }
1011*e8380792SMatthias Ringwald 
1012*e8380792SMatthias Ringwald 
1013*e8380792SMatthias Ringwald   /*
1014*e8380792SMatthias Ringwald    * @brief C custom defined SXTB16 for M3 and M0 processors
1015*e8380792SMatthias Ringwald    */
__SXTB16(uint32_t x)1016*e8380792SMatthias Ringwald   static __INLINE uint32_t __SXTB16(
1017*e8380792SMatthias Ringwald   uint32_t x)
1018*e8380792SMatthias Ringwald   {
1019*e8380792SMatthias Ringwald     return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) |
1020*e8380792SMatthias Ringwald                        ((((q31_t)x <<  8) >>  8) & (q31_t)0xFFFF0000)  ));
1021*e8380792SMatthias Ringwald   }
1022*e8380792SMatthias Ringwald 
1023*e8380792SMatthias Ringwald #endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */
1024*e8380792SMatthias Ringwald 
1025*e8380792SMatthias Ringwald 
1026*e8380792SMatthias Ringwald   /**
1027*e8380792SMatthias Ringwald    * @brief Instance structure for the Q7 FIR filter.
1028*e8380792SMatthias Ringwald    */
1029*e8380792SMatthias Ringwald   typedef struct
1030*e8380792SMatthias Ringwald   {
1031*e8380792SMatthias Ringwald     uint16_t numTaps;        /**< number of filter coefficients in the filter. */
1032*e8380792SMatthias Ringwald     q7_t *pState;            /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
1033*e8380792SMatthias Ringwald     q7_t *pCoeffs;           /**< points to the coefficient array. The array is of length numTaps.*/
1034*e8380792SMatthias Ringwald   } arm_fir_instance_q7;
1035*e8380792SMatthias Ringwald 
1036*e8380792SMatthias Ringwald   /**
1037*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 FIR filter.
1038*e8380792SMatthias Ringwald    */
1039*e8380792SMatthias Ringwald   typedef struct
1040*e8380792SMatthias Ringwald   {
1041*e8380792SMatthias Ringwald     uint16_t numTaps;         /**< number of filter coefficients in the filter. */
1042*e8380792SMatthias Ringwald     q15_t *pState;            /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
1043*e8380792SMatthias Ringwald     q15_t *pCoeffs;           /**< points to the coefficient array. The array is of length numTaps.*/
1044*e8380792SMatthias Ringwald   } arm_fir_instance_q15;
1045*e8380792SMatthias Ringwald 
1046*e8380792SMatthias Ringwald   /**
1047*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 FIR filter.
1048*e8380792SMatthias Ringwald    */
1049*e8380792SMatthias Ringwald   typedef struct
1050*e8380792SMatthias Ringwald   {
1051*e8380792SMatthias Ringwald     uint16_t numTaps;         /**< number of filter coefficients in the filter. */
1052*e8380792SMatthias Ringwald     q31_t *pState;            /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
1053*e8380792SMatthias Ringwald     q31_t *pCoeffs;           /**< points to the coefficient array. The array is of length numTaps. */
1054*e8380792SMatthias Ringwald   } arm_fir_instance_q31;
1055*e8380792SMatthias Ringwald 
1056*e8380792SMatthias Ringwald   /**
1057*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point FIR filter.
1058*e8380792SMatthias Ringwald    */
1059*e8380792SMatthias Ringwald   typedef struct
1060*e8380792SMatthias Ringwald   {
1061*e8380792SMatthias Ringwald     uint16_t numTaps;     /**< number of filter coefficients in the filter. */
1062*e8380792SMatthias Ringwald     float32_t *pState;    /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
1063*e8380792SMatthias Ringwald     float32_t *pCoeffs;   /**< points to the coefficient array. The array is of length numTaps. */
1064*e8380792SMatthias Ringwald   } arm_fir_instance_f32;
1065*e8380792SMatthias Ringwald 
1066*e8380792SMatthias Ringwald 
1067*e8380792SMatthias Ringwald   /**
1068*e8380792SMatthias Ringwald    * @brief Processing function for the Q7 FIR filter.
1069*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q7 FIR filter structure.
1070*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1071*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1072*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1073*e8380792SMatthias Ringwald    */
1074*e8380792SMatthias Ringwald   void arm_fir_q7(
1075*e8380792SMatthias Ringwald   const arm_fir_instance_q7 * S,
1076*e8380792SMatthias Ringwald   q7_t * pSrc,
1077*e8380792SMatthias Ringwald   q7_t * pDst,
1078*e8380792SMatthias Ringwald   uint32_t blockSize);
1079*e8380792SMatthias Ringwald 
1080*e8380792SMatthias Ringwald 
1081*e8380792SMatthias Ringwald   /**
1082*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q7 FIR filter.
1083*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q7 FIR structure.
1084*e8380792SMatthias Ringwald    * @param[in]     numTaps    Number of filter coefficients in the filter.
1085*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
1086*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
1087*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of samples that are processed.
1088*e8380792SMatthias Ringwald    */
1089*e8380792SMatthias Ringwald   void arm_fir_init_q7(
1090*e8380792SMatthias Ringwald   arm_fir_instance_q7 * S,
1091*e8380792SMatthias Ringwald   uint16_t numTaps,
1092*e8380792SMatthias Ringwald   q7_t * pCoeffs,
1093*e8380792SMatthias Ringwald   q7_t * pState,
1094*e8380792SMatthias Ringwald   uint32_t blockSize);
1095*e8380792SMatthias Ringwald 
1096*e8380792SMatthias Ringwald 
1097*e8380792SMatthias Ringwald   /**
1098*e8380792SMatthias Ringwald    * @brief Processing function for the Q15 FIR filter.
1099*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 FIR structure.
1100*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1101*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1102*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1103*e8380792SMatthias Ringwald    */
1104*e8380792SMatthias Ringwald   void arm_fir_q15(
1105*e8380792SMatthias Ringwald   const arm_fir_instance_q15 * S,
1106*e8380792SMatthias Ringwald   q15_t * pSrc,
1107*e8380792SMatthias Ringwald   q15_t * pDst,
1108*e8380792SMatthias Ringwald   uint32_t blockSize);
1109*e8380792SMatthias Ringwald 
1110*e8380792SMatthias Ringwald 
1111*e8380792SMatthias Ringwald   /**
1112*e8380792SMatthias Ringwald    * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4.
1113*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 FIR filter structure.
1114*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1115*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1116*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1117*e8380792SMatthias Ringwald    */
1118*e8380792SMatthias Ringwald   void arm_fir_fast_q15(
1119*e8380792SMatthias Ringwald   const arm_fir_instance_q15 * S,
1120*e8380792SMatthias Ringwald   q15_t * pSrc,
1121*e8380792SMatthias Ringwald   q15_t * pDst,
1122*e8380792SMatthias Ringwald   uint32_t blockSize);
1123*e8380792SMatthias Ringwald 
1124*e8380792SMatthias Ringwald 
1125*e8380792SMatthias Ringwald   /**
1126*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q15 FIR filter.
1127*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q15 FIR filter structure.
1128*e8380792SMatthias Ringwald    * @param[in]     numTaps    Number of filter coefficients in the filter. Must be even and greater than or equal to 4.
1129*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
1130*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
1131*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of samples that are processed at a time.
1132*e8380792SMatthias Ringwald    * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if
1133*e8380792SMatthias Ringwald    * <code>numTaps</code> is not a supported value.
1134*e8380792SMatthias Ringwald    */
1135*e8380792SMatthias Ringwald   arm_status arm_fir_init_q15(
1136*e8380792SMatthias Ringwald   arm_fir_instance_q15 * S,
1137*e8380792SMatthias Ringwald   uint16_t numTaps,
1138*e8380792SMatthias Ringwald   q15_t * pCoeffs,
1139*e8380792SMatthias Ringwald   q15_t * pState,
1140*e8380792SMatthias Ringwald   uint32_t blockSize);
1141*e8380792SMatthias Ringwald 
1142*e8380792SMatthias Ringwald 
1143*e8380792SMatthias Ringwald   /**
1144*e8380792SMatthias Ringwald    * @brief Processing function for the Q31 FIR filter.
1145*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q31 FIR filter structure.
1146*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1147*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1148*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1149*e8380792SMatthias Ringwald    */
1150*e8380792SMatthias Ringwald   void arm_fir_q31(
1151*e8380792SMatthias Ringwald   const arm_fir_instance_q31 * S,
1152*e8380792SMatthias Ringwald   q31_t * pSrc,
1153*e8380792SMatthias Ringwald   q31_t * pDst,
1154*e8380792SMatthias Ringwald   uint32_t blockSize);
1155*e8380792SMatthias Ringwald 
1156*e8380792SMatthias Ringwald 
1157*e8380792SMatthias Ringwald   /**
1158*e8380792SMatthias Ringwald    * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4.
1159*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q31 FIR structure.
1160*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1161*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1162*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1163*e8380792SMatthias Ringwald    */
1164*e8380792SMatthias Ringwald   void arm_fir_fast_q31(
1165*e8380792SMatthias Ringwald   const arm_fir_instance_q31 * S,
1166*e8380792SMatthias Ringwald   q31_t * pSrc,
1167*e8380792SMatthias Ringwald   q31_t * pDst,
1168*e8380792SMatthias Ringwald   uint32_t blockSize);
1169*e8380792SMatthias Ringwald 
1170*e8380792SMatthias Ringwald 
1171*e8380792SMatthias Ringwald   /**
1172*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q31 FIR filter.
1173*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q31 FIR structure.
1174*e8380792SMatthias Ringwald    * @param[in]     numTaps    Number of filter coefficients in the filter.
1175*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
1176*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
1177*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of samples that are processed at a time.
1178*e8380792SMatthias Ringwald    */
1179*e8380792SMatthias Ringwald   void arm_fir_init_q31(
1180*e8380792SMatthias Ringwald   arm_fir_instance_q31 * S,
1181*e8380792SMatthias Ringwald   uint16_t numTaps,
1182*e8380792SMatthias Ringwald   q31_t * pCoeffs,
1183*e8380792SMatthias Ringwald   q31_t * pState,
1184*e8380792SMatthias Ringwald   uint32_t blockSize);
1185*e8380792SMatthias Ringwald 
1186*e8380792SMatthias Ringwald 
1187*e8380792SMatthias Ringwald   /**
1188*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point FIR filter.
1189*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the floating-point FIR structure.
1190*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1191*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1192*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1193*e8380792SMatthias Ringwald    */
1194*e8380792SMatthias Ringwald   void arm_fir_f32(
1195*e8380792SMatthias Ringwald   const arm_fir_instance_f32 * S,
1196*e8380792SMatthias Ringwald   float32_t * pSrc,
1197*e8380792SMatthias Ringwald   float32_t * pDst,
1198*e8380792SMatthias Ringwald   uint32_t blockSize);
1199*e8380792SMatthias Ringwald 
1200*e8380792SMatthias Ringwald 
1201*e8380792SMatthias Ringwald   /**
1202*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point FIR filter.
1203*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the floating-point FIR filter structure.
1204*e8380792SMatthias Ringwald    * @param[in]     numTaps    Number of filter coefficients in the filter.
1205*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
1206*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
1207*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of samples that are processed at a time.
1208*e8380792SMatthias Ringwald    */
1209*e8380792SMatthias Ringwald   void arm_fir_init_f32(
1210*e8380792SMatthias Ringwald   arm_fir_instance_f32 * S,
1211*e8380792SMatthias Ringwald   uint16_t numTaps,
1212*e8380792SMatthias Ringwald   float32_t * pCoeffs,
1213*e8380792SMatthias Ringwald   float32_t * pState,
1214*e8380792SMatthias Ringwald   uint32_t blockSize);
1215*e8380792SMatthias Ringwald 
1216*e8380792SMatthias Ringwald 
1217*e8380792SMatthias Ringwald   /**
1218*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 Biquad cascade filter.
1219*e8380792SMatthias Ringwald    */
1220*e8380792SMatthias Ringwald   typedef struct
1221*e8380792SMatthias Ringwald   {
1222*e8380792SMatthias Ringwald     int8_t numStages;        /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
1223*e8380792SMatthias Ringwald     q15_t *pState;           /**< Points to the array of state coefficients.  The array is of length 4*numStages. */
1224*e8380792SMatthias Ringwald     q15_t *pCoeffs;          /**< Points to the array of coefficients.  The array is of length 5*numStages. */
1225*e8380792SMatthias Ringwald     int8_t postShift;        /**< Additional shift, in bits, applied to each output sample. */
1226*e8380792SMatthias Ringwald   } arm_biquad_casd_df1_inst_q15;
1227*e8380792SMatthias Ringwald 
1228*e8380792SMatthias Ringwald   /**
1229*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 Biquad cascade filter.
1230*e8380792SMatthias Ringwald    */
1231*e8380792SMatthias Ringwald   typedef struct
1232*e8380792SMatthias Ringwald   {
1233*e8380792SMatthias Ringwald     uint32_t numStages;      /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
1234*e8380792SMatthias Ringwald     q31_t *pState;           /**< Points to the array of state coefficients.  The array is of length 4*numStages. */
1235*e8380792SMatthias Ringwald     q31_t *pCoeffs;          /**< Points to the array of coefficients.  The array is of length 5*numStages. */
1236*e8380792SMatthias Ringwald     uint8_t postShift;       /**< Additional shift, in bits, applied to each output sample. */
1237*e8380792SMatthias Ringwald   } arm_biquad_casd_df1_inst_q31;
1238*e8380792SMatthias Ringwald 
1239*e8380792SMatthias Ringwald   /**
1240*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point Biquad cascade filter.
1241*e8380792SMatthias Ringwald    */
1242*e8380792SMatthias Ringwald   typedef struct
1243*e8380792SMatthias Ringwald   {
1244*e8380792SMatthias Ringwald     uint32_t numStages;      /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
1245*e8380792SMatthias Ringwald     float32_t *pState;       /**< Points to the array of state coefficients.  The array is of length 4*numStages. */
1246*e8380792SMatthias Ringwald     float32_t *pCoeffs;      /**< Points to the array of coefficients.  The array is of length 5*numStages. */
1247*e8380792SMatthias Ringwald   } arm_biquad_casd_df1_inst_f32;
1248*e8380792SMatthias Ringwald 
1249*e8380792SMatthias Ringwald 
1250*e8380792SMatthias Ringwald   /**
1251*e8380792SMatthias Ringwald    * @brief Processing function for the Q15 Biquad cascade filter.
1252*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 Biquad cascade structure.
1253*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1254*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1255*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1256*e8380792SMatthias Ringwald    */
1257*e8380792SMatthias Ringwald   void arm_biquad_cascade_df1_q15(
1258*e8380792SMatthias Ringwald   const arm_biquad_casd_df1_inst_q15 * S,
1259*e8380792SMatthias Ringwald   q15_t * pSrc,
1260*e8380792SMatthias Ringwald   q15_t * pDst,
1261*e8380792SMatthias Ringwald   uint32_t blockSize);
1262*e8380792SMatthias Ringwald 
1263*e8380792SMatthias Ringwald 
1264*e8380792SMatthias Ringwald   /**
1265*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q15 Biquad cascade filter.
1266*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q15 Biquad cascade structure.
1267*e8380792SMatthias Ringwald    * @param[in]     numStages  number of 2nd order stages in the filter.
1268*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
1269*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
1270*e8380792SMatthias Ringwald    * @param[in]     postShift  Shift to be applied to the output. Varies according to the coefficients format
1271*e8380792SMatthias Ringwald    */
1272*e8380792SMatthias Ringwald   void arm_biquad_cascade_df1_init_q15(
1273*e8380792SMatthias Ringwald   arm_biquad_casd_df1_inst_q15 * S,
1274*e8380792SMatthias Ringwald   uint8_t numStages,
1275*e8380792SMatthias Ringwald   q15_t * pCoeffs,
1276*e8380792SMatthias Ringwald   q15_t * pState,
1277*e8380792SMatthias Ringwald   int8_t postShift);
1278*e8380792SMatthias Ringwald 
1279*e8380792SMatthias Ringwald 
1280*e8380792SMatthias Ringwald   /**
1281*e8380792SMatthias Ringwald    * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4.
1282*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 Biquad cascade structure.
1283*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1284*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1285*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1286*e8380792SMatthias Ringwald    */
1287*e8380792SMatthias Ringwald   void arm_biquad_cascade_df1_fast_q15(
1288*e8380792SMatthias Ringwald   const arm_biquad_casd_df1_inst_q15 * S,
1289*e8380792SMatthias Ringwald   q15_t * pSrc,
1290*e8380792SMatthias Ringwald   q15_t * pDst,
1291*e8380792SMatthias Ringwald   uint32_t blockSize);
1292*e8380792SMatthias Ringwald 
1293*e8380792SMatthias Ringwald 
1294*e8380792SMatthias Ringwald   /**
1295*e8380792SMatthias Ringwald    * @brief Processing function for the Q31 Biquad cascade filter
1296*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q31 Biquad cascade structure.
1297*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1298*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1299*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1300*e8380792SMatthias Ringwald    */
1301*e8380792SMatthias Ringwald   void arm_biquad_cascade_df1_q31(
1302*e8380792SMatthias Ringwald   const arm_biquad_casd_df1_inst_q31 * S,
1303*e8380792SMatthias Ringwald   q31_t * pSrc,
1304*e8380792SMatthias Ringwald   q31_t * pDst,
1305*e8380792SMatthias Ringwald   uint32_t blockSize);
1306*e8380792SMatthias Ringwald 
1307*e8380792SMatthias Ringwald 
1308*e8380792SMatthias Ringwald   /**
1309*e8380792SMatthias Ringwald    * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4.
1310*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q31 Biquad cascade structure.
1311*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1312*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1313*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1314*e8380792SMatthias Ringwald    */
1315*e8380792SMatthias Ringwald   void arm_biquad_cascade_df1_fast_q31(
1316*e8380792SMatthias Ringwald   const arm_biquad_casd_df1_inst_q31 * S,
1317*e8380792SMatthias Ringwald   q31_t * pSrc,
1318*e8380792SMatthias Ringwald   q31_t * pDst,
1319*e8380792SMatthias Ringwald   uint32_t blockSize);
1320*e8380792SMatthias Ringwald 
1321*e8380792SMatthias Ringwald 
1322*e8380792SMatthias Ringwald   /**
1323*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q31 Biquad cascade filter.
1324*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q31 Biquad cascade structure.
1325*e8380792SMatthias Ringwald    * @param[in]     numStages  number of 2nd order stages in the filter.
1326*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
1327*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
1328*e8380792SMatthias Ringwald    * @param[in]     postShift  Shift to be applied to the output. Varies according to the coefficients format
1329*e8380792SMatthias Ringwald    */
1330*e8380792SMatthias Ringwald   void arm_biquad_cascade_df1_init_q31(
1331*e8380792SMatthias Ringwald   arm_biquad_casd_df1_inst_q31 * S,
1332*e8380792SMatthias Ringwald   uint8_t numStages,
1333*e8380792SMatthias Ringwald   q31_t * pCoeffs,
1334*e8380792SMatthias Ringwald   q31_t * pState,
1335*e8380792SMatthias Ringwald   int8_t postShift);
1336*e8380792SMatthias Ringwald 
1337*e8380792SMatthias Ringwald 
1338*e8380792SMatthias Ringwald   /**
1339*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point Biquad cascade filter.
1340*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the floating-point Biquad cascade structure.
1341*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
1342*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
1343*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
1344*e8380792SMatthias Ringwald    */
1345*e8380792SMatthias Ringwald   void arm_biquad_cascade_df1_f32(
1346*e8380792SMatthias Ringwald   const arm_biquad_casd_df1_inst_f32 * S,
1347*e8380792SMatthias Ringwald   float32_t * pSrc,
1348*e8380792SMatthias Ringwald   float32_t * pDst,
1349*e8380792SMatthias Ringwald   uint32_t blockSize);
1350*e8380792SMatthias Ringwald 
1351*e8380792SMatthias Ringwald 
1352*e8380792SMatthias Ringwald   /**
1353*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point Biquad cascade filter.
1354*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the floating-point Biquad cascade structure.
1355*e8380792SMatthias Ringwald    * @param[in]     numStages  number of 2nd order stages in the filter.
1356*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
1357*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
1358*e8380792SMatthias Ringwald    */
1359*e8380792SMatthias Ringwald   void arm_biquad_cascade_df1_init_f32(
1360*e8380792SMatthias Ringwald   arm_biquad_casd_df1_inst_f32 * S,
1361*e8380792SMatthias Ringwald   uint8_t numStages,
1362*e8380792SMatthias Ringwald   float32_t * pCoeffs,
1363*e8380792SMatthias Ringwald   float32_t * pState);
1364*e8380792SMatthias Ringwald 
1365*e8380792SMatthias Ringwald 
1366*e8380792SMatthias Ringwald   /**
1367*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point matrix structure.
1368*e8380792SMatthias Ringwald    */
1369*e8380792SMatthias Ringwald   typedef struct
1370*e8380792SMatthias Ringwald   {
1371*e8380792SMatthias Ringwald     uint16_t numRows;     /**< number of rows of the matrix.     */
1372*e8380792SMatthias Ringwald     uint16_t numCols;     /**< number of columns of the matrix.  */
1373*e8380792SMatthias Ringwald     float32_t *pData;     /**< points to the data of the matrix. */
1374*e8380792SMatthias Ringwald   } arm_matrix_instance_f32;
1375*e8380792SMatthias Ringwald 
1376*e8380792SMatthias Ringwald 
1377*e8380792SMatthias Ringwald   /**
1378*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point matrix structure.
1379*e8380792SMatthias Ringwald    */
1380*e8380792SMatthias Ringwald   typedef struct
1381*e8380792SMatthias Ringwald   {
1382*e8380792SMatthias Ringwald     uint16_t numRows;     /**< number of rows of the matrix.     */
1383*e8380792SMatthias Ringwald     uint16_t numCols;     /**< number of columns of the matrix.  */
1384*e8380792SMatthias Ringwald     float64_t *pData;     /**< points to the data of the matrix. */
1385*e8380792SMatthias Ringwald   } arm_matrix_instance_f64;
1386*e8380792SMatthias Ringwald 
1387*e8380792SMatthias Ringwald   /**
1388*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 matrix structure.
1389*e8380792SMatthias Ringwald    */
1390*e8380792SMatthias Ringwald   typedef struct
1391*e8380792SMatthias Ringwald   {
1392*e8380792SMatthias Ringwald     uint16_t numRows;     /**< number of rows of the matrix.     */
1393*e8380792SMatthias Ringwald     uint16_t numCols;     /**< number of columns of the matrix.  */
1394*e8380792SMatthias Ringwald     q15_t *pData;         /**< points to the data of the matrix. */
1395*e8380792SMatthias Ringwald   } arm_matrix_instance_q15;
1396*e8380792SMatthias Ringwald 
1397*e8380792SMatthias Ringwald   /**
1398*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 matrix structure.
1399*e8380792SMatthias Ringwald    */
1400*e8380792SMatthias Ringwald   typedef struct
1401*e8380792SMatthias Ringwald   {
1402*e8380792SMatthias Ringwald     uint16_t numRows;     /**< number of rows of the matrix.     */
1403*e8380792SMatthias Ringwald     uint16_t numCols;     /**< number of columns of the matrix.  */
1404*e8380792SMatthias Ringwald     q31_t *pData;         /**< points to the data of the matrix. */
1405*e8380792SMatthias Ringwald   } arm_matrix_instance_q31;
1406*e8380792SMatthias Ringwald 
1407*e8380792SMatthias Ringwald 
1408*e8380792SMatthias Ringwald   /**
1409*e8380792SMatthias Ringwald    * @brief Floating-point matrix addition.
1410*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1411*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1412*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1413*e8380792SMatthias Ringwald    * @return     The function returns either
1414*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1415*e8380792SMatthias Ringwald    */
1416*e8380792SMatthias Ringwald   arm_status arm_mat_add_f32(
1417*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrcA,
1418*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrcB,
1419*e8380792SMatthias Ringwald   arm_matrix_instance_f32 * pDst);
1420*e8380792SMatthias Ringwald 
1421*e8380792SMatthias Ringwald 
1422*e8380792SMatthias Ringwald   /**
1423*e8380792SMatthias Ringwald    * @brief Q15 matrix addition.
1424*e8380792SMatthias Ringwald    * @param[in]   pSrcA  points to the first input matrix structure
1425*e8380792SMatthias Ringwald    * @param[in]   pSrcB  points to the second input matrix structure
1426*e8380792SMatthias Ringwald    * @param[out]  pDst   points to output matrix structure
1427*e8380792SMatthias Ringwald    * @return     The function returns either
1428*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1429*e8380792SMatthias Ringwald    */
1430*e8380792SMatthias Ringwald   arm_status arm_mat_add_q15(
1431*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcA,
1432*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcB,
1433*e8380792SMatthias Ringwald   arm_matrix_instance_q15 * pDst);
1434*e8380792SMatthias Ringwald 
1435*e8380792SMatthias Ringwald 
1436*e8380792SMatthias Ringwald   /**
1437*e8380792SMatthias Ringwald    * @brief Q31 matrix addition.
1438*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1439*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1440*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1441*e8380792SMatthias Ringwald    * @return     The function returns either
1442*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1443*e8380792SMatthias Ringwald    */
1444*e8380792SMatthias Ringwald   arm_status arm_mat_add_q31(
1445*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcA,
1446*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcB,
1447*e8380792SMatthias Ringwald   arm_matrix_instance_q31 * pDst);
1448*e8380792SMatthias Ringwald 
1449*e8380792SMatthias Ringwald 
1450*e8380792SMatthias Ringwald   /**
1451*e8380792SMatthias Ringwald    * @brief Floating-point, complex, matrix multiplication.
1452*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1453*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1454*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1455*e8380792SMatthias Ringwald    * @return     The function returns either
1456*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1457*e8380792SMatthias Ringwald    */
1458*e8380792SMatthias Ringwald   arm_status arm_mat_cmplx_mult_f32(
1459*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrcA,
1460*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrcB,
1461*e8380792SMatthias Ringwald   arm_matrix_instance_f32 * pDst);
1462*e8380792SMatthias Ringwald 
1463*e8380792SMatthias Ringwald 
1464*e8380792SMatthias Ringwald   /**
1465*e8380792SMatthias Ringwald    * @brief Q15, complex,  matrix multiplication.
1466*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1467*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1468*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1469*e8380792SMatthias Ringwald    * @return     The function returns either
1470*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1471*e8380792SMatthias Ringwald    */
1472*e8380792SMatthias Ringwald   arm_status arm_mat_cmplx_mult_q15(
1473*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcA,
1474*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcB,
1475*e8380792SMatthias Ringwald   arm_matrix_instance_q15 * pDst,
1476*e8380792SMatthias Ringwald   q15_t * pScratch);
1477*e8380792SMatthias Ringwald 
1478*e8380792SMatthias Ringwald 
1479*e8380792SMatthias Ringwald   /**
1480*e8380792SMatthias Ringwald    * @brief Q31, complex, matrix multiplication.
1481*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1482*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1483*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1484*e8380792SMatthias Ringwald    * @return     The function returns either
1485*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1486*e8380792SMatthias Ringwald    */
1487*e8380792SMatthias Ringwald   arm_status arm_mat_cmplx_mult_q31(
1488*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcA,
1489*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcB,
1490*e8380792SMatthias Ringwald   arm_matrix_instance_q31 * pDst);
1491*e8380792SMatthias Ringwald 
1492*e8380792SMatthias Ringwald 
1493*e8380792SMatthias Ringwald   /**
1494*e8380792SMatthias Ringwald    * @brief Floating-point matrix transpose.
1495*e8380792SMatthias Ringwald    * @param[in]  pSrc  points to the input matrix
1496*e8380792SMatthias Ringwald    * @param[out] pDst  points to the output matrix
1497*e8380792SMatthias Ringwald    * @return    The function returns either  <code>ARM_MATH_SIZE_MISMATCH</code>
1498*e8380792SMatthias Ringwald    * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1499*e8380792SMatthias Ringwald    */
1500*e8380792SMatthias Ringwald   arm_status arm_mat_trans_f32(
1501*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrc,
1502*e8380792SMatthias Ringwald   arm_matrix_instance_f32 * pDst);
1503*e8380792SMatthias Ringwald 
1504*e8380792SMatthias Ringwald 
1505*e8380792SMatthias Ringwald   /**
1506*e8380792SMatthias Ringwald    * @brief Q15 matrix transpose.
1507*e8380792SMatthias Ringwald    * @param[in]  pSrc  points to the input matrix
1508*e8380792SMatthias Ringwald    * @param[out] pDst  points to the output matrix
1509*e8380792SMatthias Ringwald    * @return    The function returns either  <code>ARM_MATH_SIZE_MISMATCH</code>
1510*e8380792SMatthias Ringwald    * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1511*e8380792SMatthias Ringwald    */
1512*e8380792SMatthias Ringwald   arm_status arm_mat_trans_q15(
1513*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrc,
1514*e8380792SMatthias Ringwald   arm_matrix_instance_q15 * pDst);
1515*e8380792SMatthias Ringwald 
1516*e8380792SMatthias Ringwald 
1517*e8380792SMatthias Ringwald   /**
1518*e8380792SMatthias Ringwald    * @brief Q31 matrix transpose.
1519*e8380792SMatthias Ringwald    * @param[in]  pSrc  points to the input matrix
1520*e8380792SMatthias Ringwald    * @param[out] pDst  points to the output matrix
1521*e8380792SMatthias Ringwald    * @return    The function returns either  <code>ARM_MATH_SIZE_MISMATCH</code>
1522*e8380792SMatthias Ringwald    * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1523*e8380792SMatthias Ringwald    */
1524*e8380792SMatthias Ringwald   arm_status arm_mat_trans_q31(
1525*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrc,
1526*e8380792SMatthias Ringwald   arm_matrix_instance_q31 * pDst);
1527*e8380792SMatthias Ringwald 
1528*e8380792SMatthias Ringwald 
1529*e8380792SMatthias Ringwald   /**
1530*e8380792SMatthias Ringwald    * @brief Floating-point matrix multiplication
1531*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1532*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1533*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1534*e8380792SMatthias Ringwald    * @return     The function returns either
1535*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1536*e8380792SMatthias Ringwald    */
1537*e8380792SMatthias Ringwald   arm_status arm_mat_mult_f32(
1538*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrcA,
1539*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrcB,
1540*e8380792SMatthias Ringwald   arm_matrix_instance_f32 * pDst);
1541*e8380792SMatthias Ringwald 
1542*e8380792SMatthias Ringwald 
1543*e8380792SMatthias Ringwald   /**
1544*e8380792SMatthias Ringwald    * @brief Q15 matrix multiplication
1545*e8380792SMatthias Ringwald    * @param[in]  pSrcA   points to the first input matrix structure
1546*e8380792SMatthias Ringwald    * @param[in]  pSrcB   points to the second input matrix structure
1547*e8380792SMatthias Ringwald    * @param[out] pDst    points to output matrix structure
1548*e8380792SMatthias Ringwald    * @param[in]  pState  points to the array for storing intermediate results
1549*e8380792SMatthias Ringwald    * @return     The function returns either
1550*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1551*e8380792SMatthias Ringwald    */
1552*e8380792SMatthias Ringwald   arm_status arm_mat_mult_q15(
1553*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcA,
1554*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcB,
1555*e8380792SMatthias Ringwald   arm_matrix_instance_q15 * pDst,
1556*e8380792SMatthias Ringwald   q15_t * pState);
1557*e8380792SMatthias Ringwald 
1558*e8380792SMatthias Ringwald 
1559*e8380792SMatthias Ringwald   /**
1560*e8380792SMatthias Ringwald    * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4
1561*e8380792SMatthias Ringwald    * @param[in]  pSrcA   points to the first input matrix structure
1562*e8380792SMatthias Ringwald    * @param[in]  pSrcB   points to the second input matrix structure
1563*e8380792SMatthias Ringwald    * @param[out] pDst    points to output matrix structure
1564*e8380792SMatthias Ringwald    * @param[in]  pState  points to the array for storing intermediate results
1565*e8380792SMatthias Ringwald    * @return     The function returns either
1566*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1567*e8380792SMatthias Ringwald    */
1568*e8380792SMatthias Ringwald   arm_status arm_mat_mult_fast_q15(
1569*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcA,
1570*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcB,
1571*e8380792SMatthias Ringwald   arm_matrix_instance_q15 * pDst,
1572*e8380792SMatthias Ringwald   q15_t * pState);
1573*e8380792SMatthias Ringwald 
1574*e8380792SMatthias Ringwald 
1575*e8380792SMatthias Ringwald   /**
1576*e8380792SMatthias Ringwald    * @brief Q31 matrix multiplication
1577*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1578*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1579*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1580*e8380792SMatthias Ringwald    * @return     The function returns either
1581*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1582*e8380792SMatthias Ringwald    */
1583*e8380792SMatthias Ringwald   arm_status arm_mat_mult_q31(
1584*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcA,
1585*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcB,
1586*e8380792SMatthias Ringwald   arm_matrix_instance_q31 * pDst);
1587*e8380792SMatthias Ringwald 
1588*e8380792SMatthias Ringwald 
1589*e8380792SMatthias Ringwald   /**
1590*e8380792SMatthias Ringwald    * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4
1591*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1592*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1593*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1594*e8380792SMatthias Ringwald    * @return     The function returns either
1595*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1596*e8380792SMatthias Ringwald    */
1597*e8380792SMatthias Ringwald   arm_status arm_mat_mult_fast_q31(
1598*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcA,
1599*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcB,
1600*e8380792SMatthias Ringwald   arm_matrix_instance_q31 * pDst);
1601*e8380792SMatthias Ringwald 
1602*e8380792SMatthias Ringwald 
1603*e8380792SMatthias Ringwald   /**
1604*e8380792SMatthias Ringwald    * @brief Floating-point matrix subtraction
1605*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1606*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1607*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1608*e8380792SMatthias Ringwald    * @return     The function returns either
1609*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1610*e8380792SMatthias Ringwald    */
1611*e8380792SMatthias Ringwald   arm_status arm_mat_sub_f32(
1612*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrcA,
1613*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrcB,
1614*e8380792SMatthias Ringwald   arm_matrix_instance_f32 * pDst);
1615*e8380792SMatthias Ringwald 
1616*e8380792SMatthias Ringwald 
1617*e8380792SMatthias Ringwald   /**
1618*e8380792SMatthias Ringwald    * @brief Q15 matrix subtraction
1619*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1620*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1621*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1622*e8380792SMatthias Ringwald    * @return     The function returns either
1623*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1624*e8380792SMatthias Ringwald    */
1625*e8380792SMatthias Ringwald   arm_status arm_mat_sub_q15(
1626*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcA,
1627*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrcB,
1628*e8380792SMatthias Ringwald   arm_matrix_instance_q15 * pDst);
1629*e8380792SMatthias Ringwald 
1630*e8380792SMatthias Ringwald 
1631*e8380792SMatthias Ringwald   /**
1632*e8380792SMatthias Ringwald    * @brief Q31 matrix subtraction
1633*e8380792SMatthias Ringwald    * @param[in]  pSrcA  points to the first input matrix structure
1634*e8380792SMatthias Ringwald    * @param[in]  pSrcB  points to the second input matrix structure
1635*e8380792SMatthias Ringwald    * @param[out] pDst   points to output matrix structure
1636*e8380792SMatthias Ringwald    * @return     The function returns either
1637*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1638*e8380792SMatthias Ringwald    */
1639*e8380792SMatthias Ringwald   arm_status arm_mat_sub_q31(
1640*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcA,
1641*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrcB,
1642*e8380792SMatthias Ringwald   arm_matrix_instance_q31 * pDst);
1643*e8380792SMatthias Ringwald 
1644*e8380792SMatthias Ringwald 
1645*e8380792SMatthias Ringwald   /**
1646*e8380792SMatthias Ringwald    * @brief Floating-point matrix scaling.
1647*e8380792SMatthias Ringwald    * @param[in]  pSrc   points to the input matrix
1648*e8380792SMatthias Ringwald    * @param[in]  scale  scale factor
1649*e8380792SMatthias Ringwald    * @param[out] pDst   points to the output matrix
1650*e8380792SMatthias Ringwald    * @return     The function returns either
1651*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1652*e8380792SMatthias Ringwald    */
1653*e8380792SMatthias Ringwald   arm_status arm_mat_scale_f32(
1654*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * pSrc,
1655*e8380792SMatthias Ringwald   float32_t scale,
1656*e8380792SMatthias Ringwald   arm_matrix_instance_f32 * pDst);
1657*e8380792SMatthias Ringwald 
1658*e8380792SMatthias Ringwald 
1659*e8380792SMatthias Ringwald   /**
1660*e8380792SMatthias Ringwald    * @brief Q15 matrix scaling.
1661*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to input matrix
1662*e8380792SMatthias Ringwald    * @param[in]  scaleFract  fractional portion of the scale factor
1663*e8380792SMatthias Ringwald    * @param[in]  shift       number of bits to shift the result by
1664*e8380792SMatthias Ringwald    * @param[out] pDst        points to output matrix
1665*e8380792SMatthias Ringwald    * @return     The function returns either
1666*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1667*e8380792SMatthias Ringwald    */
1668*e8380792SMatthias Ringwald   arm_status arm_mat_scale_q15(
1669*e8380792SMatthias Ringwald   const arm_matrix_instance_q15 * pSrc,
1670*e8380792SMatthias Ringwald   q15_t scaleFract,
1671*e8380792SMatthias Ringwald   int32_t shift,
1672*e8380792SMatthias Ringwald   arm_matrix_instance_q15 * pDst);
1673*e8380792SMatthias Ringwald 
1674*e8380792SMatthias Ringwald 
1675*e8380792SMatthias Ringwald   /**
1676*e8380792SMatthias Ringwald    * @brief Q31 matrix scaling.
1677*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to input matrix
1678*e8380792SMatthias Ringwald    * @param[in]  scaleFract  fractional portion of the scale factor
1679*e8380792SMatthias Ringwald    * @param[in]  shift       number of bits to shift the result by
1680*e8380792SMatthias Ringwald    * @param[out] pDst        points to output matrix structure
1681*e8380792SMatthias Ringwald    * @return     The function returns either
1682*e8380792SMatthias Ringwald    * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
1683*e8380792SMatthias Ringwald    */
1684*e8380792SMatthias Ringwald   arm_status arm_mat_scale_q31(
1685*e8380792SMatthias Ringwald   const arm_matrix_instance_q31 * pSrc,
1686*e8380792SMatthias Ringwald   q31_t scaleFract,
1687*e8380792SMatthias Ringwald   int32_t shift,
1688*e8380792SMatthias Ringwald   arm_matrix_instance_q31 * pDst);
1689*e8380792SMatthias Ringwald 
1690*e8380792SMatthias Ringwald 
1691*e8380792SMatthias Ringwald   /**
1692*e8380792SMatthias Ringwald    * @brief  Q31 matrix initialization.
1693*e8380792SMatthias Ringwald    * @param[in,out] S         points to an instance of the floating-point matrix structure.
1694*e8380792SMatthias Ringwald    * @param[in]     nRows     number of rows in the matrix.
1695*e8380792SMatthias Ringwald    * @param[in]     nColumns  number of columns in the matrix.
1696*e8380792SMatthias Ringwald    * @param[in]     pData     points to the matrix data array.
1697*e8380792SMatthias Ringwald    */
1698*e8380792SMatthias Ringwald   void arm_mat_init_q31(
1699*e8380792SMatthias Ringwald   arm_matrix_instance_q31 * S,
1700*e8380792SMatthias Ringwald   uint16_t nRows,
1701*e8380792SMatthias Ringwald   uint16_t nColumns,
1702*e8380792SMatthias Ringwald   q31_t * pData);
1703*e8380792SMatthias Ringwald 
1704*e8380792SMatthias Ringwald 
1705*e8380792SMatthias Ringwald   /**
1706*e8380792SMatthias Ringwald    * @brief  Q15 matrix initialization.
1707*e8380792SMatthias Ringwald    * @param[in,out] S         points to an instance of the floating-point matrix structure.
1708*e8380792SMatthias Ringwald    * @param[in]     nRows     number of rows in the matrix.
1709*e8380792SMatthias Ringwald    * @param[in]     nColumns  number of columns in the matrix.
1710*e8380792SMatthias Ringwald    * @param[in]     pData     points to the matrix data array.
1711*e8380792SMatthias Ringwald    */
1712*e8380792SMatthias Ringwald   void arm_mat_init_q15(
1713*e8380792SMatthias Ringwald   arm_matrix_instance_q15 * S,
1714*e8380792SMatthias Ringwald   uint16_t nRows,
1715*e8380792SMatthias Ringwald   uint16_t nColumns,
1716*e8380792SMatthias Ringwald   q15_t * pData);
1717*e8380792SMatthias Ringwald 
1718*e8380792SMatthias Ringwald 
1719*e8380792SMatthias Ringwald   /**
1720*e8380792SMatthias Ringwald    * @brief  Floating-point matrix initialization.
1721*e8380792SMatthias Ringwald    * @param[in,out] S         points to an instance of the floating-point matrix structure.
1722*e8380792SMatthias Ringwald    * @param[in]     nRows     number of rows in the matrix.
1723*e8380792SMatthias Ringwald    * @param[in]     nColumns  number of columns in the matrix.
1724*e8380792SMatthias Ringwald    * @param[in]     pData     points to the matrix data array.
1725*e8380792SMatthias Ringwald    */
1726*e8380792SMatthias Ringwald   void arm_mat_init_f32(
1727*e8380792SMatthias Ringwald   arm_matrix_instance_f32 * S,
1728*e8380792SMatthias Ringwald   uint16_t nRows,
1729*e8380792SMatthias Ringwald   uint16_t nColumns,
1730*e8380792SMatthias Ringwald   float32_t * pData);
1731*e8380792SMatthias Ringwald 
1732*e8380792SMatthias Ringwald 
1733*e8380792SMatthias Ringwald 
1734*e8380792SMatthias Ringwald   /**
1735*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 PID Control.
1736*e8380792SMatthias Ringwald    */
1737*e8380792SMatthias Ringwald   typedef struct
1738*e8380792SMatthias Ringwald   {
1739*e8380792SMatthias Ringwald     q15_t A0;           /**< The derived gain, A0 = Kp + Ki + Kd . */
1740*e8380792SMatthias Ringwald #ifdef ARM_MATH_CM0_FAMILY
1741*e8380792SMatthias Ringwald     q15_t A1;
1742*e8380792SMatthias Ringwald     q15_t A2;
1743*e8380792SMatthias Ringwald #else
1744*e8380792SMatthias Ringwald     q31_t A1;           /**< The derived gain A1 = -Kp - 2Kd | Kd.*/
1745*e8380792SMatthias Ringwald #endif
1746*e8380792SMatthias Ringwald     q15_t state[3];     /**< The state array of length 3. */
1747*e8380792SMatthias Ringwald     q15_t Kp;           /**< The proportional gain. */
1748*e8380792SMatthias Ringwald     q15_t Ki;           /**< The integral gain. */
1749*e8380792SMatthias Ringwald     q15_t Kd;           /**< The derivative gain. */
1750*e8380792SMatthias Ringwald   } arm_pid_instance_q15;
1751*e8380792SMatthias Ringwald 
1752*e8380792SMatthias Ringwald   /**
1753*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 PID Control.
1754*e8380792SMatthias Ringwald    */
1755*e8380792SMatthias Ringwald   typedef struct
1756*e8380792SMatthias Ringwald   {
1757*e8380792SMatthias Ringwald     q31_t A0;            /**< The derived gain, A0 = Kp + Ki + Kd . */
1758*e8380792SMatthias Ringwald     q31_t A1;            /**< The derived gain, A1 = -Kp - 2Kd. */
1759*e8380792SMatthias Ringwald     q31_t A2;            /**< The derived gain, A2 = Kd . */
1760*e8380792SMatthias Ringwald     q31_t state[3];      /**< The state array of length 3. */
1761*e8380792SMatthias Ringwald     q31_t Kp;            /**< The proportional gain. */
1762*e8380792SMatthias Ringwald     q31_t Ki;            /**< The integral gain. */
1763*e8380792SMatthias Ringwald     q31_t Kd;            /**< The derivative gain. */
1764*e8380792SMatthias Ringwald   } arm_pid_instance_q31;
1765*e8380792SMatthias Ringwald 
1766*e8380792SMatthias Ringwald   /**
1767*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point PID Control.
1768*e8380792SMatthias Ringwald    */
1769*e8380792SMatthias Ringwald   typedef struct
1770*e8380792SMatthias Ringwald   {
1771*e8380792SMatthias Ringwald     float32_t A0;          /**< The derived gain, A0 = Kp + Ki + Kd . */
1772*e8380792SMatthias Ringwald     float32_t A1;          /**< The derived gain, A1 = -Kp - 2Kd. */
1773*e8380792SMatthias Ringwald     float32_t A2;          /**< The derived gain, A2 = Kd . */
1774*e8380792SMatthias Ringwald     float32_t state[3];    /**< The state array of length 3. */
1775*e8380792SMatthias Ringwald     float32_t Kp;          /**< The proportional gain. */
1776*e8380792SMatthias Ringwald     float32_t Ki;          /**< The integral gain. */
1777*e8380792SMatthias Ringwald     float32_t Kd;          /**< The derivative gain. */
1778*e8380792SMatthias Ringwald   } arm_pid_instance_f32;
1779*e8380792SMatthias Ringwald 
1780*e8380792SMatthias Ringwald 
1781*e8380792SMatthias Ringwald 
1782*e8380792SMatthias Ringwald   /**
1783*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point PID Control.
1784*e8380792SMatthias Ringwald    * @param[in,out] S               points to an instance of the PID structure.
1785*e8380792SMatthias Ringwald    * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.
1786*e8380792SMatthias Ringwald    */
1787*e8380792SMatthias Ringwald   void arm_pid_init_f32(
1788*e8380792SMatthias Ringwald   arm_pid_instance_f32 * S,
1789*e8380792SMatthias Ringwald   int32_t resetStateFlag);
1790*e8380792SMatthias Ringwald 
1791*e8380792SMatthias Ringwald 
1792*e8380792SMatthias Ringwald   /**
1793*e8380792SMatthias Ringwald    * @brief  Reset function for the floating-point PID Control.
1794*e8380792SMatthias Ringwald    * @param[in,out] S  is an instance of the floating-point PID Control structure
1795*e8380792SMatthias Ringwald    */
1796*e8380792SMatthias Ringwald   void arm_pid_reset_f32(
1797*e8380792SMatthias Ringwald   arm_pid_instance_f32 * S);
1798*e8380792SMatthias Ringwald 
1799*e8380792SMatthias Ringwald 
1800*e8380792SMatthias Ringwald   /**
1801*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q31 PID Control.
1802*e8380792SMatthias Ringwald    * @param[in,out] S               points to an instance of the Q15 PID structure.
1803*e8380792SMatthias Ringwald    * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.
1804*e8380792SMatthias Ringwald    */
1805*e8380792SMatthias Ringwald   void arm_pid_init_q31(
1806*e8380792SMatthias Ringwald   arm_pid_instance_q31 * S,
1807*e8380792SMatthias Ringwald   int32_t resetStateFlag);
1808*e8380792SMatthias Ringwald 
1809*e8380792SMatthias Ringwald 
1810*e8380792SMatthias Ringwald   /**
1811*e8380792SMatthias Ringwald    * @brief  Reset function for the Q31 PID Control.
1812*e8380792SMatthias Ringwald    * @param[in,out] S   points to an instance of the Q31 PID Control structure
1813*e8380792SMatthias Ringwald    */
1814*e8380792SMatthias Ringwald 
1815*e8380792SMatthias Ringwald   void arm_pid_reset_q31(
1816*e8380792SMatthias Ringwald   arm_pid_instance_q31 * S);
1817*e8380792SMatthias Ringwald 
1818*e8380792SMatthias Ringwald 
1819*e8380792SMatthias Ringwald   /**
1820*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q15 PID Control.
1821*e8380792SMatthias Ringwald    * @param[in,out] S               points to an instance of the Q15 PID structure.
1822*e8380792SMatthias Ringwald    * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.
1823*e8380792SMatthias Ringwald    */
1824*e8380792SMatthias Ringwald   void arm_pid_init_q15(
1825*e8380792SMatthias Ringwald   arm_pid_instance_q15 * S,
1826*e8380792SMatthias Ringwald   int32_t resetStateFlag);
1827*e8380792SMatthias Ringwald 
1828*e8380792SMatthias Ringwald 
1829*e8380792SMatthias Ringwald   /**
1830*e8380792SMatthias Ringwald    * @brief  Reset function for the Q15 PID Control.
1831*e8380792SMatthias Ringwald    * @param[in,out] S  points to an instance of the q15 PID Control structure
1832*e8380792SMatthias Ringwald    */
1833*e8380792SMatthias Ringwald   void arm_pid_reset_q15(
1834*e8380792SMatthias Ringwald   arm_pid_instance_q15 * S);
1835*e8380792SMatthias Ringwald 
1836*e8380792SMatthias Ringwald 
1837*e8380792SMatthias Ringwald   /**
1838*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point Linear Interpolate function.
1839*e8380792SMatthias Ringwald    */
1840*e8380792SMatthias Ringwald   typedef struct
1841*e8380792SMatthias Ringwald   {
1842*e8380792SMatthias Ringwald     uint32_t nValues;           /**< nValues */
1843*e8380792SMatthias Ringwald     float32_t x1;               /**< x1 */
1844*e8380792SMatthias Ringwald     float32_t xSpacing;         /**< xSpacing */
1845*e8380792SMatthias Ringwald     float32_t *pYData;          /**< pointer to the table of Y values */
1846*e8380792SMatthias Ringwald   } arm_linear_interp_instance_f32;
1847*e8380792SMatthias Ringwald 
1848*e8380792SMatthias Ringwald   /**
1849*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point bilinear interpolation function.
1850*e8380792SMatthias Ringwald    */
1851*e8380792SMatthias Ringwald   typedef struct
1852*e8380792SMatthias Ringwald   {
1853*e8380792SMatthias Ringwald     uint16_t numRows;   /**< number of rows in the data table. */
1854*e8380792SMatthias Ringwald     uint16_t numCols;   /**< number of columns in the data table. */
1855*e8380792SMatthias Ringwald     float32_t *pData;   /**< points to the data table. */
1856*e8380792SMatthias Ringwald   } arm_bilinear_interp_instance_f32;
1857*e8380792SMatthias Ringwald 
1858*e8380792SMatthias Ringwald    /**
1859*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 bilinear interpolation function.
1860*e8380792SMatthias Ringwald    */
1861*e8380792SMatthias Ringwald   typedef struct
1862*e8380792SMatthias Ringwald   {
1863*e8380792SMatthias Ringwald     uint16_t numRows;   /**< number of rows in the data table. */
1864*e8380792SMatthias Ringwald     uint16_t numCols;   /**< number of columns in the data table. */
1865*e8380792SMatthias Ringwald     q31_t *pData;       /**< points to the data table. */
1866*e8380792SMatthias Ringwald   } arm_bilinear_interp_instance_q31;
1867*e8380792SMatthias Ringwald 
1868*e8380792SMatthias Ringwald    /**
1869*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 bilinear interpolation function.
1870*e8380792SMatthias Ringwald    */
1871*e8380792SMatthias Ringwald   typedef struct
1872*e8380792SMatthias Ringwald   {
1873*e8380792SMatthias Ringwald     uint16_t numRows;   /**< number of rows in the data table. */
1874*e8380792SMatthias Ringwald     uint16_t numCols;   /**< number of columns in the data table. */
1875*e8380792SMatthias Ringwald     q15_t *pData;       /**< points to the data table. */
1876*e8380792SMatthias Ringwald   } arm_bilinear_interp_instance_q15;
1877*e8380792SMatthias Ringwald 
1878*e8380792SMatthias Ringwald    /**
1879*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 bilinear interpolation function.
1880*e8380792SMatthias Ringwald    */
1881*e8380792SMatthias Ringwald   typedef struct
1882*e8380792SMatthias Ringwald   {
1883*e8380792SMatthias Ringwald     uint16_t numRows;   /**< number of rows in the data table. */
1884*e8380792SMatthias Ringwald     uint16_t numCols;   /**< number of columns in the data table. */
1885*e8380792SMatthias Ringwald     q7_t *pData;        /**< points to the data table. */
1886*e8380792SMatthias Ringwald   } arm_bilinear_interp_instance_q7;
1887*e8380792SMatthias Ringwald 
1888*e8380792SMatthias Ringwald 
1889*e8380792SMatthias Ringwald   /**
1890*e8380792SMatthias Ringwald    * @brief Q7 vector multiplication.
1891*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
1892*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
1893*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
1894*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
1895*e8380792SMatthias Ringwald    */
1896*e8380792SMatthias Ringwald   void arm_mult_q7(
1897*e8380792SMatthias Ringwald   q7_t * pSrcA,
1898*e8380792SMatthias Ringwald   q7_t * pSrcB,
1899*e8380792SMatthias Ringwald   q7_t * pDst,
1900*e8380792SMatthias Ringwald   uint32_t blockSize);
1901*e8380792SMatthias Ringwald 
1902*e8380792SMatthias Ringwald 
1903*e8380792SMatthias Ringwald   /**
1904*e8380792SMatthias Ringwald    * @brief Q15 vector multiplication.
1905*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
1906*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
1907*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
1908*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
1909*e8380792SMatthias Ringwald    */
1910*e8380792SMatthias Ringwald   void arm_mult_q15(
1911*e8380792SMatthias Ringwald   q15_t * pSrcA,
1912*e8380792SMatthias Ringwald   q15_t * pSrcB,
1913*e8380792SMatthias Ringwald   q15_t * pDst,
1914*e8380792SMatthias Ringwald   uint32_t blockSize);
1915*e8380792SMatthias Ringwald 
1916*e8380792SMatthias Ringwald 
1917*e8380792SMatthias Ringwald   /**
1918*e8380792SMatthias Ringwald    * @brief Q31 vector multiplication.
1919*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
1920*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
1921*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
1922*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
1923*e8380792SMatthias Ringwald    */
1924*e8380792SMatthias Ringwald   void arm_mult_q31(
1925*e8380792SMatthias Ringwald   q31_t * pSrcA,
1926*e8380792SMatthias Ringwald   q31_t * pSrcB,
1927*e8380792SMatthias Ringwald   q31_t * pDst,
1928*e8380792SMatthias Ringwald   uint32_t blockSize);
1929*e8380792SMatthias Ringwald 
1930*e8380792SMatthias Ringwald 
1931*e8380792SMatthias Ringwald   /**
1932*e8380792SMatthias Ringwald    * @brief Floating-point vector multiplication.
1933*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
1934*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
1935*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
1936*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
1937*e8380792SMatthias Ringwald    */
1938*e8380792SMatthias Ringwald   void arm_mult_f32(
1939*e8380792SMatthias Ringwald   float32_t * pSrcA,
1940*e8380792SMatthias Ringwald   float32_t * pSrcB,
1941*e8380792SMatthias Ringwald   float32_t * pDst,
1942*e8380792SMatthias Ringwald   uint32_t blockSize);
1943*e8380792SMatthias Ringwald 
1944*e8380792SMatthias Ringwald 
1945*e8380792SMatthias Ringwald   /**
1946*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 CFFT/CIFFT function.
1947*e8380792SMatthias Ringwald    */
1948*e8380792SMatthias Ringwald   typedef struct
1949*e8380792SMatthias Ringwald   {
1950*e8380792SMatthias Ringwald     uint16_t fftLen;                 /**< length of the FFT. */
1951*e8380792SMatthias Ringwald     uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
1952*e8380792SMatthias Ringwald     uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
1953*e8380792SMatthias Ringwald     q15_t *pTwiddle;                 /**< points to the Sin twiddle factor table. */
1954*e8380792SMatthias Ringwald     uint16_t *pBitRevTable;          /**< points to the bit reversal table. */
1955*e8380792SMatthias Ringwald     uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
1956*e8380792SMatthias Ringwald     uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
1957*e8380792SMatthias Ringwald   } arm_cfft_radix2_instance_q15;
1958*e8380792SMatthias Ringwald 
1959*e8380792SMatthias Ringwald /* Deprecated */
1960*e8380792SMatthias Ringwald   arm_status arm_cfft_radix2_init_q15(
1961*e8380792SMatthias Ringwald   arm_cfft_radix2_instance_q15 * S,
1962*e8380792SMatthias Ringwald   uint16_t fftLen,
1963*e8380792SMatthias Ringwald   uint8_t ifftFlag,
1964*e8380792SMatthias Ringwald   uint8_t bitReverseFlag);
1965*e8380792SMatthias Ringwald 
1966*e8380792SMatthias Ringwald /* Deprecated */
1967*e8380792SMatthias Ringwald   void arm_cfft_radix2_q15(
1968*e8380792SMatthias Ringwald   const arm_cfft_radix2_instance_q15 * S,
1969*e8380792SMatthias Ringwald   q15_t * pSrc);
1970*e8380792SMatthias Ringwald 
1971*e8380792SMatthias Ringwald 
1972*e8380792SMatthias Ringwald   /**
1973*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 CFFT/CIFFT function.
1974*e8380792SMatthias Ringwald    */
1975*e8380792SMatthias Ringwald   typedef struct
1976*e8380792SMatthias Ringwald   {
1977*e8380792SMatthias Ringwald     uint16_t fftLen;                 /**< length of the FFT. */
1978*e8380792SMatthias Ringwald     uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
1979*e8380792SMatthias Ringwald     uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
1980*e8380792SMatthias Ringwald     q15_t *pTwiddle;                 /**< points to the twiddle factor table. */
1981*e8380792SMatthias Ringwald     uint16_t *pBitRevTable;          /**< points to the bit reversal table. */
1982*e8380792SMatthias Ringwald     uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
1983*e8380792SMatthias Ringwald     uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
1984*e8380792SMatthias Ringwald   } arm_cfft_radix4_instance_q15;
1985*e8380792SMatthias Ringwald 
1986*e8380792SMatthias Ringwald /* Deprecated */
1987*e8380792SMatthias Ringwald   arm_status arm_cfft_radix4_init_q15(
1988*e8380792SMatthias Ringwald   arm_cfft_radix4_instance_q15 * S,
1989*e8380792SMatthias Ringwald   uint16_t fftLen,
1990*e8380792SMatthias Ringwald   uint8_t ifftFlag,
1991*e8380792SMatthias Ringwald   uint8_t bitReverseFlag);
1992*e8380792SMatthias Ringwald 
1993*e8380792SMatthias Ringwald /* Deprecated */
1994*e8380792SMatthias Ringwald   void arm_cfft_radix4_q15(
1995*e8380792SMatthias Ringwald   const arm_cfft_radix4_instance_q15 * S,
1996*e8380792SMatthias Ringwald   q15_t * pSrc);
1997*e8380792SMatthias Ringwald 
1998*e8380792SMatthias Ringwald   /**
1999*e8380792SMatthias Ringwald    * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function.
2000*e8380792SMatthias Ringwald    */
2001*e8380792SMatthias Ringwald   typedef struct
2002*e8380792SMatthias Ringwald   {
2003*e8380792SMatthias Ringwald     uint16_t fftLen;                 /**< length of the FFT. */
2004*e8380792SMatthias Ringwald     uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
2005*e8380792SMatthias Ringwald     uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
2006*e8380792SMatthias Ringwald     q31_t *pTwiddle;                 /**< points to the Twiddle factor table. */
2007*e8380792SMatthias Ringwald     uint16_t *pBitRevTable;          /**< points to the bit reversal table. */
2008*e8380792SMatthias Ringwald     uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
2009*e8380792SMatthias Ringwald     uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
2010*e8380792SMatthias Ringwald   } arm_cfft_radix2_instance_q31;
2011*e8380792SMatthias Ringwald 
2012*e8380792SMatthias Ringwald /* Deprecated */
2013*e8380792SMatthias Ringwald   arm_status arm_cfft_radix2_init_q31(
2014*e8380792SMatthias Ringwald   arm_cfft_radix2_instance_q31 * S,
2015*e8380792SMatthias Ringwald   uint16_t fftLen,
2016*e8380792SMatthias Ringwald   uint8_t ifftFlag,
2017*e8380792SMatthias Ringwald   uint8_t bitReverseFlag);
2018*e8380792SMatthias Ringwald 
2019*e8380792SMatthias Ringwald /* Deprecated */
2020*e8380792SMatthias Ringwald   void arm_cfft_radix2_q31(
2021*e8380792SMatthias Ringwald   const arm_cfft_radix2_instance_q31 * S,
2022*e8380792SMatthias Ringwald   q31_t * pSrc);
2023*e8380792SMatthias Ringwald 
2024*e8380792SMatthias Ringwald   /**
2025*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 CFFT/CIFFT function.
2026*e8380792SMatthias Ringwald    */
2027*e8380792SMatthias Ringwald   typedef struct
2028*e8380792SMatthias Ringwald   {
2029*e8380792SMatthias Ringwald     uint16_t fftLen;                 /**< length of the FFT. */
2030*e8380792SMatthias Ringwald     uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
2031*e8380792SMatthias Ringwald     uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
2032*e8380792SMatthias Ringwald     q31_t *pTwiddle;                 /**< points to the twiddle factor table. */
2033*e8380792SMatthias Ringwald     uint16_t *pBitRevTable;          /**< points to the bit reversal table. */
2034*e8380792SMatthias Ringwald     uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
2035*e8380792SMatthias Ringwald     uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
2036*e8380792SMatthias Ringwald   } arm_cfft_radix4_instance_q31;
2037*e8380792SMatthias Ringwald 
2038*e8380792SMatthias Ringwald /* Deprecated */
2039*e8380792SMatthias Ringwald   void arm_cfft_radix4_q31(
2040*e8380792SMatthias Ringwald   const arm_cfft_radix4_instance_q31 * S,
2041*e8380792SMatthias Ringwald   q31_t * pSrc);
2042*e8380792SMatthias Ringwald 
2043*e8380792SMatthias Ringwald /* Deprecated */
2044*e8380792SMatthias Ringwald   arm_status arm_cfft_radix4_init_q31(
2045*e8380792SMatthias Ringwald   arm_cfft_radix4_instance_q31 * S,
2046*e8380792SMatthias Ringwald   uint16_t fftLen,
2047*e8380792SMatthias Ringwald   uint8_t ifftFlag,
2048*e8380792SMatthias Ringwald   uint8_t bitReverseFlag);
2049*e8380792SMatthias Ringwald 
2050*e8380792SMatthias Ringwald   /**
2051*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point CFFT/CIFFT function.
2052*e8380792SMatthias Ringwald    */
2053*e8380792SMatthias Ringwald   typedef struct
2054*e8380792SMatthias Ringwald   {
2055*e8380792SMatthias Ringwald     uint16_t fftLen;                   /**< length of the FFT. */
2056*e8380792SMatthias Ringwald     uint8_t ifftFlag;                  /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
2057*e8380792SMatthias Ringwald     uint8_t bitReverseFlag;            /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
2058*e8380792SMatthias Ringwald     float32_t *pTwiddle;               /**< points to the Twiddle factor table. */
2059*e8380792SMatthias Ringwald     uint16_t *pBitRevTable;            /**< points to the bit reversal table. */
2060*e8380792SMatthias Ringwald     uint16_t twidCoefModifier;         /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
2061*e8380792SMatthias Ringwald     uint16_t bitRevFactor;             /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
2062*e8380792SMatthias Ringwald     float32_t onebyfftLen;             /**< value of 1/fftLen. */
2063*e8380792SMatthias Ringwald   } arm_cfft_radix2_instance_f32;
2064*e8380792SMatthias Ringwald 
2065*e8380792SMatthias Ringwald /* Deprecated */
2066*e8380792SMatthias Ringwald   arm_status arm_cfft_radix2_init_f32(
2067*e8380792SMatthias Ringwald   arm_cfft_radix2_instance_f32 * S,
2068*e8380792SMatthias Ringwald   uint16_t fftLen,
2069*e8380792SMatthias Ringwald   uint8_t ifftFlag,
2070*e8380792SMatthias Ringwald   uint8_t bitReverseFlag);
2071*e8380792SMatthias Ringwald 
2072*e8380792SMatthias Ringwald /* Deprecated */
2073*e8380792SMatthias Ringwald   void arm_cfft_radix2_f32(
2074*e8380792SMatthias Ringwald   const arm_cfft_radix2_instance_f32 * S,
2075*e8380792SMatthias Ringwald   float32_t * pSrc);
2076*e8380792SMatthias Ringwald 
2077*e8380792SMatthias Ringwald   /**
2078*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point CFFT/CIFFT function.
2079*e8380792SMatthias Ringwald    */
2080*e8380792SMatthias Ringwald   typedef struct
2081*e8380792SMatthias Ringwald   {
2082*e8380792SMatthias Ringwald     uint16_t fftLen;                   /**< length of the FFT. */
2083*e8380792SMatthias Ringwald     uint8_t ifftFlag;                  /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
2084*e8380792SMatthias Ringwald     uint8_t bitReverseFlag;            /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
2085*e8380792SMatthias Ringwald     float32_t *pTwiddle;               /**< points to the Twiddle factor table. */
2086*e8380792SMatthias Ringwald     uint16_t *pBitRevTable;            /**< points to the bit reversal table. */
2087*e8380792SMatthias Ringwald     uint16_t twidCoefModifier;         /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
2088*e8380792SMatthias Ringwald     uint16_t bitRevFactor;             /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
2089*e8380792SMatthias Ringwald     float32_t onebyfftLen;             /**< value of 1/fftLen. */
2090*e8380792SMatthias Ringwald   } arm_cfft_radix4_instance_f32;
2091*e8380792SMatthias Ringwald 
2092*e8380792SMatthias Ringwald /* Deprecated */
2093*e8380792SMatthias Ringwald   arm_status arm_cfft_radix4_init_f32(
2094*e8380792SMatthias Ringwald   arm_cfft_radix4_instance_f32 * S,
2095*e8380792SMatthias Ringwald   uint16_t fftLen,
2096*e8380792SMatthias Ringwald   uint8_t ifftFlag,
2097*e8380792SMatthias Ringwald   uint8_t bitReverseFlag);
2098*e8380792SMatthias Ringwald 
2099*e8380792SMatthias Ringwald /* Deprecated */
2100*e8380792SMatthias Ringwald   void arm_cfft_radix4_f32(
2101*e8380792SMatthias Ringwald   const arm_cfft_radix4_instance_f32 * S,
2102*e8380792SMatthias Ringwald   float32_t * pSrc);
2103*e8380792SMatthias Ringwald 
2104*e8380792SMatthias Ringwald   /**
2105*e8380792SMatthias Ringwald    * @brief Instance structure for the fixed-point CFFT/CIFFT function.
2106*e8380792SMatthias Ringwald    */
2107*e8380792SMatthias Ringwald   typedef struct
2108*e8380792SMatthias Ringwald   {
2109*e8380792SMatthias Ringwald     uint16_t fftLen;                   /**< length of the FFT. */
2110*e8380792SMatthias Ringwald     const q15_t *pTwiddle;             /**< points to the Twiddle factor table. */
2111*e8380792SMatthias Ringwald     const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */
2112*e8380792SMatthias Ringwald     uint16_t bitRevLength;             /**< bit reversal table length. */
2113*e8380792SMatthias Ringwald   } arm_cfft_instance_q15;
2114*e8380792SMatthias Ringwald 
2115*e8380792SMatthias Ringwald void arm_cfft_q15(
2116*e8380792SMatthias Ringwald     const arm_cfft_instance_q15 * S,
2117*e8380792SMatthias Ringwald     q15_t * p1,
2118*e8380792SMatthias Ringwald     uint8_t ifftFlag,
2119*e8380792SMatthias Ringwald     uint8_t bitReverseFlag);
2120*e8380792SMatthias Ringwald 
2121*e8380792SMatthias Ringwald   /**
2122*e8380792SMatthias Ringwald    * @brief Instance structure for the fixed-point CFFT/CIFFT function.
2123*e8380792SMatthias Ringwald    */
2124*e8380792SMatthias Ringwald   typedef struct
2125*e8380792SMatthias Ringwald   {
2126*e8380792SMatthias Ringwald     uint16_t fftLen;                   /**< length of the FFT. */
2127*e8380792SMatthias Ringwald     const q31_t *pTwiddle;             /**< points to the Twiddle factor table. */
2128*e8380792SMatthias Ringwald     const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */
2129*e8380792SMatthias Ringwald     uint16_t bitRevLength;             /**< bit reversal table length. */
2130*e8380792SMatthias Ringwald   } arm_cfft_instance_q31;
2131*e8380792SMatthias Ringwald 
2132*e8380792SMatthias Ringwald void arm_cfft_q31(
2133*e8380792SMatthias Ringwald     const arm_cfft_instance_q31 * S,
2134*e8380792SMatthias Ringwald     q31_t * p1,
2135*e8380792SMatthias Ringwald     uint8_t ifftFlag,
2136*e8380792SMatthias Ringwald     uint8_t bitReverseFlag);
2137*e8380792SMatthias Ringwald 
2138*e8380792SMatthias Ringwald   /**
2139*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point CFFT/CIFFT function.
2140*e8380792SMatthias Ringwald    */
2141*e8380792SMatthias Ringwald   typedef struct
2142*e8380792SMatthias Ringwald   {
2143*e8380792SMatthias Ringwald     uint16_t fftLen;                   /**< length of the FFT. */
2144*e8380792SMatthias Ringwald     const float32_t *pTwiddle;         /**< points to the Twiddle factor table. */
2145*e8380792SMatthias Ringwald     const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */
2146*e8380792SMatthias Ringwald     uint16_t bitRevLength;             /**< bit reversal table length. */
2147*e8380792SMatthias Ringwald   } arm_cfft_instance_f32;
2148*e8380792SMatthias Ringwald 
2149*e8380792SMatthias Ringwald   void arm_cfft_f32(
2150*e8380792SMatthias Ringwald   const arm_cfft_instance_f32 * S,
2151*e8380792SMatthias Ringwald   float32_t * p1,
2152*e8380792SMatthias Ringwald   uint8_t ifftFlag,
2153*e8380792SMatthias Ringwald   uint8_t bitReverseFlag);
2154*e8380792SMatthias Ringwald 
2155*e8380792SMatthias Ringwald   /**
2156*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 RFFT/RIFFT function.
2157*e8380792SMatthias Ringwald    */
2158*e8380792SMatthias Ringwald   typedef struct
2159*e8380792SMatthias Ringwald   {
2160*e8380792SMatthias Ringwald     uint32_t fftLenReal;                      /**< length of the real FFT. */
2161*e8380792SMatthias Ringwald     uint8_t ifftFlagR;                        /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
2162*e8380792SMatthias Ringwald     uint8_t bitReverseFlagR;                  /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
2163*e8380792SMatthias Ringwald     uint32_t twidCoefRModifier;               /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
2164*e8380792SMatthias Ringwald     q15_t *pTwiddleAReal;                     /**< points to the real twiddle factor table. */
2165*e8380792SMatthias Ringwald     q15_t *pTwiddleBReal;                     /**< points to the imag twiddle factor table. */
2166*e8380792SMatthias Ringwald     const arm_cfft_instance_q15 *pCfft;       /**< points to the complex FFT instance. */
2167*e8380792SMatthias Ringwald   } arm_rfft_instance_q15;
2168*e8380792SMatthias Ringwald 
2169*e8380792SMatthias Ringwald   arm_status arm_rfft_init_q15(
2170*e8380792SMatthias Ringwald   arm_rfft_instance_q15 * S,
2171*e8380792SMatthias Ringwald   uint32_t fftLenReal,
2172*e8380792SMatthias Ringwald   uint32_t ifftFlagR,
2173*e8380792SMatthias Ringwald   uint32_t bitReverseFlag);
2174*e8380792SMatthias Ringwald 
2175*e8380792SMatthias Ringwald   void arm_rfft_q15(
2176*e8380792SMatthias Ringwald   const arm_rfft_instance_q15 * S,
2177*e8380792SMatthias Ringwald   q15_t * pSrc,
2178*e8380792SMatthias Ringwald   q15_t * pDst);
2179*e8380792SMatthias Ringwald 
2180*e8380792SMatthias Ringwald   /**
2181*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 RFFT/RIFFT function.
2182*e8380792SMatthias Ringwald    */
2183*e8380792SMatthias Ringwald   typedef struct
2184*e8380792SMatthias Ringwald   {
2185*e8380792SMatthias Ringwald     uint32_t fftLenReal;                        /**< length of the real FFT. */
2186*e8380792SMatthias Ringwald     uint8_t ifftFlagR;                          /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
2187*e8380792SMatthias Ringwald     uint8_t bitReverseFlagR;                    /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
2188*e8380792SMatthias Ringwald     uint32_t twidCoefRModifier;                 /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
2189*e8380792SMatthias Ringwald     q31_t *pTwiddleAReal;                       /**< points to the real twiddle factor table. */
2190*e8380792SMatthias Ringwald     q31_t *pTwiddleBReal;                       /**< points to the imag twiddle factor table. */
2191*e8380792SMatthias Ringwald     const arm_cfft_instance_q31 *pCfft;         /**< points to the complex FFT instance. */
2192*e8380792SMatthias Ringwald   } arm_rfft_instance_q31;
2193*e8380792SMatthias Ringwald 
2194*e8380792SMatthias Ringwald   arm_status arm_rfft_init_q31(
2195*e8380792SMatthias Ringwald   arm_rfft_instance_q31 * S,
2196*e8380792SMatthias Ringwald   uint32_t fftLenReal,
2197*e8380792SMatthias Ringwald   uint32_t ifftFlagR,
2198*e8380792SMatthias Ringwald   uint32_t bitReverseFlag);
2199*e8380792SMatthias Ringwald 
2200*e8380792SMatthias Ringwald   void arm_rfft_q31(
2201*e8380792SMatthias Ringwald   const arm_rfft_instance_q31 * S,
2202*e8380792SMatthias Ringwald   q31_t * pSrc,
2203*e8380792SMatthias Ringwald   q31_t * pDst);
2204*e8380792SMatthias Ringwald 
2205*e8380792SMatthias Ringwald   /**
2206*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point RFFT/RIFFT function.
2207*e8380792SMatthias Ringwald    */
2208*e8380792SMatthias Ringwald   typedef struct
2209*e8380792SMatthias Ringwald   {
2210*e8380792SMatthias Ringwald     uint32_t fftLenReal;                        /**< length of the real FFT. */
2211*e8380792SMatthias Ringwald     uint16_t fftLenBy2;                         /**< length of the complex FFT. */
2212*e8380792SMatthias Ringwald     uint8_t ifftFlagR;                          /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
2213*e8380792SMatthias Ringwald     uint8_t bitReverseFlagR;                    /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
2214*e8380792SMatthias Ringwald     uint32_t twidCoefRModifier;                     /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
2215*e8380792SMatthias Ringwald     float32_t *pTwiddleAReal;                   /**< points to the real twiddle factor table. */
2216*e8380792SMatthias Ringwald     float32_t *pTwiddleBReal;                   /**< points to the imag twiddle factor table. */
2217*e8380792SMatthias Ringwald     arm_cfft_radix4_instance_f32 *pCfft;        /**< points to the complex FFT instance. */
2218*e8380792SMatthias Ringwald   } arm_rfft_instance_f32;
2219*e8380792SMatthias Ringwald 
2220*e8380792SMatthias Ringwald   arm_status arm_rfft_init_f32(
2221*e8380792SMatthias Ringwald   arm_rfft_instance_f32 * S,
2222*e8380792SMatthias Ringwald   arm_cfft_radix4_instance_f32 * S_CFFT,
2223*e8380792SMatthias Ringwald   uint32_t fftLenReal,
2224*e8380792SMatthias Ringwald   uint32_t ifftFlagR,
2225*e8380792SMatthias Ringwald   uint32_t bitReverseFlag);
2226*e8380792SMatthias Ringwald 
2227*e8380792SMatthias Ringwald   void arm_rfft_f32(
2228*e8380792SMatthias Ringwald   const arm_rfft_instance_f32 * S,
2229*e8380792SMatthias Ringwald   float32_t * pSrc,
2230*e8380792SMatthias Ringwald   float32_t * pDst);
2231*e8380792SMatthias Ringwald 
2232*e8380792SMatthias Ringwald   /**
2233*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point RFFT/RIFFT function.
2234*e8380792SMatthias Ringwald    */
2235*e8380792SMatthias Ringwald typedef struct
2236*e8380792SMatthias Ringwald   {
2237*e8380792SMatthias Ringwald     arm_cfft_instance_f32 Sint;      /**< Internal CFFT structure. */
2238*e8380792SMatthias Ringwald     uint16_t fftLenRFFT;             /**< length of the real sequence */
2239*e8380792SMatthias Ringwald     float32_t * pTwiddleRFFT;        /**< Twiddle factors real stage  */
2240*e8380792SMatthias Ringwald   } arm_rfft_fast_instance_f32 ;
2241*e8380792SMatthias Ringwald 
2242*e8380792SMatthias Ringwald arm_status arm_rfft_fast_init_f32 (
2243*e8380792SMatthias Ringwald    arm_rfft_fast_instance_f32 * S,
2244*e8380792SMatthias Ringwald    uint16_t fftLen);
2245*e8380792SMatthias Ringwald 
2246*e8380792SMatthias Ringwald void arm_rfft_fast_f32(
2247*e8380792SMatthias Ringwald   arm_rfft_fast_instance_f32 * S,
2248*e8380792SMatthias Ringwald   float32_t * p, float32_t * pOut,
2249*e8380792SMatthias Ringwald   uint8_t ifftFlag);
2250*e8380792SMatthias Ringwald 
2251*e8380792SMatthias Ringwald   /**
2252*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point DCT4/IDCT4 function.
2253*e8380792SMatthias Ringwald    */
2254*e8380792SMatthias Ringwald   typedef struct
2255*e8380792SMatthias Ringwald   {
2256*e8380792SMatthias Ringwald     uint16_t N;                          /**< length of the DCT4. */
2257*e8380792SMatthias Ringwald     uint16_t Nby2;                       /**< half of the length of the DCT4. */
2258*e8380792SMatthias Ringwald     float32_t normalize;                 /**< normalizing factor. */
2259*e8380792SMatthias Ringwald     float32_t *pTwiddle;                 /**< points to the twiddle factor table. */
2260*e8380792SMatthias Ringwald     float32_t *pCosFactor;               /**< points to the cosFactor table. */
2261*e8380792SMatthias Ringwald     arm_rfft_instance_f32 *pRfft;        /**< points to the real FFT instance. */
2262*e8380792SMatthias Ringwald     arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */
2263*e8380792SMatthias Ringwald   } arm_dct4_instance_f32;
2264*e8380792SMatthias Ringwald 
2265*e8380792SMatthias Ringwald 
2266*e8380792SMatthias Ringwald   /**
2267*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point DCT4/IDCT4.
2268*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of floating-point DCT4/IDCT4 structure.
2269*e8380792SMatthias Ringwald    * @param[in]     S_RFFT     points to an instance of floating-point RFFT/RIFFT structure.
2270*e8380792SMatthias Ringwald    * @param[in]     S_CFFT     points to an instance of floating-point CFFT/CIFFT structure.
2271*e8380792SMatthias Ringwald    * @param[in]     N          length of the DCT4.
2272*e8380792SMatthias Ringwald    * @param[in]     Nby2       half of the length of the DCT4.
2273*e8380792SMatthias Ringwald    * @param[in]     normalize  normalizing factor.
2274*e8380792SMatthias Ringwald    * @return      arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported transform length.
2275*e8380792SMatthias Ringwald    */
2276*e8380792SMatthias Ringwald   arm_status arm_dct4_init_f32(
2277*e8380792SMatthias Ringwald   arm_dct4_instance_f32 * S,
2278*e8380792SMatthias Ringwald   arm_rfft_instance_f32 * S_RFFT,
2279*e8380792SMatthias Ringwald   arm_cfft_radix4_instance_f32 * S_CFFT,
2280*e8380792SMatthias Ringwald   uint16_t N,
2281*e8380792SMatthias Ringwald   uint16_t Nby2,
2282*e8380792SMatthias Ringwald   float32_t normalize);
2283*e8380792SMatthias Ringwald 
2284*e8380792SMatthias Ringwald 
2285*e8380792SMatthias Ringwald   /**
2286*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point DCT4/IDCT4.
2287*e8380792SMatthias Ringwald    * @param[in]     S              points to an instance of the floating-point DCT4/IDCT4 structure.
2288*e8380792SMatthias Ringwald    * @param[in]     pState         points to state buffer.
2289*e8380792SMatthias Ringwald    * @param[in,out] pInlineBuffer  points to the in-place input and output buffer.
2290*e8380792SMatthias Ringwald    */
2291*e8380792SMatthias Ringwald   void arm_dct4_f32(
2292*e8380792SMatthias Ringwald   const arm_dct4_instance_f32 * S,
2293*e8380792SMatthias Ringwald   float32_t * pState,
2294*e8380792SMatthias Ringwald   float32_t * pInlineBuffer);
2295*e8380792SMatthias Ringwald 
2296*e8380792SMatthias Ringwald 
2297*e8380792SMatthias Ringwald   /**
2298*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 DCT4/IDCT4 function.
2299*e8380792SMatthias Ringwald    */
2300*e8380792SMatthias Ringwald   typedef struct
2301*e8380792SMatthias Ringwald   {
2302*e8380792SMatthias Ringwald     uint16_t N;                          /**< length of the DCT4. */
2303*e8380792SMatthias Ringwald     uint16_t Nby2;                       /**< half of the length of the DCT4. */
2304*e8380792SMatthias Ringwald     q31_t normalize;                     /**< normalizing factor. */
2305*e8380792SMatthias Ringwald     q31_t *pTwiddle;                     /**< points to the twiddle factor table. */
2306*e8380792SMatthias Ringwald     q31_t *pCosFactor;                   /**< points to the cosFactor table. */
2307*e8380792SMatthias Ringwald     arm_rfft_instance_q31 *pRfft;        /**< points to the real FFT instance. */
2308*e8380792SMatthias Ringwald     arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */
2309*e8380792SMatthias Ringwald   } arm_dct4_instance_q31;
2310*e8380792SMatthias Ringwald 
2311*e8380792SMatthias Ringwald 
2312*e8380792SMatthias Ringwald   /**
2313*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q31 DCT4/IDCT4.
2314*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of Q31 DCT4/IDCT4 structure.
2315*e8380792SMatthias Ringwald    * @param[in]     S_RFFT     points to an instance of Q31 RFFT/RIFFT structure
2316*e8380792SMatthias Ringwald    * @param[in]     S_CFFT     points to an instance of Q31 CFFT/CIFFT structure
2317*e8380792SMatthias Ringwald    * @param[in]     N          length of the DCT4.
2318*e8380792SMatthias Ringwald    * @param[in]     Nby2       half of the length of the DCT4.
2319*e8380792SMatthias Ringwald    * @param[in]     normalize  normalizing factor.
2320*e8380792SMatthias Ringwald    * @return      arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.
2321*e8380792SMatthias Ringwald    */
2322*e8380792SMatthias Ringwald   arm_status arm_dct4_init_q31(
2323*e8380792SMatthias Ringwald   arm_dct4_instance_q31 * S,
2324*e8380792SMatthias Ringwald   arm_rfft_instance_q31 * S_RFFT,
2325*e8380792SMatthias Ringwald   arm_cfft_radix4_instance_q31 * S_CFFT,
2326*e8380792SMatthias Ringwald   uint16_t N,
2327*e8380792SMatthias Ringwald   uint16_t Nby2,
2328*e8380792SMatthias Ringwald   q31_t normalize);
2329*e8380792SMatthias Ringwald 
2330*e8380792SMatthias Ringwald 
2331*e8380792SMatthias Ringwald   /**
2332*e8380792SMatthias Ringwald    * @brief Processing function for the Q31 DCT4/IDCT4.
2333*e8380792SMatthias Ringwald    * @param[in]     S              points to an instance of the Q31 DCT4 structure.
2334*e8380792SMatthias Ringwald    * @param[in]     pState         points to state buffer.
2335*e8380792SMatthias Ringwald    * @param[in,out] pInlineBuffer  points to the in-place input and output buffer.
2336*e8380792SMatthias Ringwald    */
2337*e8380792SMatthias Ringwald   void arm_dct4_q31(
2338*e8380792SMatthias Ringwald   const arm_dct4_instance_q31 * S,
2339*e8380792SMatthias Ringwald   q31_t * pState,
2340*e8380792SMatthias Ringwald   q31_t * pInlineBuffer);
2341*e8380792SMatthias Ringwald 
2342*e8380792SMatthias Ringwald 
2343*e8380792SMatthias Ringwald   /**
2344*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 DCT4/IDCT4 function.
2345*e8380792SMatthias Ringwald    */
2346*e8380792SMatthias Ringwald   typedef struct
2347*e8380792SMatthias Ringwald   {
2348*e8380792SMatthias Ringwald     uint16_t N;                          /**< length of the DCT4. */
2349*e8380792SMatthias Ringwald     uint16_t Nby2;                       /**< half of the length of the DCT4. */
2350*e8380792SMatthias Ringwald     q15_t normalize;                     /**< normalizing factor. */
2351*e8380792SMatthias Ringwald     q15_t *pTwiddle;                     /**< points to the twiddle factor table. */
2352*e8380792SMatthias Ringwald     q15_t *pCosFactor;                   /**< points to the cosFactor table. */
2353*e8380792SMatthias Ringwald     arm_rfft_instance_q15 *pRfft;        /**< points to the real FFT instance. */
2354*e8380792SMatthias Ringwald     arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */
2355*e8380792SMatthias Ringwald   } arm_dct4_instance_q15;
2356*e8380792SMatthias Ringwald 
2357*e8380792SMatthias Ringwald 
2358*e8380792SMatthias Ringwald   /**
2359*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q15 DCT4/IDCT4.
2360*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of Q15 DCT4/IDCT4 structure.
2361*e8380792SMatthias Ringwald    * @param[in]     S_RFFT     points to an instance of Q15 RFFT/RIFFT structure.
2362*e8380792SMatthias Ringwald    * @param[in]     S_CFFT     points to an instance of Q15 CFFT/CIFFT structure.
2363*e8380792SMatthias Ringwald    * @param[in]     N          length of the DCT4.
2364*e8380792SMatthias Ringwald    * @param[in]     Nby2       half of the length of the DCT4.
2365*e8380792SMatthias Ringwald    * @param[in]     normalize  normalizing factor.
2366*e8380792SMatthias Ringwald    * @return      arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.
2367*e8380792SMatthias Ringwald    */
2368*e8380792SMatthias Ringwald   arm_status arm_dct4_init_q15(
2369*e8380792SMatthias Ringwald   arm_dct4_instance_q15 * S,
2370*e8380792SMatthias Ringwald   arm_rfft_instance_q15 * S_RFFT,
2371*e8380792SMatthias Ringwald   arm_cfft_radix4_instance_q15 * S_CFFT,
2372*e8380792SMatthias Ringwald   uint16_t N,
2373*e8380792SMatthias Ringwald   uint16_t Nby2,
2374*e8380792SMatthias Ringwald   q15_t normalize);
2375*e8380792SMatthias Ringwald 
2376*e8380792SMatthias Ringwald 
2377*e8380792SMatthias Ringwald   /**
2378*e8380792SMatthias Ringwald    * @brief Processing function for the Q15 DCT4/IDCT4.
2379*e8380792SMatthias Ringwald    * @param[in]     S              points to an instance of the Q15 DCT4 structure.
2380*e8380792SMatthias Ringwald    * @param[in]     pState         points to state buffer.
2381*e8380792SMatthias Ringwald    * @param[in,out] pInlineBuffer  points to the in-place input and output buffer.
2382*e8380792SMatthias Ringwald    */
2383*e8380792SMatthias Ringwald   void arm_dct4_q15(
2384*e8380792SMatthias Ringwald   const arm_dct4_instance_q15 * S,
2385*e8380792SMatthias Ringwald   q15_t * pState,
2386*e8380792SMatthias Ringwald   q15_t * pInlineBuffer);
2387*e8380792SMatthias Ringwald 
2388*e8380792SMatthias Ringwald 
2389*e8380792SMatthias Ringwald   /**
2390*e8380792SMatthias Ringwald    * @brief Floating-point vector addition.
2391*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2392*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2393*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2394*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2395*e8380792SMatthias Ringwald    */
2396*e8380792SMatthias Ringwald   void arm_add_f32(
2397*e8380792SMatthias Ringwald   float32_t * pSrcA,
2398*e8380792SMatthias Ringwald   float32_t * pSrcB,
2399*e8380792SMatthias Ringwald   float32_t * pDst,
2400*e8380792SMatthias Ringwald   uint32_t blockSize);
2401*e8380792SMatthias Ringwald 
2402*e8380792SMatthias Ringwald 
2403*e8380792SMatthias Ringwald   /**
2404*e8380792SMatthias Ringwald    * @brief Q7 vector addition.
2405*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2406*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2407*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2408*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2409*e8380792SMatthias Ringwald    */
2410*e8380792SMatthias Ringwald   void arm_add_q7(
2411*e8380792SMatthias Ringwald   q7_t * pSrcA,
2412*e8380792SMatthias Ringwald   q7_t * pSrcB,
2413*e8380792SMatthias Ringwald   q7_t * pDst,
2414*e8380792SMatthias Ringwald   uint32_t blockSize);
2415*e8380792SMatthias Ringwald 
2416*e8380792SMatthias Ringwald 
2417*e8380792SMatthias Ringwald   /**
2418*e8380792SMatthias Ringwald    * @brief Q15 vector addition.
2419*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2420*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2421*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2422*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2423*e8380792SMatthias Ringwald    */
2424*e8380792SMatthias Ringwald   void arm_add_q15(
2425*e8380792SMatthias Ringwald   q15_t * pSrcA,
2426*e8380792SMatthias Ringwald   q15_t * pSrcB,
2427*e8380792SMatthias Ringwald   q15_t * pDst,
2428*e8380792SMatthias Ringwald   uint32_t blockSize);
2429*e8380792SMatthias Ringwald 
2430*e8380792SMatthias Ringwald 
2431*e8380792SMatthias Ringwald   /**
2432*e8380792SMatthias Ringwald    * @brief Q31 vector addition.
2433*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2434*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2435*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2436*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2437*e8380792SMatthias Ringwald    */
2438*e8380792SMatthias Ringwald   void arm_add_q31(
2439*e8380792SMatthias Ringwald   q31_t * pSrcA,
2440*e8380792SMatthias Ringwald   q31_t * pSrcB,
2441*e8380792SMatthias Ringwald   q31_t * pDst,
2442*e8380792SMatthias Ringwald   uint32_t blockSize);
2443*e8380792SMatthias Ringwald 
2444*e8380792SMatthias Ringwald 
2445*e8380792SMatthias Ringwald   /**
2446*e8380792SMatthias Ringwald    * @brief Floating-point vector subtraction.
2447*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2448*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2449*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2450*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2451*e8380792SMatthias Ringwald    */
2452*e8380792SMatthias Ringwald   void arm_sub_f32(
2453*e8380792SMatthias Ringwald   float32_t * pSrcA,
2454*e8380792SMatthias Ringwald   float32_t * pSrcB,
2455*e8380792SMatthias Ringwald   float32_t * pDst,
2456*e8380792SMatthias Ringwald   uint32_t blockSize);
2457*e8380792SMatthias Ringwald 
2458*e8380792SMatthias Ringwald 
2459*e8380792SMatthias Ringwald   /**
2460*e8380792SMatthias Ringwald    * @brief Q7 vector subtraction.
2461*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2462*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2463*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2464*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2465*e8380792SMatthias Ringwald    */
2466*e8380792SMatthias Ringwald   void arm_sub_q7(
2467*e8380792SMatthias Ringwald   q7_t * pSrcA,
2468*e8380792SMatthias Ringwald   q7_t * pSrcB,
2469*e8380792SMatthias Ringwald   q7_t * pDst,
2470*e8380792SMatthias Ringwald   uint32_t blockSize);
2471*e8380792SMatthias Ringwald 
2472*e8380792SMatthias Ringwald 
2473*e8380792SMatthias Ringwald   /**
2474*e8380792SMatthias Ringwald    * @brief Q15 vector subtraction.
2475*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2476*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2477*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2478*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2479*e8380792SMatthias Ringwald    */
2480*e8380792SMatthias Ringwald   void arm_sub_q15(
2481*e8380792SMatthias Ringwald   q15_t * pSrcA,
2482*e8380792SMatthias Ringwald   q15_t * pSrcB,
2483*e8380792SMatthias Ringwald   q15_t * pDst,
2484*e8380792SMatthias Ringwald   uint32_t blockSize);
2485*e8380792SMatthias Ringwald 
2486*e8380792SMatthias Ringwald 
2487*e8380792SMatthias Ringwald   /**
2488*e8380792SMatthias Ringwald    * @brief Q31 vector subtraction.
2489*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2490*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2491*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2492*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2493*e8380792SMatthias Ringwald    */
2494*e8380792SMatthias Ringwald   void arm_sub_q31(
2495*e8380792SMatthias Ringwald   q31_t * pSrcA,
2496*e8380792SMatthias Ringwald   q31_t * pSrcB,
2497*e8380792SMatthias Ringwald   q31_t * pDst,
2498*e8380792SMatthias Ringwald   uint32_t blockSize);
2499*e8380792SMatthias Ringwald 
2500*e8380792SMatthias Ringwald 
2501*e8380792SMatthias Ringwald   /**
2502*e8380792SMatthias Ringwald    * @brief Multiplies a floating-point vector by a scalar.
2503*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2504*e8380792SMatthias Ringwald    * @param[in]  scale      scale factor to be applied
2505*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2506*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2507*e8380792SMatthias Ringwald    */
2508*e8380792SMatthias Ringwald   void arm_scale_f32(
2509*e8380792SMatthias Ringwald   float32_t * pSrc,
2510*e8380792SMatthias Ringwald   float32_t scale,
2511*e8380792SMatthias Ringwald   float32_t * pDst,
2512*e8380792SMatthias Ringwald   uint32_t blockSize);
2513*e8380792SMatthias Ringwald 
2514*e8380792SMatthias Ringwald 
2515*e8380792SMatthias Ringwald   /**
2516*e8380792SMatthias Ringwald    * @brief Multiplies a Q7 vector by a scalar.
2517*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the input vector
2518*e8380792SMatthias Ringwald    * @param[in]  scaleFract  fractional portion of the scale value
2519*e8380792SMatthias Ringwald    * @param[in]  shift       number of bits to shift the result by
2520*e8380792SMatthias Ringwald    * @param[out] pDst        points to the output vector
2521*e8380792SMatthias Ringwald    * @param[in]  blockSize   number of samples in the vector
2522*e8380792SMatthias Ringwald    */
2523*e8380792SMatthias Ringwald   void arm_scale_q7(
2524*e8380792SMatthias Ringwald   q7_t * pSrc,
2525*e8380792SMatthias Ringwald   q7_t scaleFract,
2526*e8380792SMatthias Ringwald   int8_t shift,
2527*e8380792SMatthias Ringwald   q7_t * pDst,
2528*e8380792SMatthias Ringwald   uint32_t blockSize);
2529*e8380792SMatthias Ringwald 
2530*e8380792SMatthias Ringwald 
2531*e8380792SMatthias Ringwald   /**
2532*e8380792SMatthias Ringwald    * @brief Multiplies a Q15 vector by a scalar.
2533*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the input vector
2534*e8380792SMatthias Ringwald    * @param[in]  scaleFract  fractional portion of the scale value
2535*e8380792SMatthias Ringwald    * @param[in]  shift       number of bits to shift the result by
2536*e8380792SMatthias Ringwald    * @param[out] pDst        points to the output vector
2537*e8380792SMatthias Ringwald    * @param[in]  blockSize   number of samples in the vector
2538*e8380792SMatthias Ringwald    */
2539*e8380792SMatthias Ringwald   void arm_scale_q15(
2540*e8380792SMatthias Ringwald   q15_t * pSrc,
2541*e8380792SMatthias Ringwald   q15_t scaleFract,
2542*e8380792SMatthias Ringwald   int8_t shift,
2543*e8380792SMatthias Ringwald   q15_t * pDst,
2544*e8380792SMatthias Ringwald   uint32_t blockSize);
2545*e8380792SMatthias Ringwald 
2546*e8380792SMatthias Ringwald 
2547*e8380792SMatthias Ringwald   /**
2548*e8380792SMatthias Ringwald    * @brief Multiplies a Q31 vector by a scalar.
2549*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the input vector
2550*e8380792SMatthias Ringwald    * @param[in]  scaleFract  fractional portion of the scale value
2551*e8380792SMatthias Ringwald    * @param[in]  shift       number of bits to shift the result by
2552*e8380792SMatthias Ringwald    * @param[out] pDst        points to the output vector
2553*e8380792SMatthias Ringwald    * @param[in]  blockSize   number of samples in the vector
2554*e8380792SMatthias Ringwald    */
2555*e8380792SMatthias Ringwald   void arm_scale_q31(
2556*e8380792SMatthias Ringwald   q31_t * pSrc,
2557*e8380792SMatthias Ringwald   q31_t scaleFract,
2558*e8380792SMatthias Ringwald   int8_t shift,
2559*e8380792SMatthias Ringwald   q31_t * pDst,
2560*e8380792SMatthias Ringwald   uint32_t blockSize);
2561*e8380792SMatthias Ringwald 
2562*e8380792SMatthias Ringwald 
2563*e8380792SMatthias Ringwald   /**
2564*e8380792SMatthias Ringwald    * @brief Q7 vector absolute value.
2565*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input buffer
2566*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output buffer
2567*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2568*e8380792SMatthias Ringwald    */
2569*e8380792SMatthias Ringwald   void arm_abs_q7(
2570*e8380792SMatthias Ringwald   q7_t * pSrc,
2571*e8380792SMatthias Ringwald   q7_t * pDst,
2572*e8380792SMatthias Ringwald   uint32_t blockSize);
2573*e8380792SMatthias Ringwald 
2574*e8380792SMatthias Ringwald 
2575*e8380792SMatthias Ringwald   /**
2576*e8380792SMatthias Ringwald    * @brief Floating-point vector absolute value.
2577*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input buffer
2578*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output buffer
2579*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2580*e8380792SMatthias Ringwald    */
2581*e8380792SMatthias Ringwald   void arm_abs_f32(
2582*e8380792SMatthias Ringwald   float32_t * pSrc,
2583*e8380792SMatthias Ringwald   float32_t * pDst,
2584*e8380792SMatthias Ringwald   uint32_t blockSize);
2585*e8380792SMatthias Ringwald 
2586*e8380792SMatthias Ringwald 
2587*e8380792SMatthias Ringwald   /**
2588*e8380792SMatthias Ringwald    * @brief Q15 vector absolute value.
2589*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input buffer
2590*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output buffer
2591*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2592*e8380792SMatthias Ringwald    */
2593*e8380792SMatthias Ringwald   void arm_abs_q15(
2594*e8380792SMatthias Ringwald   q15_t * pSrc,
2595*e8380792SMatthias Ringwald   q15_t * pDst,
2596*e8380792SMatthias Ringwald   uint32_t blockSize);
2597*e8380792SMatthias Ringwald 
2598*e8380792SMatthias Ringwald 
2599*e8380792SMatthias Ringwald   /**
2600*e8380792SMatthias Ringwald    * @brief Q31 vector absolute value.
2601*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input buffer
2602*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output buffer
2603*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2604*e8380792SMatthias Ringwald    */
2605*e8380792SMatthias Ringwald   void arm_abs_q31(
2606*e8380792SMatthias Ringwald   q31_t * pSrc,
2607*e8380792SMatthias Ringwald   q31_t * pDst,
2608*e8380792SMatthias Ringwald   uint32_t blockSize);
2609*e8380792SMatthias Ringwald 
2610*e8380792SMatthias Ringwald 
2611*e8380792SMatthias Ringwald   /**
2612*e8380792SMatthias Ringwald    * @brief Dot product of floating-point vectors.
2613*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2614*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2615*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2616*e8380792SMatthias Ringwald    * @param[out] result     output result returned here
2617*e8380792SMatthias Ringwald    */
2618*e8380792SMatthias Ringwald   void arm_dot_prod_f32(
2619*e8380792SMatthias Ringwald   float32_t * pSrcA,
2620*e8380792SMatthias Ringwald   float32_t * pSrcB,
2621*e8380792SMatthias Ringwald   uint32_t blockSize,
2622*e8380792SMatthias Ringwald   float32_t * result);
2623*e8380792SMatthias Ringwald 
2624*e8380792SMatthias Ringwald 
2625*e8380792SMatthias Ringwald   /**
2626*e8380792SMatthias Ringwald    * @brief Dot product of Q7 vectors.
2627*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2628*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2629*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2630*e8380792SMatthias Ringwald    * @param[out] result     output result returned here
2631*e8380792SMatthias Ringwald    */
2632*e8380792SMatthias Ringwald   void arm_dot_prod_q7(
2633*e8380792SMatthias Ringwald   q7_t * pSrcA,
2634*e8380792SMatthias Ringwald   q7_t * pSrcB,
2635*e8380792SMatthias Ringwald   uint32_t blockSize,
2636*e8380792SMatthias Ringwald   q31_t * result);
2637*e8380792SMatthias Ringwald 
2638*e8380792SMatthias Ringwald 
2639*e8380792SMatthias Ringwald   /**
2640*e8380792SMatthias Ringwald    * @brief Dot product of Q15 vectors.
2641*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2642*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2643*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2644*e8380792SMatthias Ringwald    * @param[out] result     output result returned here
2645*e8380792SMatthias Ringwald    */
2646*e8380792SMatthias Ringwald   void arm_dot_prod_q15(
2647*e8380792SMatthias Ringwald   q15_t * pSrcA,
2648*e8380792SMatthias Ringwald   q15_t * pSrcB,
2649*e8380792SMatthias Ringwald   uint32_t blockSize,
2650*e8380792SMatthias Ringwald   q63_t * result);
2651*e8380792SMatthias Ringwald 
2652*e8380792SMatthias Ringwald 
2653*e8380792SMatthias Ringwald   /**
2654*e8380792SMatthias Ringwald    * @brief Dot product of Q31 vectors.
2655*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input vector
2656*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input vector
2657*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in each vector
2658*e8380792SMatthias Ringwald    * @param[out] result     output result returned here
2659*e8380792SMatthias Ringwald    */
2660*e8380792SMatthias Ringwald   void arm_dot_prod_q31(
2661*e8380792SMatthias Ringwald   q31_t * pSrcA,
2662*e8380792SMatthias Ringwald   q31_t * pSrcB,
2663*e8380792SMatthias Ringwald   uint32_t blockSize,
2664*e8380792SMatthias Ringwald   q63_t * result);
2665*e8380792SMatthias Ringwald 
2666*e8380792SMatthias Ringwald 
2667*e8380792SMatthias Ringwald   /**
2668*e8380792SMatthias Ringwald    * @brief  Shifts the elements of a Q7 vector a specified number of bits.
2669*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2670*e8380792SMatthias Ringwald    * @param[in]  shiftBits  number of bits to shift.  A positive value shifts left; a negative value shifts right.
2671*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2672*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2673*e8380792SMatthias Ringwald    */
2674*e8380792SMatthias Ringwald   void arm_shift_q7(
2675*e8380792SMatthias Ringwald   q7_t * pSrc,
2676*e8380792SMatthias Ringwald   int8_t shiftBits,
2677*e8380792SMatthias Ringwald   q7_t * pDst,
2678*e8380792SMatthias Ringwald   uint32_t blockSize);
2679*e8380792SMatthias Ringwald 
2680*e8380792SMatthias Ringwald 
2681*e8380792SMatthias Ringwald   /**
2682*e8380792SMatthias Ringwald    * @brief  Shifts the elements of a Q15 vector a specified number of bits.
2683*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2684*e8380792SMatthias Ringwald    * @param[in]  shiftBits  number of bits to shift.  A positive value shifts left; a negative value shifts right.
2685*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2686*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2687*e8380792SMatthias Ringwald    */
2688*e8380792SMatthias Ringwald   void arm_shift_q15(
2689*e8380792SMatthias Ringwald   q15_t * pSrc,
2690*e8380792SMatthias Ringwald   int8_t shiftBits,
2691*e8380792SMatthias Ringwald   q15_t * pDst,
2692*e8380792SMatthias Ringwald   uint32_t blockSize);
2693*e8380792SMatthias Ringwald 
2694*e8380792SMatthias Ringwald 
2695*e8380792SMatthias Ringwald   /**
2696*e8380792SMatthias Ringwald    * @brief  Shifts the elements of a Q31 vector a specified number of bits.
2697*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2698*e8380792SMatthias Ringwald    * @param[in]  shiftBits  number of bits to shift.  A positive value shifts left; a negative value shifts right.
2699*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2700*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2701*e8380792SMatthias Ringwald    */
2702*e8380792SMatthias Ringwald   void arm_shift_q31(
2703*e8380792SMatthias Ringwald   q31_t * pSrc,
2704*e8380792SMatthias Ringwald   int8_t shiftBits,
2705*e8380792SMatthias Ringwald   q31_t * pDst,
2706*e8380792SMatthias Ringwald   uint32_t blockSize);
2707*e8380792SMatthias Ringwald 
2708*e8380792SMatthias Ringwald 
2709*e8380792SMatthias Ringwald   /**
2710*e8380792SMatthias Ringwald    * @brief  Adds a constant offset to a floating-point vector.
2711*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2712*e8380792SMatthias Ringwald    * @param[in]  offset     is the offset to be added
2713*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2714*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2715*e8380792SMatthias Ringwald    */
2716*e8380792SMatthias Ringwald   void arm_offset_f32(
2717*e8380792SMatthias Ringwald   float32_t * pSrc,
2718*e8380792SMatthias Ringwald   float32_t offset,
2719*e8380792SMatthias Ringwald   float32_t * pDst,
2720*e8380792SMatthias Ringwald   uint32_t blockSize);
2721*e8380792SMatthias Ringwald 
2722*e8380792SMatthias Ringwald 
2723*e8380792SMatthias Ringwald   /**
2724*e8380792SMatthias Ringwald    * @brief  Adds a constant offset to a Q7 vector.
2725*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2726*e8380792SMatthias Ringwald    * @param[in]  offset     is the offset to be added
2727*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2728*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2729*e8380792SMatthias Ringwald    */
2730*e8380792SMatthias Ringwald   void arm_offset_q7(
2731*e8380792SMatthias Ringwald   q7_t * pSrc,
2732*e8380792SMatthias Ringwald   q7_t offset,
2733*e8380792SMatthias Ringwald   q7_t * pDst,
2734*e8380792SMatthias Ringwald   uint32_t blockSize);
2735*e8380792SMatthias Ringwald 
2736*e8380792SMatthias Ringwald 
2737*e8380792SMatthias Ringwald   /**
2738*e8380792SMatthias Ringwald    * @brief  Adds a constant offset to a Q15 vector.
2739*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2740*e8380792SMatthias Ringwald    * @param[in]  offset     is the offset to be added
2741*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2742*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2743*e8380792SMatthias Ringwald    */
2744*e8380792SMatthias Ringwald   void arm_offset_q15(
2745*e8380792SMatthias Ringwald   q15_t * pSrc,
2746*e8380792SMatthias Ringwald   q15_t offset,
2747*e8380792SMatthias Ringwald   q15_t * pDst,
2748*e8380792SMatthias Ringwald   uint32_t blockSize);
2749*e8380792SMatthias Ringwald 
2750*e8380792SMatthias Ringwald 
2751*e8380792SMatthias Ringwald   /**
2752*e8380792SMatthias Ringwald    * @brief  Adds a constant offset to a Q31 vector.
2753*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2754*e8380792SMatthias Ringwald    * @param[in]  offset     is the offset to be added
2755*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2756*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2757*e8380792SMatthias Ringwald    */
2758*e8380792SMatthias Ringwald   void arm_offset_q31(
2759*e8380792SMatthias Ringwald   q31_t * pSrc,
2760*e8380792SMatthias Ringwald   q31_t offset,
2761*e8380792SMatthias Ringwald   q31_t * pDst,
2762*e8380792SMatthias Ringwald   uint32_t blockSize);
2763*e8380792SMatthias Ringwald 
2764*e8380792SMatthias Ringwald 
2765*e8380792SMatthias Ringwald   /**
2766*e8380792SMatthias Ringwald    * @brief  Negates the elements of a floating-point vector.
2767*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2768*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2769*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2770*e8380792SMatthias Ringwald    */
2771*e8380792SMatthias Ringwald   void arm_negate_f32(
2772*e8380792SMatthias Ringwald   float32_t * pSrc,
2773*e8380792SMatthias Ringwald   float32_t * pDst,
2774*e8380792SMatthias Ringwald   uint32_t blockSize);
2775*e8380792SMatthias Ringwald 
2776*e8380792SMatthias Ringwald 
2777*e8380792SMatthias Ringwald   /**
2778*e8380792SMatthias Ringwald    * @brief  Negates the elements of a Q7 vector.
2779*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2780*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2781*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2782*e8380792SMatthias Ringwald    */
2783*e8380792SMatthias Ringwald   void arm_negate_q7(
2784*e8380792SMatthias Ringwald   q7_t * pSrc,
2785*e8380792SMatthias Ringwald   q7_t * pDst,
2786*e8380792SMatthias Ringwald   uint32_t blockSize);
2787*e8380792SMatthias Ringwald 
2788*e8380792SMatthias Ringwald 
2789*e8380792SMatthias Ringwald   /**
2790*e8380792SMatthias Ringwald    * @brief  Negates the elements of a Q15 vector.
2791*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2792*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2793*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2794*e8380792SMatthias Ringwald    */
2795*e8380792SMatthias Ringwald   void arm_negate_q15(
2796*e8380792SMatthias Ringwald   q15_t * pSrc,
2797*e8380792SMatthias Ringwald   q15_t * pDst,
2798*e8380792SMatthias Ringwald   uint32_t blockSize);
2799*e8380792SMatthias Ringwald 
2800*e8380792SMatthias Ringwald 
2801*e8380792SMatthias Ringwald   /**
2802*e8380792SMatthias Ringwald    * @brief  Negates the elements of a Q31 vector.
2803*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the input vector
2804*e8380792SMatthias Ringwald    * @param[out] pDst       points to the output vector
2805*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples in the vector
2806*e8380792SMatthias Ringwald    */
2807*e8380792SMatthias Ringwald   void arm_negate_q31(
2808*e8380792SMatthias Ringwald   q31_t * pSrc,
2809*e8380792SMatthias Ringwald   q31_t * pDst,
2810*e8380792SMatthias Ringwald   uint32_t blockSize);
2811*e8380792SMatthias Ringwald 
2812*e8380792SMatthias Ringwald 
2813*e8380792SMatthias Ringwald   /**
2814*e8380792SMatthias Ringwald    * @brief  Copies the elements of a floating-point vector.
2815*e8380792SMatthias Ringwald    * @param[in]  pSrc       input pointer
2816*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
2817*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
2818*e8380792SMatthias Ringwald    */
2819*e8380792SMatthias Ringwald   void arm_copy_f32(
2820*e8380792SMatthias Ringwald   float32_t * pSrc,
2821*e8380792SMatthias Ringwald   float32_t * pDst,
2822*e8380792SMatthias Ringwald   uint32_t blockSize);
2823*e8380792SMatthias Ringwald 
2824*e8380792SMatthias Ringwald 
2825*e8380792SMatthias Ringwald   /**
2826*e8380792SMatthias Ringwald    * @brief  Copies the elements of a Q7 vector.
2827*e8380792SMatthias Ringwald    * @param[in]  pSrc       input pointer
2828*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
2829*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
2830*e8380792SMatthias Ringwald    */
2831*e8380792SMatthias Ringwald   void arm_copy_q7(
2832*e8380792SMatthias Ringwald   q7_t * pSrc,
2833*e8380792SMatthias Ringwald   q7_t * pDst,
2834*e8380792SMatthias Ringwald   uint32_t blockSize);
2835*e8380792SMatthias Ringwald 
2836*e8380792SMatthias Ringwald 
2837*e8380792SMatthias Ringwald   /**
2838*e8380792SMatthias Ringwald    * @brief  Copies the elements of a Q15 vector.
2839*e8380792SMatthias Ringwald    * @param[in]  pSrc       input pointer
2840*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
2841*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
2842*e8380792SMatthias Ringwald    */
2843*e8380792SMatthias Ringwald   void arm_copy_q15(
2844*e8380792SMatthias Ringwald   q15_t * pSrc,
2845*e8380792SMatthias Ringwald   q15_t * pDst,
2846*e8380792SMatthias Ringwald   uint32_t blockSize);
2847*e8380792SMatthias Ringwald 
2848*e8380792SMatthias Ringwald 
2849*e8380792SMatthias Ringwald   /**
2850*e8380792SMatthias Ringwald    * @brief  Copies the elements of a Q31 vector.
2851*e8380792SMatthias Ringwald    * @param[in]  pSrc       input pointer
2852*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
2853*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
2854*e8380792SMatthias Ringwald    */
2855*e8380792SMatthias Ringwald   void arm_copy_q31(
2856*e8380792SMatthias Ringwald   q31_t * pSrc,
2857*e8380792SMatthias Ringwald   q31_t * pDst,
2858*e8380792SMatthias Ringwald   uint32_t blockSize);
2859*e8380792SMatthias Ringwald 
2860*e8380792SMatthias Ringwald 
2861*e8380792SMatthias Ringwald   /**
2862*e8380792SMatthias Ringwald    * @brief  Fills a constant value into a floating-point vector.
2863*e8380792SMatthias Ringwald    * @param[in]  value      input value to be filled
2864*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
2865*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
2866*e8380792SMatthias Ringwald    */
2867*e8380792SMatthias Ringwald   void arm_fill_f32(
2868*e8380792SMatthias Ringwald   float32_t value,
2869*e8380792SMatthias Ringwald   float32_t * pDst,
2870*e8380792SMatthias Ringwald   uint32_t blockSize);
2871*e8380792SMatthias Ringwald 
2872*e8380792SMatthias Ringwald 
2873*e8380792SMatthias Ringwald   /**
2874*e8380792SMatthias Ringwald    * @brief  Fills a constant value into a Q7 vector.
2875*e8380792SMatthias Ringwald    * @param[in]  value      input value to be filled
2876*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
2877*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
2878*e8380792SMatthias Ringwald    */
2879*e8380792SMatthias Ringwald   void arm_fill_q7(
2880*e8380792SMatthias Ringwald   q7_t value,
2881*e8380792SMatthias Ringwald   q7_t * pDst,
2882*e8380792SMatthias Ringwald   uint32_t blockSize);
2883*e8380792SMatthias Ringwald 
2884*e8380792SMatthias Ringwald 
2885*e8380792SMatthias Ringwald   /**
2886*e8380792SMatthias Ringwald    * @brief  Fills a constant value into a Q15 vector.
2887*e8380792SMatthias Ringwald    * @param[in]  value      input value to be filled
2888*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
2889*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
2890*e8380792SMatthias Ringwald    */
2891*e8380792SMatthias Ringwald   void arm_fill_q15(
2892*e8380792SMatthias Ringwald   q15_t value,
2893*e8380792SMatthias Ringwald   q15_t * pDst,
2894*e8380792SMatthias Ringwald   uint32_t blockSize);
2895*e8380792SMatthias Ringwald 
2896*e8380792SMatthias Ringwald 
2897*e8380792SMatthias Ringwald   /**
2898*e8380792SMatthias Ringwald    * @brief  Fills a constant value into a Q31 vector.
2899*e8380792SMatthias Ringwald    * @param[in]  value      input value to be filled
2900*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
2901*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
2902*e8380792SMatthias Ringwald    */
2903*e8380792SMatthias Ringwald   void arm_fill_q31(
2904*e8380792SMatthias Ringwald   q31_t value,
2905*e8380792SMatthias Ringwald   q31_t * pDst,
2906*e8380792SMatthias Ringwald   uint32_t blockSize);
2907*e8380792SMatthias Ringwald 
2908*e8380792SMatthias Ringwald 
2909*e8380792SMatthias Ringwald /**
2910*e8380792SMatthias Ringwald  * @brief Convolution of floating-point sequences.
2911*e8380792SMatthias Ringwald  * @param[in]  pSrcA    points to the first input sequence.
2912*e8380792SMatthias Ringwald  * @param[in]  srcALen  length of the first input sequence.
2913*e8380792SMatthias Ringwald  * @param[in]  pSrcB    points to the second input sequence.
2914*e8380792SMatthias Ringwald  * @param[in]  srcBLen  length of the second input sequence.
2915*e8380792SMatthias Ringwald  * @param[out] pDst     points to the location where the output result is written.  Length srcALen+srcBLen-1.
2916*e8380792SMatthias Ringwald  */
2917*e8380792SMatthias Ringwald   void arm_conv_f32(
2918*e8380792SMatthias Ringwald   float32_t * pSrcA,
2919*e8380792SMatthias Ringwald   uint32_t srcALen,
2920*e8380792SMatthias Ringwald   float32_t * pSrcB,
2921*e8380792SMatthias Ringwald   uint32_t srcBLen,
2922*e8380792SMatthias Ringwald   float32_t * pDst);
2923*e8380792SMatthias Ringwald 
2924*e8380792SMatthias Ringwald 
2925*e8380792SMatthias Ringwald   /**
2926*e8380792SMatthias Ringwald    * @brief Convolution of Q15 sequences.
2927*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input sequence.
2928*e8380792SMatthias Ringwald    * @param[in]  srcALen    length of the first input sequence.
2929*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input sequence.
2930*e8380792SMatthias Ringwald    * @param[in]  srcBLen    length of the second input sequence.
2931*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data  Length srcALen+srcBLen-1.
2932*e8380792SMatthias Ringwald    * @param[in]  pScratch1  points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
2933*e8380792SMatthias Ringwald    * @param[in]  pScratch2  points to scratch buffer of size min(srcALen, srcBLen).
2934*e8380792SMatthias Ringwald    */
2935*e8380792SMatthias Ringwald   void arm_conv_opt_q15(
2936*e8380792SMatthias Ringwald   q15_t * pSrcA,
2937*e8380792SMatthias Ringwald   uint32_t srcALen,
2938*e8380792SMatthias Ringwald   q15_t * pSrcB,
2939*e8380792SMatthias Ringwald   uint32_t srcBLen,
2940*e8380792SMatthias Ringwald   q15_t * pDst,
2941*e8380792SMatthias Ringwald   q15_t * pScratch1,
2942*e8380792SMatthias Ringwald   q15_t * pScratch2);
2943*e8380792SMatthias Ringwald 
2944*e8380792SMatthias Ringwald 
2945*e8380792SMatthias Ringwald /**
2946*e8380792SMatthias Ringwald  * @brief Convolution of Q15 sequences.
2947*e8380792SMatthias Ringwald  * @param[in]  pSrcA    points to the first input sequence.
2948*e8380792SMatthias Ringwald  * @param[in]  srcALen  length of the first input sequence.
2949*e8380792SMatthias Ringwald  * @param[in]  pSrcB    points to the second input sequence.
2950*e8380792SMatthias Ringwald  * @param[in]  srcBLen  length of the second input sequence.
2951*e8380792SMatthias Ringwald  * @param[out] pDst     points to the location where the output result is written.  Length srcALen+srcBLen-1.
2952*e8380792SMatthias Ringwald  */
2953*e8380792SMatthias Ringwald   void arm_conv_q15(
2954*e8380792SMatthias Ringwald   q15_t * pSrcA,
2955*e8380792SMatthias Ringwald   uint32_t srcALen,
2956*e8380792SMatthias Ringwald   q15_t * pSrcB,
2957*e8380792SMatthias Ringwald   uint32_t srcBLen,
2958*e8380792SMatthias Ringwald   q15_t * pDst);
2959*e8380792SMatthias Ringwald 
2960*e8380792SMatthias Ringwald 
2961*e8380792SMatthias Ringwald   /**
2962*e8380792SMatthias Ringwald    * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
2963*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
2964*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
2965*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
2966*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
2967*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length srcALen+srcBLen-1.
2968*e8380792SMatthias Ringwald    */
2969*e8380792SMatthias Ringwald   void arm_conv_fast_q15(
2970*e8380792SMatthias Ringwald           q15_t * pSrcA,
2971*e8380792SMatthias Ringwald           uint32_t srcALen,
2972*e8380792SMatthias Ringwald           q15_t * pSrcB,
2973*e8380792SMatthias Ringwald           uint32_t srcBLen,
2974*e8380792SMatthias Ringwald           q15_t * pDst);
2975*e8380792SMatthias Ringwald 
2976*e8380792SMatthias Ringwald 
2977*e8380792SMatthias Ringwald   /**
2978*e8380792SMatthias Ringwald    * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
2979*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input sequence.
2980*e8380792SMatthias Ringwald    * @param[in]  srcALen    length of the first input sequence.
2981*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input sequence.
2982*e8380792SMatthias Ringwald    * @param[in]  srcBLen    length of the second input sequence.
2983*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data  Length srcALen+srcBLen-1.
2984*e8380792SMatthias Ringwald    * @param[in]  pScratch1  points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
2985*e8380792SMatthias Ringwald    * @param[in]  pScratch2  points to scratch buffer of size min(srcALen, srcBLen).
2986*e8380792SMatthias Ringwald    */
2987*e8380792SMatthias Ringwald   void arm_conv_fast_opt_q15(
2988*e8380792SMatthias Ringwald   q15_t * pSrcA,
2989*e8380792SMatthias Ringwald   uint32_t srcALen,
2990*e8380792SMatthias Ringwald   q15_t * pSrcB,
2991*e8380792SMatthias Ringwald   uint32_t srcBLen,
2992*e8380792SMatthias Ringwald   q15_t * pDst,
2993*e8380792SMatthias Ringwald   q15_t * pScratch1,
2994*e8380792SMatthias Ringwald   q15_t * pScratch2);
2995*e8380792SMatthias Ringwald 
2996*e8380792SMatthias Ringwald 
2997*e8380792SMatthias Ringwald   /**
2998*e8380792SMatthias Ringwald    * @brief Convolution of Q31 sequences.
2999*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
3000*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
3001*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
3002*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
3003*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length srcALen+srcBLen-1.
3004*e8380792SMatthias Ringwald    */
3005*e8380792SMatthias Ringwald   void arm_conv_q31(
3006*e8380792SMatthias Ringwald   q31_t * pSrcA,
3007*e8380792SMatthias Ringwald   uint32_t srcALen,
3008*e8380792SMatthias Ringwald   q31_t * pSrcB,
3009*e8380792SMatthias Ringwald   uint32_t srcBLen,
3010*e8380792SMatthias Ringwald   q31_t * pDst);
3011*e8380792SMatthias Ringwald 
3012*e8380792SMatthias Ringwald 
3013*e8380792SMatthias Ringwald   /**
3014*e8380792SMatthias Ringwald    * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4
3015*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
3016*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
3017*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
3018*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
3019*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length srcALen+srcBLen-1.
3020*e8380792SMatthias Ringwald    */
3021*e8380792SMatthias Ringwald   void arm_conv_fast_q31(
3022*e8380792SMatthias Ringwald   q31_t * pSrcA,
3023*e8380792SMatthias Ringwald   uint32_t srcALen,
3024*e8380792SMatthias Ringwald   q31_t * pSrcB,
3025*e8380792SMatthias Ringwald   uint32_t srcBLen,
3026*e8380792SMatthias Ringwald   q31_t * pDst);
3027*e8380792SMatthias Ringwald 
3028*e8380792SMatthias Ringwald 
3029*e8380792SMatthias Ringwald     /**
3030*e8380792SMatthias Ringwald    * @brief Convolution of Q7 sequences.
3031*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input sequence.
3032*e8380792SMatthias Ringwald    * @param[in]  srcALen    length of the first input sequence.
3033*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input sequence.
3034*e8380792SMatthias Ringwald    * @param[in]  srcBLen    length of the second input sequence.
3035*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data  Length srcALen+srcBLen-1.
3036*e8380792SMatthias Ringwald    * @param[in]  pScratch1  points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
3037*e8380792SMatthias Ringwald    * @param[in]  pScratch2  points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
3038*e8380792SMatthias Ringwald    */
3039*e8380792SMatthias Ringwald   void arm_conv_opt_q7(
3040*e8380792SMatthias Ringwald   q7_t * pSrcA,
3041*e8380792SMatthias Ringwald   uint32_t srcALen,
3042*e8380792SMatthias Ringwald   q7_t * pSrcB,
3043*e8380792SMatthias Ringwald   uint32_t srcBLen,
3044*e8380792SMatthias Ringwald   q7_t * pDst,
3045*e8380792SMatthias Ringwald   q15_t * pScratch1,
3046*e8380792SMatthias Ringwald   q15_t * pScratch2);
3047*e8380792SMatthias Ringwald 
3048*e8380792SMatthias Ringwald 
3049*e8380792SMatthias Ringwald   /**
3050*e8380792SMatthias Ringwald    * @brief Convolution of Q7 sequences.
3051*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
3052*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
3053*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
3054*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
3055*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length srcALen+srcBLen-1.
3056*e8380792SMatthias Ringwald    */
3057*e8380792SMatthias Ringwald   void arm_conv_q7(
3058*e8380792SMatthias Ringwald   q7_t * pSrcA,
3059*e8380792SMatthias Ringwald   uint32_t srcALen,
3060*e8380792SMatthias Ringwald   q7_t * pSrcB,
3061*e8380792SMatthias Ringwald   uint32_t srcBLen,
3062*e8380792SMatthias Ringwald   q7_t * pDst);
3063*e8380792SMatthias Ringwald 
3064*e8380792SMatthias Ringwald 
3065*e8380792SMatthias Ringwald   /**
3066*e8380792SMatthias Ringwald    * @brief Partial convolution of floating-point sequences.
3067*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input sequence.
3068*e8380792SMatthias Ringwald    * @param[in]  srcALen     length of the first input sequence.
3069*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input sequence.
3070*e8380792SMatthias Ringwald    * @param[in]  srcBLen     length of the second input sequence.
3071*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
3072*e8380792SMatthias Ringwald    * @param[in]  firstIndex  is the first output sample to start with.
3073*e8380792SMatthias Ringwald    * @param[in]  numPoints   is the number of output points to be computed.
3074*e8380792SMatthias Ringwald    * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
3075*e8380792SMatthias Ringwald    */
3076*e8380792SMatthias Ringwald   arm_status arm_conv_partial_f32(
3077*e8380792SMatthias Ringwald   float32_t * pSrcA,
3078*e8380792SMatthias Ringwald   uint32_t srcALen,
3079*e8380792SMatthias Ringwald   float32_t * pSrcB,
3080*e8380792SMatthias Ringwald   uint32_t srcBLen,
3081*e8380792SMatthias Ringwald   float32_t * pDst,
3082*e8380792SMatthias Ringwald   uint32_t firstIndex,
3083*e8380792SMatthias Ringwald   uint32_t numPoints);
3084*e8380792SMatthias Ringwald 
3085*e8380792SMatthias Ringwald 
3086*e8380792SMatthias Ringwald   /**
3087*e8380792SMatthias Ringwald    * @brief Partial convolution of Q15 sequences.
3088*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input sequence.
3089*e8380792SMatthias Ringwald    * @param[in]  srcALen     length of the first input sequence.
3090*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input sequence.
3091*e8380792SMatthias Ringwald    * @param[in]  srcBLen     length of the second input sequence.
3092*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
3093*e8380792SMatthias Ringwald    * @param[in]  firstIndex  is the first output sample to start with.
3094*e8380792SMatthias Ringwald    * @param[in]  numPoints   is the number of output points to be computed.
3095*e8380792SMatthias Ringwald    * @param[in]  pScratch1   points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
3096*e8380792SMatthias Ringwald    * @param[in]  pScratch2   points to scratch buffer of size min(srcALen, srcBLen).
3097*e8380792SMatthias Ringwald    * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
3098*e8380792SMatthias Ringwald    */
3099*e8380792SMatthias Ringwald   arm_status arm_conv_partial_opt_q15(
3100*e8380792SMatthias Ringwald   q15_t * pSrcA,
3101*e8380792SMatthias Ringwald   uint32_t srcALen,
3102*e8380792SMatthias Ringwald   q15_t * pSrcB,
3103*e8380792SMatthias Ringwald   uint32_t srcBLen,
3104*e8380792SMatthias Ringwald   q15_t * pDst,
3105*e8380792SMatthias Ringwald   uint32_t firstIndex,
3106*e8380792SMatthias Ringwald   uint32_t numPoints,
3107*e8380792SMatthias Ringwald   q15_t * pScratch1,
3108*e8380792SMatthias Ringwald   q15_t * pScratch2);
3109*e8380792SMatthias Ringwald 
3110*e8380792SMatthias Ringwald 
3111*e8380792SMatthias Ringwald   /**
3112*e8380792SMatthias Ringwald    * @brief Partial convolution of Q15 sequences.
3113*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input sequence.
3114*e8380792SMatthias Ringwald    * @param[in]  srcALen     length of the first input sequence.
3115*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input sequence.
3116*e8380792SMatthias Ringwald    * @param[in]  srcBLen     length of the second input sequence.
3117*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
3118*e8380792SMatthias Ringwald    * @param[in]  firstIndex  is the first output sample to start with.
3119*e8380792SMatthias Ringwald    * @param[in]  numPoints   is the number of output points to be computed.
3120*e8380792SMatthias Ringwald    * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
3121*e8380792SMatthias Ringwald    */
3122*e8380792SMatthias Ringwald   arm_status arm_conv_partial_q15(
3123*e8380792SMatthias Ringwald   q15_t * pSrcA,
3124*e8380792SMatthias Ringwald   uint32_t srcALen,
3125*e8380792SMatthias Ringwald   q15_t * pSrcB,
3126*e8380792SMatthias Ringwald   uint32_t srcBLen,
3127*e8380792SMatthias Ringwald   q15_t * pDst,
3128*e8380792SMatthias Ringwald   uint32_t firstIndex,
3129*e8380792SMatthias Ringwald   uint32_t numPoints);
3130*e8380792SMatthias Ringwald 
3131*e8380792SMatthias Ringwald 
3132*e8380792SMatthias Ringwald   /**
3133*e8380792SMatthias Ringwald    * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
3134*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input sequence.
3135*e8380792SMatthias Ringwald    * @param[in]  srcALen     length of the first input sequence.
3136*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input sequence.
3137*e8380792SMatthias Ringwald    * @param[in]  srcBLen     length of the second input sequence.
3138*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
3139*e8380792SMatthias Ringwald    * @param[in]  firstIndex  is the first output sample to start with.
3140*e8380792SMatthias Ringwald    * @param[in]  numPoints   is the number of output points to be computed.
3141*e8380792SMatthias Ringwald    * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
3142*e8380792SMatthias Ringwald    */
3143*e8380792SMatthias Ringwald   arm_status arm_conv_partial_fast_q15(
3144*e8380792SMatthias Ringwald   q15_t * pSrcA,
3145*e8380792SMatthias Ringwald   uint32_t srcALen,
3146*e8380792SMatthias Ringwald   q15_t * pSrcB,
3147*e8380792SMatthias Ringwald   uint32_t srcBLen,
3148*e8380792SMatthias Ringwald   q15_t * pDst,
3149*e8380792SMatthias Ringwald   uint32_t firstIndex,
3150*e8380792SMatthias Ringwald   uint32_t numPoints);
3151*e8380792SMatthias Ringwald 
3152*e8380792SMatthias Ringwald 
3153*e8380792SMatthias Ringwald   /**
3154*e8380792SMatthias Ringwald    * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
3155*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input sequence.
3156*e8380792SMatthias Ringwald    * @param[in]  srcALen     length of the first input sequence.
3157*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input sequence.
3158*e8380792SMatthias Ringwald    * @param[in]  srcBLen     length of the second input sequence.
3159*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
3160*e8380792SMatthias Ringwald    * @param[in]  firstIndex  is the first output sample to start with.
3161*e8380792SMatthias Ringwald    * @param[in]  numPoints   is the number of output points to be computed.
3162*e8380792SMatthias Ringwald    * @param[in]  pScratch1   points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
3163*e8380792SMatthias Ringwald    * @param[in]  pScratch2   points to scratch buffer of size min(srcALen, srcBLen).
3164*e8380792SMatthias Ringwald    * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
3165*e8380792SMatthias Ringwald    */
3166*e8380792SMatthias Ringwald   arm_status arm_conv_partial_fast_opt_q15(
3167*e8380792SMatthias Ringwald   q15_t * pSrcA,
3168*e8380792SMatthias Ringwald   uint32_t srcALen,
3169*e8380792SMatthias Ringwald   q15_t * pSrcB,
3170*e8380792SMatthias Ringwald   uint32_t srcBLen,
3171*e8380792SMatthias Ringwald   q15_t * pDst,
3172*e8380792SMatthias Ringwald   uint32_t firstIndex,
3173*e8380792SMatthias Ringwald   uint32_t numPoints,
3174*e8380792SMatthias Ringwald   q15_t * pScratch1,
3175*e8380792SMatthias Ringwald   q15_t * pScratch2);
3176*e8380792SMatthias Ringwald 
3177*e8380792SMatthias Ringwald 
3178*e8380792SMatthias Ringwald   /**
3179*e8380792SMatthias Ringwald    * @brief Partial convolution of Q31 sequences.
3180*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input sequence.
3181*e8380792SMatthias Ringwald    * @param[in]  srcALen     length of the first input sequence.
3182*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input sequence.
3183*e8380792SMatthias Ringwald    * @param[in]  srcBLen     length of the second input sequence.
3184*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
3185*e8380792SMatthias Ringwald    * @param[in]  firstIndex  is the first output sample to start with.
3186*e8380792SMatthias Ringwald    * @param[in]  numPoints   is the number of output points to be computed.
3187*e8380792SMatthias Ringwald    * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
3188*e8380792SMatthias Ringwald    */
3189*e8380792SMatthias Ringwald   arm_status arm_conv_partial_q31(
3190*e8380792SMatthias Ringwald   q31_t * pSrcA,
3191*e8380792SMatthias Ringwald   uint32_t srcALen,
3192*e8380792SMatthias Ringwald   q31_t * pSrcB,
3193*e8380792SMatthias Ringwald   uint32_t srcBLen,
3194*e8380792SMatthias Ringwald   q31_t * pDst,
3195*e8380792SMatthias Ringwald   uint32_t firstIndex,
3196*e8380792SMatthias Ringwald   uint32_t numPoints);
3197*e8380792SMatthias Ringwald 
3198*e8380792SMatthias Ringwald 
3199*e8380792SMatthias Ringwald   /**
3200*e8380792SMatthias Ringwald    * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4
3201*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input sequence.
3202*e8380792SMatthias Ringwald    * @param[in]  srcALen     length of the first input sequence.
3203*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input sequence.
3204*e8380792SMatthias Ringwald    * @param[in]  srcBLen     length of the second input sequence.
3205*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
3206*e8380792SMatthias Ringwald    * @param[in]  firstIndex  is the first output sample to start with.
3207*e8380792SMatthias Ringwald    * @param[in]  numPoints   is the number of output points to be computed.
3208*e8380792SMatthias Ringwald    * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
3209*e8380792SMatthias Ringwald    */
3210*e8380792SMatthias Ringwald   arm_status arm_conv_partial_fast_q31(
3211*e8380792SMatthias Ringwald   q31_t * pSrcA,
3212*e8380792SMatthias Ringwald   uint32_t srcALen,
3213*e8380792SMatthias Ringwald   q31_t * pSrcB,
3214*e8380792SMatthias Ringwald   uint32_t srcBLen,
3215*e8380792SMatthias Ringwald   q31_t * pDst,
3216*e8380792SMatthias Ringwald   uint32_t firstIndex,
3217*e8380792SMatthias Ringwald   uint32_t numPoints);
3218*e8380792SMatthias Ringwald 
3219*e8380792SMatthias Ringwald 
3220*e8380792SMatthias Ringwald   /**
3221*e8380792SMatthias Ringwald    * @brief Partial convolution of Q7 sequences
3222*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input sequence.
3223*e8380792SMatthias Ringwald    * @param[in]  srcALen     length of the first input sequence.
3224*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input sequence.
3225*e8380792SMatthias Ringwald    * @param[in]  srcBLen     length of the second input sequence.
3226*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
3227*e8380792SMatthias Ringwald    * @param[in]  firstIndex  is the first output sample to start with.
3228*e8380792SMatthias Ringwald    * @param[in]  numPoints   is the number of output points to be computed.
3229*e8380792SMatthias Ringwald    * @param[in]  pScratch1   points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
3230*e8380792SMatthias Ringwald    * @param[in]  pScratch2   points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
3231*e8380792SMatthias Ringwald    * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
3232*e8380792SMatthias Ringwald    */
3233*e8380792SMatthias Ringwald   arm_status arm_conv_partial_opt_q7(
3234*e8380792SMatthias Ringwald   q7_t * pSrcA,
3235*e8380792SMatthias Ringwald   uint32_t srcALen,
3236*e8380792SMatthias Ringwald   q7_t * pSrcB,
3237*e8380792SMatthias Ringwald   uint32_t srcBLen,
3238*e8380792SMatthias Ringwald   q7_t * pDst,
3239*e8380792SMatthias Ringwald   uint32_t firstIndex,
3240*e8380792SMatthias Ringwald   uint32_t numPoints,
3241*e8380792SMatthias Ringwald   q15_t * pScratch1,
3242*e8380792SMatthias Ringwald   q15_t * pScratch2);
3243*e8380792SMatthias Ringwald 
3244*e8380792SMatthias Ringwald 
3245*e8380792SMatthias Ringwald /**
3246*e8380792SMatthias Ringwald    * @brief Partial convolution of Q7 sequences.
3247*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input sequence.
3248*e8380792SMatthias Ringwald    * @param[in]  srcALen     length of the first input sequence.
3249*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input sequence.
3250*e8380792SMatthias Ringwald    * @param[in]  srcBLen     length of the second input sequence.
3251*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
3252*e8380792SMatthias Ringwald    * @param[in]  firstIndex  is the first output sample to start with.
3253*e8380792SMatthias Ringwald    * @param[in]  numPoints   is the number of output points to be computed.
3254*e8380792SMatthias Ringwald    * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].
3255*e8380792SMatthias Ringwald    */
3256*e8380792SMatthias Ringwald   arm_status arm_conv_partial_q7(
3257*e8380792SMatthias Ringwald   q7_t * pSrcA,
3258*e8380792SMatthias Ringwald   uint32_t srcALen,
3259*e8380792SMatthias Ringwald   q7_t * pSrcB,
3260*e8380792SMatthias Ringwald   uint32_t srcBLen,
3261*e8380792SMatthias Ringwald   q7_t * pDst,
3262*e8380792SMatthias Ringwald   uint32_t firstIndex,
3263*e8380792SMatthias Ringwald   uint32_t numPoints);
3264*e8380792SMatthias Ringwald 
3265*e8380792SMatthias Ringwald 
3266*e8380792SMatthias Ringwald   /**
3267*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 FIR decimator.
3268*e8380792SMatthias Ringwald    */
3269*e8380792SMatthias Ringwald   typedef struct
3270*e8380792SMatthias Ringwald   {
3271*e8380792SMatthias Ringwald     uint8_t M;                  /**< decimation factor. */
3272*e8380792SMatthias Ringwald     uint16_t numTaps;           /**< number of coefficients in the filter. */
3273*e8380792SMatthias Ringwald     q15_t *pCoeffs;             /**< points to the coefficient array. The array is of length numTaps.*/
3274*e8380792SMatthias Ringwald     q15_t *pState;              /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
3275*e8380792SMatthias Ringwald   } arm_fir_decimate_instance_q15;
3276*e8380792SMatthias Ringwald 
3277*e8380792SMatthias Ringwald   /**
3278*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 FIR decimator.
3279*e8380792SMatthias Ringwald    */
3280*e8380792SMatthias Ringwald   typedef struct
3281*e8380792SMatthias Ringwald   {
3282*e8380792SMatthias Ringwald     uint8_t M;                  /**< decimation factor. */
3283*e8380792SMatthias Ringwald     uint16_t numTaps;           /**< number of coefficients in the filter. */
3284*e8380792SMatthias Ringwald     q31_t *pCoeffs;             /**< points to the coefficient array. The array is of length numTaps.*/
3285*e8380792SMatthias Ringwald     q31_t *pState;              /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
3286*e8380792SMatthias Ringwald   } arm_fir_decimate_instance_q31;
3287*e8380792SMatthias Ringwald 
3288*e8380792SMatthias Ringwald   /**
3289*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point FIR decimator.
3290*e8380792SMatthias Ringwald    */
3291*e8380792SMatthias Ringwald   typedef struct
3292*e8380792SMatthias Ringwald   {
3293*e8380792SMatthias Ringwald     uint8_t M;                  /**< decimation factor. */
3294*e8380792SMatthias Ringwald     uint16_t numTaps;           /**< number of coefficients in the filter. */
3295*e8380792SMatthias Ringwald     float32_t *pCoeffs;         /**< points to the coefficient array. The array is of length numTaps.*/
3296*e8380792SMatthias Ringwald     float32_t *pState;          /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
3297*e8380792SMatthias Ringwald   } arm_fir_decimate_instance_f32;
3298*e8380792SMatthias Ringwald 
3299*e8380792SMatthias Ringwald 
3300*e8380792SMatthias Ringwald   /**
3301*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point FIR decimator.
3302*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the floating-point FIR decimator structure.
3303*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3304*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3305*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of input samples to process per call.
3306*e8380792SMatthias Ringwald    */
3307*e8380792SMatthias Ringwald   void arm_fir_decimate_f32(
3308*e8380792SMatthias Ringwald   const arm_fir_decimate_instance_f32 * S,
3309*e8380792SMatthias Ringwald   float32_t * pSrc,
3310*e8380792SMatthias Ringwald   float32_t * pDst,
3311*e8380792SMatthias Ringwald   uint32_t blockSize);
3312*e8380792SMatthias Ringwald 
3313*e8380792SMatthias Ringwald 
3314*e8380792SMatthias Ringwald   /**
3315*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point FIR decimator.
3316*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the floating-point FIR decimator structure.
3317*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of coefficients in the filter.
3318*e8380792SMatthias Ringwald    * @param[in]     M          decimation factor.
3319*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
3320*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3321*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of input samples to process per call.
3322*e8380792SMatthias Ringwald    * @return    The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
3323*e8380792SMatthias Ringwald    * <code>blockSize</code> is not a multiple of <code>M</code>.
3324*e8380792SMatthias Ringwald    */
3325*e8380792SMatthias Ringwald   arm_status arm_fir_decimate_init_f32(
3326*e8380792SMatthias Ringwald   arm_fir_decimate_instance_f32 * S,
3327*e8380792SMatthias Ringwald   uint16_t numTaps,
3328*e8380792SMatthias Ringwald   uint8_t M,
3329*e8380792SMatthias Ringwald   float32_t * pCoeffs,
3330*e8380792SMatthias Ringwald   float32_t * pState,
3331*e8380792SMatthias Ringwald   uint32_t blockSize);
3332*e8380792SMatthias Ringwald 
3333*e8380792SMatthias Ringwald 
3334*e8380792SMatthias Ringwald   /**
3335*e8380792SMatthias Ringwald    * @brief Processing function for the Q15 FIR decimator.
3336*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 FIR decimator structure.
3337*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3338*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3339*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of input samples to process per call.
3340*e8380792SMatthias Ringwald    */
3341*e8380792SMatthias Ringwald   void arm_fir_decimate_q15(
3342*e8380792SMatthias Ringwald   const arm_fir_decimate_instance_q15 * S,
3343*e8380792SMatthias Ringwald   q15_t * pSrc,
3344*e8380792SMatthias Ringwald   q15_t * pDst,
3345*e8380792SMatthias Ringwald   uint32_t blockSize);
3346*e8380792SMatthias Ringwald 
3347*e8380792SMatthias Ringwald 
3348*e8380792SMatthias Ringwald   /**
3349*e8380792SMatthias Ringwald    * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4.
3350*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 FIR decimator structure.
3351*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3352*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3353*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of input samples to process per call.
3354*e8380792SMatthias Ringwald    */
3355*e8380792SMatthias Ringwald   void arm_fir_decimate_fast_q15(
3356*e8380792SMatthias Ringwald   const arm_fir_decimate_instance_q15 * S,
3357*e8380792SMatthias Ringwald   q15_t * pSrc,
3358*e8380792SMatthias Ringwald   q15_t * pDst,
3359*e8380792SMatthias Ringwald   uint32_t blockSize);
3360*e8380792SMatthias Ringwald 
3361*e8380792SMatthias Ringwald 
3362*e8380792SMatthias Ringwald   /**
3363*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q15 FIR decimator.
3364*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q15 FIR decimator structure.
3365*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of coefficients in the filter.
3366*e8380792SMatthias Ringwald    * @param[in]     M          decimation factor.
3367*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
3368*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3369*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of input samples to process per call.
3370*e8380792SMatthias Ringwald    * @return    The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
3371*e8380792SMatthias Ringwald    * <code>blockSize</code> is not a multiple of <code>M</code>.
3372*e8380792SMatthias Ringwald    */
3373*e8380792SMatthias Ringwald   arm_status arm_fir_decimate_init_q15(
3374*e8380792SMatthias Ringwald   arm_fir_decimate_instance_q15 * S,
3375*e8380792SMatthias Ringwald   uint16_t numTaps,
3376*e8380792SMatthias Ringwald   uint8_t M,
3377*e8380792SMatthias Ringwald   q15_t * pCoeffs,
3378*e8380792SMatthias Ringwald   q15_t * pState,
3379*e8380792SMatthias Ringwald   uint32_t blockSize);
3380*e8380792SMatthias Ringwald 
3381*e8380792SMatthias Ringwald 
3382*e8380792SMatthias Ringwald   /**
3383*e8380792SMatthias Ringwald    * @brief Processing function for the Q31 FIR decimator.
3384*e8380792SMatthias Ringwald    * @param[in]  S     points to an instance of the Q31 FIR decimator structure.
3385*e8380792SMatthias Ringwald    * @param[in]  pSrc  points to the block of input data.
3386*e8380792SMatthias Ringwald    * @param[out] pDst  points to the block of output data
3387*e8380792SMatthias Ringwald    * @param[in] blockSize number of input samples to process per call.
3388*e8380792SMatthias Ringwald    */
3389*e8380792SMatthias Ringwald   void arm_fir_decimate_q31(
3390*e8380792SMatthias Ringwald   const arm_fir_decimate_instance_q31 * S,
3391*e8380792SMatthias Ringwald   q31_t * pSrc,
3392*e8380792SMatthias Ringwald   q31_t * pDst,
3393*e8380792SMatthias Ringwald   uint32_t blockSize);
3394*e8380792SMatthias Ringwald 
3395*e8380792SMatthias Ringwald   /**
3396*e8380792SMatthias Ringwald    * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4.
3397*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q31 FIR decimator structure.
3398*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3399*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3400*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of input samples to process per call.
3401*e8380792SMatthias Ringwald    */
3402*e8380792SMatthias Ringwald   void arm_fir_decimate_fast_q31(
3403*e8380792SMatthias Ringwald   arm_fir_decimate_instance_q31 * S,
3404*e8380792SMatthias Ringwald   q31_t * pSrc,
3405*e8380792SMatthias Ringwald   q31_t * pDst,
3406*e8380792SMatthias Ringwald   uint32_t blockSize);
3407*e8380792SMatthias Ringwald 
3408*e8380792SMatthias Ringwald 
3409*e8380792SMatthias Ringwald   /**
3410*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q31 FIR decimator.
3411*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q31 FIR decimator structure.
3412*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of coefficients in the filter.
3413*e8380792SMatthias Ringwald    * @param[in]     M          decimation factor.
3414*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
3415*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3416*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of input samples to process per call.
3417*e8380792SMatthias Ringwald    * @return    The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
3418*e8380792SMatthias Ringwald    * <code>blockSize</code> is not a multiple of <code>M</code>.
3419*e8380792SMatthias Ringwald    */
3420*e8380792SMatthias Ringwald   arm_status arm_fir_decimate_init_q31(
3421*e8380792SMatthias Ringwald   arm_fir_decimate_instance_q31 * S,
3422*e8380792SMatthias Ringwald   uint16_t numTaps,
3423*e8380792SMatthias Ringwald   uint8_t M,
3424*e8380792SMatthias Ringwald   q31_t * pCoeffs,
3425*e8380792SMatthias Ringwald   q31_t * pState,
3426*e8380792SMatthias Ringwald   uint32_t blockSize);
3427*e8380792SMatthias Ringwald 
3428*e8380792SMatthias Ringwald 
3429*e8380792SMatthias Ringwald   /**
3430*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 FIR interpolator.
3431*e8380792SMatthias Ringwald    */
3432*e8380792SMatthias Ringwald   typedef struct
3433*e8380792SMatthias Ringwald   {
3434*e8380792SMatthias Ringwald     uint8_t L;                      /**< upsample factor. */
3435*e8380792SMatthias Ringwald     uint16_t phaseLength;           /**< length of each polyphase filter component. */
3436*e8380792SMatthias Ringwald     q15_t *pCoeffs;                 /**< points to the coefficient array. The array is of length L*phaseLength. */
3437*e8380792SMatthias Ringwald     q15_t *pState;                  /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */
3438*e8380792SMatthias Ringwald   } arm_fir_interpolate_instance_q15;
3439*e8380792SMatthias Ringwald 
3440*e8380792SMatthias Ringwald   /**
3441*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 FIR interpolator.
3442*e8380792SMatthias Ringwald    */
3443*e8380792SMatthias Ringwald   typedef struct
3444*e8380792SMatthias Ringwald   {
3445*e8380792SMatthias Ringwald     uint8_t L;                      /**< upsample factor. */
3446*e8380792SMatthias Ringwald     uint16_t phaseLength;           /**< length of each polyphase filter component. */
3447*e8380792SMatthias Ringwald     q31_t *pCoeffs;                 /**< points to the coefficient array. The array is of length L*phaseLength. */
3448*e8380792SMatthias Ringwald     q31_t *pState;                  /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */
3449*e8380792SMatthias Ringwald   } arm_fir_interpolate_instance_q31;
3450*e8380792SMatthias Ringwald 
3451*e8380792SMatthias Ringwald   /**
3452*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point FIR interpolator.
3453*e8380792SMatthias Ringwald    */
3454*e8380792SMatthias Ringwald   typedef struct
3455*e8380792SMatthias Ringwald   {
3456*e8380792SMatthias Ringwald     uint8_t L;                     /**< upsample factor. */
3457*e8380792SMatthias Ringwald     uint16_t phaseLength;          /**< length of each polyphase filter component. */
3458*e8380792SMatthias Ringwald     float32_t *pCoeffs;            /**< points to the coefficient array. The array is of length L*phaseLength. */
3459*e8380792SMatthias Ringwald     float32_t *pState;             /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */
3460*e8380792SMatthias Ringwald   } arm_fir_interpolate_instance_f32;
3461*e8380792SMatthias Ringwald 
3462*e8380792SMatthias Ringwald 
3463*e8380792SMatthias Ringwald   /**
3464*e8380792SMatthias Ringwald    * @brief Processing function for the Q15 FIR interpolator.
3465*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 FIR interpolator structure.
3466*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3467*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
3468*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of input samples to process per call.
3469*e8380792SMatthias Ringwald    */
3470*e8380792SMatthias Ringwald   void arm_fir_interpolate_q15(
3471*e8380792SMatthias Ringwald   const arm_fir_interpolate_instance_q15 * S,
3472*e8380792SMatthias Ringwald   q15_t * pSrc,
3473*e8380792SMatthias Ringwald   q15_t * pDst,
3474*e8380792SMatthias Ringwald   uint32_t blockSize);
3475*e8380792SMatthias Ringwald 
3476*e8380792SMatthias Ringwald 
3477*e8380792SMatthias Ringwald   /**
3478*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q15 FIR interpolator.
3479*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q15 FIR interpolator structure.
3480*e8380792SMatthias Ringwald    * @param[in]     L          upsample factor.
3481*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of filter coefficients in the filter.
3482*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficient buffer.
3483*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3484*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of input samples to process per call.
3485*e8380792SMatthias Ringwald    * @return        The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
3486*e8380792SMatthias Ringwald    * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.
3487*e8380792SMatthias Ringwald    */
3488*e8380792SMatthias Ringwald   arm_status arm_fir_interpolate_init_q15(
3489*e8380792SMatthias Ringwald   arm_fir_interpolate_instance_q15 * S,
3490*e8380792SMatthias Ringwald   uint8_t L,
3491*e8380792SMatthias Ringwald   uint16_t numTaps,
3492*e8380792SMatthias Ringwald   q15_t * pCoeffs,
3493*e8380792SMatthias Ringwald   q15_t * pState,
3494*e8380792SMatthias Ringwald   uint32_t blockSize);
3495*e8380792SMatthias Ringwald 
3496*e8380792SMatthias Ringwald 
3497*e8380792SMatthias Ringwald   /**
3498*e8380792SMatthias Ringwald    * @brief Processing function for the Q31 FIR interpolator.
3499*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 FIR interpolator structure.
3500*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3501*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
3502*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of input samples to process per call.
3503*e8380792SMatthias Ringwald    */
3504*e8380792SMatthias Ringwald   void arm_fir_interpolate_q31(
3505*e8380792SMatthias Ringwald   const arm_fir_interpolate_instance_q31 * S,
3506*e8380792SMatthias Ringwald   q31_t * pSrc,
3507*e8380792SMatthias Ringwald   q31_t * pDst,
3508*e8380792SMatthias Ringwald   uint32_t blockSize);
3509*e8380792SMatthias Ringwald 
3510*e8380792SMatthias Ringwald 
3511*e8380792SMatthias Ringwald   /**
3512*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q31 FIR interpolator.
3513*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q31 FIR interpolator structure.
3514*e8380792SMatthias Ringwald    * @param[in]     L          upsample factor.
3515*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of filter coefficients in the filter.
3516*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficient buffer.
3517*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3518*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of input samples to process per call.
3519*e8380792SMatthias Ringwald    * @return        The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
3520*e8380792SMatthias Ringwald    * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.
3521*e8380792SMatthias Ringwald    */
3522*e8380792SMatthias Ringwald   arm_status arm_fir_interpolate_init_q31(
3523*e8380792SMatthias Ringwald   arm_fir_interpolate_instance_q31 * S,
3524*e8380792SMatthias Ringwald   uint8_t L,
3525*e8380792SMatthias Ringwald   uint16_t numTaps,
3526*e8380792SMatthias Ringwald   q31_t * pCoeffs,
3527*e8380792SMatthias Ringwald   q31_t * pState,
3528*e8380792SMatthias Ringwald   uint32_t blockSize);
3529*e8380792SMatthias Ringwald 
3530*e8380792SMatthias Ringwald 
3531*e8380792SMatthias Ringwald   /**
3532*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point FIR interpolator.
3533*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the floating-point FIR interpolator structure.
3534*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3535*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
3536*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of input samples to process per call.
3537*e8380792SMatthias Ringwald    */
3538*e8380792SMatthias Ringwald   void arm_fir_interpolate_f32(
3539*e8380792SMatthias Ringwald   const arm_fir_interpolate_instance_f32 * S,
3540*e8380792SMatthias Ringwald   float32_t * pSrc,
3541*e8380792SMatthias Ringwald   float32_t * pDst,
3542*e8380792SMatthias Ringwald   uint32_t blockSize);
3543*e8380792SMatthias Ringwald 
3544*e8380792SMatthias Ringwald 
3545*e8380792SMatthias Ringwald   /**
3546*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point FIR interpolator.
3547*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the floating-point FIR interpolator structure.
3548*e8380792SMatthias Ringwald    * @param[in]     L          upsample factor.
3549*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of filter coefficients in the filter.
3550*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficient buffer.
3551*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3552*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of input samples to process per call.
3553*e8380792SMatthias Ringwald    * @return        The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if
3554*e8380792SMatthias Ringwald    * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.
3555*e8380792SMatthias Ringwald    */
3556*e8380792SMatthias Ringwald   arm_status arm_fir_interpolate_init_f32(
3557*e8380792SMatthias Ringwald   arm_fir_interpolate_instance_f32 * S,
3558*e8380792SMatthias Ringwald   uint8_t L,
3559*e8380792SMatthias Ringwald   uint16_t numTaps,
3560*e8380792SMatthias Ringwald   float32_t * pCoeffs,
3561*e8380792SMatthias Ringwald   float32_t * pState,
3562*e8380792SMatthias Ringwald   uint32_t blockSize);
3563*e8380792SMatthias Ringwald 
3564*e8380792SMatthias Ringwald 
3565*e8380792SMatthias Ringwald   /**
3566*e8380792SMatthias Ringwald    * @brief Instance structure for the high precision Q31 Biquad cascade filter.
3567*e8380792SMatthias Ringwald    */
3568*e8380792SMatthias Ringwald   typedef struct
3569*e8380792SMatthias Ringwald   {
3570*e8380792SMatthias Ringwald     uint8_t numStages;       /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
3571*e8380792SMatthias Ringwald     q63_t *pState;           /**< points to the array of state coefficients.  The array is of length 4*numStages. */
3572*e8380792SMatthias Ringwald     q31_t *pCoeffs;          /**< points to the array of coefficients.  The array is of length 5*numStages. */
3573*e8380792SMatthias Ringwald     uint8_t postShift;       /**< additional shift, in bits, applied to each output sample. */
3574*e8380792SMatthias Ringwald   } arm_biquad_cas_df1_32x64_ins_q31;
3575*e8380792SMatthias Ringwald 
3576*e8380792SMatthias Ringwald 
3577*e8380792SMatthias Ringwald   /**
3578*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the high precision Q31 Biquad cascade filter structure.
3579*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3580*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3581*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3582*e8380792SMatthias Ringwald    */
3583*e8380792SMatthias Ringwald   void arm_biquad_cas_df1_32x64_q31(
3584*e8380792SMatthias Ringwald   const arm_biquad_cas_df1_32x64_ins_q31 * S,
3585*e8380792SMatthias Ringwald   q31_t * pSrc,
3586*e8380792SMatthias Ringwald   q31_t * pDst,
3587*e8380792SMatthias Ringwald   uint32_t blockSize);
3588*e8380792SMatthias Ringwald 
3589*e8380792SMatthias Ringwald 
3590*e8380792SMatthias Ringwald   /**
3591*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the high precision Q31 Biquad cascade filter structure.
3592*e8380792SMatthias Ringwald    * @param[in]     numStages  number of 2nd order stages in the filter.
3593*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
3594*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3595*e8380792SMatthias Ringwald    * @param[in]     postShift  shift to be applied to the output. Varies according to the coefficients format
3596*e8380792SMatthias Ringwald    */
3597*e8380792SMatthias Ringwald   void arm_biquad_cas_df1_32x64_init_q31(
3598*e8380792SMatthias Ringwald   arm_biquad_cas_df1_32x64_ins_q31 * S,
3599*e8380792SMatthias Ringwald   uint8_t numStages,
3600*e8380792SMatthias Ringwald   q31_t * pCoeffs,
3601*e8380792SMatthias Ringwald   q63_t * pState,
3602*e8380792SMatthias Ringwald   uint8_t postShift);
3603*e8380792SMatthias Ringwald 
3604*e8380792SMatthias Ringwald 
3605*e8380792SMatthias Ringwald   /**
3606*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.
3607*e8380792SMatthias Ringwald    */
3608*e8380792SMatthias Ringwald   typedef struct
3609*e8380792SMatthias Ringwald   {
3610*e8380792SMatthias Ringwald     uint8_t numStages;         /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
3611*e8380792SMatthias Ringwald     float32_t *pState;         /**< points to the array of state coefficients.  The array is of length 2*numStages. */
3612*e8380792SMatthias Ringwald     float32_t *pCoeffs;        /**< points to the array of coefficients.  The array is of length 5*numStages. */
3613*e8380792SMatthias Ringwald   } arm_biquad_cascade_df2T_instance_f32;
3614*e8380792SMatthias Ringwald 
3615*e8380792SMatthias Ringwald   /**
3616*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.
3617*e8380792SMatthias Ringwald    */
3618*e8380792SMatthias Ringwald   typedef struct
3619*e8380792SMatthias Ringwald   {
3620*e8380792SMatthias Ringwald     uint8_t numStages;         /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
3621*e8380792SMatthias Ringwald     float32_t *pState;         /**< points to the array of state coefficients.  The array is of length 4*numStages. */
3622*e8380792SMatthias Ringwald     float32_t *pCoeffs;        /**< points to the array of coefficients.  The array is of length 5*numStages. */
3623*e8380792SMatthias Ringwald   } arm_biquad_cascade_stereo_df2T_instance_f32;
3624*e8380792SMatthias Ringwald 
3625*e8380792SMatthias Ringwald   /**
3626*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.
3627*e8380792SMatthias Ringwald    */
3628*e8380792SMatthias Ringwald   typedef struct
3629*e8380792SMatthias Ringwald   {
3630*e8380792SMatthias Ringwald     uint8_t numStages;         /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
3631*e8380792SMatthias Ringwald     float64_t *pState;         /**< points to the array of state coefficients.  The array is of length 2*numStages. */
3632*e8380792SMatthias Ringwald     float64_t *pCoeffs;        /**< points to the array of coefficients.  The array is of length 5*numStages. */
3633*e8380792SMatthias Ringwald   } arm_biquad_cascade_df2T_instance_f64;
3634*e8380792SMatthias Ringwald 
3635*e8380792SMatthias Ringwald 
3636*e8380792SMatthias Ringwald   /**
3637*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter.
3638*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the filter data structure.
3639*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3640*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3641*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3642*e8380792SMatthias Ringwald    */
3643*e8380792SMatthias Ringwald   void arm_biquad_cascade_df2T_f32(
3644*e8380792SMatthias Ringwald   const arm_biquad_cascade_df2T_instance_f32 * S,
3645*e8380792SMatthias Ringwald   float32_t * pSrc,
3646*e8380792SMatthias Ringwald   float32_t * pDst,
3647*e8380792SMatthias Ringwald   uint32_t blockSize);
3648*e8380792SMatthias Ringwald 
3649*e8380792SMatthias Ringwald 
3650*e8380792SMatthias Ringwald   /**
3651*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels
3652*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the filter data structure.
3653*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3654*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3655*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3656*e8380792SMatthias Ringwald    */
3657*e8380792SMatthias Ringwald   void arm_biquad_cascade_stereo_df2T_f32(
3658*e8380792SMatthias Ringwald   const arm_biquad_cascade_stereo_df2T_instance_f32 * S,
3659*e8380792SMatthias Ringwald   float32_t * pSrc,
3660*e8380792SMatthias Ringwald   float32_t * pDst,
3661*e8380792SMatthias Ringwald   uint32_t blockSize);
3662*e8380792SMatthias Ringwald 
3663*e8380792SMatthias Ringwald 
3664*e8380792SMatthias Ringwald   /**
3665*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter.
3666*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the filter data structure.
3667*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3668*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3669*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3670*e8380792SMatthias Ringwald    */
3671*e8380792SMatthias Ringwald   void arm_biquad_cascade_df2T_f64(
3672*e8380792SMatthias Ringwald   const arm_biquad_cascade_df2T_instance_f64 * S,
3673*e8380792SMatthias Ringwald   float64_t * pSrc,
3674*e8380792SMatthias Ringwald   float64_t * pDst,
3675*e8380792SMatthias Ringwald   uint32_t blockSize);
3676*e8380792SMatthias Ringwald 
3677*e8380792SMatthias Ringwald 
3678*e8380792SMatthias Ringwald   /**
3679*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point transposed direct form II Biquad cascade filter.
3680*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the filter data structure.
3681*e8380792SMatthias Ringwald    * @param[in]     numStages  number of 2nd order stages in the filter.
3682*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
3683*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3684*e8380792SMatthias Ringwald    */
3685*e8380792SMatthias Ringwald   void arm_biquad_cascade_df2T_init_f32(
3686*e8380792SMatthias Ringwald   arm_biquad_cascade_df2T_instance_f32 * S,
3687*e8380792SMatthias Ringwald   uint8_t numStages,
3688*e8380792SMatthias Ringwald   float32_t * pCoeffs,
3689*e8380792SMatthias Ringwald   float32_t * pState);
3690*e8380792SMatthias Ringwald 
3691*e8380792SMatthias Ringwald 
3692*e8380792SMatthias Ringwald   /**
3693*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point transposed direct form II Biquad cascade filter.
3694*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the filter data structure.
3695*e8380792SMatthias Ringwald    * @param[in]     numStages  number of 2nd order stages in the filter.
3696*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
3697*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3698*e8380792SMatthias Ringwald    */
3699*e8380792SMatthias Ringwald   void arm_biquad_cascade_stereo_df2T_init_f32(
3700*e8380792SMatthias Ringwald   arm_biquad_cascade_stereo_df2T_instance_f32 * S,
3701*e8380792SMatthias Ringwald   uint8_t numStages,
3702*e8380792SMatthias Ringwald   float32_t * pCoeffs,
3703*e8380792SMatthias Ringwald   float32_t * pState);
3704*e8380792SMatthias Ringwald 
3705*e8380792SMatthias Ringwald 
3706*e8380792SMatthias Ringwald   /**
3707*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point transposed direct form II Biquad cascade filter.
3708*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the filter data structure.
3709*e8380792SMatthias Ringwald    * @param[in]     numStages  number of 2nd order stages in the filter.
3710*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the filter coefficients.
3711*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
3712*e8380792SMatthias Ringwald    */
3713*e8380792SMatthias Ringwald   void arm_biquad_cascade_df2T_init_f64(
3714*e8380792SMatthias Ringwald   arm_biquad_cascade_df2T_instance_f64 * S,
3715*e8380792SMatthias Ringwald   uint8_t numStages,
3716*e8380792SMatthias Ringwald   float64_t * pCoeffs,
3717*e8380792SMatthias Ringwald   float64_t * pState);
3718*e8380792SMatthias Ringwald 
3719*e8380792SMatthias Ringwald 
3720*e8380792SMatthias Ringwald   /**
3721*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 FIR lattice filter.
3722*e8380792SMatthias Ringwald    */
3723*e8380792SMatthias Ringwald   typedef struct
3724*e8380792SMatthias Ringwald   {
3725*e8380792SMatthias Ringwald     uint16_t numStages;                  /**< number of filter stages. */
3726*e8380792SMatthias Ringwald     q15_t *pState;                       /**< points to the state variable array. The array is of length numStages. */
3727*e8380792SMatthias Ringwald     q15_t *pCoeffs;                      /**< points to the coefficient array. The array is of length numStages. */
3728*e8380792SMatthias Ringwald   } arm_fir_lattice_instance_q15;
3729*e8380792SMatthias Ringwald 
3730*e8380792SMatthias Ringwald   /**
3731*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 FIR lattice filter.
3732*e8380792SMatthias Ringwald    */
3733*e8380792SMatthias Ringwald   typedef struct
3734*e8380792SMatthias Ringwald   {
3735*e8380792SMatthias Ringwald     uint16_t numStages;                  /**< number of filter stages. */
3736*e8380792SMatthias Ringwald     q31_t *pState;                       /**< points to the state variable array. The array is of length numStages. */
3737*e8380792SMatthias Ringwald     q31_t *pCoeffs;                      /**< points to the coefficient array. The array is of length numStages. */
3738*e8380792SMatthias Ringwald   } arm_fir_lattice_instance_q31;
3739*e8380792SMatthias Ringwald 
3740*e8380792SMatthias Ringwald   /**
3741*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point FIR lattice filter.
3742*e8380792SMatthias Ringwald    */
3743*e8380792SMatthias Ringwald   typedef struct
3744*e8380792SMatthias Ringwald   {
3745*e8380792SMatthias Ringwald     uint16_t numStages;                  /**< number of filter stages. */
3746*e8380792SMatthias Ringwald     float32_t *pState;                   /**< points to the state variable array. The array is of length numStages. */
3747*e8380792SMatthias Ringwald     float32_t *pCoeffs;                  /**< points to the coefficient array. The array is of length numStages. */
3748*e8380792SMatthias Ringwald   } arm_fir_lattice_instance_f32;
3749*e8380792SMatthias Ringwald 
3750*e8380792SMatthias Ringwald 
3751*e8380792SMatthias Ringwald   /**
3752*e8380792SMatthias Ringwald    * @brief Initialization function for the Q15 FIR lattice filter.
3753*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the Q15 FIR lattice structure.
3754*e8380792SMatthias Ringwald    * @param[in] numStages  number of filter stages.
3755*e8380792SMatthias Ringwald    * @param[in] pCoeffs    points to the coefficient buffer.  The array is of length numStages.
3756*e8380792SMatthias Ringwald    * @param[in] pState     points to the state buffer.  The array is of length numStages.
3757*e8380792SMatthias Ringwald    */
3758*e8380792SMatthias Ringwald   void arm_fir_lattice_init_q15(
3759*e8380792SMatthias Ringwald   arm_fir_lattice_instance_q15 * S,
3760*e8380792SMatthias Ringwald   uint16_t numStages,
3761*e8380792SMatthias Ringwald   q15_t * pCoeffs,
3762*e8380792SMatthias Ringwald   q15_t * pState);
3763*e8380792SMatthias Ringwald 
3764*e8380792SMatthias Ringwald 
3765*e8380792SMatthias Ringwald   /**
3766*e8380792SMatthias Ringwald    * @brief Processing function for the Q15 FIR lattice filter.
3767*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 FIR lattice structure.
3768*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3769*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
3770*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3771*e8380792SMatthias Ringwald    */
3772*e8380792SMatthias Ringwald   void arm_fir_lattice_q15(
3773*e8380792SMatthias Ringwald   const arm_fir_lattice_instance_q15 * S,
3774*e8380792SMatthias Ringwald   q15_t * pSrc,
3775*e8380792SMatthias Ringwald   q15_t * pDst,
3776*e8380792SMatthias Ringwald   uint32_t blockSize);
3777*e8380792SMatthias Ringwald 
3778*e8380792SMatthias Ringwald 
3779*e8380792SMatthias Ringwald   /**
3780*e8380792SMatthias Ringwald    * @brief Initialization function for the Q31 FIR lattice filter.
3781*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the Q31 FIR lattice structure.
3782*e8380792SMatthias Ringwald    * @param[in] numStages  number of filter stages.
3783*e8380792SMatthias Ringwald    * @param[in] pCoeffs    points to the coefficient buffer.  The array is of length numStages.
3784*e8380792SMatthias Ringwald    * @param[in] pState     points to the state buffer.   The array is of length numStages.
3785*e8380792SMatthias Ringwald    */
3786*e8380792SMatthias Ringwald   void arm_fir_lattice_init_q31(
3787*e8380792SMatthias Ringwald   arm_fir_lattice_instance_q31 * S,
3788*e8380792SMatthias Ringwald   uint16_t numStages,
3789*e8380792SMatthias Ringwald   q31_t * pCoeffs,
3790*e8380792SMatthias Ringwald   q31_t * pState);
3791*e8380792SMatthias Ringwald 
3792*e8380792SMatthias Ringwald 
3793*e8380792SMatthias Ringwald   /**
3794*e8380792SMatthias Ringwald    * @brief Processing function for the Q31 FIR lattice filter.
3795*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q31 FIR lattice structure.
3796*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3797*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3798*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3799*e8380792SMatthias Ringwald    */
3800*e8380792SMatthias Ringwald   void arm_fir_lattice_q31(
3801*e8380792SMatthias Ringwald   const arm_fir_lattice_instance_q31 * S,
3802*e8380792SMatthias Ringwald   q31_t * pSrc,
3803*e8380792SMatthias Ringwald   q31_t * pDst,
3804*e8380792SMatthias Ringwald   uint32_t blockSize);
3805*e8380792SMatthias Ringwald 
3806*e8380792SMatthias Ringwald 
3807*e8380792SMatthias Ringwald /**
3808*e8380792SMatthias Ringwald  * @brief Initialization function for the floating-point FIR lattice filter.
3809*e8380792SMatthias Ringwald  * @param[in] S          points to an instance of the floating-point FIR lattice structure.
3810*e8380792SMatthias Ringwald  * @param[in] numStages  number of filter stages.
3811*e8380792SMatthias Ringwald  * @param[in] pCoeffs    points to the coefficient buffer.  The array is of length numStages.
3812*e8380792SMatthias Ringwald  * @param[in] pState     points to the state buffer.  The array is of length numStages.
3813*e8380792SMatthias Ringwald  */
3814*e8380792SMatthias Ringwald   void arm_fir_lattice_init_f32(
3815*e8380792SMatthias Ringwald   arm_fir_lattice_instance_f32 * S,
3816*e8380792SMatthias Ringwald   uint16_t numStages,
3817*e8380792SMatthias Ringwald   float32_t * pCoeffs,
3818*e8380792SMatthias Ringwald   float32_t * pState);
3819*e8380792SMatthias Ringwald 
3820*e8380792SMatthias Ringwald 
3821*e8380792SMatthias Ringwald   /**
3822*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point FIR lattice filter.
3823*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the floating-point FIR lattice structure.
3824*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3825*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data
3826*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3827*e8380792SMatthias Ringwald    */
3828*e8380792SMatthias Ringwald   void arm_fir_lattice_f32(
3829*e8380792SMatthias Ringwald   const arm_fir_lattice_instance_f32 * S,
3830*e8380792SMatthias Ringwald   float32_t * pSrc,
3831*e8380792SMatthias Ringwald   float32_t * pDst,
3832*e8380792SMatthias Ringwald   uint32_t blockSize);
3833*e8380792SMatthias Ringwald 
3834*e8380792SMatthias Ringwald 
3835*e8380792SMatthias Ringwald   /**
3836*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 IIR lattice filter.
3837*e8380792SMatthias Ringwald    */
3838*e8380792SMatthias Ringwald   typedef struct
3839*e8380792SMatthias Ringwald   {
3840*e8380792SMatthias Ringwald     uint16_t numStages;                  /**< number of stages in the filter. */
3841*e8380792SMatthias Ringwald     q15_t *pState;                       /**< points to the state variable array. The array is of length numStages+blockSize. */
3842*e8380792SMatthias Ringwald     q15_t *pkCoeffs;                     /**< points to the reflection coefficient array. The array is of length numStages. */
3843*e8380792SMatthias Ringwald     q15_t *pvCoeffs;                     /**< points to the ladder coefficient array. The array is of length numStages+1. */
3844*e8380792SMatthias Ringwald   } arm_iir_lattice_instance_q15;
3845*e8380792SMatthias Ringwald 
3846*e8380792SMatthias Ringwald   /**
3847*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 IIR lattice filter.
3848*e8380792SMatthias Ringwald    */
3849*e8380792SMatthias Ringwald   typedef struct
3850*e8380792SMatthias Ringwald   {
3851*e8380792SMatthias Ringwald     uint16_t numStages;                  /**< number of stages in the filter. */
3852*e8380792SMatthias Ringwald     q31_t *pState;                       /**< points to the state variable array. The array is of length numStages+blockSize. */
3853*e8380792SMatthias Ringwald     q31_t *pkCoeffs;                     /**< points to the reflection coefficient array. The array is of length numStages. */
3854*e8380792SMatthias Ringwald     q31_t *pvCoeffs;                     /**< points to the ladder coefficient array. The array is of length numStages+1. */
3855*e8380792SMatthias Ringwald   } arm_iir_lattice_instance_q31;
3856*e8380792SMatthias Ringwald 
3857*e8380792SMatthias Ringwald   /**
3858*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point IIR lattice filter.
3859*e8380792SMatthias Ringwald    */
3860*e8380792SMatthias Ringwald   typedef struct
3861*e8380792SMatthias Ringwald   {
3862*e8380792SMatthias Ringwald     uint16_t numStages;                  /**< number of stages in the filter. */
3863*e8380792SMatthias Ringwald     float32_t *pState;                   /**< points to the state variable array. The array is of length numStages+blockSize. */
3864*e8380792SMatthias Ringwald     float32_t *pkCoeffs;                 /**< points to the reflection coefficient array. The array is of length numStages. */
3865*e8380792SMatthias Ringwald     float32_t *pvCoeffs;                 /**< points to the ladder coefficient array. The array is of length numStages+1. */
3866*e8380792SMatthias Ringwald   } arm_iir_lattice_instance_f32;
3867*e8380792SMatthias Ringwald 
3868*e8380792SMatthias Ringwald 
3869*e8380792SMatthias Ringwald   /**
3870*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point IIR lattice filter.
3871*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the floating-point IIR lattice structure.
3872*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3873*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
3874*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3875*e8380792SMatthias Ringwald    */
3876*e8380792SMatthias Ringwald   void arm_iir_lattice_f32(
3877*e8380792SMatthias Ringwald   const arm_iir_lattice_instance_f32 * S,
3878*e8380792SMatthias Ringwald   float32_t * pSrc,
3879*e8380792SMatthias Ringwald   float32_t * pDst,
3880*e8380792SMatthias Ringwald   uint32_t blockSize);
3881*e8380792SMatthias Ringwald 
3882*e8380792SMatthias Ringwald 
3883*e8380792SMatthias Ringwald   /**
3884*e8380792SMatthias Ringwald    * @brief Initialization function for the floating-point IIR lattice filter.
3885*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the floating-point IIR lattice structure.
3886*e8380792SMatthias Ringwald    * @param[in] numStages  number of stages in the filter.
3887*e8380792SMatthias Ringwald    * @param[in] pkCoeffs   points to the reflection coefficient buffer.  The array is of length numStages.
3888*e8380792SMatthias Ringwald    * @param[in] pvCoeffs   points to the ladder coefficient buffer.  The array is of length numStages+1.
3889*e8380792SMatthias Ringwald    * @param[in] pState     points to the state buffer.  The array is of length numStages+blockSize-1.
3890*e8380792SMatthias Ringwald    * @param[in] blockSize  number of samples to process.
3891*e8380792SMatthias Ringwald    */
3892*e8380792SMatthias Ringwald   void arm_iir_lattice_init_f32(
3893*e8380792SMatthias Ringwald   arm_iir_lattice_instance_f32 * S,
3894*e8380792SMatthias Ringwald   uint16_t numStages,
3895*e8380792SMatthias Ringwald   float32_t * pkCoeffs,
3896*e8380792SMatthias Ringwald   float32_t * pvCoeffs,
3897*e8380792SMatthias Ringwald   float32_t * pState,
3898*e8380792SMatthias Ringwald   uint32_t blockSize);
3899*e8380792SMatthias Ringwald 
3900*e8380792SMatthias Ringwald 
3901*e8380792SMatthias Ringwald   /**
3902*e8380792SMatthias Ringwald    * @brief Processing function for the Q31 IIR lattice filter.
3903*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q31 IIR lattice structure.
3904*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3905*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
3906*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3907*e8380792SMatthias Ringwald    */
3908*e8380792SMatthias Ringwald   void arm_iir_lattice_q31(
3909*e8380792SMatthias Ringwald   const arm_iir_lattice_instance_q31 * S,
3910*e8380792SMatthias Ringwald   q31_t * pSrc,
3911*e8380792SMatthias Ringwald   q31_t * pDst,
3912*e8380792SMatthias Ringwald   uint32_t blockSize);
3913*e8380792SMatthias Ringwald 
3914*e8380792SMatthias Ringwald 
3915*e8380792SMatthias Ringwald   /**
3916*e8380792SMatthias Ringwald    * @brief Initialization function for the Q31 IIR lattice filter.
3917*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the Q31 IIR lattice structure.
3918*e8380792SMatthias Ringwald    * @param[in] numStages  number of stages in the filter.
3919*e8380792SMatthias Ringwald    * @param[in] pkCoeffs   points to the reflection coefficient buffer.  The array is of length numStages.
3920*e8380792SMatthias Ringwald    * @param[in] pvCoeffs   points to the ladder coefficient buffer.  The array is of length numStages+1.
3921*e8380792SMatthias Ringwald    * @param[in] pState     points to the state buffer.  The array is of length numStages+blockSize.
3922*e8380792SMatthias Ringwald    * @param[in] blockSize  number of samples to process.
3923*e8380792SMatthias Ringwald    */
3924*e8380792SMatthias Ringwald   void arm_iir_lattice_init_q31(
3925*e8380792SMatthias Ringwald   arm_iir_lattice_instance_q31 * S,
3926*e8380792SMatthias Ringwald   uint16_t numStages,
3927*e8380792SMatthias Ringwald   q31_t * pkCoeffs,
3928*e8380792SMatthias Ringwald   q31_t * pvCoeffs,
3929*e8380792SMatthias Ringwald   q31_t * pState,
3930*e8380792SMatthias Ringwald   uint32_t blockSize);
3931*e8380792SMatthias Ringwald 
3932*e8380792SMatthias Ringwald 
3933*e8380792SMatthias Ringwald   /**
3934*e8380792SMatthias Ringwald    * @brief Processing function for the Q15 IIR lattice filter.
3935*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 IIR lattice structure.
3936*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3937*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data.
3938*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3939*e8380792SMatthias Ringwald    */
3940*e8380792SMatthias Ringwald   void arm_iir_lattice_q15(
3941*e8380792SMatthias Ringwald   const arm_iir_lattice_instance_q15 * S,
3942*e8380792SMatthias Ringwald   q15_t * pSrc,
3943*e8380792SMatthias Ringwald   q15_t * pDst,
3944*e8380792SMatthias Ringwald   uint32_t blockSize);
3945*e8380792SMatthias Ringwald 
3946*e8380792SMatthias Ringwald 
3947*e8380792SMatthias Ringwald /**
3948*e8380792SMatthias Ringwald  * @brief Initialization function for the Q15 IIR lattice filter.
3949*e8380792SMatthias Ringwald  * @param[in] S          points to an instance of the fixed-point Q15 IIR lattice structure.
3950*e8380792SMatthias Ringwald  * @param[in] numStages  number of stages in the filter.
3951*e8380792SMatthias Ringwald  * @param[in] pkCoeffs   points to reflection coefficient buffer.  The array is of length numStages.
3952*e8380792SMatthias Ringwald  * @param[in] pvCoeffs   points to ladder coefficient buffer.  The array is of length numStages+1.
3953*e8380792SMatthias Ringwald  * @param[in] pState     points to state buffer.  The array is of length numStages+blockSize.
3954*e8380792SMatthias Ringwald  * @param[in] blockSize  number of samples to process per call.
3955*e8380792SMatthias Ringwald  */
3956*e8380792SMatthias Ringwald   void arm_iir_lattice_init_q15(
3957*e8380792SMatthias Ringwald   arm_iir_lattice_instance_q15 * S,
3958*e8380792SMatthias Ringwald   uint16_t numStages,
3959*e8380792SMatthias Ringwald   q15_t * pkCoeffs,
3960*e8380792SMatthias Ringwald   q15_t * pvCoeffs,
3961*e8380792SMatthias Ringwald   q15_t * pState,
3962*e8380792SMatthias Ringwald   uint32_t blockSize);
3963*e8380792SMatthias Ringwald 
3964*e8380792SMatthias Ringwald 
3965*e8380792SMatthias Ringwald   /**
3966*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point LMS filter.
3967*e8380792SMatthias Ringwald    */
3968*e8380792SMatthias Ringwald   typedef struct
3969*e8380792SMatthias Ringwald   {
3970*e8380792SMatthias Ringwald     uint16_t numTaps;    /**< number of coefficients in the filter. */
3971*e8380792SMatthias Ringwald     float32_t *pState;   /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
3972*e8380792SMatthias Ringwald     float32_t *pCoeffs;  /**< points to the coefficient array. The array is of length numTaps. */
3973*e8380792SMatthias Ringwald     float32_t mu;        /**< step size that controls filter coefficient updates. */
3974*e8380792SMatthias Ringwald   } arm_lms_instance_f32;
3975*e8380792SMatthias Ringwald 
3976*e8380792SMatthias Ringwald 
3977*e8380792SMatthias Ringwald   /**
3978*e8380792SMatthias Ringwald    * @brief Processing function for floating-point LMS filter.
3979*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the floating-point LMS filter structure.
3980*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
3981*e8380792SMatthias Ringwald    * @param[in]  pRef       points to the block of reference data.
3982*e8380792SMatthias Ringwald    * @param[out] pOut       points to the block of output data.
3983*e8380792SMatthias Ringwald    * @param[out] pErr       points to the block of error data.
3984*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
3985*e8380792SMatthias Ringwald    */
3986*e8380792SMatthias Ringwald   void arm_lms_f32(
3987*e8380792SMatthias Ringwald   const arm_lms_instance_f32 * S,
3988*e8380792SMatthias Ringwald   float32_t * pSrc,
3989*e8380792SMatthias Ringwald   float32_t * pRef,
3990*e8380792SMatthias Ringwald   float32_t * pOut,
3991*e8380792SMatthias Ringwald   float32_t * pErr,
3992*e8380792SMatthias Ringwald   uint32_t blockSize);
3993*e8380792SMatthias Ringwald 
3994*e8380792SMatthias Ringwald 
3995*e8380792SMatthias Ringwald   /**
3996*e8380792SMatthias Ringwald    * @brief Initialization function for floating-point LMS filter.
3997*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the floating-point LMS filter structure.
3998*e8380792SMatthias Ringwald    * @param[in] numTaps    number of filter coefficients.
3999*e8380792SMatthias Ringwald    * @param[in] pCoeffs    points to the coefficient buffer.
4000*e8380792SMatthias Ringwald    * @param[in] pState     points to state buffer.
4001*e8380792SMatthias Ringwald    * @param[in] mu         step size that controls filter coefficient updates.
4002*e8380792SMatthias Ringwald    * @param[in] blockSize  number of samples to process.
4003*e8380792SMatthias Ringwald    */
4004*e8380792SMatthias Ringwald   void arm_lms_init_f32(
4005*e8380792SMatthias Ringwald   arm_lms_instance_f32 * S,
4006*e8380792SMatthias Ringwald   uint16_t numTaps,
4007*e8380792SMatthias Ringwald   float32_t * pCoeffs,
4008*e8380792SMatthias Ringwald   float32_t * pState,
4009*e8380792SMatthias Ringwald   float32_t mu,
4010*e8380792SMatthias Ringwald   uint32_t blockSize);
4011*e8380792SMatthias Ringwald 
4012*e8380792SMatthias Ringwald 
4013*e8380792SMatthias Ringwald   /**
4014*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 LMS filter.
4015*e8380792SMatthias Ringwald    */
4016*e8380792SMatthias Ringwald   typedef struct
4017*e8380792SMatthias Ringwald   {
4018*e8380792SMatthias Ringwald     uint16_t numTaps;    /**< number of coefficients in the filter. */
4019*e8380792SMatthias Ringwald     q15_t *pState;       /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
4020*e8380792SMatthias Ringwald     q15_t *pCoeffs;      /**< points to the coefficient array. The array is of length numTaps. */
4021*e8380792SMatthias Ringwald     q15_t mu;            /**< step size that controls filter coefficient updates. */
4022*e8380792SMatthias Ringwald     uint32_t postShift;  /**< bit shift applied to coefficients. */
4023*e8380792SMatthias Ringwald   } arm_lms_instance_q15;
4024*e8380792SMatthias Ringwald 
4025*e8380792SMatthias Ringwald 
4026*e8380792SMatthias Ringwald   /**
4027*e8380792SMatthias Ringwald    * @brief Initialization function for the Q15 LMS filter.
4028*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the Q15 LMS filter structure.
4029*e8380792SMatthias Ringwald    * @param[in] numTaps    number of filter coefficients.
4030*e8380792SMatthias Ringwald    * @param[in] pCoeffs    points to the coefficient buffer.
4031*e8380792SMatthias Ringwald    * @param[in] pState     points to the state buffer.
4032*e8380792SMatthias Ringwald    * @param[in] mu         step size that controls filter coefficient updates.
4033*e8380792SMatthias Ringwald    * @param[in] blockSize  number of samples to process.
4034*e8380792SMatthias Ringwald    * @param[in] postShift  bit shift applied to coefficients.
4035*e8380792SMatthias Ringwald    */
4036*e8380792SMatthias Ringwald   void arm_lms_init_q15(
4037*e8380792SMatthias Ringwald   arm_lms_instance_q15 * S,
4038*e8380792SMatthias Ringwald   uint16_t numTaps,
4039*e8380792SMatthias Ringwald   q15_t * pCoeffs,
4040*e8380792SMatthias Ringwald   q15_t * pState,
4041*e8380792SMatthias Ringwald   q15_t mu,
4042*e8380792SMatthias Ringwald   uint32_t blockSize,
4043*e8380792SMatthias Ringwald   uint32_t postShift);
4044*e8380792SMatthias Ringwald 
4045*e8380792SMatthias Ringwald 
4046*e8380792SMatthias Ringwald   /**
4047*e8380792SMatthias Ringwald    * @brief Processing function for Q15 LMS filter.
4048*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 LMS filter structure.
4049*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
4050*e8380792SMatthias Ringwald    * @param[in]  pRef       points to the block of reference data.
4051*e8380792SMatthias Ringwald    * @param[out] pOut       points to the block of output data.
4052*e8380792SMatthias Ringwald    * @param[out] pErr       points to the block of error data.
4053*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
4054*e8380792SMatthias Ringwald    */
4055*e8380792SMatthias Ringwald   void arm_lms_q15(
4056*e8380792SMatthias Ringwald   const arm_lms_instance_q15 * S,
4057*e8380792SMatthias Ringwald   q15_t * pSrc,
4058*e8380792SMatthias Ringwald   q15_t * pRef,
4059*e8380792SMatthias Ringwald   q15_t * pOut,
4060*e8380792SMatthias Ringwald   q15_t * pErr,
4061*e8380792SMatthias Ringwald   uint32_t blockSize);
4062*e8380792SMatthias Ringwald 
4063*e8380792SMatthias Ringwald 
4064*e8380792SMatthias Ringwald   /**
4065*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 LMS filter.
4066*e8380792SMatthias Ringwald    */
4067*e8380792SMatthias Ringwald   typedef struct
4068*e8380792SMatthias Ringwald   {
4069*e8380792SMatthias Ringwald     uint16_t numTaps;    /**< number of coefficients in the filter. */
4070*e8380792SMatthias Ringwald     q31_t *pState;       /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
4071*e8380792SMatthias Ringwald     q31_t *pCoeffs;      /**< points to the coefficient array. The array is of length numTaps. */
4072*e8380792SMatthias Ringwald     q31_t mu;            /**< step size that controls filter coefficient updates. */
4073*e8380792SMatthias Ringwald     uint32_t postShift;  /**< bit shift applied to coefficients. */
4074*e8380792SMatthias Ringwald   } arm_lms_instance_q31;
4075*e8380792SMatthias Ringwald 
4076*e8380792SMatthias Ringwald 
4077*e8380792SMatthias Ringwald   /**
4078*e8380792SMatthias Ringwald    * @brief Processing function for Q31 LMS filter.
4079*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 LMS filter structure.
4080*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
4081*e8380792SMatthias Ringwald    * @param[in]  pRef       points to the block of reference data.
4082*e8380792SMatthias Ringwald    * @param[out] pOut       points to the block of output data.
4083*e8380792SMatthias Ringwald    * @param[out] pErr       points to the block of error data.
4084*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
4085*e8380792SMatthias Ringwald    */
4086*e8380792SMatthias Ringwald   void arm_lms_q31(
4087*e8380792SMatthias Ringwald   const arm_lms_instance_q31 * S,
4088*e8380792SMatthias Ringwald   q31_t * pSrc,
4089*e8380792SMatthias Ringwald   q31_t * pRef,
4090*e8380792SMatthias Ringwald   q31_t * pOut,
4091*e8380792SMatthias Ringwald   q31_t * pErr,
4092*e8380792SMatthias Ringwald   uint32_t blockSize);
4093*e8380792SMatthias Ringwald 
4094*e8380792SMatthias Ringwald 
4095*e8380792SMatthias Ringwald   /**
4096*e8380792SMatthias Ringwald    * @brief Initialization function for Q31 LMS filter.
4097*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the Q31 LMS filter structure.
4098*e8380792SMatthias Ringwald    * @param[in] numTaps    number of filter coefficients.
4099*e8380792SMatthias Ringwald    * @param[in] pCoeffs    points to coefficient buffer.
4100*e8380792SMatthias Ringwald    * @param[in] pState     points to state buffer.
4101*e8380792SMatthias Ringwald    * @param[in] mu         step size that controls filter coefficient updates.
4102*e8380792SMatthias Ringwald    * @param[in] blockSize  number of samples to process.
4103*e8380792SMatthias Ringwald    * @param[in] postShift  bit shift applied to coefficients.
4104*e8380792SMatthias Ringwald    */
4105*e8380792SMatthias Ringwald   void arm_lms_init_q31(
4106*e8380792SMatthias Ringwald   arm_lms_instance_q31 * S,
4107*e8380792SMatthias Ringwald   uint16_t numTaps,
4108*e8380792SMatthias Ringwald   q31_t * pCoeffs,
4109*e8380792SMatthias Ringwald   q31_t * pState,
4110*e8380792SMatthias Ringwald   q31_t mu,
4111*e8380792SMatthias Ringwald   uint32_t blockSize,
4112*e8380792SMatthias Ringwald   uint32_t postShift);
4113*e8380792SMatthias Ringwald 
4114*e8380792SMatthias Ringwald 
4115*e8380792SMatthias Ringwald   /**
4116*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point normalized LMS filter.
4117*e8380792SMatthias Ringwald    */
4118*e8380792SMatthias Ringwald   typedef struct
4119*e8380792SMatthias Ringwald   {
4120*e8380792SMatthias Ringwald     uint16_t numTaps;     /**< number of coefficients in the filter. */
4121*e8380792SMatthias Ringwald     float32_t *pState;    /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
4122*e8380792SMatthias Ringwald     float32_t *pCoeffs;   /**< points to the coefficient array. The array is of length numTaps. */
4123*e8380792SMatthias Ringwald     float32_t mu;         /**< step size that control filter coefficient updates. */
4124*e8380792SMatthias Ringwald     float32_t energy;     /**< saves previous frame energy. */
4125*e8380792SMatthias Ringwald     float32_t x0;         /**< saves previous input sample. */
4126*e8380792SMatthias Ringwald   } arm_lms_norm_instance_f32;
4127*e8380792SMatthias Ringwald 
4128*e8380792SMatthias Ringwald 
4129*e8380792SMatthias Ringwald   /**
4130*e8380792SMatthias Ringwald    * @brief Processing function for floating-point normalized LMS filter.
4131*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the floating-point normalized LMS filter structure.
4132*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
4133*e8380792SMatthias Ringwald    * @param[in]  pRef       points to the block of reference data.
4134*e8380792SMatthias Ringwald    * @param[out] pOut       points to the block of output data.
4135*e8380792SMatthias Ringwald    * @param[out] pErr       points to the block of error data.
4136*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
4137*e8380792SMatthias Ringwald    */
4138*e8380792SMatthias Ringwald   void arm_lms_norm_f32(
4139*e8380792SMatthias Ringwald   arm_lms_norm_instance_f32 * S,
4140*e8380792SMatthias Ringwald   float32_t * pSrc,
4141*e8380792SMatthias Ringwald   float32_t * pRef,
4142*e8380792SMatthias Ringwald   float32_t * pOut,
4143*e8380792SMatthias Ringwald   float32_t * pErr,
4144*e8380792SMatthias Ringwald   uint32_t blockSize);
4145*e8380792SMatthias Ringwald 
4146*e8380792SMatthias Ringwald 
4147*e8380792SMatthias Ringwald   /**
4148*e8380792SMatthias Ringwald    * @brief Initialization function for floating-point normalized LMS filter.
4149*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the floating-point LMS filter structure.
4150*e8380792SMatthias Ringwald    * @param[in] numTaps    number of filter coefficients.
4151*e8380792SMatthias Ringwald    * @param[in] pCoeffs    points to coefficient buffer.
4152*e8380792SMatthias Ringwald    * @param[in] pState     points to state buffer.
4153*e8380792SMatthias Ringwald    * @param[in] mu         step size that controls filter coefficient updates.
4154*e8380792SMatthias Ringwald    * @param[in] blockSize  number of samples to process.
4155*e8380792SMatthias Ringwald    */
4156*e8380792SMatthias Ringwald   void arm_lms_norm_init_f32(
4157*e8380792SMatthias Ringwald   arm_lms_norm_instance_f32 * S,
4158*e8380792SMatthias Ringwald   uint16_t numTaps,
4159*e8380792SMatthias Ringwald   float32_t * pCoeffs,
4160*e8380792SMatthias Ringwald   float32_t * pState,
4161*e8380792SMatthias Ringwald   float32_t mu,
4162*e8380792SMatthias Ringwald   uint32_t blockSize);
4163*e8380792SMatthias Ringwald 
4164*e8380792SMatthias Ringwald 
4165*e8380792SMatthias Ringwald   /**
4166*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 normalized LMS filter.
4167*e8380792SMatthias Ringwald    */
4168*e8380792SMatthias Ringwald   typedef struct
4169*e8380792SMatthias Ringwald   {
4170*e8380792SMatthias Ringwald     uint16_t numTaps;     /**< number of coefficients in the filter. */
4171*e8380792SMatthias Ringwald     q31_t *pState;        /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
4172*e8380792SMatthias Ringwald     q31_t *pCoeffs;       /**< points to the coefficient array. The array is of length numTaps. */
4173*e8380792SMatthias Ringwald     q31_t mu;             /**< step size that controls filter coefficient updates. */
4174*e8380792SMatthias Ringwald     uint8_t postShift;    /**< bit shift applied to coefficients. */
4175*e8380792SMatthias Ringwald     q31_t *recipTable;    /**< points to the reciprocal initial value table. */
4176*e8380792SMatthias Ringwald     q31_t energy;         /**< saves previous frame energy. */
4177*e8380792SMatthias Ringwald     q31_t x0;             /**< saves previous input sample. */
4178*e8380792SMatthias Ringwald   } arm_lms_norm_instance_q31;
4179*e8380792SMatthias Ringwald 
4180*e8380792SMatthias Ringwald 
4181*e8380792SMatthias Ringwald   /**
4182*e8380792SMatthias Ringwald    * @brief Processing function for Q31 normalized LMS filter.
4183*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q31 normalized LMS filter structure.
4184*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
4185*e8380792SMatthias Ringwald    * @param[in]  pRef       points to the block of reference data.
4186*e8380792SMatthias Ringwald    * @param[out] pOut       points to the block of output data.
4187*e8380792SMatthias Ringwald    * @param[out] pErr       points to the block of error data.
4188*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
4189*e8380792SMatthias Ringwald    */
4190*e8380792SMatthias Ringwald   void arm_lms_norm_q31(
4191*e8380792SMatthias Ringwald   arm_lms_norm_instance_q31 * S,
4192*e8380792SMatthias Ringwald   q31_t * pSrc,
4193*e8380792SMatthias Ringwald   q31_t * pRef,
4194*e8380792SMatthias Ringwald   q31_t * pOut,
4195*e8380792SMatthias Ringwald   q31_t * pErr,
4196*e8380792SMatthias Ringwald   uint32_t blockSize);
4197*e8380792SMatthias Ringwald 
4198*e8380792SMatthias Ringwald 
4199*e8380792SMatthias Ringwald   /**
4200*e8380792SMatthias Ringwald    * @brief Initialization function for Q31 normalized LMS filter.
4201*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the Q31 normalized LMS filter structure.
4202*e8380792SMatthias Ringwald    * @param[in] numTaps    number of filter coefficients.
4203*e8380792SMatthias Ringwald    * @param[in] pCoeffs    points to coefficient buffer.
4204*e8380792SMatthias Ringwald    * @param[in] pState     points to state buffer.
4205*e8380792SMatthias Ringwald    * @param[in] mu         step size that controls filter coefficient updates.
4206*e8380792SMatthias Ringwald    * @param[in] blockSize  number of samples to process.
4207*e8380792SMatthias Ringwald    * @param[in] postShift  bit shift applied to coefficients.
4208*e8380792SMatthias Ringwald    */
4209*e8380792SMatthias Ringwald   void arm_lms_norm_init_q31(
4210*e8380792SMatthias Ringwald   arm_lms_norm_instance_q31 * S,
4211*e8380792SMatthias Ringwald   uint16_t numTaps,
4212*e8380792SMatthias Ringwald   q31_t * pCoeffs,
4213*e8380792SMatthias Ringwald   q31_t * pState,
4214*e8380792SMatthias Ringwald   q31_t mu,
4215*e8380792SMatthias Ringwald   uint32_t blockSize,
4216*e8380792SMatthias Ringwald   uint8_t postShift);
4217*e8380792SMatthias Ringwald 
4218*e8380792SMatthias Ringwald 
4219*e8380792SMatthias Ringwald   /**
4220*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 normalized LMS filter.
4221*e8380792SMatthias Ringwald    */
4222*e8380792SMatthias Ringwald   typedef struct
4223*e8380792SMatthias Ringwald   {
4224*e8380792SMatthias Ringwald     uint16_t numTaps;     /**< Number of coefficients in the filter. */
4225*e8380792SMatthias Ringwald     q15_t *pState;        /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
4226*e8380792SMatthias Ringwald     q15_t *pCoeffs;       /**< points to the coefficient array. The array is of length numTaps. */
4227*e8380792SMatthias Ringwald     q15_t mu;             /**< step size that controls filter coefficient updates. */
4228*e8380792SMatthias Ringwald     uint8_t postShift;    /**< bit shift applied to coefficients. */
4229*e8380792SMatthias Ringwald     q15_t *recipTable;    /**< Points to the reciprocal initial value table. */
4230*e8380792SMatthias Ringwald     q15_t energy;         /**< saves previous frame energy. */
4231*e8380792SMatthias Ringwald     q15_t x0;             /**< saves previous input sample. */
4232*e8380792SMatthias Ringwald   } arm_lms_norm_instance_q15;
4233*e8380792SMatthias Ringwald 
4234*e8380792SMatthias Ringwald 
4235*e8380792SMatthias Ringwald   /**
4236*e8380792SMatthias Ringwald    * @brief Processing function for Q15 normalized LMS filter.
4237*e8380792SMatthias Ringwald    * @param[in]  S          points to an instance of the Q15 normalized LMS filter structure.
4238*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the block of input data.
4239*e8380792SMatthias Ringwald    * @param[in]  pRef       points to the block of reference data.
4240*e8380792SMatthias Ringwald    * @param[out] pOut       points to the block of output data.
4241*e8380792SMatthias Ringwald    * @param[out] pErr       points to the block of error data.
4242*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process.
4243*e8380792SMatthias Ringwald    */
4244*e8380792SMatthias Ringwald   void arm_lms_norm_q15(
4245*e8380792SMatthias Ringwald   arm_lms_norm_instance_q15 * S,
4246*e8380792SMatthias Ringwald   q15_t * pSrc,
4247*e8380792SMatthias Ringwald   q15_t * pRef,
4248*e8380792SMatthias Ringwald   q15_t * pOut,
4249*e8380792SMatthias Ringwald   q15_t * pErr,
4250*e8380792SMatthias Ringwald   uint32_t blockSize);
4251*e8380792SMatthias Ringwald 
4252*e8380792SMatthias Ringwald 
4253*e8380792SMatthias Ringwald   /**
4254*e8380792SMatthias Ringwald    * @brief Initialization function for Q15 normalized LMS filter.
4255*e8380792SMatthias Ringwald    * @param[in] S          points to an instance of the Q15 normalized LMS filter structure.
4256*e8380792SMatthias Ringwald    * @param[in] numTaps    number of filter coefficients.
4257*e8380792SMatthias Ringwald    * @param[in] pCoeffs    points to coefficient buffer.
4258*e8380792SMatthias Ringwald    * @param[in] pState     points to state buffer.
4259*e8380792SMatthias Ringwald    * @param[in] mu         step size that controls filter coefficient updates.
4260*e8380792SMatthias Ringwald    * @param[in] blockSize  number of samples to process.
4261*e8380792SMatthias Ringwald    * @param[in] postShift  bit shift applied to coefficients.
4262*e8380792SMatthias Ringwald    */
4263*e8380792SMatthias Ringwald   void arm_lms_norm_init_q15(
4264*e8380792SMatthias Ringwald   arm_lms_norm_instance_q15 * S,
4265*e8380792SMatthias Ringwald   uint16_t numTaps,
4266*e8380792SMatthias Ringwald   q15_t * pCoeffs,
4267*e8380792SMatthias Ringwald   q15_t * pState,
4268*e8380792SMatthias Ringwald   q15_t mu,
4269*e8380792SMatthias Ringwald   uint32_t blockSize,
4270*e8380792SMatthias Ringwald   uint8_t postShift);
4271*e8380792SMatthias Ringwald 
4272*e8380792SMatthias Ringwald 
4273*e8380792SMatthias Ringwald   /**
4274*e8380792SMatthias Ringwald    * @brief Correlation of floating-point sequences.
4275*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
4276*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
4277*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
4278*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
4279*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
4280*e8380792SMatthias Ringwald    */
4281*e8380792SMatthias Ringwald   void arm_correlate_f32(
4282*e8380792SMatthias Ringwald   float32_t * pSrcA,
4283*e8380792SMatthias Ringwald   uint32_t srcALen,
4284*e8380792SMatthias Ringwald   float32_t * pSrcB,
4285*e8380792SMatthias Ringwald   uint32_t srcBLen,
4286*e8380792SMatthias Ringwald   float32_t * pDst);
4287*e8380792SMatthias Ringwald 
4288*e8380792SMatthias Ringwald 
4289*e8380792SMatthias Ringwald    /**
4290*e8380792SMatthias Ringwald    * @brief Correlation of Q15 sequences
4291*e8380792SMatthias Ringwald    * @param[in]  pSrcA     points to the first input sequence.
4292*e8380792SMatthias Ringwald    * @param[in]  srcALen   length of the first input sequence.
4293*e8380792SMatthias Ringwald    * @param[in]  pSrcB     points to the second input sequence.
4294*e8380792SMatthias Ringwald    * @param[in]  srcBLen   length of the second input sequence.
4295*e8380792SMatthias Ringwald    * @param[out] pDst      points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
4296*e8380792SMatthias Ringwald    * @param[in]  pScratch  points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
4297*e8380792SMatthias Ringwald    */
4298*e8380792SMatthias Ringwald   void arm_correlate_opt_q15(
4299*e8380792SMatthias Ringwald   q15_t * pSrcA,
4300*e8380792SMatthias Ringwald   uint32_t srcALen,
4301*e8380792SMatthias Ringwald   q15_t * pSrcB,
4302*e8380792SMatthias Ringwald   uint32_t srcBLen,
4303*e8380792SMatthias Ringwald   q15_t * pDst,
4304*e8380792SMatthias Ringwald   q15_t * pScratch);
4305*e8380792SMatthias Ringwald 
4306*e8380792SMatthias Ringwald 
4307*e8380792SMatthias Ringwald   /**
4308*e8380792SMatthias Ringwald    * @brief Correlation of Q15 sequences.
4309*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
4310*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
4311*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
4312*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
4313*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
4314*e8380792SMatthias Ringwald    */
4315*e8380792SMatthias Ringwald 
4316*e8380792SMatthias Ringwald   void arm_correlate_q15(
4317*e8380792SMatthias Ringwald   q15_t * pSrcA,
4318*e8380792SMatthias Ringwald   uint32_t srcALen,
4319*e8380792SMatthias Ringwald   q15_t * pSrcB,
4320*e8380792SMatthias Ringwald   uint32_t srcBLen,
4321*e8380792SMatthias Ringwald   q15_t * pDst);
4322*e8380792SMatthias Ringwald 
4323*e8380792SMatthias Ringwald 
4324*e8380792SMatthias Ringwald   /**
4325*e8380792SMatthias Ringwald    * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4.
4326*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
4327*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
4328*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
4329*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
4330*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
4331*e8380792SMatthias Ringwald    */
4332*e8380792SMatthias Ringwald 
4333*e8380792SMatthias Ringwald   void arm_correlate_fast_q15(
4334*e8380792SMatthias Ringwald   q15_t * pSrcA,
4335*e8380792SMatthias Ringwald   uint32_t srcALen,
4336*e8380792SMatthias Ringwald   q15_t * pSrcB,
4337*e8380792SMatthias Ringwald   uint32_t srcBLen,
4338*e8380792SMatthias Ringwald   q15_t * pDst);
4339*e8380792SMatthias Ringwald 
4340*e8380792SMatthias Ringwald 
4341*e8380792SMatthias Ringwald   /**
4342*e8380792SMatthias Ringwald    * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4.
4343*e8380792SMatthias Ringwald    * @param[in]  pSrcA     points to the first input sequence.
4344*e8380792SMatthias Ringwald    * @param[in]  srcALen   length of the first input sequence.
4345*e8380792SMatthias Ringwald    * @param[in]  pSrcB     points to the second input sequence.
4346*e8380792SMatthias Ringwald    * @param[in]  srcBLen   length of the second input sequence.
4347*e8380792SMatthias Ringwald    * @param[out] pDst      points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
4348*e8380792SMatthias Ringwald    * @param[in]  pScratch  points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
4349*e8380792SMatthias Ringwald    */
4350*e8380792SMatthias Ringwald   void arm_correlate_fast_opt_q15(
4351*e8380792SMatthias Ringwald   q15_t * pSrcA,
4352*e8380792SMatthias Ringwald   uint32_t srcALen,
4353*e8380792SMatthias Ringwald   q15_t * pSrcB,
4354*e8380792SMatthias Ringwald   uint32_t srcBLen,
4355*e8380792SMatthias Ringwald   q15_t * pDst,
4356*e8380792SMatthias Ringwald   q15_t * pScratch);
4357*e8380792SMatthias Ringwald 
4358*e8380792SMatthias Ringwald 
4359*e8380792SMatthias Ringwald   /**
4360*e8380792SMatthias Ringwald    * @brief Correlation of Q31 sequences.
4361*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
4362*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
4363*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
4364*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
4365*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
4366*e8380792SMatthias Ringwald    */
4367*e8380792SMatthias Ringwald   void arm_correlate_q31(
4368*e8380792SMatthias Ringwald   q31_t * pSrcA,
4369*e8380792SMatthias Ringwald   uint32_t srcALen,
4370*e8380792SMatthias Ringwald   q31_t * pSrcB,
4371*e8380792SMatthias Ringwald   uint32_t srcBLen,
4372*e8380792SMatthias Ringwald   q31_t * pDst);
4373*e8380792SMatthias Ringwald 
4374*e8380792SMatthias Ringwald 
4375*e8380792SMatthias Ringwald   /**
4376*e8380792SMatthias Ringwald    * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4
4377*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
4378*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
4379*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
4380*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
4381*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
4382*e8380792SMatthias Ringwald    */
4383*e8380792SMatthias Ringwald   void arm_correlate_fast_q31(
4384*e8380792SMatthias Ringwald   q31_t * pSrcA,
4385*e8380792SMatthias Ringwald   uint32_t srcALen,
4386*e8380792SMatthias Ringwald   q31_t * pSrcB,
4387*e8380792SMatthias Ringwald   uint32_t srcBLen,
4388*e8380792SMatthias Ringwald   q31_t * pDst);
4389*e8380792SMatthias Ringwald 
4390*e8380792SMatthias Ringwald 
4391*e8380792SMatthias Ringwald  /**
4392*e8380792SMatthias Ringwald    * @brief Correlation of Q7 sequences.
4393*e8380792SMatthias Ringwald    * @param[in]  pSrcA      points to the first input sequence.
4394*e8380792SMatthias Ringwald    * @param[in]  srcALen    length of the first input sequence.
4395*e8380792SMatthias Ringwald    * @param[in]  pSrcB      points to the second input sequence.
4396*e8380792SMatthias Ringwald    * @param[in]  srcBLen    length of the second input sequence.
4397*e8380792SMatthias Ringwald    * @param[out] pDst       points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
4398*e8380792SMatthias Ringwald    * @param[in]  pScratch1  points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
4399*e8380792SMatthias Ringwald    * @param[in]  pScratch2  points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
4400*e8380792SMatthias Ringwald    */
4401*e8380792SMatthias Ringwald   void arm_correlate_opt_q7(
4402*e8380792SMatthias Ringwald   q7_t * pSrcA,
4403*e8380792SMatthias Ringwald   uint32_t srcALen,
4404*e8380792SMatthias Ringwald   q7_t * pSrcB,
4405*e8380792SMatthias Ringwald   uint32_t srcBLen,
4406*e8380792SMatthias Ringwald   q7_t * pDst,
4407*e8380792SMatthias Ringwald   q15_t * pScratch1,
4408*e8380792SMatthias Ringwald   q15_t * pScratch2);
4409*e8380792SMatthias Ringwald 
4410*e8380792SMatthias Ringwald 
4411*e8380792SMatthias Ringwald   /**
4412*e8380792SMatthias Ringwald    * @brief Correlation of Q7 sequences.
4413*e8380792SMatthias Ringwald    * @param[in]  pSrcA    points to the first input sequence.
4414*e8380792SMatthias Ringwald    * @param[in]  srcALen  length of the first input sequence.
4415*e8380792SMatthias Ringwald    * @param[in]  pSrcB    points to the second input sequence.
4416*e8380792SMatthias Ringwald    * @param[in]  srcBLen  length of the second input sequence.
4417*e8380792SMatthias Ringwald    * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
4418*e8380792SMatthias Ringwald    */
4419*e8380792SMatthias Ringwald   void arm_correlate_q7(
4420*e8380792SMatthias Ringwald   q7_t * pSrcA,
4421*e8380792SMatthias Ringwald   uint32_t srcALen,
4422*e8380792SMatthias Ringwald   q7_t * pSrcB,
4423*e8380792SMatthias Ringwald   uint32_t srcBLen,
4424*e8380792SMatthias Ringwald   q7_t * pDst);
4425*e8380792SMatthias Ringwald 
4426*e8380792SMatthias Ringwald 
4427*e8380792SMatthias Ringwald   /**
4428*e8380792SMatthias Ringwald    * @brief Instance structure for the floating-point sparse FIR filter.
4429*e8380792SMatthias Ringwald    */
4430*e8380792SMatthias Ringwald   typedef struct
4431*e8380792SMatthias Ringwald   {
4432*e8380792SMatthias Ringwald     uint16_t numTaps;             /**< number of coefficients in the filter. */
4433*e8380792SMatthias Ringwald     uint16_t stateIndex;          /**< state buffer index.  Points to the oldest sample in the state buffer. */
4434*e8380792SMatthias Ringwald     float32_t *pState;            /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */
4435*e8380792SMatthias Ringwald     float32_t *pCoeffs;           /**< points to the coefficient array. The array is of length numTaps.*/
4436*e8380792SMatthias Ringwald     uint16_t maxDelay;            /**< maximum offset specified by the pTapDelay array. */
4437*e8380792SMatthias Ringwald     int32_t *pTapDelay;           /**< points to the array of delay values.  The array is of length numTaps. */
4438*e8380792SMatthias Ringwald   } arm_fir_sparse_instance_f32;
4439*e8380792SMatthias Ringwald 
4440*e8380792SMatthias Ringwald   /**
4441*e8380792SMatthias Ringwald    * @brief Instance structure for the Q31 sparse FIR filter.
4442*e8380792SMatthias Ringwald    */
4443*e8380792SMatthias Ringwald   typedef struct
4444*e8380792SMatthias Ringwald   {
4445*e8380792SMatthias Ringwald     uint16_t numTaps;             /**< number of coefficients in the filter. */
4446*e8380792SMatthias Ringwald     uint16_t stateIndex;          /**< state buffer index.  Points to the oldest sample in the state buffer. */
4447*e8380792SMatthias Ringwald     q31_t *pState;                /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */
4448*e8380792SMatthias Ringwald     q31_t *pCoeffs;               /**< points to the coefficient array. The array is of length numTaps.*/
4449*e8380792SMatthias Ringwald     uint16_t maxDelay;            /**< maximum offset specified by the pTapDelay array. */
4450*e8380792SMatthias Ringwald     int32_t *pTapDelay;           /**< points to the array of delay values.  The array is of length numTaps. */
4451*e8380792SMatthias Ringwald   } arm_fir_sparse_instance_q31;
4452*e8380792SMatthias Ringwald 
4453*e8380792SMatthias Ringwald   /**
4454*e8380792SMatthias Ringwald    * @brief Instance structure for the Q15 sparse FIR filter.
4455*e8380792SMatthias Ringwald    */
4456*e8380792SMatthias Ringwald   typedef struct
4457*e8380792SMatthias Ringwald   {
4458*e8380792SMatthias Ringwald     uint16_t numTaps;             /**< number of coefficients in the filter. */
4459*e8380792SMatthias Ringwald     uint16_t stateIndex;          /**< state buffer index.  Points to the oldest sample in the state buffer. */
4460*e8380792SMatthias Ringwald     q15_t *pState;                /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */
4461*e8380792SMatthias Ringwald     q15_t *pCoeffs;               /**< points to the coefficient array. The array is of length numTaps.*/
4462*e8380792SMatthias Ringwald     uint16_t maxDelay;            /**< maximum offset specified by the pTapDelay array. */
4463*e8380792SMatthias Ringwald     int32_t *pTapDelay;           /**< points to the array of delay values.  The array is of length numTaps. */
4464*e8380792SMatthias Ringwald   } arm_fir_sparse_instance_q15;
4465*e8380792SMatthias Ringwald 
4466*e8380792SMatthias Ringwald   /**
4467*e8380792SMatthias Ringwald    * @brief Instance structure for the Q7 sparse FIR filter.
4468*e8380792SMatthias Ringwald    */
4469*e8380792SMatthias Ringwald   typedef struct
4470*e8380792SMatthias Ringwald   {
4471*e8380792SMatthias Ringwald     uint16_t numTaps;             /**< number of coefficients in the filter. */
4472*e8380792SMatthias Ringwald     uint16_t stateIndex;          /**< state buffer index.  Points to the oldest sample in the state buffer. */
4473*e8380792SMatthias Ringwald     q7_t *pState;                 /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */
4474*e8380792SMatthias Ringwald     q7_t *pCoeffs;                /**< points to the coefficient array. The array is of length numTaps.*/
4475*e8380792SMatthias Ringwald     uint16_t maxDelay;            /**< maximum offset specified by the pTapDelay array. */
4476*e8380792SMatthias Ringwald     int32_t *pTapDelay;           /**< points to the array of delay values.  The array is of length numTaps. */
4477*e8380792SMatthias Ringwald   } arm_fir_sparse_instance_q7;
4478*e8380792SMatthias Ringwald 
4479*e8380792SMatthias Ringwald 
4480*e8380792SMatthias Ringwald   /**
4481*e8380792SMatthias Ringwald    * @brief Processing function for the floating-point sparse FIR filter.
4482*e8380792SMatthias Ringwald    * @param[in]  S           points to an instance of the floating-point sparse FIR structure.
4483*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the block of input data.
4484*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
4485*e8380792SMatthias Ringwald    * @param[in]  pScratchIn  points to a temporary buffer of size blockSize.
4486*e8380792SMatthias Ringwald    * @param[in]  blockSize   number of input samples to process per call.
4487*e8380792SMatthias Ringwald    */
4488*e8380792SMatthias Ringwald   void arm_fir_sparse_f32(
4489*e8380792SMatthias Ringwald   arm_fir_sparse_instance_f32 * S,
4490*e8380792SMatthias Ringwald   float32_t * pSrc,
4491*e8380792SMatthias Ringwald   float32_t * pDst,
4492*e8380792SMatthias Ringwald   float32_t * pScratchIn,
4493*e8380792SMatthias Ringwald   uint32_t blockSize);
4494*e8380792SMatthias Ringwald 
4495*e8380792SMatthias Ringwald 
4496*e8380792SMatthias Ringwald   /**
4497*e8380792SMatthias Ringwald    * @brief  Initialization function for the floating-point sparse FIR filter.
4498*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the floating-point sparse FIR structure.
4499*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of nonzero coefficients in the filter.
4500*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the array of filter coefficients.
4501*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
4502*e8380792SMatthias Ringwald    * @param[in]     pTapDelay  points to the array of offset times.
4503*e8380792SMatthias Ringwald    * @param[in]     maxDelay   maximum offset time supported.
4504*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of samples that will be processed per block.
4505*e8380792SMatthias Ringwald    */
4506*e8380792SMatthias Ringwald   void arm_fir_sparse_init_f32(
4507*e8380792SMatthias Ringwald   arm_fir_sparse_instance_f32 * S,
4508*e8380792SMatthias Ringwald   uint16_t numTaps,
4509*e8380792SMatthias Ringwald   float32_t * pCoeffs,
4510*e8380792SMatthias Ringwald   float32_t * pState,
4511*e8380792SMatthias Ringwald   int32_t * pTapDelay,
4512*e8380792SMatthias Ringwald   uint16_t maxDelay,
4513*e8380792SMatthias Ringwald   uint32_t blockSize);
4514*e8380792SMatthias Ringwald 
4515*e8380792SMatthias Ringwald 
4516*e8380792SMatthias Ringwald   /**
4517*e8380792SMatthias Ringwald    * @brief Processing function for the Q31 sparse FIR filter.
4518*e8380792SMatthias Ringwald    * @param[in]  S           points to an instance of the Q31 sparse FIR structure.
4519*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the block of input data.
4520*e8380792SMatthias Ringwald    * @param[out] pDst        points to the block of output data
4521*e8380792SMatthias Ringwald    * @param[in]  pScratchIn  points to a temporary buffer of size blockSize.
4522*e8380792SMatthias Ringwald    * @param[in]  blockSize   number of input samples to process per call.
4523*e8380792SMatthias Ringwald    */
4524*e8380792SMatthias Ringwald   void arm_fir_sparse_q31(
4525*e8380792SMatthias Ringwald   arm_fir_sparse_instance_q31 * S,
4526*e8380792SMatthias Ringwald   q31_t * pSrc,
4527*e8380792SMatthias Ringwald   q31_t * pDst,
4528*e8380792SMatthias Ringwald   q31_t * pScratchIn,
4529*e8380792SMatthias Ringwald   uint32_t blockSize);
4530*e8380792SMatthias Ringwald 
4531*e8380792SMatthias Ringwald 
4532*e8380792SMatthias Ringwald   /**
4533*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q31 sparse FIR filter.
4534*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q31 sparse FIR structure.
4535*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of nonzero coefficients in the filter.
4536*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the array of filter coefficients.
4537*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
4538*e8380792SMatthias Ringwald    * @param[in]     pTapDelay  points to the array of offset times.
4539*e8380792SMatthias Ringwald    * @param[in]     maxDelay   maximum offset time supported.
4540*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of samples that will be processed per block.
4541*e8380792SMatthias Ringwald    */
4542*e8380792SMatthias Ringwald   void arm_fir_sparse_init_q31(
4543*e8380792SMatthias Ringwald   arm_fir_sparse_instance_q31 * S,
4544*e8380792SMatthias Ringwald   uint16_t numTaps,
4545*e8380792SMatthias Ringwald   q31_t * pCoeffs,
4546*e8380792SMatthias Ringwald   q31_t * pState,
4547*e8380792SMatthias Ringwald   int32_t * pTapDelay,
4548*e8380792SMatthias Ringwald   uint16_t maxDelay,
4549*e8380792SMatthias Ringwald   uint32_t blockSize);
4550*e8380792SMatthias Ringwald 
4551*e8380792SMatthias Ringwald 
4552*e8380792SMatthias Ringwald   /**
4553*e8380792SMatthias Ringwald    * @brief Processing function for the Q15 sparse FIR filter.
4554*e8380792SMatthias Ringwald    * @param[in]  S            points to an instance of the Q15 sparse FIR structure.
4555*e8380792SMatthias Ringwald    * @param[in]  pSrc         points to the block of input data.
4556*e8380792SMatthias Ringwald    * @param[out] pDst         points to the block of output data
4557*e8380792SMatthias Ringwald    * @param[in]  pScratchIn   points to a temporary buffer of size blockSize.
4558*e8380792SMatthias Ringwald    * @param[in]  pScratchOut  points to a temporary buffer of size blockSize.
4559*e8380792SMatthias Ringwald    * @param[in]  blockSize    number of input samples to process per call.
4560*e8380792SMatthias Ringwald    */
4561*e8380792SMatthias Ringwald   void arm_fir_sparse_q15(
4562*e8380792SMatthias Ringwald   arm_fir_sparse_instance_q15 * S,
4563*e8380792SMatthias Ringwald   q15_t * pSrc,
4564*e8380792SMatthias Ringwald   q15_t * pDst,
4565*e8380792SMatthias Ringwald   q15_t * pScratchIn,
4566*e8380792SMatthias Ringwald   q31_t * pScratchOut,
4567*e8380792SMatthias Ringwald   uint32_t blockSize);
4568*e8380792SMatthias Ringwald 
4569*e8380792SMatthias Ringwald 
4570*e8380792SMatthias Ringwald   /**
4571*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q15 sparse FIR filter.
4572*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q15 sparse FIR structure.
4573*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of nonzero coefficients in the filter.
4574*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the array of filter coefficients.
4575*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
4576*e8380792SMatthias Ringwald    * @param[in]     pTapDelay  points to the array of offset times.
4577*e8380792SMatthias Ringwald    * @param[in]     maxDelay   maximum offset time supported.
4578*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of samples that will be processed per block.
4579*e8380792SMatthias Ringwald    */
4580*e8380792SMatthias Ringwald   void arm_fir_sparse_init_q15(
4581*e8380792SMatthias Ringwald   arm_fir_sparse_instance_q15 * S,
4582*e8380792SMatthias Ringwald   uint16_t numTaps,
4583*e8380792SMatthias Ringwald   q15_t * pCoeffs,
4584*e8380792SMatthias Ringwald   q15_t * pState,
4585*e8380792SMatthias Ringwald   int32_t * pTapDelay,
4586*e8380792SMatthias Ringwald   uint16_t maxDelay,
4587*e8380792SMatthias Ringwald   uint32_t blockSize);
4588*e8380792SMatthias Ringwald 
4589*e8380792SMatthias Ringwald 
4590*e8380792SMatthias Ringwald   /**
4591*e8380792SMatthias Ringwald    * @brief Processing function for the Q7 sparse FIR filter.
4592*e8380792SMatthias Ringwald    * @param[in]  S            points to an instance of the Q7 sparse FIR structure.
4593*e8380792SMatthias Ringwald    * @param[in]  pSrc         points to the block of input data.
4594*e8380792SMatthias Ringwald    * @param[out] pDst         points to the block of output data
4595*e8380792SMatthias Ringwald    * @param[in]  pScratchIn   points to a temporary buffer of size blockSize.
4596*e8380792SMatthias Ringwald    * @param[in]  pScratchOut  points to a temporary buffer of size blockSize.
4597*e8380792SMatthias Ringwald    * @param[in]  blockSize    number of input samples to process per call.
4598*e8380792SMatthias Ringwald    */
4599*e8380792SMatthias Ringwald   void arm_fir_sparse_q7(
4600*e8380792SMatthias Ringwald   arm_fir_sparse_instance_q7 * S,
4601*e8380792SMatthias Ringwald   q7_t * pSrc,
4602*e8380792SMatthias Ringwald   q7_t * pDst,
4603*e8380792SMatthias Ringwald   q7_t * pScratchIn,
4604*e8380792SMatthias Ringwald   q31_t * pScratchOut,
4605*e8380792SMatthias Ringwald   uint32_t blockSize);
4606*e8380792SMatthias Ringwald 
4607*e8380792SMatthias Ringwald 
4608*e8380792SMatthias Ringwald   /**
4609*e8380792SMatthias Ringwald    * @brief  Initialization function for the Q7 sparse FIR filter.
4610*e8380792SMatthias Ringwald    * @param[in,out] S          points to an instance of the Q7 sparse FIR structure.
4611*e8380792SMatthias Ringwald    * @param[in]     numTaps    number of nonzero coefficients in the filter.
4612*e8380792SMatthias Ringwald    * @param[in]     pCoeffs    points to the array of filter coefficients.
4613*e8380792SMatthias Ringwald    * @param[in]     pState     points to the state buffer.
4614*e8380792SMatthias Ringwald    * @param[in]     pTapDelay  points to the array of offset times.
4615*e8380792SMatthias Ringwald    * @param[in]     maxDelay   maximum offset time supported.
4616*e8380792SMatthias Ringwald    * @param[in]     blockSize  number of samples that will be processed per block.
4617*e8380792SMatthias Ringwald    */
4618*e8380792SMatthias Ringwald   void arm_fir_sparse_init_q7(
4619*e8380792SMatthias Ringwald   arm_fir_sparse_instance_q7 * S,
4620*e8380792SMatthias Ringwald   uint16_t numTaps,
4621*e8380792SMatthias Ringwald   q7_t * pCoeffs,
4622*e8380792SMatthias Ringwald   q7_t * pState,
4623*e8380792SMatthias Ringwald   int32_t * pTapDelay,
4624*e8380792SMatthias Ringwald   uint16_t maxDelay,
4625*e8380792SMatthias Ringwald   uint32_t blockSize);
4626*e8380792SMatthias Ringwald 
4627*e8380792SMatthias Ringwald 
4628*e8380792SMatthias Ringwald   /**
4629*e8380792SMatthias Ringwald    * @brief  Floating-point sin_cos function.
4630*e8380792SMatthias Ringwald    * @param[in]  theta   input value in degrees
4631*e8380792SMatthias Ringwald    * @param[out] pSinVal  points to the processed sine output.
4632*e8380792SMatthias Ringwald    * @param[out] pCosVal  points to the processed cos output.
4633*e8380792SMatthias Ringwald    */
4634*e8380792SMatthias Ringwald   void arm_sin_cos_f32(
4635*e8380792SMatthias Ringwald   float32_t theta,
4636*e8380792SMatthias Ringwald   float32_t * pSinVal,
4637*e8380792SMatthias Ringwald   float32_t * pCosVal);
4638*e8380792SMatthias Ringwald 
4639*e8380792SMatthias Ringwald 
4640*e8380792SMatthias Ringwald   /**
4641*e8380792SMatthias Ringwald    * @brief  Q31 sin_cos function.
4642*e8380792SMatthias Ringwald    * @param[in]  theta    scaled input value in degrees
4643*e8380792SMatthias Ringwald    * @param[out] pSinVal  points to the processed sine output.
4644*e8380792SMatthias Ringwald    * @param[out] pCosVal  points to the processed cosine output.
4645*e8380792SMatthias Ringwald    */
4646*e8380792SMatthias Ringwald   void arm_sin_cos_q31(
4647*e8380792SMatthias Ringwald   q31_t theta,
4648*e8380792SMatthias Ringwald   q31_t * pSinVal,
4649*e8380792SMatthias Ringwald   q31_t * pCosVal);
4650*e8380792SMatthias Ringwald 
4651*e8380792SMatthias Ringwald 
4652*e8380792SMatthias Ringwald   /**
4653*e8380792SMatthias Ringwald    * @brief  Floating-point complex conjugate.
4654*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the input vector
4655*e8380792SMatthias Ringwald    * @param[out] pDst        points to the output vector
4656*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in each vector
4657*e8380792SMatthias Ringwald    */
4658*e8380792SMatthias Ringwald   void arm_cmplx_conj_f32(
4659*e8380792SMatthias Ringwald   float32_t * pSrc,
4660*e8380792SMatthias Ringwald   float32_t * pDst,
4661*e8380792SMatthias Ringwald   uint32_t numSamples);
4662*e8380792SMatthias Ringwald 
4663*e8380792SMatthias Ringwald   /**
4664*e8380792SMatthias Ringwald    * @brief  Q31 complex conjugate.
4665*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the input vector
4666*e8380792SMatthias Ringwald    * @param[out] pDst        points to the output vector
4667*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in each vector
4668*e8380792SMatthias Ringwald    */
4669*e8380792SMatthias Ringwald   void arm_cmplx_conj_q31(
4670*e8380792SMatthias Ringwald   q31_t * pSrc,
4671*e8380792SMatthias Ringwald   q31_t * pDst,
4672*e8380792SMatthias Ringwald   uint32_t numSamples);
4673*e8380792SMatthias Ringwald 
4674*e8380792SMatthias Ringwald 
4675*e8380792SMatthias Ringwald   /**
4676*e8380792SMatthias Ringwald    * @brief  Q15 complex conjugate.
4677*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the input vector
4678*e8380792SMatthias Ringwald    * @param[out] pDst        points to the output vector
4679*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in each vector
4680*e8380792SMatthias Ringwald    */
4681*e8380792SMatthias Ringwald   void arm_cmplx_conj_q15(
4682*e8380792SMatthias Ringwald   q15_t * pSrc,
4683*e8380792SMatthias Ringwald   q15_t * pDst,
4684*e8380792SMatthias Ringwald   uint32_t numSamples);
4685*e8380792SMatthias Ringwald 
4686*e8380792SMatthias Ringwald 
4687*e8380792SMatthias Ringwald   /**
4688*e8380792SMatthias Ringwald    * @brief  Floating-point complex magnitude squared
4689*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the complex input vector
4690*e8380792SMatthias Ringwald    * @param[out] pDst        points to the real output vector
4691*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in the input vector
4692*e8380792SMatthias Ringwald    */
4693*e8380792SMatthias Ringwald   void arm_cmplx_mag_squared_f32(
4694*e8380792SMatthias Ringwald   float32_t * pSrc,
4695*e8380792SMatthias Ringwald   float32_t * pDst,
4696*e8380792SMatthias Ringwald   uint32_t numSamples);
4697*e8380792SMatthias Ringwald 
4698*e8380792SMatthias Ringwald 
4699*e8380792SMatthias Ringwald   /**
4700*e8380792SMatthias Ringwald    * @brief  Q31 complex magnitude squared
4701*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the complex input vector
4702*e8380792SMatthias Ringwald    * @param[out] pDst        points to the real output vector
4703*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in the input vector
4704*e8380792SMatthias Ringwald    */
4705*e8380792SMatthias Ringwald   void arm_cmplx_mag_squared_q31(
4706*e8380792SMatthias Ringwald   q31_t * pSrc,
4707*e8380792SMatthias Ringwald   q31_t * pDst,
4708*e8380792SMatthias Ringwald   uint32_t numSamples);
4709*e8380792SMatthias Ringwald 
4710*e8380792SMatthias Ringwald 
4711*e8380792SMatthias Ringwald   /**
4712*e8380792SMatthias Ringwald    * @brief  Q15 complex magnitude squared
4713*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the complex input vector
4714*e8380792SMatthias Ringwald    * @param[out] pDst        points to the real output vector
4715*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in the input vector
4716*e8380792SMatthias Ringwald    */
4717*e8380792SMatthias Ringwald   void arm_cmplx_mag_squared_q15(
4718*e8380792SMatthias Ringwald   q15_t * pSrc,
4719*e8380792SMatthias Ringwald   q15_t * pDst,
4720*e8380792SMatthias Ringwald   uint32_t numSamples);
4721*e8380792SMatthias Ringwald 
4722*e8380792SMatthias Ringwald 
4723*e8380792SMatthias Ringwald  /**
4724*e8380792SMatthias Ringwald    * @ingroup groupController
4725*e8380792SMatthias Ringwald    */
4726*e8380792SMatthias Ringwald 
4727*e8380792SMatthias Ringwald   /**
4728*e8380792SMatthias Ringwald    * @defgroup PID PID Motor Control
4729*e8380792SMatthias Ringwald    *
4730*e8380792SMatthias Ringwald    * A Proportional Integral Derivative (PID) controller is a generic feedback control
4731*e8380792SMatthias Ringwald    * loop mechanism widely used in industrial control systems.
4732*e8380792SMatthias Ringwald    * A PID controller is the most commonly used type of feedback controller.
4733*e8380792SMatthias Ringwald    *
4734*e8380792SMatthias Ringwald    * This set of functions implements (PID) controllers
4735*e8380792SMatthias Ringwald    * for Q15, Q31, and floating-point data types.  The functions operate on a single sample
4736*e8380792SMatthias Ringwald    * of data and each call to the function returns a single processed value.
4737*e8380792SMatthias Ringwald    * <code>S</code> points to an instance of the PID control data structure.  <code>in</code>
4738*e8380792SMatthias Ringwald    * is the input sample value. The functions return the output value.
4739*e8380792SMatthias Ringwald    *
4740*e8380792SMatthias Ringwald    * \par Algorithm:
4741*e8380792SMatthias Ringwald    * <pre>
4742*e8380792SMatthias Ringwald    *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
4743*e8380792SMatthias Ringwald    *    A0 = Kp + Ki + Kd
4744*e8380792SMatthias Ringwald    *    A1 = (-Kp ) - (2 * Kd )
4745*e8380792SMatthias Ringwald    *    A2 = Kd  </pre>
4746*e8380792SMatthias Ringwald    *
4747*e8380792SMatthias Ringwald    * \par
4748*e8380792SMatthias Ringwald    * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant
4749*e8380792SMatthias Ringwald    *
4750*e8380792SMatthias Ringwald    * \par
4751*e8380792SMatthias Ringwald    * \image html PID.gif "Proportional Integral Derivative Controller"
4752*e8380792SMatthias Ringwald    *
4753*e8380792SMatthias Ringwald    * \par
4754*e8380792SMatthias Ringwald    * The PID controller calculates an "error" value as the difference between
4755*e8380792SMatthias Ringwald    * the measured output and the reference input.
4756*e8380792SMatthias Ringwald    * The controller attempts to minimize the error by adjusting the process control inputs.
4757*e8380792SMatthias Ringwald    * The proportional value determines the reaction to the current error,
4758*e8380792SMatthias Ringwald    * the integral value determines the reaction based on the sum of recent errors,
4759*e8380792SMatthias Ringwald    * and the derivative value determines the reaction based on the rate at which the error has been changing.
4760*e8380792SMatthias Ringwald    *
4761*e8380792SMatthias Ringwald    * \par Instance Structure
4762*e8380792SMatthias Ringwald    * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure.
4763*e8380792SMatthias Ringwald    * A separate instance structure must be defined for each PID Controller.
4764*e8380792SMatthias Ringwald    * There are separate instance structure declarations for each of the 3 supported data types.
4765*e8380792SMatthias Ringwald    *
4766*e8380792SMatthias Ringwald    * \par Reset Functions
4767*e8380792SMatthias Ringwald    * There is also an associated reset function for each data type which clears the state array.
4768*e8380792SMatthias Ringwald    *
4769*e8380792SMatthias Ringwald    * \par Initialization Functions
4770*e8380792SMatthias Ringwald    * There is also an associated initialization function for each data type.
4771*e8380792SMatthias Ringwald    * The initialization function performs the following operations:
4772*e8380792SMatthias Ringwald    * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains.
4773*e8380792SMatthias Ringwald    * - Zeros out the values in the state buffer.
4774*e8380792SMatthias Ringwald    *
4775*e8380792SMatthias Ringwald    * \par
4776*e8380792SMatthias Ringwald    * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function.
4777*e8380792SMatthias Ringwald    *
4778*e8380792SMatthias Ringwald    * \par Fixed-Point Behavior
4779*e8380792SMatthias Ringwald    * Care must be taken when using the fixed-point versions of the PID Controller functions.
4780*e8380792SMatthias Ringwald    * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered.
4781*e8380792SMatthias Ringwald    * Refer to the function specific documentation below for usage guidelines.
4782*e8380792SMatthias Ringwald    */
4783*e8380792SMatthias Ringwald 
4784*e8380792SMatthias Ringwald   /**
4785*e8380792SMatthias Ringwald    * @addtogroup PID
4786*e8380792SMatthias Ringwald    * @{
4787*e8380792SMatthias Ringwald    */
4788*e8380792SMatthias Ringwald 
4789*e8380792SMatthias Ringwald   /**
4790*e8380792SMatthias Ringwald    * @brief  Process function for the floating-point PID Control.
4791*e8380792SMatthias Ringwald    * @param[in,out] S   is an instance of the floating-point PID Control structure
4792*e8380792SMatthias Ringwald    * @param[in]     in  input sample to process
4793*e8380792SMatthias Ringwald    * @return out processed output sample.
4794*e8380792SMatthias Ringwald    */
arm_pid_f32(arm_pid_instance_f32 * S,float32_t in)4795*e8380792SMatthias Ringwald   static __INLINE float32_t arm_pid_f32(
4796*e8380792SMatthias Ringwald   arm_pid_instance_f32 * S,
4797*e8380792SMatthias Ringwald   float32_t in)
4798*e8380792SMatthias Ringwald   {
4799*e8380792SMatthias Ringwald     float32_t out;
4800*e8380792SMatthias Ringwald 
4801*e8380792SMatthias Ringwald     /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]  */
4802*e8380792SMatthias Ringwald     out = (S->A0 * in) +
4803*e8380792SMatthias Ringwald       (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]);
4804*e8380792SMatthias Ringwald 
4805*e8380792SMatthias Ringwald     /* Update state */
4806*e8380792SMatthias Ringwald     S->state[1] = S->state[0];
4807*e8380792SMatthias Ringwald     S->state[0] = in;
4808*e8380792SMatthias Ringwald     S->state[2] = out;
4809*e8380792SMatthias Ringwald 
4810*e8380792SMatthias Ringwald     /* return to application */
4811*e8380792SMatthias Ringwald     return (out);
4812*e8380792SMatthias Ringwald 
4813*e8380792SMatthias Ringwald   }
4814*e8380792SMatthias Ringwald 
4815*e8380792SMatthias Ringwald   /**
4816*e8380792SMatthias Ringwald    * @brief  Process function for the Q31 PID Control.
4817*e8380792SMatthias Ringwald    * @param[in,out] S  points to an instance of the Q31 PID Control structure
4818*e8380792SMatthias Ringwald    * @param[in]     in  input sample to process
4819*e8380792SMatthias Ringwald    * @return out processed output sample.
4820*e8380792SMatthias Ringwald    *
4821*e8380792SMatthias Ringwald    * <b>Scaling and Overflow Behavior:</b>
4822*e8380792SMatthias Ringwald    * \par
4823*e8380792SMatthias Ringwald    * The function is implemented using an internal 64-bit accumulator.
4824*e8380792SMatthias Ringwald    * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit.
4825*e8380792SMatthias Ringwald    * Thus, if the accumulator result overflows it wraps around rather than clip.
4826*e8380792SMatthias Ringwald    * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions.
4827*e8380792SMatthias Ringwald    * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format.
4828*e8380792SMatthias Ringwald    */
arm_pid_q31(arm_pid_instance_q31 * S,q31_t in)4829*e8380792SMatthias Ringwald   static __INLINE q31_t arm_pid_q31(
4830*e8380792SMatthias Ringwald   arm_pid_instance_q31 * S,
4831*e8380792SMatthias Ringwald   q31_t in)
4832*e8380792SMatthias Ringwald   {
4833*e8380792SMatthias Ringwald     q63_t acc;
4834*e8380792SMatthias Ringwald     q31_t out;
4835*e8380792SMatthias Ringwald 
4836*e8380792SMatthias Ringwald     /* acc = A0 * x[n]  */
4837*e8380792SMatthias Ringwald     acc = (q63_t) S->A0 * in;
4838*e8380792SMatthias Ringwald 
4839*e8380792SMatthias Ringwald     /* acc += A1 * x[n-1] */
4840*e8380792SMatthias Ringwald     acc += (q63_t) S->A1 * S->state[0];
4841*e8380792SMatthias Ringwald 
4842*e8380792SMatthias Ringwald     /* acc += A2 * x[n-2]  */
4843*e8380792SMatthias Ringwald     acc += (q63_t) S->A2 * S->state[1];
4844*e8380792SMatthias Ringwald 
4845*e8380792SMatthias Ringwald     /* convert output to 1.31 format to add y[n-1] */
4846*e8380792SMatthias Ringwald     out = (q31_t) (acc >> 31u);
4847*e8380792SMatthias Ringwald 
4848*e8380792SMatthias Ringwald     /* out += y[n-1] */
4849*e8380792SMatthias Ringwald     out += S->state[2];
4850*e8380792SMatthias Ringwald 
4851*e8380792SMatthias Ringwald     /* Update state */
4852*e8380792SMatthias Ringwald     S->state[1] = S->state[0];
4853*e8380792SMatthias Ringwald     S->state[0] = in;
4854*e8380792SMatthias Ringwald     S->state[2] = out;
4855*e8380792SMatthias Ringwald 
4856*e8380792SMatthias Ringwald     /* return to application */
4857*e8380792SMatthias Ringwald     return (out);
4858*e8380792SMatthias Ringwald   }
4859*e8380792SMatthias Ringwald 
4860*e8380792SMatthias Ringwald 
4861*e8380792SMatthias Ringwald   /**
4862*e8380792SMatthias Ringwald    * @brief  Process function for the Q15 PID Control.
4863*e8380792SMatthias Ringwald    * @param[in,out] S   points to an instance of the Q15 PID Control structure
4864*e8380792SMatthias Ringwald    * @param[in]     in  input sample to process
4865*e8380792SMatthias Ringwald    * @return out processed output sample.
4866*e8380792SMatthias Ringwald    *
4867*e8380792SMatthias Ringwald    * <b>Scaling and Overflow Behavior:</b>
4868*e8380792SMatthias Ringwald    * \par
4869*e8380792SMatthias Ringwald    * The function is implemented using a 64-bit internal accumulator.
4870*e8380792SMatthias Ringwald    * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result.
4871*e8380792SMatthias Ringwald    * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format.
4872*e8380792SMatthias Ringwald    * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved.
4873*e8380792SMatthias Ringwald    * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits.
4874*e8380792SMatthias Ringwald    * Lastly, the accumulator is saturated to yield a result in 1.15 format.
4875*e8380792SMatthias Ringwald    */
arm_pid_q15(arm_pid_instance_q15 * S,q15_t in)4876*e8380792SMatthias Ringwald   static __INLINE q15_t arm_pid_q15(
4877*e8380792SMatthias Ringwald   arm_pid_instance_q15 * S,
4878*e8380792SMatthias Ringwald   q15_t in)
4879*e8380792SMatthias Ringwald   {
4880*e8380792SMatthias Ringwald     q63_t acc;
4881*e8380792SMatthias Ringwald     q15_t out;
4882*e8380792SMatthias Ringwald 
4883*e8380792SMatthias Ringwald #ifndef ARM_MATH_CM0_FAMILY
4884*e8380792SMatthias Ringwald     __SIMD32_TYPE *vstate;
4885*e8380792SMatthias Ringwald 
4886*e8380792SMatthias Ringwald     /* Implementation of PID controller */
4887*e8380792SMatthias Ringwald 
4888*e8380792SMatthias Ringwald     /* acc = A0 * x[n]  */
4889*e8380792SMatthias Ringwald     acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in);
4890*e8380792SMatthias Ringwald 
4891*e8380792SMatthias Ringwald     /* acc += A1 * x[n-1] + A2 * x[n-2]  */
4892*e8380792SMatthias Ringwald     vstate = __SIMD32_CONST(S->state);
4893*e8380792SMatthias Ringwald     acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)*vstate, (uint64_t)acc);
4894*e8380792SMatthias Ringwald #else
4895*e8380792SMatthias Ringwald     /* acc = A0 * x[n]  */
4896*e8380792SMatthias Ringwald     acc = ((q31_t) S->A0) * in;
4897*e8380792SMatthias Ringwald 
4898*e8380792SMatthias Ringwald     /* acc += A1 * x[n-1] + A2 * x[n-2]  */
4899*e8380792SMatthias Ringwald     acc += (q31_t) S->A1 * S->state[0];
4900*e8380792SMatthias Ringwald     acc += (q31_t) S->A2 * S->state[1];
4901*e8380792SMatthias Ringwald #endif
4902*e8380792SMatthias Ringwald 
4903*e8380792SMatthias Ringwald     /* acc += y[n-1] */
4904*e8380792SMatthias Ringwald     acc += (q31_t) S->state[2] << 15;
4905*e8380792SMatthias Ringwald 
4906*e8380792SMatthias Ringwald     /* saturate the output */
4907*e8380792SMatthias Ringwald     out = (q15_t) (__SSAT((acc >> 15), 16));
4908*e8380792SMatthias Ringwald 
4909*e8380792SMatthias Ringwald     /* Update state */
4910*e8380792SMatthias Ringwald     S->state[1] = S->state[0];
4911*e8380792SMatthias Ringwald     S->state[0] = in;
4912*e8380792SMatthias Ringwald     S->state[2] = out;
4913*e8380792SMatthias Ringwald 
4914*e8380792SMatthias Ringwald     /* return to application */
4915*e8380792SMatthias Ringwald     return (out);
4916*e8380792SMatthias Ringwald   }
4917*e8380792SMatthias Ringwald 
4918*e8380792SMatthias Ringwald   /**
4919*e8380792SMatthias Ringwald    * @} end of PID group
4920*e8380792SMatthias Ringwald    */
4921*e8380792SMatthias Ringwald 
4922*e8380792SMatthias Ringwald 
4923*e8380792SMatthias Ringwald   /**
4924*e8380792SMatthias Ringwald    * @brief Floating-point matrix inverse.
4925*e8380792SMatthias Ringwald    * @param[in]  src   points to the instance of the input floating-point matrix structure.
4926*e8380792SMatthias Ringwald    * @param[out] dst   points to the instance of the output floating-point matrix structure.
4927*e8380792SMatthias Ringwald    * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
4928*e8380792SMatthias Ringwald    * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR.
4929*e8380792SMatthias Ringwald    */
4930*e8380792SMatthias Ringwald   arm_status arm_mat_inverse_f32(
4931*e8380792SMatthias Ringwald   const arm_matrix_instance_f32 * src,
4932*e8380792SMatthias Ringwald   arm_matrix_instance_f32 * dst);
4933*e8380792SMatthias Ringwald 
4934*e8380792SMatthias Ringwald 
4935*e8380792SMatthias Ringwald   /**
4936*e8380792SMatthias Ringwald    * @brief Floating-point matrix inverse.
4937*e8380792SMatthias Ringwald    * @param[in]  src   points to the instance of the input floating-point matrix structure.
4938*e8380792SMatthias Ringwald    * @param[out] dst   points to the instance of the output floating-point matrix structure.
4939*e8380792SMatthias Ringwald    * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.
4940*e8380792SMatthias Ringwald    * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR.
4941*e8380792SMatthias Ringwald    */
4942*e8380792SMatthias Ringwald   arm_status arm_mat_inverse_f64(
4943*e8380792SMatthias Ringwald   const arm_matrix_instance_f64 * src,
4944*e8380792SMatthias Ringwald   arm_matrix_instance_f64 * dst);
4945*e8380792SMatthias Ringwald 
4946*e8380792SMatthias Ringwald 
4947*e8380792SMatthias Ringwald 
4948*e8380792SMatthias Ringwald   /**
4949*e8380792SMatthias Ringwald    * @ingroup groupController
4950*e8380792SMatthias Ringwald    */
4951*e8380792SMatthias Ringwald 
4952*e8380792SMatthias Ringwald   /**
4953*e8380792SMatthias Ringwald    * @defgroup clarke Vector Clarke Transform
4954*e8380792SMatthias Ringwald    * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector.
4955*e8380792SMatthias Ringwald    * Generally the Clarke transform uses three-phase currents <code>Ia, Ib and Ic</code> to calculate currents
4956*e8380792SMatthias Ringwald    * in the two-phase orthogonal stator axis <code>Ialpha</code> and <code>Ibeta</code>.
4957*e8380792SMatthias Ringwald    * When <code>Ialpha</code> is superposed with <code>Ia</code> as shown in the figure below
4958*e8380792SMatthias Ringwald    * \image html clarke.gif Stator current space vector and its components in (a,b).
4959*e8380792SMatthias Ringwald    * and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code>
4960*e8380792SMatthias Ringwald    * can be calculated using only <code>Ia</code> and <code>Ib</code>.
4961*e8380792SMatthias Ringwald    *
4962*e8380792SMatthias Ringwald    * The function operates on a single sample of data and each call to the function returns the processed output.
4963*e8380792SMatthias Ringwald    * The library provides separate functions for Q31 and floating-point data types.
4964*e8380792SMatthias Ringwald    * \par Algorithm
4965*e8380792SMatthias Ringwald    * \image html clarkeFormula.gif
4966*e8380792SMatthias Ringwald    * where <code>Ia</code> and <code>Ib</code> are the instantaneous stator phases and
4967*e8380792SMatthias Ringwald    * <code>pIalpha</code> and <code>pIbeta</code> are the two coordinates of time invariant vector.
4968*e8380792SMatthias Ringwald    * \par Fixed-Point Behavior
4969*e8380792SMatthias Ringwald    * Care must be taken when using the Q31 version of the Clarke transform.
4970*e8380792SMatthias Ringwald    * In particular, the overflow and saturation behavior of the accumulator used must be considered.
4971*e8380792SMatthias Ringwald    * Refer to the function specific documentation below for usage guidelines.
4972*e8380792SMatthias Ringwald    */
4973*e8380792SMatthias Ringwald 
4974*e8380792SMatthias Ringwald   /**
4975*e8380792SMatthias Ringwald    * @addtogroup clarke
4976*e8380792SMatthias Ringwald    * @{
4977*e8380792SMatthias Ringwald    */
4978*e8380792SMatthias Ringwald 
4979*e8380792SMatthias Ringwald   /**
4980*e8380792SMatthias Ringwald    *
4981*e8380792SMatthias Ringwald    * @brief  Floating-point Clarke transform
4982*e8380792SMatthias Ringwald    * @param[in]  Ia       input three-phase coordinate <code>a</code>
4983*e8380792SMatthias Ringwald    * @param[in]  Ib       input three-phase coordinate <code>b</code>
4984*e8380792SMatthias Ringwald    * @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha
4985*e8380792SMatthias Ringwald    * @param[out] pIbeta   points to output two-phase orthogonal vector axis beta
4986*e8380792SMatthias Ringwald    */
arm_clarke_f32(float32_t Ia,float32_t Ib,float32_t * pIalpha,float32_t * pIbeta)4987*e8380792SMatthias Ringwald   static __INLINE void arm_clarke_f32(
4988*e8380792SMatthias Ringwald   float32_t Ia,
4989*e8380792SMatthias Ringwald   float32_t Ib,
4990*e8380792SMatthias Ringwald   float32_t * pIalpha,
4991*e8380792SMatthias Ringwald   float32_t * pIbeta)
4992*e8380792SMatthias Ringwald   {
4993*e8380792SMatthias Ringwald     /* Calculate pIalpha using the equation, pIalpha = Ia */
4994*e8380792SMatthias Ringwald     *pIalpha = Ia;
4995*e8380792SMatthias Ringwald 
4996*e8380792SMatthias Ringwald     /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */
4997*e8380792SMatthias Ringwald     *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib);
4998*e8380792SMatthias Ringwald   }
4999*e8380792SMatthias Ringwald 
5000*e8380792SMatthias Ringwald 
5001*e8380792SMatthias Ringwald   /**
5002*e8380792SMatthias Ringwald    * @brief  Clarke transform for Q31 version
5003*e8380792SMatthias Ringwald    * @param[in]  Ia       input three-phase coordinate <code>a</code>
5004*e8380792SMatthias Ringwald    * @param[in]  Ib       input three-phase coordinate <code>b</code>
5005*e8380792SMatthias Ringwald    * @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha
5006*e8380792SMatthias Ringwald    * @param[out] pIbeta   points to output two-phase orthogonal vector axis beta
5007*e8380792SMatthias Ringwald    *
5008*e8380792SMatthias Ringwald    * <b>Scaling and Overflow Behavior:</b>
5009*e8380792SMatthias Ringwald    * \par
5010*e8380792SMatthias Ringwald    * The function is implemented using an internal 32-bit accumulator.
5011*e8380792SMatthias Ringwald    * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
5012*e8380792SMatthias Ringwald    * There is saturation on the addition, hence there is no risk of overflow.
5013*e8380792SMatthias Ringwald    */
arm_clarke_q31(q31_t Ia,q31_t Ib,q31_t * pIalpha,q31_t * pIbeta)5014*e8380792SMatthias Ringwald   static __INLINE void arm_clarke_q31(
5015*e8380792SMatthias Ringwald   q31_t Ia,
5016*e8380792SMatthias Ringwald   q31_t Ib,
5017*e8380792SMatthias Ringwald   q31_t * pIalpha,
5018*e8380792SMatthias Ringwald   q31_t * pIbeta)
5019*e8380792SMatthias Ringwald   {
5020*e8380792SMatthias Ringwald     q31_t product1, product2;                    /* Temporary variables used to store intermediate results */
5021*e8380792SMatthias Ringwald 
5022*e8380792SMatthias Ringwald     /* Calculating pIalpha from Ia by equation pIalpha = Ia */
5023*e8380792SMatthias Ringwald     *pIalpha = Ia;
5024*e8380792SMatthias Ringwald 
5025*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */
5026*e8380792SMatthias Ringwald     product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30);
5027*e8380792SMatthias Ringwald 
5028*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (2/sqrt(3) * Ib) */
5029*e8380792SMatthias Ringwald     product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30);
5030*e8380792SMatthias Ringwald 
5031*e8380792SMatthias Ringwald     /* pIbeta is calculated by adding the intermediate products */
5032*e8380792SMatthias Ringwald     *pIbeta = __QADD(product1, product2);
5033*e8380792SMatthias Ringwald   }
5034*e8380792SMatthias Ringwald 
5035*e8380792SMatthias Ringwald   /**
5036*e8380792SMatthias Ringwald    * @} end of clarke group
5037*e8380792SMatthias Ringwald    */
5038*e8380792SMatthias Ringwald 
5039*e8380792SMatthias Ringwald   /**
5040*e8380792SMatthias Ringwald    * @brief  Converts the elements of the Q7 vector to Q31 vector.
5041*e8380792SMatthias Ringwald    * @param[in]  pSrc       input pointer
5042*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
5043*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
5044*e8380792SMatthias Ringwald    */
5045*e8380792SMatthias Ringwald   void arm_q7_to_q31(
5046*e8380792SMatthias Ringwald   q7_t * pSrc,
5047*e8380792SMatthias Ringwald   q31_t * pDst,
5048*e8380792SMatthias Ringwald   uint32_t blockSize);
5049*e8380792SMatthias Ringwald 
5050*e8380792SMatthias Ringwald 
5051*e8380792SMatthias Ringwald 
5052*e8380792SMatthias Ringwald   /**
5053*e8380792SMatthias Ringwald    * @ingroup groupController
5054*e8380792SMatthias Ringwald    */
5055*e8380792SMatthias Ringwald 
5056*e8380792SMatthias Ringwald   /**
5057*e8380792SMatthias Ringwald    * @defgroup inv_clarke Vector Inverse Clarke Transform
5058*e8380792SMatthias Ringwald    * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases.
5059*e8380792SMatthias Ringwald    *
5060*e8380792SMatthias Ringwald    * The function operates on a single sample of data and each call to the function returns the processed output.
5061*e8380792SMatthias Ringwald    * The library provides separate functions for Q31 and floating-point data types.
5062*e8380792SMatthias Ringwald    * \par Algorithm
5063*e8380792SMatthias Ringwald    * \image html clarkeInvFormula.gif
5064*e8380792SMatthias Ringwald    * where <code>pIa</code> and <code>pIb</code> are the instantaneous stator phases and
5065*e8380792SMatthias Ringwald    * <code>Ialpha</code> and <code>Ibeta</code> are the two coordinates of time invariant vector.
5066*e8380792SMatthias Ringwald    * \par Fixed-Point Behavior
5067*e8380792SMatthias Ringwald    * Care must be taken when using the Q31 version of the Clarke transform.
5068*e8380792SMatthias Ringwald    * In particular, the overflow and saturation behavior of the accumulator used must be considered.
5069*e8380792SMatthias Ringwald    * Refer to the function specific documentation below for usage guidelines.
5070*e8380792SMatthias Ringwald    */
5071*e8380792SMatthias Ringwald 
5072*e8380792SMatthias Ringwald   /**
5073*e8380792SMatthias Ringwald    * @addtogroup inv_clarke
5074*e8380792SMatthias Ringwald    * @{
5075*e8380792SMatthias Ringwald    */
5076*e8380792SMatthias Ringwald 
5077*e8380792SMatthias Ringwald    /**
5078*e8380792SMatthias Ringwald    * @brief  Floating-point Inverse Clarke transform
5079*e8380792SMatthias Ringwald    * @param[in]  Ialpha  input two-phase orthogonal vector axis alpha
5080*e8380792SMatthias Ringwald    * @param[in]  Ibeta   input two-phase orthogonal vector axis beta
5081*e8380792SMatthias Ringwald    * @param[out] pIa     points to output three-phase coordinate <code>a</code>
5082*e8380792SMatthias Ringwald    * @param[out] pIb     points to output three-phase coordinate <code>b</code>
5083*e8380792SMatthias Ringwald    */
arm_inv_clarke_f32(float32_t Ialpha,float32_t Ibeta,float32_t * pIa,float32_t * pIb)5084*e8380792SMatthias Ringwald   static __INLINE void arm_inv_clarke_f32(
5085*e8380792SMatthias Ringwald   float32_t Ialpha,
5086*e8380792SMatthias Ringwald   float32_t Ibeta,
5087*e8380792SMatthias Ringwald   float32_t * pIa,
5088*e8380792SMatthias Ringwald   float32_t * pIb)
5089*e8380792SMatthias Ringwald   {
5090*e8380792SMatthias Ringwald     /* Calculating pIa from Ialpha by equation pIa = Ialpha */
5091*e8380792SMatthias Ringwald     *pIa = Ialpha;
5092*e8380792SMatthias Ringwald 
5093*e8380792SMatthias Ringwald     /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */
5094*e8380792SMatthias Ringwald     *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta;
5095*e8380792SMatthias Ringwald   }
5096*e8380792SMatthias Ringwald 
5097*e8380792SMatthias Ringwald 
5098*e8380792SMatthias Ringwald   /**
5099*e8380792SMatthias Ringwald    * @brief  Inverse Clarke transform for Q31 version
5100*e8380792SMatthias Ringwald    * @param[in]  Ialpha  input two-phase orthogonal vector axis alpha
5101*e8380792SMatthias Ringwald    * @param[in]  Ibeta   input two-phase orthogonal vector axis beta
5102*e8380792SMatthias Ringwald    * @param[out] pIa     points to output three-phase coordinate <code>a</code>
5103*e8380792SMatthias Ringwald    * @param[out] pIb     points to output three-phase coordinate <code>b</code>
5104*e8380792SMatthias Ringwald    *
5105*e8380792SMatthias Ringwald    * <b>Scaling and Overflow Behavior:</b>
5106*e8380792SMatthias Ringwald    * \par
5107*e8380792SMatthias Ringwald    * The function is implemented using an internal 32-bit accumulator.
5108*e8380792SMatthias Ringwald    * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
5109*e8380792SMatthias Ringwald    * There is saturation on the subtraction, hence there is no risk of overflow.
5110*e8380792SMatthias Ringwald    */
arm_inv_clarke_q31(q31_t Ialpha,q31_t Ibeta,q31_t * pIa,q31_t * pIb)5111*e8380792SMatthias Ringwald   static __INLINE void arm_inv_clarke_q31(
5112*e8380792SMatthias Ringwald   q31_t Ialpha,
5113*e8380792SMatthias Ringwald   q31_t Ibeta,
5114*e8380792SMatthias Ringwald   q31_t * pIa,
5115*e8380792SMatthias Ringwald   q31_t * pIb)
5116*e8380792SMatthias Ringwald   {
5117*e8380792SMatthias Ringwald     q31_t product1, product2;                    /* Temporary variables used to store intermediate results */
5118*e8380792SMatthias Ringwald 
5119*e8380792SMatthias Ringwald     /* Calculating pIa from Ialpha by equation pIa = Ialpha */
5120*e8380792SMatthias Ringwald     *pIa = Ialpha;
5121*e8380792SMatthias Ringwald 
5122*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */
5123*e8380792SMatthias Ringwald     product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31);
5124*e8380792SMatthias Ringwald 
5125*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (1/sqrt(3) * pIb) */
5126*e8380792SMatthias Ringwald     product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31);
5127*e8380792SMatthias Ringwald 
5128*e8380792SMatthias Ringwald     /* pIb is calculated by subtracting the products */
5129*e8380792SMatthias Ringwald     *pIb = __QSUB(product2, product1);
5130*e8380792SMatthias Ringwald   }
5131*e8380792SMatthias Ringwald 
5132*e8380792SMatthias Ringwald   /**
5133*e8380792SMatthias Ringwald    * @} end of inv_clarke group
5134*e8380792SMatthias Ringwald    */
5135*e8380792SMatthias Ringwald 
5136*e8380792SMatthias Ringwald   /**
5137*e8380792SMatthias Ringwald    * @brief  Converts the elements of the Q7 vector to Q15 vector.
5138*e8380792SMatthias Ringwald    * @param[in]  pSrc       input pointer
5139*e8380792SMatthias Ringwald    * @param[out] pDst       output pointer
5140*e8380792SMatthias Ringwald    * @param[in]  blockSize  number of samples to process
5141*e8380792SMatthias Ringwald    */
5142*e8380792SMatthias Ringwald   void arm_q7_to_q15(
5143*e8380792SMatthias Ringwald   q7_t * pSrc,
5144*e8380792SMatthias Ringwald   q15_t * pDst,
5145*e8380792SMatthias Ringwald   uint32_t blockSize);
5146*e8380792SMatthias Ringwald 
5147*e8380792SMatthias Ringwald 
5148*e8380792SMatthias Ringwald 
5149*e8380792SMatthias Ringwald   /**
5150*e8380792SMatthias Ringwald    * @ingroup groupController
5151*e8380792SMatthias Ringwald    */
5152*e8380792SMatthias Ringwald 
5153*e8380792SMatthias Ringwald   /**
5154*e8380792SMatthias Ringwald    * @defgroup park Vector Park Transform
5155*e8380792SMatthias Ringwald    *
5156*e8380792SMatthias Ringwald    * Forward Park transform converts the input two-coordinate vector to flux and torque components.
5157*e8380792SMatthias Ringwald    * The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents
5158*e8380792SMatthias Ringwald    * from the stationary to the moving reference frame and control the spatial relationship between
5159*e8380792SMatthias Ringwald    * the stator vector current and rotor flux vector.
5160*e8380792SMatthias Ringwald    * If we consider the d axis aligned with the rotor flux, the diagram below shows the
5161*e8380792SMatthias Ringwald    * current vector and the relationship from the two reference frames:
5162*e8380792SMatthias Ringwald    * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame"
5163*e8380792SMatthias Ringwald    *
5164*e8380792SMatthias Ringwald    * The function operates on a single sample of data and each call to the function returns the processed output.
5165*e8380792SMatthias Ringwald    * The library provides separate functions for Q31 and floating-point data types.
5166*e8380792SMatthias Ringwald    * \par Algorithm
5167*e8380792SMatthias Ringwald    * \image html parkFormula.gif
5168*e8380792SMatthias Ringwald    * where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components,
5169*e8380792SMatthias Ringwald    * <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the
5170*e8380792SMatthias Ringwald    * cosine and sine values of theta (rotor flux position).
5171*e8380792SMatthias Ringwald    * \par Fixed-Point Behavior
5172*e8380792SMatthias Ringwald    * Care must be taken when using the Q31 version of the Park transform.
5173*e8380792SMatthias Ringwald    * In particular, the overflow and saturation behavior of the accumulator used must be considered.
5174*e8380792SMatthias Ringwald    * Refer to the function specific documentation below for usage guidelines.
5175*e8380792SMatthias Ringwald    */
5176*e8380792SMatthias Ringwald 
5177*e8380792SMatthias Ringwald   /**
5178*e8380792SMatthias Ringwald    * @addtogroup park
5179*e8380792SMatthias Ringwald    * @{
5180*e8380792SMatthias Ringwald    */
5181*e8380792SMatthias Ringwald 
5182*e8380792SMatthias Ringwald   /**
5183*e8380792SMatthias Ringwald    * @brief Floating-point Park transform
5184*e8380792SMatthias Ringwald    * @param[in]  Ialpha  input two-phase vector coordinate alpha
5185*e8380792SMatthias Ringwald    * @param[in]  Ibeta   input two-phase vector coordinate beta
5186*e8380792SMatthias Ringwald    * @param[out] pId     points to output   rotor reference frame d
5187*e8380792SMatthias Ringwald    * @param[out] pIq     points to output   rotor reference frame q
5188*e8380792SMatthias Ringwald    * @param[in]  sinVal  sine value of rotation angle theta
5189*e8380792SMatthias Ringwald    * @param[in]  cosVal  cosine value of rotation angle theta
5190*e8380792SMatthias Ringwald    *
5191*e8380792SMatthias Ringwald    * The function implements the forward Park transform.
5192*e8380792SMatthias Ringwald    *
5193*e8380792SMatthias Ringwald    */
arm_park_f32(float32_t Ialpha,float32_t Ibeta,float32_t * pId,float32_t * pIq,float32_t sinVal,float32_t cosVal)5194*e8380792SMatthias Ringwald   static __INLINE void arm_park_f32(
5195*e8380792SMatthias Ringwald   float32_t Ialpha,
5196*e8380792SMatthias Ringwald   float32_t Ibeta,
5197*e8380792SMatthias Ringwald   float32_t * pId,
5198*e8380792SMatthias Ringwald   float32_t * pIq,
5199*e8380792SMatthias Ringwald   float32_t sinVal,
5200*e8380792SMatthias Ringwald   float32_t cosVal)
5201*e8380792SMatthias Ringwald   {
5202*e8380792SMatthias Ringwald     /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */
5203*e8380792SMatthias Ringwald     *pId = Ialpha * cosVal + Ibeta * sinVal;
5204*e8380792SMatthias Ringwald 
5205*e8380792SMatthias Ringwald     /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */
5206*e8380792SMatthias Ringwald     *pIq = -Ialpha * sinVal + Ibeta * cosVal;
5207*e8380792SMatthias Ringwald   }
5208*e8380792SMatthias Ringwald 
5209*e8380792SMatthias Ringwald 
5210*e8380792SMatthias Ringwald   /**
5211*e8380792SMatthias Ringwald    * @brief  Park transform for Q31 version
5212*e8380792SMatthias Ringwald    * @param[in]  Ialpha  input two-phase vector coordinate alpha
5213*e8380792SMatthias Ringwald    * @param[in]  Ibeta   input two-phase vector coordinate beta
5214*e8380792SMatthias Ringwald    * @param[out] pId     points to output rotor reference frame d
5215*e8380792SMatthias Ringwald    * @param[out] pIq     points to output rotor reference frame q
5216*e8380792SMatthias Ringwald    * @param[in]  sinVal  sine value of rotation angle theta
5217*e8380792SMatthias Ringwald    * @param[in]  cosVal  cosine value of rotation angle theta
5218*e8380792SMatthias Ringwald    *
5219*e8380792SMatthias Ringwald    * <b>Scaling and Overflow Behavior:</b>
5220*e8380792SMatthias Ringwald    * \par
5221*e8380792SMatthias Ringwald    * The function is implemented using an internal 32-bit accumulator.
5222*e8380792SMatthias Ringwald    * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
5223*e8380792SMatthias Ringwald    * There is saturation on the addition and subtraction, hence there is no risk of overflow.
5224*e8380792SMatthias Ringwald    */
arm_park_q31(q31_t Ialpha,q31_t Ibeta,q31_t * pId,q31_t * pIq,q31_t sinVal,q31_t cosVal)5225*e8380792SMatthias Ringwald   static __INLINE void arm_park_q31(
5226*e8380792SMatthias Ringwald   q31_t Ialpha,
5227*e8380792SMatthias Ringwald   q31_t Ibeta,
5228*e8380792SMatthias Ringwald   q31_t * pId,
5229*e8380792SMatthias Ringwald   q31_t * pIq,
5230*e8380792SMatthias Ringwald   q31_t sinVal,
5231*e8380792SMatthias Ringwald   q31_t cosVal)
5232*e8380792SMatthias Ringwald   {
5233*e8380792SMatthias Ringwald     q31_t product1, product2;                    /* Temporary variables used to store intermediate results */
5234*e8380792SMatthias Ringwald     q31_t product3, product4;                    /* Temporary variables used to store intermediate results */
5235*e8380792SMatthias Ringwald 
5236*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (Ialpha * cosVal) */
5237*e8380792SMatthias Ringwald     product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31);
5238*e8380792SMatthias Ringwald 
5239*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (Ibeta * sinVal) */
5240*e8380792SMatthias Ringwald     product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31);
5241*e8380792SMatthias Ringwald 
5242*e8380792SMatthias Ringwald 
5243*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (Ialpha * sinVal) */
5244*e8380792SMatthias Ringwald     product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31);
5245*e8380792SMatthias Ringwald 
5246*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (Ibeta * cosVal) */
5247*e8380792SMatthias Ringwald     product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31);
5248*e8380792SMatthias Ringwald 
5249*e8380792SMatthias Ringwald     /* Calculate pId by adding the two intermediate products 1 and 2 */
5250*e8380792SMatthias Ringwald     *pId = __QADD(product1, product2);
5251*e8380792SMatthias Ringwald 
5252*e8380792SMatthias Ringwald     /* Calculate pIq by subtracting the two intermediate products 3 from 4 */
5253*e8380792SMatthias Ringwald     *pIq = __QSUB(product4, product3);
5254*e8380792SMatthias Ringwald   }
5255*e8380792SMatthias Ringwald 
5256*e8380792SMatthias Ringwald   /**
5257*e8380792SMatthias Ringwald    * @} end of park group
5258*e8380792SMatthias Ringwald    */
5259*e8380792SMatthias Ringwald 
5260*e8380792SMatthias Ringwald   /**
5261*e8380792SMatthias Ringwald    * @brief  Converts the elements of the Q7 vector to floating-point vector.
5262*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
5263*e8380792SMatthias Ringwald    * @param[out] pDst       is output pointer
5264*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
5265*e8380792SMatthias Ringwald    */
5266*e8380792SMatthias Ringwald   void arm_q7_to_float(
5267*e8380792SMatthias Ringwald   q7_t * pSrc,
5268*e8380792SMatthias Ringwald   float32_t * pDst,
5269*e8380792SMatthias Ringwald   uint32_t blockSize);
5270*e8380792SMatthias Ringwald 
5271*e8380792SMatthias Ringwald 
5272*e8380792SMatthias Ringwald   /**
5273*e8380792SMatthias Ringwald    * @ingroup groupController
5274*e8380792SMatthias Ringwald    */
5275*e8380792SMatthias Ringwald 
5276*e8380792SMatthias Ringwald   /**
5277*e8380792SMatthias Ringwald    * @defgroup inv_park Vector Inverse Park transform
5278*e8380792SMatthias Ringwald    * Inverse Park transform converts the input flux and torque components to two-coordinate vector.
5279*e8380792SMatthias Ringwald    *
5280*e8380792SMatthias Ringwald    * The function operates on a single sample of data and each call to the function returns the processed output.
5281*e8380792SMatthias Ringwald    * The library provides separate functions for Q31 and floating-point data types.
5282*e8380792SMatthias Ringwald    * \par Algorithm
5283*e8380792SMatthias Ringwald    * \image html parkInvFormula.gif
5284*e8380792SMatthias Ringwald    * where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components,
5285*e8380792SMatthias Ringwald    * <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the
5286*e8380792SMatthias Ringwald    * cosine and sine values of theta (rotor flux position).
5287*e8380792SMatthias Ringwald    * \par Fixed-Point Behavior
5288*e8380792SMatthias Ringwald    * Care must be taken when using the Q31 version of the Park transform.
5289*e8380792SMatthias Ringwald    * In particular, the overflow and saturation behavior of the accumulator used must be considered.
5290*e8380792SMatthias Ringwald    * Refer to the function specific documentation below for usage guidelines.
5291*e8380792SMatthias Ringwald    */
5292*e8380792SMatthias Ringwald 
5293*e8380792SMatthias Ringwald   /**
5294*e8380792SMatthias Ringwald    * @addtogroup inv_park
5295*e8380792SMatthias Ringwald    * @{
5296*e8380792SMatthias Ringwald    */
5297*e8380792SMatthias Ringwald 
5298*e8380792SMatthias Ringwald    /**
5299*e8380792SMatthias Ringwald    * @brief  Floating-point Inverse Park transform
5300*e8380792SMatthias Ringwald    * @param[in]  Id       input coordinate of rotor reference frame d
5301*e8380792SMatthias Ringwald    * @param[in]  Iq       input coordinate of rotor reference frame q
5302*e8380792SMatthias Ringwald    * @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha
5303*e8380792SMatthias Ringwald    * @param[out] pIbeta   points to output two-phase orthogonal vector axis beta
5304*e8380792SMatthias Ringwald    * @param[in]  sinVal   sine value of rotation angle theta
5305*e8380792SMatthias Ringwald    * @param[in]  cosVal   cosine value of rotation angle theta
5306*e8380792SMatthias Ringwald    */
arm_inv_park_f32(float32_t Id,float32_t Iq,float32_t * pIalpha,float32_t * pIbeta,float32_t sinVal,float32_t cosVal)5307*e8380792SMatthias Ringwald   static __INLINE void arm_inv_park_f32(
5308*e8380792SMatthias Ringwald   float32_t Id,
5309*e8380792SMatthias Ringwald   float32_t Iq,
5310*e8380792SMatthias Ringwald   float32_t * pIalpha,
5311*e8380792SMatthias Ringwald   float32_t * pIbeta,
5312*e8380792SMatthias Ringwald   float32_t sinVal,
5313*e8380792SMatthias Ringwald   float32_t cosVal)
5314*e8380792SMatthias Ringwald   {
5315*e8380792SMatthias Ringwald     /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */
5316*e8380792SMatthias Ringwald     *pIalpha = Id * cosVal - Iq * sinVal;
5317*e8380792SMatthias Ringwald 
5318*e8380792SMatthias Ringwald     /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */
5319*e8380792SMatthias Ringwald     *pIbeta = Id * sinVal + Iq * cosVal;
5320*e8380792SMatthias Ringwald   }
5321*e8380792SMatthias Ringwald 
5322*e8380792SMatthias Ringwald 
5323*e8380792SMatthias Ringwald   /**
5324*e8380792SMatthias Ringwald    * @brief  Inverse Park transform for   Q31 version
5325*e8380792SMatthias Ringwald    * @param[in]  Id       input coordinate of rotor reference frame d
5326*e8380792SMatthias Ringwald    * @param[in]  Iq       input coordinate of rotor reference frame q
5327*e8380792SMatthias Ringwald    * @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha
5328*e8380792SMatthias Ringwald    * @param[out] pIbeta   points to output two-phase orthogonal vector axis beta
5329*e8380792SMatthias Ringwald    * @param[in]  sinVal   sine value of rotation angle theta
5330*e8380792SMatthias Ringwald    * @param[in]  cosVal   cosine value of rotation angle theta
5331*e8380792SMatthias Ringwald    *
5332*e8380792SMatthias Ringwald    * <b>Scaling and Overflow Behavior:</b>
5333*e8380792SMatthias Ringwald    * \par
5334*e8380792SMatthias Ringwald    * The function is implemented using an internal 32-bit accumulator.
5335*e8380792SMatthias Ringwald    * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.
5336*e8380792SMatthias Ringwald    * There is saturation on the addition, hence there is no risk of overflow.
5337*e8380792SMatthias Ringwald    */
arm_inv_park_q31(q31_t Id,q31_t Iq,q31_t * pIalpha,q31_t * pIbeta,q31_t sinVal,q31_t cosVal)5338*e8380792SMatthias Ringwald   static __INLINE void arm_inv_park_q31(
5339*e8380792SMatthias Ringwald   q31_t Id,
5340*e8380792SMatthias Ringwald   q31_t Iq,
5341*e8380792SMatthias Ringwald   q31_t * pIalpha,
5342*e8380792SMatthias Ringwald   q31_t * pIbeta,
5343*e8380792SMatthias Ringwald   q31_t sinVal,
5344*e8380792SMatthias Ringwald   q31_t cosVal)
5345*e8380792SMatthias Ringwald   {
5346*e8380792SMatthias Ringwald     q31_t product1, product2;                    /* Temporary variables used to store intermediate results */
5347*e8380792SMatthias Ringwald     q31_t product3, product4;                    /* Temporary variables used to store intermediate results */
5348*e8380792SMatthias Ringwald 
5349*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (Id * cosVal) */
5350*e8380792SMatthias Ringwald     product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31);
5351*e8380792SMatthias Ringwald 
5352*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (Iq * sinVal) */
5353*e8380792SMatthias Ringwald     product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31);
5354*e8380792SMatthias Ringwald 
5355*e8380792SMatthias Ringwald 
5356*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (Id * sinVal) */
5357*e8380792SMatthias Ringwald     product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31);
5358*e8380792SMatthias Ringwald 
5359*e8380792SMatthias Ringwald     /* Intermediate product is calculated by (Iq * cosVal) */
5360*e8380792SMatthias Ringwald     product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31);
5361*e8380792SMatthias Ringwald 
5362*e8380792SMatthias Ringwald     /* Calculate pIalpha by using the two intermediate products 1 and 2 */
5363*e8380792SMatthias Ringwald     *pIalpha = __QSUB(product1, product2);
5364*e8380792SMatthias Ringwald 
5365*e8380792SMatthias Ringwald     /* Calculate pIbeta by using the two intermediate products 3 and 4 */
5366*e8380792SMatthias Ringwald     *pIbeta = __QADD(product4, product3);
5367*e8380792SMatthias Ringwald   }
5368*e8380792SMatthias Ringwald 
5369*e8380792SMatthias Ringwald   /**
5370*e8380792SMatthias Ringwald    * @} end of Inverse park group
5371*e8380792SMatthias Ringwald    */
5372*e8380792SMatthias Ringwald 
5373*e8380792SMatthias Ringwald 
5374*e8380792SMatthias Ringwald   /**
5375*e8380792SMatthias Ringwald    * @brief  Converts the elements of the Q31 vector to floating-point vector.
5376*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
5377*e8380792SMatthias Ringwald    * @param[out] pDst       is output pointer
5378*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
5379*e8380792SMatthias Ringwald    */
5380*e8380792SMatthias Ringwald   void arm_q31_to_float(
5381*e8380792SMatthias Ringwald   q31_t * pSrc,
5382*e8380792SMatthias Ringwald   float32_t * pDst,
5383*e8380792SMatthias Ringwald   uint32_t blockSize);
5384*e8380792SMatthias Ringwald 
5385*e8380792SMatthias Ringwald   /**
5386*e8380792SMatthias Ringwald    * @ingroup groupInterpolation
5387*e8380792SMatthias Ringwald    */
5388*e8380792SMatthias Ringwald 
5389*e8380792SMatthias Ringwald   /**
5390*e8380792SMatthias Ringwald    * @defgroup LinearInterpolate Linear Interpolation
5391*e8380792SMatthias Ringwald    *
5392*e8380792SMatthias Ringwald    * Linear interpolation is a method of curve fitting using linear polynomials.
5393*e8380792SMatthias Ringwald    * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line
5394*e8380792SMatthias Ringwald    *
5395*e8380792SMatthias Ringwald    * \par
5396*e8380792SMatthias Ringwald    * \image html LinearInterp.gif "Linear interpolation"
5397*e8380792SMatthias Ringwald    *
5398*e8380792SMatthias Ringwald    * \par
5399*e8380792SMatthias Ringwald    * A  Linear Interpolate function calculates an output value(y), for the input(x)
5400*e8380792SMatthias Ringwald    * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values)
5401*e8380792SMatthias Ringwald    *
5402*e8380792SMatthias Ringwald    * \par Algorithm:
5403*e8380792SMatthias Ringwald    * <pre>
5404*e8380792SMatthias Ringwald    *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
5405*e8380792SMatthias Ringwald    *       where x0, x1 are nearest values of input x
5406*e8380792SMatthias Ringwald    *             y0, y1 are nearest values to output y
5407*e8380792SMatthias Ringwald    * </pre>
5408*e8380792SMatthias Ringwald    *
5409*e8380792SMatthias Ringwald    * \par
5410*e8380792SMatthias Ringwald    * This set of functions implements Linear interpolation process
5411*e8380792SMatthias Ringwald    * for Q7, Q15, Q31, and floating-point data types.  The functions operate on a single
5412*e8380792SMatthias Ringwald    * sample of data and each call to the function returns a single processed value.
5413*e8380792SMatthias Ringwald    * <code>S</code> points to an instance of the Linear Interpolate function data structure.
5414*e8380792SMatthias Ringwald    * <code>x</code> is the input sample value. The functions returns the output value.
5415*e8380792SMatthias Ringwald    *
5416*e8380792SMatthias Ringwald    * \par
5417*e8380792SMatthias Ringwald    * if x is outside of the table boundary, Linear interpolation returns first value of the table
5418*e8380792SMatthias Ringwald    * if x is below input range and returns last value of table if x is above range.
5419*e8380792SMatthias Ringwald    */
5420*e8380792SMatthias Ringwald 
5421*e8380792SMatthias Ringwald   /**
5422*e8380792SMatthias Ringwald    * @addtogroup LinearInterpolate
5423*e8380792SMatthias Ringwald    * @{
5424*e8380792SMatthias Ringwald    */
5425*e8380792SMatthias Ringwald 
5426*e8380792SMatthias Ringwald   /**
5427*e8380792SMatthias Ringwald    * @brief  Process function for the floating-point Linear Interpolation Function.
5428*e8380792SMatthias Ringwald    * @param[in,out] S  is an instance of the floating-point Linear Interpolation structure
5429*e8380792SMatthias Ringwald    * @param[in]     x  input sample to process
5430*e8380792SMatthias Ringwald    * @return y processed output sample.
5431*e8380792SMatthias Ringwald    *
5432*e8380792SMatthias Ringwald    */
arm_linear_interp_f32(arm_linear_interp_instance_f32 * S,float32_t x)5433*e8380792SMatthias Ringwald   static __INLINE float32_t arm_linear_interp_f32(
5434*e8380792SMatthias Ringwald   arm_linear_interp_instance_f32 * S,
5435*e8380792SMatthias Ringwald   float32_t x)
5436*e8380792SMatthias Ringwald   {
5437*e8380792SMatthias Ringwald     float32_t y;
5438*e8380792SMatthias Ringwald     float32_t x0, x1;                            /* Nearest input values */
5439*e8380792SMatthias Ringwald     float32_t y0, y1;                            /* Nearest output values */
5440*e8380792SMatthias Ringwald     float32_t xSpacing = S->xSpacing;            /* spacing between input values */
5441*e8380792SMatthias Ringwald     int32_t i;                                   /* Index variable */
5442*e8380792SMatthias Ringwald     float32_t *pYData = S->pYData;               /* pointer to output table */
5443*e8380792SMatthias Ringwald 
5444*e8380792SMatthias Ringwald     /* Calculation of index */
5445*e8380792SMatthias Ringwald     i = (int32_t) ((x - S->x1) / xSpacing);
5446*e8380792SMatthias Ringwald 
5447*e8380792SMatthias Ringwald     if(i < 0)
5448*e8380792SMatthias Ringwald     {
5449*e8380792SMatthias Ringwald       /* Iniatilize output for below specified range as least output value of table */
5450*e8380792SMatthias Ringwald       y = pYData[0];
5451*e8380792SMatthias Ringwald     }
5452*e8380792SMatthias Ringwald     else if((uint32_t)i >= S->nValues)
5453*e8380792SMatthias Ringwald     {
5454*e8380792SMatthias Ringwald       /* Iniatilize output for above specified range as last output value of table */
5455*e8380792SMatthias Ringwald       y = pYData[S->nValues - 1];
5456*e8380792SMatthias Ringwald     }
5457*e8380792SMatthias Ringwald     else
5458*e8380792SMatthias Ringwald     {
5459*e8380792SMatthias Ringwald       /* Calculation of nearest input values */
5460*e8380792SMatthias Ringwald       x0 = S->x1 +  i      * xSpacing;
5461*e8380792SMatthias Ringwald       x1 = S->x1 + (i + 1) * xSpacing;
5462*e8380792SMatthias Ringwald 
5463*e8380792SMatthias Ringwald       /* Read of nearest output values */
5464*e8380792SMatthias Ringwald       y0 = pYData[i];
5465*e8380792SMatthias Ringwald       y1 = pYData[i + 1];
5466*e8380792SMatthias Ringwald 
5467*e8380792SMatthias Ringwald       /* Calculation of output */
5468*e8380792SMatthias Ringwald       y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0));
5469*e8380792SMatthias Ringwald 
5470*e8380792SMatthias Ringwald     }
5471*e8380792SMatthias Ringwald 
5472*e8380792SMatthias Ringwald     /* returns output value */
5473*e8380792SMatthias Ringwald     return (y);
5474*e8380792SMatthias Ringwald   }
5475*e8380792SMatthias Ringwald 
5476*e8380792SMatthias Ringwald 
5477*e8380792SMatthias Ringwald    /**
5478*e8380792SMatthias Ringwald    *
5479*e8380792SMatthias Ringwald    * @brief  Process function for the Q31 Linear Interpolation Function.
5480*e8380792SMatthias Ringwald    * @param[in] pYData   pointer to Q31 Linear Interpolation table
5481*e8380792SMatthias Ringwald    * @param[in] x        input sample to process
5482*e8380792SMatthias Ringwald    * @param[in] nValues  number of table values
5483*e8380792SMatthias Ringwald    * @return y processed output sample.
5484*e8380792SMatthias Ringwald    *
5485*e8380792SMatthias Ringwald    * \par
5486*e8380792SMatthias Ringwald    * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
5487*e8380792SMatthias Ringwald    * This function can support maximum of table size 2^12.
5488*e8380792SMatthias Ringwald    *
5489*e8380792SMatthias Ringwald    */
arm_linear_interp_q31(q31_t * pYData,q31_t x,uint32_t nValues)5490*e8380792SMatthias Ringwald   static __INLINE q31_t arm_linear_interp_q31(
5491*e8380792SMatthias Ringwald   q31_t * pYData,
5492*e8380792SMatthias Ringwald   q31_t x,
5493*e8380792SMatthias Ringwald   uint32_t nValues)
5494*e8380792SMatthias Ringwald   {
5495*e8380792SMatthias Ringwald     q31_t y;                                     /* output */
5496*e8380792SMatthias Ringwald     q31_t y0, y1;                                /* Nearest output values */
5497*e8380792SMatthias Ringwald     q31_t fract;                                 /* fractional part */
5498*e8380792SMatthias Ringwald     int32_t index;                               /* Index to read nearest output values */
5499*e8380792SMatthias Ringwald 
5500*e8380792SMatthias Ringwald     /* Input is in 12.20 format */
5501*e8380792SMatthias Ringwald     /* 12 bits for the table index */
5502*e8380792SMatthias Ringwald     /* Index value calculation */
5503*e8380792SMatthias Ringwald     index = ((x & (q31_t)0xFFF00000) >> 20);
5504*e8380792SMatthias Ringwald 
5505*e8380792SMatthias Ringwald     if(index >= (int32_t)(nValues - 1))
5506*e8380792SMatthias Ringwald     {
5507*e8380792SMatthias Ringwald       return (pYData[nValues - 1]);
5508*e8380792SMatthias Ringwald     }
5509*e8380792SMatthias Ringwald     else if(index < 0)
5510*e8380792SMatthias Ringwald     {
5511*e8380792SMatthias Ringwald       return (pYData[0]);
5512*e8380792SMatthias Ringwald     }
5513*e8380792SMatthias Ringwald     else
5514*e8380792SMatthias Ringwald     {
5515*e8380792SMatthias Ringwald       /* 20 bits for the fractional part */
5516*e8380792SMatthias Ringwald       /* shift left by 11 to keep fract in 1.31 format */
5517*e8380792SMatthias Ringwald       fract = (x & 0x000FFFFF) << 11;
5518*e8380792SMatthias Ringwald 
5519*e8380792SMatthias Ringwald       /* Read two nearest output values from the index in 1.31(q31) format */
5520*e8380792SMatthias Ringwald       y0 = pYData[index];
5521*e8380792SMatthias Ringwald       y1 = pYData[index + 1];
5522*e8380792SMatthias Ringwald 
5523*e8380792SMatthias Ringwald       /* Calculation of y0 * (1-fract) and y is in 2.30 format */
5524*e8380792SMatthias Ringwald       y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32));
5525*e8380792SMatthias Ringwald 
5526*e8380792SMatthias Ringwald       /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */
5527*e8380792SMatthias Ringwald       y += ((q31_t) (((q63_t) y1 * fract) >> 32));
5528*e8380792SMatthias Ringwald 
5529*e8380792SMatthias Ringwald       /* Convert y to 1.31 format */
5530*e8380792SMatthias Ringwald       return (y << 1u);
5531*e8380792SMatthias Ringwald     }
5532*e8380792SMatthias Ringwald   }
5533*e8380792SMatthias Ringwald 
5534*e8380792SMatthias Ringwald 
5535*e8380792SMatthias Ringwald   /**
5536*e8380792SMatthias Ringwald    *
5537*e8380792SMatthias Ringwald    * @brief  Process function for the Q15 Linear Interpolation Function.
5538*e8380792SMatthias Ringwald    * @param[in] pYData   pointer to Q15 Linear Interpolation table
5539*e8380792SMatthias Ringwald    * @param[in] x        input sample to process
5540*e8380792SMatthias Ringwald    * @param[in] nValues  number of table values
5541*e8380792SMatthias Ringwald    * @return y processed output sample.
5542*e8380792SMatthias Ringwald    *
5543*e8380792SMatthias Ringwald    * \par
5544*e8380792SMatthias Ringwald    * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
5545*e8380792SMatthias Ringwald    * This function can support maximum of table size 2^12.
5546*e8380792SMatthias Ringwald    *
5547*e8380792SMatthias Ringwald    */
arm_linear_interp_q15(q15_t * pYData,q31_t x,uint32_t nValues)5548*e8380792SMatthias Ringwald   static __INLINE q15_t arm_linear_interp_q15(
5549*e8380792SMatthias Ringwald   q15_t * pYData,
5550*e8380792SMatthias Ringwald   q31_t x,
5551*e8380792SMatthias Ringwald   uint32_t nValues)
5552*e8380792SMatthias Ringwald   {
5553*e8380792SMatthias Ringwald     q63_t y;                                     /* output */
5554*e8380792SMatthias Ringwald     q15_t y0, y1;                                /* Nearest output values */
5555*e8380792SMatthias Ringwald     q31_t fract;                                 /* fractional part */
5556*e8380792SMatthias Ringwald     int32_t index;                               /* Index to read nearest output values */
5557*e8380792SMatthias Ringwald 
5558*e8380792SMatthias Ringwald     /* Input is in 12.20 format */
5559*e8380792SMatthias Ringwald     /* 12 bits for the table index */
5560*e8380792SMatthias Ringwald     /* Index value calculation */
5561*e8380792SMatthias Ringwald     index = ((x & (int32_t)0xFFF00000) >> 20);
5562*e8380792SMatthias Ringwald 
5563*e8380792SMatthias Ringwald     if(index >= (int32_t)(nValues - 1))
5564*e8380792SMatthias Ringwald     {
5565*e8380792SMatthias Ringwald       return (pYData[nValues - 1]);
5566*e8380792SMatthias Ringwald     }
5567*e8380792SMatthias Ringwald     else if(index < 0)
5568*e8380792SMatthias Ringwald     {
5569*e8380792SMatthias Ringwald       return (pYData[0]);
5570*e8380792SMatthias Ringwald     }
5571*e8380792SMatthias Ringwald     else
5572*e8380792SMatthias Ringwald     {
5573*e8380792SMatthias Ringwald       /* 20 bits for the fractional part */
5574*e8380792SMatthias Ringwald       /* fract is in 12.20 format */
5575*e8380792SMatthias Ringwald       fract = (x & 0x000FFFFF);
5576*e8380792SMatthias Ringwald 
5577*e8380792SMatthias Ringwald       /* Read two nearest output values from the index */
5578*e8380792SMatthias Ringwald       y0 = pYData[index];
5579*e8380792SMatthias Ringwald       y1 = pYData[index + 1];
5580*e8380792SMatthias Ringwald 
5581*e8380792SMatthias Ringwald       /* Calculation of y0 * (1-fract) and y is in 13.35 format */
5582*e8380792SMatthias Ringwald       y = ((q63_t) y0 * (0xFFFFF - fract));
5583*e8380792SMatthias Ringwald 
5584*e8380792SMatthias Ringwald       /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */
5585*e8380792SMatthias Ringwald       y += ((q63_t) y1 * (fract));
5586*e8380792SMatthias Ringwald 
5587*e8380792SMatthias Ringwald       /* convert y to 1.15 format */
5588*e8380792SMatthias Ringwald       return (q15_t) (y >> 20);
5589*e8380792SMatthias Ringwald     }
5590*e8380792SMatthias Ringwald   }
5591*e8380792SMatthias Ringwald 
5592*e8380792SMatthias Ringwald 
5593*e8380792SMatthias Ringwald   /**
5594*e8380792SMatthias Ringwald    *
5595*e8380792SMatthias Ringwald    * @brief  Process function for the Q7 Linear Interpolation Function.
5596*e8380792SMatthias Ringwald    * @param[in] pYData   pointer to Q7 Linear Interpolation table
5597*e8380792SMatthias Ringwald    * @param[in] x        input sample to process
5598*e8380792SMatthias Ringwald    * @param[in] nValues  number of table values
5599*e8380792SMatthias Ringwald    * @return y processed output sample.
5600*e8380792SMatthias Ringwald    *
5601*e8380792SMatthias Ringwald    * \par
5602*e8380792SMatthias Ringwald    * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
5603*e8380792SMatthias Ringwald    * This function can support maximum of table size 2^12.
5604*e8380792SMatthias Ringwald    */
arm_linear_interp_q7(q7_t * pYData,q31_t x,uint32_t nValues)5605*e8380792SMatthias Ringwald   static __INLINE q7_t arm_linear_interp_q7(
5606*e8380792SMatthias Ringwald   q7_t * pYData,
5607*e8380792SMatthias Ringwald   q31_t x,
5608*e8380792SMatthias Ringwald   uint32_t nValues)
5609*e8380792SMatthias Ringwald   {
5610*e8380792SMatthias Ringwald     q31_t y;                                     /* output */
5611*e8380792SMatthias Ringwald     q7_t y0, y1;                                 /* Nearest output values */
5612*e8380792SMatthias Ringwald     q31_t fract;                                 /* fractional part */
5613*e8380792SMatthias Ringwald     uint32_t index;                              /* Index to read nearest output values */
5614*e8380792SMatthias Ringwald 
5615*e8380792SMatthias Ringwald     /* Input is in 12.20 format */
5616*e8380792SMatthias Ringwald     /* 12 bits for the table index */
5617*e8380792SMatthias Ringwald     /* Index value calculation */
5618*e8380792SMatthias Ringwald     if (x < 0)
5619*e8380792SMatthias Ringwald     {
5620*e8380792SMatthias Ringwald       return (pYData[0]);
5621*e8380792SMatthias Ringwald     }
5622*e8380792SMatthias Ringwald     index = (x >> 20) & 0xfff;
5623*e8380792SMatthias Ringwald 
5624*e8380792SMatthias Ringwald     if(index >= (nValues - 1))
5625*e8380792SMatthias Ringwald     {
5626*e8380792SMatthias Ringwald       return (pYData[nValues - 1]);
5627*e8380792SMatthias Ringwald     }
5628*e8380792SMatthias Ringwald     else
5629*e8380792SMatthias Ringwald     {
5630*e8380792SMatthias Ringwald       /* 20 bits for the fractional part */
5631*e8380792SMatthias Ringwald       /* fract is in 12.20 format */
5632*e8380792SMatthias Ringwald       fract = (x & 0x000FFFFF);
5633*e8380792SMatthias Ringwald 
5634*e8380792SMatthias Ringwald       /* Read two nearest output values from the index and are in 1.7(q7) format */
5635*e8380792SMatthias Ringwald       y0 = pYData[index];
5636*e8380792SMatthias Ringwald       y1 = pYData[index + 1];
5637*e8380792SMatthias Ringwald 
5638*e8380792SMatthias Ringwald       /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */
5639*e8380792SMatthias Ringwald       y = ((y0 * (0xFFFFF - fract)));
5640*e8380792SMatthias Ringwald 
5641*e8380792SMatthias Ringwald       /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */
5642*e8380792SMatthias Ringwald       y += (y1 * fract);
5643*e8380792SMatthias Ringwald 
5644*e8380792SMatthias Ringwald       /* convert y to 1.7(q7) format */
5645*e8380792SMatthias Ringwald       return (q7_t) (y >> 20);
5646*e8380792SMatthias Ringwald      }
5647*e8380792SMatthias Ringwald   }
5648*e8380792SMatthias Ringwald 
5649*e8380792SMatthias Ringwald   /**
5650*e8380792SMatthias Ringwald    * @} end of LinearInterpolate group
5651*e8380792SMatthias Ringwald    */
5652*e8380792SMatthias Ringwald 
5653*e8380792SMatthias Ringwald   /**
5654*e8380792SMatthias Ringwald    * @brief  Fast approximation to the trigonometric sine function for floating-point data.
5655*e8380792SMatthias Ringwald    * @param[in] x  input value in radians.
5656*e8380792SMatthias Ringwald    * @return  sin(x).
5657*e8380792SMatthias Ringwald    */
5658*e8380792SMatthias Ringwald   float32_t arm_sin_f32(
5659*e8380792SMatthias Ringwald   float32_t x);
5660*e8380792SMatthias Ringwald 
5661*e8380792SMatthias Ringwald 
5662*e8380792SMatthias Ringwald   /**
5663*e8380792SMatthias Ringwald    * @brief  Fast approximation to the trigonometric sine function for Q31 data.
5664*e8380792SMatthias Ringwald    * @param[in] x  Scaled input value in radians.
5665*e8380792SMatthias Ringwald    * @return  sin(x).
5666*e8380792SMatthias Ringwald    */
5667*e8380792SMatthias Ringwald   q31_t arm_sin_q31(
5668*e8380792SMatthias Ringwald   q31_t x);
5669*e8380792SMatthias Ringwald 
5670*e8380792SMatthias Ringwald 
5671*e8380792SMatthias Ringwald   /**
5672*e8380792SMatthias Ringwald    * @brief  Fast approximation to the trigonometric sine function for Q15 data.
5673*e8380792SMatthias Ringwald    * @param[in] x  Scaled input value in radians.
5674*e8380792SMatthias Ringwald    * @return  sin(x).
5675*e8380792SMatthias Ringwald    */
5676*e8380792SMatthias Ringwald   q15_t arm_sin_q15(
5677*e8380792SMatthias Ringwald   q15_t x);
5678*e8380792SMatthias Ringwald 
5679*e8380792SMatthias Ringwald 
5680*e8380792SMatthias Ringwald   /**
5681*e8380792SMatthias Ringwald    * @brief  Fast approximation to the trigonometric cosine function for floating-point data.
5682*e8380792SMatthias Ringwald    * @param[in] x  input value in radians.
5683*e8380792SMatthias Ringwald    * @return  cos(x).
5684*e8380792SMatthias Ringwald    */
5685*e8380792SMatthias Ringwald   float32_t arm_cos_f32(
5686*e8380792SMatthias Ringwald   float32_t x);
5687*e8380792SMatthias Ringwald 
5688*e8380792SMatthias Ringwald 
5689*e8380792SMatthias Ringwald   /**
5690*e8380792SMatthias Ringwald    * @brief Fast approximation to the trigonometric cosine function for Q31 data.
5691*e8380792SMatthias Ringwald    * @param[in] x  Scaled input value in radians.
5692*e8380792SMatthias Ringwald    * @return  cos(x).
5693*e8380792SMatthias Ringwald    */
5694*e8380792SMatthias Ringwald   q31_t arm_cos_q31(
5695*e8380792SMatthias Ringwald   q31_t x);
5696*e8380792SMatthias Ringwald 
5697*e8380792SMatthias Ringwald 
5698*e8380792SMatthias Ringwald   /**
5699*e8380792SMatthias Ringwald    * @brief  Fast approximation to the trigonometric cosine function for Q15 data.
5700*e8380792SMatthias Ringwald    * @param[in] x  Scaled input value in radians.
5701*e8380792SMatthias Ringwald    * @return  cos(x).
5702*e8380792SMatthias Ringwald    */
5703*e8380792SMatthias Ringwald   q15_t arm_cos_q15(
5704*e8380792SMatthias Ringwald   q15_t x);
5705*e8380792SMatthias Ringwald 
5706*e8380792SMatthias Ringwald 
5707*e8380792SMatthias Ringwald   /**
5708*e8380792SMatthias Ringwald    * @ingroup groupFastMath
5709*e8380792SMatthias Ringwald    */
5710*e8380792SMatthias Ringwald 
5711*e8380792SMatthias Ringwald 
5712*e8380792SMatthias Ringwald   /**
5713*e8380792SMatthias Ringwald    * @defgroup SQRT Square Root
5714*e8380792SMatthias Ringwald    *
5715*e8380792SMatthias Ringwald    * Computes the square root of a number.
5716*e8380792SMatthias Ringwald    * There are separate functions for Q15, Q31, and floating-point data types.
5717*e8380792SMatthias Ringwald    * The square root function is computed using the Newton-Raphson algorithm.
5718*e8380792SMatthias Ringwald    * This is an iterative algorithm of the form:
5719*e8380792SMatthias Ringwald    * <pre>
5720*e8380792SMatthias Ringwald    *      x1 = x0 - f(x0)/f'(x0)
5721*e8380792SMatthias Ringwald    * </pre>
5722*e8380792SMatthias Ringwald    * where <code>x1</code> is the current estimate,
5723*e8380792SMatthias Ringwald    * <code>x0</code> is the previous estimate, and
5724*e8380792SMatthias Ringwald    * <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>.
5725*e8380792SMatthias Ringwald    * For the square root function, the algorithm reduces to:
5726*e8380792SMatthias Ringwald    * <pre>
5727*e8380792SMatthias Ringwald    *     x0 = in/2                         [initial guess]
5728*e8380792SMatthias Ringwald    *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
5729*e8380792SMatthias Ringwald    * </pre>
5730*e8380792SMatthias Ringwald    */
5731*e8380792SMatthias Ringwald 
5732*e8380792SMatthias Ringwald 
5733*e8380792SMatthias Ringwald   /**
5734*e8380792SMatthias Ringwald    * @addtogroup SQRT
5735*e8380792SMatthias Ringwald    * @{
5736*e8380792SMatthias Ringwald    */
5737*e8380792SMatthias Ringwald 
5738*e8380792SMatthias Ringwald   /**
5739*e8380792SMatthias Ringwald    * @brief  Floating-point square root function.
5740*e8380792SMatthias Ringwald    * @param[in]  in    input value.
5741*e8380792SMatthias Ringwald    * @param[out] pOut  square root of input value.
5742*e8380792SMatthias Ringwald    * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if
5743*e8380792SMatthias Ringwald    * <code>in</code> is negative value and returns zero output for negative values.
5744*e8380792SMatthias Ringwald    */
arm_sqrt_f32(float32_t in,float32_t * pOut)5745*e8380792SMatthias Ringwald   static __INLINE arm_status arm_sqrt_f32(
5746*e8380792SMatthias Ringwald   float32_t in,
5747*e8380792SMatthias Ringwald   float32_t * pOut)
5748*e8380792SMatthias Ringwald   {
5749*e8380792SMatthias Ringwald     if(in >= 0.0f)
5750*e8380792SMatthias Ringwald     {
5751*e8380792SMatthias Ringwald 
5752*e8380792SMatthias Ringwald #if   (__FPU_USED == 1) && defined ( __CC_ARM   )
5753*e8380792SMatthias Ringwald       *pOut = __sqrtf(in);
5754*e8380792SMatthias Ringwald #elif (__FPU_USED == 1) && (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
5755*e8380792SMatthias Ringwald       *pOut = __builtin_sqrtf(in);
5756*e8380792SMatthias Ringwald #elif (__FPU_USED == 1) && defined(__GNUC__)
5757*e8380792SMatthias Ringwald       *pOut = __builtin_sqrtf(in);
5758*e8380792SMatthias Ringwald #elif (__FPU_USED == 1) && defined ( __ICCARM__ ) && (__VER__ >= 6040000)
5759*e8380792SMatthias Ringwald       __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in));
5760*e8380792SMatthias Ringwald #else
5761*e8380792SMatthias Ringwald       *pOut = sqrtf(in);
5762*e8380792SMatthias Ringwald #endif
5763*e8380792SMatthias Ringwald 
5764*e8380792SMatthias Ringwald       return (ARM_MATH_SUCCESS);
5765*e8380792SMatthias Ringwald     }
5766*e8380792SMatthias Ringwald     else
5767*e8380792SMatthias Ringwald     {
5768*e8380792SMatthias Ringwald       *pOut = 0.0f;
5769*e8380792SMatthias Ringwald       return (ARM_MATH_ARGUMENT_ERROR);
5770*e8380792SMatthias Ringwald     }
5771*e8380792SMatthias Ringwald   }
5772*e8380792SMatthias Ringwald 
5773*e8380792SMatthias Ringwald 
5774*e8380792SMatthias Ringwald   /**
5775*e8380792SMatthias Ringwald    * @brief Q31 square root function.
5776*e8380792SMatthias Ringwald    * @param[in]  in    input value.  The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF.
5777*e8380792SMatthias Ringwald    * @param[out] pOut  square root of input value.
5778*e8380792SMatthias Ringwald    * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if
5779*e8380792SMatthias Ringwald    * <code>in</code> is negative value and returns zero output for negative values.
5780*e8380792SMatthias Ringwald    */
5781*e8380792SMatthias Ringwald   arm_status arm_sqrt_q31(
5782*e8380792SMatthias Ringwald   q31_t in,
5783*e8380792SMatthias Ringwald   q31_t * pOut);
5784*e8380792SMatthias Ringwald 
5785*e8380792SMatthias Ringwald 
5786*e8380792SMatthias Ringwald   /**
5787*e8380792SMatthias Ringwald    * @brief  Q15 square root function.
5788*e8380792SMatthias Ringwald    * @param[in]  in    input value.  The range of the input value is [0 +1) or 0x0000 to 0x7FFF.
5789*e8380792SMatthias Ringwald    * @param[out] pOut  square root of input value.
5790*e8380792SMatthias Ringwald    * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if
5791*e8380792SMatthias Ringwald    * <code>in</code> is negative value and returns zero output for negative values.
5792*e8380792SMatthias Ringwald    */
5793*e8380792SMatthias Ringwald   arm_status arm_sqrt_q15(
5794*e8380792SMatthias Ringwald   q15_t in,
5795*e8380792SMatthias Ringwald   q15_t * pOut);
5796*e8380792SMatthias Ringwald 
5797*e8380792SMatthias Ringwald   /**
5798*e8380792SMatthias Ringwald    * @} end of SQRT group
5799*e8380792SMatthias Ringwald    */
5800*e8380792SMatthias Ringwald 
5801*e8380792SMatthias Ringwald 
5802*e8380792SMatthias Ringwald   /**
5803*e8380792SMatthias Ringwald    * @brief floating-point Circular write function.
5804*e8380792SMatthias Ringwald    */
arm_circularWrite_f32(int32_t * circBuffer,int32_t L,uint16_t * writeOffset,int32_t bufferInc,const int32_t * src,int32_t srcInc,uint32_t blockSize)5805*e8380792SMatthias Ringwald   static __INLINE void arm_circularWrite_f32(
5806*e8380792SMatthias Ringwald   int32_t * circBuffer,
5807*e8380792SMatthias Ringwald   int32_t L,
5808*e8380792SMatthias Ringwald   uint16_t * writeOffset,
5809*e8380792SMatthias Ringwald   int32_t bufferInc,
5810*e8380792SMatthias Ringwald   const int32_t * src,
5811*e8380792SMatthias Ringwald   int32_t srcInc,
5812*e8380792SMatthias Ringwald   uint32_t blockSize)
5813*e8380792SMatthias Ringwald   {
5814*e8380792SMatthias Ringwald     uint32_t i = 0u;
5815*e8380792SMatthias Ringwald     int32_t wOffset;
5816*e8380792SMatthias Ringwald 
5817*e8380792SMatthias Ringwald     /* Copy the value of Index pointer that points
5818*e8380792SMatthias Ringwald      * to the current location where the input samples to be copied */
5819*e8380792SMatthias Ringwald     wOffset = *writeOffset;
5820*e8380792SMatthias Ringwald 
5821*e8380792SMatthias Ringwald     /* Loop over the blockSize */
5822*e8380792SMatthias Ringwald     i = blockSize;
5823*e8380792SMatthias Ringwald 
5824*e8380792SMatthias Ringwald     while(i > 0u)
5825*e8380792SMatthias Ringwald     {
5826*e8380792SMatthias Ringwald       /* copy the input sample to the circular buffer */
5827*e8380792SMatthias Ringwald       circBuffer[wOffset] = *src;
5828*e8380792SMatthias Ringwald 
5829*e8380792SMatthias Ringwald       /* Update the input pointer */
5830*e8380792SMatthias Ringwald       src += srcInc;
5831*e8380792SMatthias Ringwald 
5832*e8380792SMatthias Ringwald       /* Circularly update wOffset.  Watch out for positive and negative value */
5833*e8380792SMatthias Ringwald       wOffset += bufferInc;
5834*e8380792SMatthias Ringwald       if(wOffset >= L)
5835*e8380792SMatthias Ringwald         wOffset -= L;
5836*e8380792SMatthias Ringwald 
5837*e8380792SMatthias Ringwald       /* Decrement the loop counter */
5838*e8380792SMatthias Ringwald       i--;
5839*e8380792SMatthias Ringwald     }
5840*e8380792SMatthias Ringwald 
5841*e8380792SMatthias Ringwald     /* Update the index pointer */
5842*e8380792SMatthias Ringwald     *writeOffset = (uint16_t)wOffset;
5843*e8380792SMatthias Ringwald   }
5844*e8380792SMatthias Ringwald 
5845*e8380792SMatthias Ringwald 
5846*e8380792SMatthias Ringwald 
5847*e8380792SMatthias Ringwald   /**
5848*e8380792SMatthias Ringwald    * @brief floating-point Circular Read function.
5849*e8380792SMatthias Ringwald    */
arm_circularRead_f32(int32_t * circBuffer,int32_t L,int32_t * readOffset,int32_t bufferInc,int32_t * dst,int32_t * dst_base,int32_t dst_length,int32_t dstInc,uint32_t blockSize)5850*e8380792SMatthias Ringwald   static __INLINE void arm_circularRead_f32(
5851*e8380792SMatthias Ringwald   int32_t * circBuffer,
5852*e8380792SMatthias Ringwald   int32_t L,
5853*e8380792SMatthias Ringwald   int32_t * readOffset,
5854*e8380792SMatthias Ringwald   int32_t bufferInc,
5855*e8380792SMatthias Ringwald   int32_t * dst,
5856*e8380792SMatthias Ringwald   int32_t * dst_base,
5857*e8380792SMatthias Ringwald   int32_t dst_length,
5858*e8380792SMatthias Ringwald   int32_t dstInc,
5859*e8380792SMatthias Ringwald   uint32_t blockSize)
5860*e8380792SMatthias Ringwald   {
5861*e8380792SMatthias Ringwald     uint32_t i = 0u;
5862*e8380792SMatthias Ringwald     int32_t rOffset, dst_end;
5863*e8380792SMatthias Ringwald 
5864*e8380792SMatthias Ringwald     /* Copy the value of Index pointer that points
5865*e8380792SMatthias Ringwald      * to the current location from where the input samples to be read */
5866*e8380792SMatthias Ringwald     rOffset = *readOffset;
5867*e8380792SMatthias Ringwald     dst_end = (int32_t) (dst_base + dst_length);
5868*e8380792SMatthias Ringwald 
5869*e8380792SMatthias Ringwald     /* Loop over the blockSize */
5870*e8380792SMatthias Ringwald     i = blockSize;
5871*e8380792SMatthias Ringwald 
5872*e8380792SMatthias Ringwald     while(i > 0u)
5873*e8380792SMatthias Ringwald     {
5874*e8380792SMatthias Ringwald       /* copy the sample from the circular buffer to the destination buffer */
5875*e8380792SMatthias Ringwald       *dst = circBuffer[rOffset];
5876*e8380792SMatthias Ringwald 
5877*e8380792SMatthias Ringwald       /* Update the input pointer */
5878*e8380792SMatthias Ringwald       dst += dstInc;
5879*e8380792SMatthias Ringwald 
5880*e8380792SMatthias Ringwald       if(dst == (int32_t *) dst_end)
5881*e8380792SMatthias Ringwald       {
5882*e8380792SMatthias Ringwald         dst = dst_base;
5883*e8380792SMatthias Ringwald       }
5884*e8380792SMatthias Ringwald 
5885*e8380792SMatthias Ringwald       /* Circularly update rOffset.  Watch out for positive and negative value  */
5886*e8380792SMatthias Ringwald       rOffset += bufferInc;
5887*e8380792SMatthias Ringwald 
5888*e8380792SMatthias Ringwald       if(rOffset >= L)
5889*e8380792SMatthias Ringwald       {
5890*e8380792SMatthias Ringwald         rOffset -= L;
5891*e8380792SMatthias Ringwald       }
5892*e8380792SMatthias Ringwald 
5893*e8380792SMatthias Ringwald       /* Decrement the loop counter */
5894*e8380792SMatthias Ringwald       i--;
5895*e8380792SMatthias Ringwald     }
5896*e8380792SMatthias Ringwald 
5897*e8380792SMatthias Ringwald     /* Update the index pointer */
5898*e8380792SMatthias Ringwald     *readOffset = rOffset;
5899*e8380792SMatthias Ringwald   }
5900*e8380792SMatthias Ringwald 
5901*e8380792SMatthias Ringwald 
5902*e8380792SMatthias Ringwald   /**
5903*e8380792SMatthias Ringwald    * @brief Q15 Circular write function.
5904*e8380792SMatthias Ringwald    */
arm_circularWrite_q15(q15_t * circBuffer,int32_t L,uint16_t * writeOffset,int32_t bufferInc,const q15_t * src,int32_t srcInc,uint32_t blockSize)5905*e8380792SMatthias Ringwald   static __INLINE void arm_circularWrite_q15(
5906*e8380792SMatthias Ringwald   q15_t * circBuffer,
5907*e8380792SMatthias Ringwald   int32_t L,
5908*e8380792SMatthias Ringwald   uint16_t * writeOffset,
5909*e8380792SMatthias Ringwald   int32_t bufferInc,
5910*e8380792SMatthias Ringwald   const q15_t * src,
5911*e8380792SMatthias Ringwald   int32_t srcInc,
5912*e8380792SMatthias Ringwald   uint32_t blockSize)
5913*e8380792SMatthias Ringwald   {
5914*e8380792SMatthias Ringwald     uint32_t i = 0u;
5915*e8380792SMatthias Ringwald     int32_t wOffset;
5916*e8380792SMatthias Ringwald 
5917*e8380792SMatthias Ringwald     /* Copy the value of Index pointer that points
5918*e8380792SMatthias Ringwald      * to the current location where the input samples to be copied */
5919*e8380792SMatthias Ringwald     wOffset = *writeOffset;
5920*e8380792SMatthias Ringwald 
5921*e8380792SMatthias Ringwald     /* Loop over the blockSize */
5922*e8380792SMatthias Ringwald     i = blockSize;
5923*e8380792SMatthias Ringwald 
5924*e8380792SMatthias Ringwald     while(i > 0u)
5925*e8380792SMatthias Ringwald     {
5926*e8380792SMatthias Ringwald       /* copy the input sample to the circular buffer */
5927*e8380792SMatthias Ringwald       circBuffer[wOffset] = *src;
5928*e8380792SMatthias Ringwald 
5929*e8380792SMatthias Ringwald       /* Update the input pointer */
5930*e8380792SMatthias Ringwald       src += srcInc;
5931*e8380792SMatthias Ringwald 
5932*e8380792SMatthias Ringwald       /* Circularly update wOffset.  Watch out for positive and negative value */
5933*e8380792SMatthias Ringwald       wOffset += bufferInc;
5934*e8380792SMatthias Ringwald       if(wOffset >= L)
5935*e8380792SMatthias Ringwald         wOffset -= L;
5936*e8380792SMatthias Ringwald 
5937*e8380792SMatthias Ringwald       /* Decrement the loop counter */
5938*e8380792SMatthias Ringwald       i--;
5939*e8380792SMatthias Ringwald     }
5940*e8380792SMatthias Ringwald 
5941*e8380792SMatthias Ringwald     /* Update the index pointer */
5942*e8380792SMatthias Ringwald     *writeOffset = (uint16_t)wOffset;
5943*e8380792SMatthias Ringwald   }
5944*e8380792SMatthias Ringwald 
5945*e8380792SMatthias Ringwald 
5946*e8380792SMatthias Ringwald   /**
5947*e8380792SMatthias Ringwald    * @brief Q15 Circular Read function.
5948*e8380792SMatthias Ringwald    */
arm_circularRead_q15(q15_t * circBuffer,int32_t L,int32_t * readOffset,int32_t bufferInc,q15_t * dst,q15_t * dst_base,int32_t dst_length,int32_t dstInc,uint32_t blockSize)5949*e8380792SMatthias Ringwald   static __INLINE void arm_circularRead_q15(
5950*e8380792SMatthias Ringwald   q15_t * circBuffer,
5951*e8380792SMatthias Ringwald   int32_t L,
5952*e8380792SMatthias Ringwald   int32_t * readOffset,
5953*e8380792SMatthias Ringwald   int32_t bufferInc,
5954*e8380792SMatthias Ringwald   q15_t * dst,
5955*e8380792SMatthias Ringwald   q15_t * dst_base,
5956*e8380792SMatthias Ringwald   int32_t dst_length,
5957*e8380792SMatthias Ringwald   int32_t dstInc,
5958*e8380792SMatthias Ringwald   uint32_t blockSize)
5959*e8380792SMatthias Ringwald   {
5960*e8380792SMatthias Ringwald     uint32_t i = 0;
5961*e8380792SMatthias Ringwald     int32_t rOffset, dst_end;
5962*e8380792SMatthias Ringwald 
5963*e8380792SMatthias Ringwald     /* Copy the value of Index pointer that points
5964*e8380792SMatthias Ringwald      * to the current location from where the input samples to be read */
5965*e8380792SMatthias Ringwald     rOffset = *readOffset;
5966*e8380792SMatthias Ringwald 
5967*e8380792SMatthias Ringwald     dst_end = (int32_t) (dst_base + dst_length);
5968*e8380792SMatthias Ringwald 
5969*e8380792SMatthias Ringwald     /* Loop over the blockSize */
5970*e8380792SMatthias Ringwald     i = blockSize;
5971*e8380792SMatthias Ringwald 
5972*e8380792SMatthias Ringwald     while(i > 0u)
5973*e8380792SMatthias Ringwald     {
5974*e8380792SMatthias Ringwald       /* copy the sample from the circular buffer to the destination buffer */
5975*e8380792SMatthias Ringwald       *dst = circBuffer[rOffset];
5976*e8380792SMatthias Ringwald 
5977*e8380792SMatthias Ringwald       /* Update the input pointer */
5978*e8380792SMatthias Ringwald       dst += dstInc;
5979*e8380792SMatthias Ringwald 
5980*e8380792SMatthias Ringwald       if(dst == (q15_t *) dst_end)
5981*e8380792SMatthias Ringwald       {
5982*e8380792SMatthias Ringwald         dst = dst_base;
5983*e8380792SMatthias Ringwald       }
5984*e8380792SMatthias Ringwald 
5985*e8380792SMatthias Ringwald       /* Circularly update wOffset.  Watch out for positive and negative value */
5986*e8380792SMatthias Ringwald       rOffset += bufferInc;
5987*e8380792SMatthias Ringwald 
5988*e8380792SMatthias Ringwald       if(rOffset >= L)
5989*e8380792SMatthias Ringwald       {
5990*e8380792SMatthias Ringwald         rOffset -= L;
5991*e8380792SMatthias Ringwald       }
5992*e8380792SMatthias Ringwald 
5993*e8380792SMatthias Ringwald       /* Decrement the loop counter */
5994*e8380792SMatthias Ringwald       i--;
5995*e8380792SMatthias Ringwald     }
5996*e8380792SMatthias Ringwald 
5997*e8380792SMatthias Ringwald     /* Update the index pointer */
5998*e8380792SMatthias Ringwald     *readOffset = rOffset;
5999*e8380792SMatthias Ringwald   }
6000*e8380792SMatthias Ringwald 
6001*e8380792SMatthias Ringwald 
6002*e8380792SMatthias Ringwald   /**
6003*e8380792SMatthias Ringwald    * @brief Q7 Circular write function.
6004*e8380792SMatthias Ringwald    */
arm_circularWrite_q7(q7_t * circBuffer,int32_t L,uint16_t * writeOffset,int32_t bufferInc,const q7_t * src,int32_t srcInc,uint32_t blockSize)6005*e8380792SMatthias Ringwald   static __INLINE void arm_circularWrite_q7(
6006*e8380792SMatthias Ringwald   q7_t * circBuffer,
6007*e8380792SMatthias Ringwald   int32_t L,
6008*e8380792SMatthias Ringwald   uint16_t * writeOffset,
6009*e8380792SMatthias Ringwald   int32_t bufferInc,
6010*e8380792SMatthias Ringwald   const q7_t * src,
6011*e8380792SMatthias Ringwald   int32_t srcInc,
6012*e8380792SMatthias Ringwald   uint32_t blockSize)
6013*e8380792SMatthias Ringwald   {
6014*e8380792SMatthias Ringwald     uint32_t i = 0u;
6015*e8380792SMatthias Ringwald     int32_t wOffset;
6016*e8380792SMatthias Ringwald 
6017*e8380792SMatthias Ringwald     /* Copy the value of Index pointer that points
6018*e8380792SMatthias Ringwald      * to the current location where the input samples to be copied */
6019*e8380792SMatthias Ringwald     wOffset = *writeOffset;
6020*e8380792SMatthias Ringwald 
6021*e8380792SMatthias Ringwald     /* Loop over the blockSize */
6022*e8380792SMatthias Ringwald     i = blockSize;
6023*e8380792SMatthias Ringwald 
6024*e8380792SMatthias Ringwald     while(i > 0u)
6025*e8380792SMatthias Ringwald     {
6026*e8380792SMatthias Ringwald       /* copy the input sample to the circular buffer */
6027*e8380792SMatthias Ringwald       circBuffer[wOffset] = *src;
6028*e8380792SMatthias Ringwald 
6029*e8380792SMatthias Ringwald       /* Update the input pointer */
6030*e8380792SMatthias Ringwald       src += srcInc;
6031*e8380792SMatthias Ringwald 
6032*e8380792SMatthias Ringwald       /* Circularly update wOffset.  Watch out for positive and negative value */
6033*e8380792SMatthias Ringwald       wOffset += bufferInc;
6034*e8380792SMatthias Ringwald       if(wOffset >= L)
6035*e8380792SMatthias Ringwald         wOffset -= L;
6036*e8380792SMatthias Ringwald 
6037*e8380792SMatthias Ringwald       /* Decrement the loop counter */
6038*e8380792SMatthias Ringwald       i--;
6039*e8380792SMatthias Ringwald     }
6040*e8380792SMatthias Ringwald 
6041*e8380792SMatthias Ringwald     /* Update the index pointer */
6042*e8380792SMatthias Ringwald     *writeOffset = (uint16_t)wOffset;
6043*e8380792SMatthias Ringwald   }
6044*e8380792SMatthias Ringwald 
6045*e8380792SMatthias Ringwald 
6046*e8380792SMatthias Ringwald   /**
6047*e8380792SMatthias Ringwald    * @brief Q7 Circular Read function.
6048*e8380792SMatthias Ringwald    */
arm_circularRead_q7(q7_t * circBuffer,int32_t L,int32_t * readOffset,int32_t bufferInc,q7_t * dst,q7_t * dst_base,int32_t dst_length,int32_t dstInc,uint32_t blockSize)6049*e8380792SMatthias Ringwald   static __INLINE void arm_circularRead_q7(
6050*e8380792SMatthias Ringwald   q7_t * circBuffer,
6051*e8380792SMatthias Ringwald   int32_t L,
6052*e8380792SMatthias Ringwald   int32_t * readOffset,
6053*e8380792SMatthias Ringwald   int32_t bufferInc,
6054*e8380792SMatthias Ringwald   q7_t * dst,
6055*e8380792SMatthias Ringwald   q7_t * dst_base,
6056*e8380792SMatthias Ringwald   int32_t dst_length,
6057*e8380792SMatthias Ringwald   int32_t dstInc,
6058*e8380792SMatthias Ringwald   uint32_t blockSize)
6059*e8380792SMatthias Ringwald   {
6060*e8380792SMatthias Ringwald     uint32_t i = 0;
6061*e8380792SMatthias Ringwald     int32_t rOffset, dst_end;
6062*e8380792SMatthias Ringwald 
6063*e8380792SMatthias Ringwald     /* Copy the value of Index pointer that points
6064*e8380792SMatthias Ringwald      * to the current location from where the input samples to be read */
6065*e8380792SMatthias Ringwald     rOffset = *readOffset;
6066*e8380792SMatthias Ringwald 
6067*e8380792SMatthias Ringwald     dst_end = (int32_t) (dst_base + dst_length);
6068*e8380792SMatthias Ringwald 
6069*e8380792SMatthias Ringwald     /* Loop over the blockSize */
6070*e8380792SMatthias Ringwald     i = blockSize;
6071*e8380792SMatthias Ringwald 
6072*e8380792SMatthias Ringwald     while(i > 0u)
6073*e8380792SMatthias Ringwald     {
6074*e8380792SMatthias Ringwald       /* copy the sample from the circular buffer to the destination buffer */
6075*e8380792SMatthias Ringwald       *dst = circBuffer[rOffset];
6076*e8380792SMatthias Ringwald 
6077*e8380792SMatthias Ringwald       /* Update the input pointer */
6078*e8380792SMatthias Ringwald       dst += dstInc;
6079*e8380792SMatthias Ringwald 
6080*e8380792SMatthias Ringwald       if(dst == (q7_t *) dst_end)
6081*e8380792SMatthias Ringwald       {
6082*e8380792SMatthias Ringwald         dst = dst_base;
6083*e8380792SMatthias Ringwald       }
6084*e8380792SMatthias Ringwald 
6085*e8380792SMatthias Ringwald       /* Circularly update rOffset.  Watch out for positive and negative value */
6086*e8380792SMatthias Ringwald       rOffset += bufferInc;
6087*e8380792SMatthias Ringwald 
6088*e8380792SMatthias Ringwald       if(rOffset >= L)
6089*e8380792SMatthias Ringwald       {
6090*e8380792SMatthias Ringwald         rOffset -= L;
6091*e8380792SMatthias Ringwald       }
6092*e8380792SMatthias Ringwald 
6093*e8380792SMatthias Ringwald       /* Decrement the loop counter */
6094*e8380792SMatthias Ringwald       i--;
6095*e8380792SMatthias Ringwald     }
6096*e8380792SMatthias Ringwald 
6097*e8380792SMatthias Ringwald     /* Update the index pointer */
6098*e8380792SMatthias Ringwald     *readOffset = rOffset;
6099*e8380792SMatthias Ringwald   }
6100*e8380792SMatthias Ringwald 
6101*e8380792SMatthias Ringwald 
6102*e8380792SMatthias Ringwald   /**
6103*e8380792SMatthias Ringwald    * @brief  Sum of the squares of the elements of a Q31 vector.
6104*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6105*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6106*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6107*e8380792SMatthias Ringwald    */
6108*e8380792SMatthias Ringwald   void arm_power_q31(
6109*e8380792SMatthias Ringwald   q31_t * pSrc,
6110*e8380792SMatthias Ringwald   uint32_t blockSize,
6111*e8380792SMatthias Ringwald   q63_t * pResult);
6112*e8380792SMatthias Ringwald 
6113*e8380792SMatthias Ringwald 
6114*e8380792SMatthias Ringwald   /**
6115*e8380792SMatthias Ringwald    * @brief  Sum of the squares of the elements of a floating-point vector.
6116*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6117*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6118*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6119*e8380792SMatthias Ringwald    */
6120*e8380792SMatthias Ringwald   void arm_power_f32(
6121*e8380792SMatthias Ringwald   float32_t * pSrc,
6122*e8380792SMatthias Ringwald   uint32_t blockSize,
6123*e8380792SMatthias Ringwald   float32_t * pResult);
6124*e8380792SMatthias Ringwald 
6125*e8380792SMatthias Ringwald 
6126*e8380792SMatthias Ringwald   /**
6127*e8380792SMatthias Ringwald    * @brief  Sum of the squares of the elements of a Q15 vector.
6128*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6129*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6130*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6131*e8380792SMatthias Ringwald    */
6132*e8380792SMatthias Ringwald   void arm_power_q15(
6133*e8380792SMatthias Ringwald   q15_t * pSrc,
6134*e8380792SMatthias Ringwald   uint32_t blockSize,
6135*e8380792SMatthias Ringwald   q63_t * pResult);
6136*e8380792SMatthias Ringwald 
6137*e8380792SMatthias Ringwald 
6138*e8380792SMatthias Ringwald   /**
6139*e8380792SMatthias Ringwald    * @brief  Sum of the squares of the elements of a Q7 vector.
6140*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6141*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6142*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6143*e8380792SMatthias Ringwald    */
6144*e8380792SMatthias Ringwald   void arm_power_q7(
6145*e8380792SMatthias Ringwald   q7_t * pSrc,
6146*e8380792SMatthias Ringwald   uint32_t blockSize,
6147*e8380792SMatthias Ringwald   q31_t * pResult);
6148*e8380792SMatthias Ringwald 
6149*e8380792SMatthias Ringwald 
6150*e8380792SMatthias Ringwald   /**
6151*e8380792SMatthias Ringwald    * @brief  Mean value of a Q7 vector.
6152*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6153*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6154*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6155*e8380792SMatthias Ringwald    */
6156*e8380792SMatthias Ringwald   void arm_mean_q7(
6157*e8380792SMatthias Ringwald   q7_t * pSrc,
6158*e8380792SMatthias Ringwald   uint32_t blockSize,
6159*e8380792SMatthias Ringwald   q7_t * pResult);
6160*e8380792SMatthias Ringwald 
6161*e8380792SMatthias Ringwald 
6162*e8380792SMatthias Ringwald   /**
6163*e8380792SMatthias Ringwald    * @brief  Mean value of a Q15 vector.
6164*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6165*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6166*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6167*e8380792SMatthias Ringwald    */
6168*e8380792SMatthias Ringwald   void arm_mean_q15(
6169*e8380792SMatthias Ringwald   q15_t * pSrc,
6170*e8380792SMatthias Ringwald   uint32_t blockSize,
6171*e8380792SMatthias Ringwald   q15_t * pResult);
6172*e8380792SMatthias Ringwald 
6173*e8380792SMatthias Ringwald 
6174*e8380792SMatthias Ringwald   /**
6175*e8380792SMatthias Ringwald    * @brief  Mean value of a Q31 vector.
6176*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6177*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6178*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6179*e8380792SMatthias Ringwald    */
6180*e8380792SMatthias Ringwald   void arm_mean_q31(
6181*e8380792SMatthias Ringwald   q31_t * pSrc,
6182*e8380792SMatthias Ringwald   uint32_t blockSize,
6183*e8380792SMatthias Ringwald   q31_t * pResult);
6184*e8380792SMatthias Ringwald 
6185*e8380792SMatthias Ringwald 
6186*e8380792SMatthias Ringwald   /**
6187*e8380792SMatthias Ringwald    * @brief  Mean value of a floating-point vector.
6188*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6189*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6190*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6191*e8380792SMatthias Ringwald    */
6192*e8380792SMatthias Ringwald   void arm_mean_f32(
6193*e8380792SMatthias Ringwald   float32_t * pSrc,
6194*e8380792SMatthias Ringwald   uint32_t blockSize,
6195*e8380792SMatthias Ringwald   float32_t * pResult);
6196*e8380792SMatthias Ringwald 
6197*e8380792SMatthias Ringwald 
6198*e8380792SMatthias Ringwald   /**
6199*e8380792SMatthias Ringwald    * @brief  Variance of the elements of a floating-point vector.
6200*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6201*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6202*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6203*e8380792SMatthias Ringwald    */
6204*e8380792SMatthias Ringwald   void arm_var_f32(
6205*e8380792SMatthias Ringwald   float32_t * pSrc,
6206*e8380792SMatthias Ringwald   uint32_t blockSize,
6207*e8380792SMatthias Ringwald   float32_t * pResult);
6208*e8380792SMatthias Ringwald 
6209*e8380792SMatthias Ringwald 
6210*e8380792SMatthias Ringwald   /**
6211*e8380792SMatthias Ringwald    * @brief  Variance of the elements of a Q31 vector.
6212*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6213*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6214*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6215*e8380792SMatthias Ringwald    */
6216*e8380792SMatthias Ringwald   void arm_var_q31(
6217*e8380792SMatthias Ringwald   q31_t * pSrc,
6218*e8380792SMatthias Ringwald   uint32_t blockSize,
6219*e8380792SMatthias Ringwald   q31_t * pResult);
6220*e8380792SMatthias Ringwald 
6221*e8380792SMatthias Ringwald 
6222*e8380792SMatthias Ringwald   /**
6223*e8380792SMatthias Ringwald    * @brief  Variance of the elements of a Q15 vector.
6224*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6225*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6226*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6227*e8380792SMatthias Ringwald    */
6228*e8380792SMatthias Ringwald   void arm_var_q15(
6229*e8380792SMatthias Ringwald   q15_t * pSrc,
6230*e8380792SMatthias Ringwald   uint32_t blockSize,
6231*e8380792SMatthias Ringwald   q15_t * pResult);
6232*e8380792SMatthias Ringwald 
6233*e8380792SMatthias Ringwald 
6234*e8380792SMatthias Ringwald   /**
6235*e8380792SMatthias Ringwald    * @brief  Root Mean Square of the elements of a floating-point vector.
6236*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6237*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6238*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6239*e8380792SMatthias Ringwald    */
6240*e8380792SMatthias Ringwald   void arm_rms_f32(
6241*e8380792SMatthias Ringwald   float32_t * pSrc,
6242*e8380792SMatthias Ringwald   uint32_t blockSize,
6243*e8380792SMatthias Ringwald   float32_t * pResult);
6244*e8380792SMatthias Ringwald 
6245*e8380792SMatthias Ringwald 
6246*e8380792SMatthias Ringwald   /**
6247*e8380792SMatthias Ringwald    * @brief  Root Mean Square of the elements of a Q31 vector.
6248*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6249*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6250*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6251*e8380792SMatthias Ringwald    */
6252*e8380792SMatthias Ringwald   void arm_rms_q31(
6253*e8380792SMatthias Ringwald   q31_t * pSrc,
6254*e8380792SMatthias Ringwald   uint32_t blockSize,
6255*e8380792SMatthias Ringwald   q31_t * pResult);
6256*e8380792SMatthias Ringwald 
6257*e8380792SMatthias Ringwald 
6258*e8380792SMatthias Ringwald   /**
6259*e8380792SMatthias Ringwald    * @brief  Root Mean Square of the elements of a Q15 vector.
6260*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6261*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6262*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6263*e8380792SMatthias Ringwald    */
6264*e8380792SMatthias Ringwald   void arm_rms_q15(
6265*e8380792SMatthias Ringwald   q15_t * pSrc,
6266*e8380792SMatthias Ringwald   uint32_t blockSize,
6267*e8380792SMatthias Ringwald   q15_t * pResult);
6268*e8380792SMatthias Ringwald 
6269*e8380792SMatthias Ringwald 
6270*e8380792SMatthias Ringwald   /**
6271*e8380792SMatthias Ringwald    * @brief  Standard deviation of the elements of a floating-point vector.
6272*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6273*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6274*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6275*e8380792SMatthias Ringwald    */
6276*e8380792SMatthias Ringwald   void arm_std_f32(
6277*e8380792SMatthias Ringwald   float32_t * pSrc,
6278*e8380792SMatthias Ringwald   uint32_t blockSize,
6279*e8380792SMatthias Ringwald   float32_t * pResult);
6280*e8380792SMatthias Ringwald 
6281*e8380792SMatthias Ringwald 
6282*e8380792SMatthias Ringwald   /**
6283*e8380792SMatthias Ringwald    * @brief  Standard deviation of the elements of a Q31 vector.
6284*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6285*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6286*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6287*e8380792SMatthias Ringwald    */
6288*e8380792SMatthias Ringwald   void arm_std_q31(
6289*e8380792SMatthias Ringwald   q31_t * pSrc,
6290*e8380792SMatthias Ringwald   uint32_t blockSize,
6291*e8380792SMatthias Ringwald   q31_t * pResult);
6292*e8380792SMatthias Ringwald 
6293*e8380792SMatthias Ringwald 
6294*e8380792SMatthias Ringwald   /**
6295*e8380792SMatthias Ringwald    * @brief  Standard deviation of the elements of a Q15 vector.
6296*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6297*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6298*e8380792SMatthias Ringwald    * @param[out] pResult    is output value.
6299*e8380792SMatthias Ringwald    */
6300*e8380792SMatthias Ringwald   void arm_std_q15(
6301*e8380792SMatthias Ringwald   q15_t * pSrc,
6302*e8380792SMatthias Ringwald   uint32_t blockSize,
6303*e8380792SMatthias Ringwald   q15_t * pResult);
6304*e8380792SMatthias Ringwald 
6305*e8380792SMatthias Ringwald 
6306*e8380792SMatthias Ringwald   /**
6307*e8380792SMatthias Ringwald    * @brief  Floating-point complex magnitude
6308*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the complex input vector
6309*e8380792SMatthias Ringwald    * @param[out] pDst        points to the real output vector
6310*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in the input vector
6311*e8380792SMatthias Ringwald    */
6312*e8380792SMatthias Ringwald   void arm_cmplx_mag_f32(
6313*e8380792SMatthias Ringwald   float32_t * pSrc,
6314*e8380792SMatthias Ringwald   float32_t * pDst,
6315*e8380792SMatthias Ringwald   uint32_t numSamples);
6316*e8380792SMatthias Ringwald 
6317*e8380792SMatthias Ringwald 
6318*e8380792SMatthias Ringwald   /**
6319*e8380792SMatthias Ringwald    * @brief  Q31 complex magnitude
6320*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the complex input vector
6321*e8380792SMatthias Ringwald    * @param[out] pDst        points to the real output vector
6322*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in the input vector
6323*e8380792SMatthias Ringwald    */
6324*e8380792SMatthias Ringwald   void arm_cmplx_mag_q31(
6325*e8380792SMatthias Ringwald   q31_t * pSrc,
6326*e8380792SMatthias Ringwald   q31_t * pDst,
6327*e8380792SMatthias Ringwald   uint32_t numSamples);
6328*e8380792SMatthias Ringwald 
6329*e8380792SMatthias Ringwald 
6330*e8380792SMatthias Ringwald   /**
6331*e8380792SMatthias Ringwald    * @brief  Q15 complex magnitude
6332*e8380792SMatthias Ringwald    * @param[in]  pSrc        points to the complex input vector
6333*e8380792SMatthias Ringwald    * @param[out] pDst        points to the real output vector
6334*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in the input vector
6335*e8380792SMatthias Ringwald    */
6336*e8380792SMatthias Ringwald   void arm_cmplx_mag_q15(
6337*e8380792SMatthias Ringwald   q15_t * pSrc,
6338*e8380792SMatthias Ringwald   q15_t * pDst,
6339*e8380792SMatthias Ringwald   uint32_t numSamples);
6340*e8380792SMatthias Ringwald 
6341*e8380792SMatthias Ringwald 
6342*e8380792SMatthias Ringwald   /**
6343*e8380792SMatthias Ringwald    * @brief  Q15 complex dot product
6344*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input vector
6345*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input vector
6346*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in each vector
6347*e8380792SMatthias Ringwald    * @param[out] realResult  real part of the result returned here
6348*e8380792SMatthias Ringwald    * @param[out] imagResult  imaginary part of the result returned here
6349*e8380792SMatthias Ringwald    */
6350*e8380792SMatthias Ringwald   void arm_cmplx_dot_prod_q15(
6351*e8380792SMatthias Ringwald   q15_t * pSrcA,
6352*e8380792SMatthias Ringwald   q15_t * pSrcB,
6353*e8380792SMatthias Ringwald   uint32_t numSamples,
6354*e8380792SMatthias Ringwald   q31_t * realResult,
6355*e8380792SMatthias Ringwald   q31_t * imagResult);
6356*e8380792SMatthias Ringwald 
6357*e8380792SMatthias Ringwald 
6358*e8380792SMatthias Ringwald   /**
6359*e8380792SMatthias Ringwald    * @brief  Q31 complex dot product
6360*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input vector
6361*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input vector
6362*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in each vector
6363*e8380792SMatthias Ringwald    * @param[out] realResult  real part of the result returned here
6364*e8380792SMatthias Ringwald    * @param[out] imagResult  imaginary part of the result returned here
6365*e8380792SMatthias Ringwald    */
6366*e8380792SMatthias Ringwald   void arm_cmplx_dot_prod_q31(
6367*e8380792SMatthias Ringwald   q31_t * pSrcA,
6368*e8380792SMatthias Ringwald   q31_t * pSrcB,
6369*e8380792SMatthias Ringwald   uint32_t numSamples,
6370*e8380792SMatthias Ringwald   q63_t * realResult,
6371*e8380792SMatthias Ringwald   q63_t * imagResult);
6372*e8380792SMatthias Ringwald 
6373*e8380792SMatthias Ringwald 
6374*e8380792SMatthias Ringwald   /**
6375*e8380792SMatthias Ringwald    * @brief  Floating-point complex dot product
6376*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input vector
6377*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input vector
6378*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in each vector
6379*e8380792SMatthias Ringwald    * @param[out] realResult  real part of the result returned here
6380*e8380792SMatthias Ringwald    * @param[out] imagResult  imaginary part of the result returned here
6381*e8380792SMatthias Ringwald    */
6382*e8380792SMatthias Ringwald   void arm_cmplx_dot_prod_f32(
6383*e8380792SMatthias Ringwald   float32_t * pSrcA,
6384*e8380792SMatthias Ringwald   float32_t * pSrcB,
6385*e8380792SMatthias Ringwald   uint32_t numSamples,
6386*e8380792SMatthias Ringwald   float32_t * realResult,
6387*e8380792SMatthias Ringwald   float32_t * imagResult);
6388*e8380792SMatthias Ringwald 
6389*e8380792SMatthias Ringwald 
6390*e8380792SMatthias Ringwald   /**
6391*e8380792SMatthias Ringwald    * @brief  Q15 complex-by-real multiplication
6392*e8380792SMatthias Ringwald    * @param[in]  pSrcCmplx   points to the complex input vector
6393*e8380792SMatthias Ringwald    * @param[in]  pSrcReal    points to the real input vector
6394*e8380792SMatthias Ringwald    * @param[out] pCmplxDst   points to the complex output vector
6395*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of samples in each vector
6396*e8380792SMatthias Ringwald    */
6397*e8380792SMatthias Ringwald   void arm_cmplx_mult_real_q15(
6398*e8380792SMatthias Ringwald   q15_t * pSrcCmplx,
6399*e8380792SMatthias Ringwald   q15_t * pSrcReal,
6400*e8380792SMatthias Ringwald   q15_t * pCmplxDst,
6401*e8380792SMatthias Ringwald   uint32_t numSamples);
6402*e8380792SMatthias Ringwald 
6403*e8380792SMatthias Ringwald 
6404*e8380792SMatthias Ringwald   /**
6405*e8380792SMatthias Ringwald    * @brief  Q31 complex-by-real multiplication
6406*e8380792SMatthias Ringwald    * @param[in]  pSrcCmplx   points to the complex input vector
6407*e8380792SMatthias Ringwald    * @param[in]  pSrcReal    points to the real input vector
6408*e8380792SMatthias Ringwald    * @param[out] pCmplxDst   points to the complex output vector
6409*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of samples in each vector
6410*e8380792SMatthias Ringwald    */
6411*e8380792SMatthias Ringwald   void arm_cmplx_mult_real_q31(
6412*e8380792SMatthias Ringwald   q31_t * pSrcCmplx,
6413*e8380792SMatthias Ringwald   q31_t * pSrcReal,
6414*e8380792SMatthias Ringwald   q31_t * pCmplxDst,
6415*e8380792SMatthias Ringwald   uint32_t numSamples);
6416*e8380792SMatthias Ringwald 
6417*e8380792SMatthias Ringwald 
6418*e8380792SMatthias Ringwald   /**
6419*e8380792SMatthias Ringwald    * @brief  Floating-point complex-by-real multiplication
6420*e8380792SMatthias Ringwald    * @param[in]  pSrcCmplx   points to the complex input vector
6421*e8380792SMatthias Ringwald    * @param[in]  pSrcReal    points to the real input vector
6422*e8380792SMatthias Ringwald    * @param[out] pCmplxDst   points to the complex output vector
6423*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of samples in each vector
6424*e8380792SMatthias Ringwald    */
6425*e8380792SMatthias Ringwald   void arm_cmplx_mult_real_f32(
6426*e8380792SMatthias Ringwald   float32_t * pSrcCmplx,
6427*e8380792SMatthias Ringwald   float32_t * pSrcReal,
6428*e8380792SMatthias Ringwald   float32_t * pCmplxDst,
6429*e8380792SMatthias Ringwald   uint32_t numSamples);
6430*e8380792SMatthias Ringwald 
6431*e8380792SMatthias Ringwald 
6432*e8380792SMatthias Ringwald   /**
6433*e8380792SMatthias Ringwald    * @brief  Minimum value of a Q7 vector.
6434*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6435*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6436*e8380792SMatthias Ringwald    * @param[out] result     is output pointer
6437*e8380792SMatthias Ringwald    * @param[in]  index      is the array index of the minimum value in the input buffer.
6438*e8380792SMatthias Ringwald    */
6439*e8380792SMatthias Ringwald   void arm_min_q7(
6440*e8380792SMatthias Ringwald   q7_t * pSrc,
6441*e8380792SMatthias Ringwald   uint32_t blockSize,
6442*e8380792SMatthias Ringwald   q7_t * result,
6443*e8380792SMatthias Ringwald   uint32_t * index);
6444*e8380792SMatthias Ringwald 
6445*e8380792SMatthias Ringwald 
6446*e8380792SMatthias Ringwald   /**
6447*e8380792SMatthias Ringwald    * @brief  Minimum value of a Q15 vector.
6448*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6449*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6450*e8380792SMatthias Ringwald    * @param[out] pResult    is output pointer
6451*e8380792SMatthias Ringwald    * @param[in]  pIndex     is the array index of the minimum value in the input buffer.
6452*e8380792SMatthias Ringwald    */
6453*e8380792SMatthias Ringwald   void arm_min_q15(
6454*e8380792SMatthias Ringwald   q15_t * pSrc,
6455*e8380792SMatthias Ringwald   uint32_t blockSize,
6456*e8380792SMatthias Ringwald   q15_t * pResult,
6457*e8380792SMatthias Ringwald   uint32_t * pIndex);
6458*e8380792SMatthias Ringwald 
6459*e8380792SMatthias Ringwald 
6460*e8380792SMatthias Ringwald   /**
6461*e8380792SMatthias Ringwald    * @brief  Minimum value of a Q31 vector.
6462*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6463*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6464*e8380792SMatthias Ringwald    * @param[out] pResult    is output pointer
6465*e8380792SMatthias Ringwald    * @param[out] pIndex     is the array index of the minimum value in the input buffer.
6466*e8380792SMatthias Ringwald    */
6467*e8380792SMatthias Ringwald   void arm_min_q31(
6468*e8380792SMatthias Ringwald   q31_t * pSrc,
6469*e8380792SMatthias Ringwald   uint32_t blockSize,
6470*e8380792SMatthias Ringwald   q31_t * pResult,
6471*e8380792SMatthias Ringwald   uint32_t * pIndex);
6472*e8380792SMatthias Ringwald 
6473*e8380792SMatthias Ringwald 
6474*e8380792SMatthias Ringwald   /**
6475*e8380792SMatthias Ringwald    * @brief  Minimum value of a floating-point vector.
6476*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6477*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6478*e8380792SMatthias Ringwald    * @param[out] pResult    is output pointer
6479*e8380792SMatthias Ringwald    * @param[out] pIndex     is the array index of the minimum value in the input buffer.
6480*e8380792SMatthias Ringwald    */
6481*e8380792SMatthias Ringwald   void arm_min_f32(
6482*e8380792SMatthias Ringwald   float32_t * pSrc,
6483*e8380792SMatthias Ringwald   uint32_t blockSize,
6484*e8380792SMatthias Ringwald   float32_t * pResult,
6485*e8380792SMatthias Ringwald   uint32_t * pIndex);
6486*e8380792SMatthias Ringwald 
6487*e8380792SMatthias Ringwald 
6488*e8380792SMatthias Ringwald /**
6489*e8380792SMatthias Ringwald  * @brief Maximum value of a Q7 vector.
6490*e8380792SMatthias Ringwald  * @param[in]  pSrc       points to the input buffer
6491*e8380792SMatthias Ringwald  * @param[in]  blockSize  length of the input vector
6492*e8380792SMatthias Ringwald  * @param[out] pResult    maximum value returned here
6493*e8380792SMatthias Ringwald  * @param[out] pIndex     index of maximum value returned here
6494*e8380792SMatthias Ringwald  */
6495*e8380792SMatthias Ringwald   void arm_max_q7(
6496*e8380792SMatthias Ringwald   q7_t * pSrc,
6497*e8380792SMatthias Ringwald   uint32_t blockSize,
6498*e8380792SMatthias Ringwald   q7_t * pResult,
6499*e8380792SMatthias Ringwald   uint32_t * pIndex);
6500*e8380792SMatthias Ringwald 
6501*e8380792SMatthias Ringwald 
6502*e8380792SMatthias Ringwald /**
6503*e8380792SMatthias Ringwald  * @brief Maximum value of a Q15 vector.
6504*e8380792SMatthias Ringwald  * @param[in]  pSrc       points to the input buffer
6505*e8380792SMatthias Ringwald  * @param[in]  blockSize  length of the input vector
6506*e8380792SMatthias Ringwald  * @param[out] pResult    maximum value returned here
6507*e8380792SMatthias Ringwald  * @param[out] pIndex     index of maximum value returned here
6508*e8380792SMatthias Ringwald  */
6509*e8380792SMatthias Ringwald   void arm_max_q15(
6510*e8380792SMatthias Ringwald   q15_t * pSrc,
6511*e8380792SMatthias Ringwald   uint32_t blockSize,
6512*e8380792SMatthias Ringwald   q15_t * pResult,
6513*e8380792SMatthias Ringwald   uint32_t * pIndex);
6514*e8380792SMatthias Ringwald 
6515*e8380792SMatthias Ringwald 
6516*e8380792SMatthias Ringwald /**
6517*e8380792SMatthias Ringwald  * @brief Maximum value of a Q31 vector.
6518*e8380792SMatthias Ringwald  * @param[in]  pSrc       points to the input buffer
6519*e8380792SMatthias Ringwald  * @param[in]  blockSize  length of the input vector
6520*e8380792SMatthias Ringwald  * @param[out] pResult    maximum value returned here
6521*e8380792SMatthias Ringwald  * @param[out] pIndex     index of maximum value returned here
6522*e8380792SMatthias Ringwald  */
6523*e8380792SMatthias Ringwald   void arm_max_q31(
6524*e8380792SMatthias Ringwald   q31_t * pSrc,
6525*e8380792SMatthias Ringwald   uint32_t blockSize,
6526*e8380792SMatthias Ringwald   q31_t * pResult,
6527*e8380792SMatthias Ringwald   uint32_t * pIndex);
6528*e8380792SMatthias Ringwald 
6529*e8380792SMatthias Ringwald 
6530*e8380792SMatthias Ringwald /**
6531*e8380792SMatthias Ringwald  * @brief Maximum value of a floating-point vector.
6532*e8380792SMatthias Ringwald  * @param[in]  pSrc       points to the input buffer
6533*e8380792SMatthias Ringwald  * @param[in]  blockSize  length of the input vector
6534*e8380792SMatthias Ringwald  * @param[out] pResult    maximum value returned here
6535*e8380792SMatthias Ringwald  * @param[out] pIndex     index of maximum value returned here
6536*e8380792SMatthias Ringwald  */
6537*e8380792SMatthias Ringwald   void arm_max_f32(
6538*e8380792SMatthias Ringwald   float32_t * pSrc,
6539*e8380792SMatthias Ringwald   uint32_t blockSize,
6540*e8380792SMatthias Ringwald   float32_t * pResult,
6541*e8380792SMatthias Ringwald   uint32_t * pIndex);
6542*e8380792SMatthias Ringwald 
6543*e8380792SMatthias Ringwald 
6544*e8380792SMatthias Ringwald   /**
6545*e8380792SMatthias Ringwald    * @brief  Q15 complex-by-complex multiplication
6546*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input vector
6547*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input vector
6548*e8380792SMatthias Ringwald    * @param[out] pDst        points to the output vector
6549*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in each vector
6550*e8380792SMatthias Ringwald    */
6551*e8380792SMatthias Ringwald   void arm_cmplx_mult_cmplx_q15(
6552*e8380792SMatthias Ringwald   q15_t * pSrcA,
6553*e8380792SMatthias Ringwald   q15_t * pSrcB,
6554*e8380792SMatthias Ringwald   q15_t * pDst,
6555*e8380792SMatthias Ringwald   uint32_t numSamples);
6556*e8380792SMatthias Ringwald 
6557*e8380792SMatthias Ringwald 
6558*e8380792SMatthias Ringwald   /**
6559*e8380792SMatthias Ringwald    * @brief  Q31 complex-by-complex multiplication
6560*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input vector
6561*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input vector
6562*e8380792SMatthias Ringwald    * @param[out] pDst        points to the output vector
6563*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in each vector
6564*e8380792SMatthias Ringwald    */
6565*e8380792SMatthias Ringwald   void arm_cmplx_mult_cmplx_q31(
6566*e8380792SMatthias Ringwald   q31_t * pSrcA,
6567*e8380792SMatthias Ringwald   q31_t * pSrcB,
6568*e8380792SMatthias Ringwald   q31_t * pDst,
6569*e8380792SMatthias Ringwald   uint32_t numSamples);
6570*e8380792SMatthias Ringwald 
6571*e8380792SMatthias Ringwald 
6572*e8380792SMatthias Ringwald   /**
6573*e8380792SMatthias Ringwald    * @brief  Floating-point complex-by-complex multiplication
6574*e8380792SMatthias Ringwald    * @param[in]  pSrcA       points to the first input vector
6575*e8380792SMatthias Ringwald    * @param[in]  pSrcB       points to the second input vector
6576*e8380792SMatthias Ringwald    * @param[out] pDst        points to the output vector
6577*e8380792SMatthias Ringwald    * @param[in]  numSamples  number of complex samples in each vector
6578*e8380792SMatthias Ringwald    */
6579*e8380792SMatthias Ringwald   void arm_cmplx_mult_cmplx_f32(
6580*e8380792SMatthias Ringwald   float32_t * pSrcA,
6581*e8380792SMatthias Ringwald   float32_t * pSrcB,
6582*e8380792SMatthias Ringwald   float32_t * pDst,
6583*e8380792SMatthias Ringwald   uint32_t numSamples);
6584*e8380792SMatthias Ringwald 
6585*e8380792SMatthias Ringwald 
6586*e8380792SMatthias Ringwald   /**
6587*e8380792SMatthias Ringwald    * @brief Converts the elements of the floating-point vector to Q31 vector.
6588*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the floating-point input vector
6589*e8380792SMatthias Ringwald    * @param[out] pDst       points to the Q31 output vector
6590*e8380792SMatthias Ringwald    * @param[in]  blockSize  length of the input vector
6591*e8380792SMatthias Ringwald    */
6592*e8380792SMatthias Ringwald   void arm_float_to_q31(
6593*e8380792SMatthias Ringwald   float32_t * pSrc,
6594*e8380792SMatthias Ringwald   q31_t * pDst,
6595*e8380792SMatthias Ringwald   uint32_t blockSize);
6596*e8380792SMatthias Ringwald 
6597*e8380792SMatthias Ringwald 
6598*e8380792SMatthias Ringwald   /**
6599*e8380792SMatthias Ringwald    * @brief Converts the elements of the floating-point vector to Q15 vector.
6600*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the floating-point input vector
6601*e8380792SMatthias Ringwald    * @param[out] pDst       points to the Q15 output vector
6602*e8380792SMatthias Ringwald    * @param[in]  blockSize  length of the input vector
6603*e8380792SMatthias Ringwald    */
6604*e8380792SMatthias Ringwald   void arm_float_to_q15(
6605*e8380792SMatthias Ringwald   float32_t * pSrc,
6606*e8380792SMatthias Ringwald   q15_t * pDst,
6607*e8380792SMatthias Ringwald   uint32_t blockSize);
6608*e8380792SMatthias Ringwald 
6609*e8380792SMatthias Ringwald 
6610*e8380792SMatthias Ringwald   /**
6611*e8380792SMatthias Ringwald    * @brief Converts the elements of the floating-point vector to Q7 vector.
6612*e8380792SMatthias Ringwald    * @param[in]  pSrc       points to the floating-point input vector
6613*e8380792SMatthias Ringwald    * @param[out] pDst       points to the Q7 output vector
6614*e8380792SMatthias Ringwald    * @param[in]  blockSize  length of the input vector
6615*e8380792SMatthias Ringwald    */
6616*e8380792SMatthias Ringwald   void arm_float_to_q7(
6617*e8380792SMatthias Ringwald   float32_t * pSrc,
6618*e8380792SMatthias Ringwald   q7_t * pDst,
6619*e8380792SMatthias Ringwald   uint32_t blockSize);
6620*e8380792SMatthias Ringwald 
6621*e8380792SMatthias Ringwald 
6622*e8380792SMatthias Ringwald   /**
6623*e8380792SMatthias Ringwald    * @brief  Converts the elements of the Q31 vector to Q15 vector.
6624*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6625*e8380792SMatthias Ringwald    * @param[out] pDst       is output pointer
6626*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6627*e8380792SMatthias Ringwald    */
6628*e8380792SMatthias Ringwald   void arm_q31_to_q15(
6629*e8380792SMatthias Ringwald   q31_t * pSrc,
6630*e8380792SMatthias Ringwald   q15_t * pDst,
6631*e8380792SMatthias Ringwald   uint32_t blockSize);
6632*e8380792SMatthias Ringwald 
6633*e8380792SMatthias Ringwald 
6634*e8380792SMatthias Ringwald   /**
6635*e8380792SMatthias Ringwald    * @brief  Converts the elements of the Q31 vector to Q7 vector.
6636*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6637*e8380792SMatthias Ringwald    * @param[out] pDst       is output pointer
6638*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6639*e8380792SMatthias Ringwald    */
6640*e8380792SMatthias Ringwald   void arm_q31_to_q7(
6641*e8380792SMatthias Ringwald   q31_t * pSrc,
6642*e8380792SMatthias Ringwald   q7_t * pDst,
6643*e8380792SMatthias Ringwald   uint32_t blockSize);
6644*e8380792SMatthias Ringwald 
6645*e8380792SMatthias Ringwald 
6646*e8380792SMatthias Ringwald   /**
6647*e8380792SMatthias Ringwald    * @brief  Converts the elements of the Q15 vector to floating-point vector.
6648*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6649*e8380792SMatthias Ringwald    * @param[out] pDst       is output pointer
6650*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6651*e8380792SMatthias Ringwald    */
6652*e8380792SMatthias Ringwald   void arm_q15_to_float(
6653*e8380792SMatthias Ringwald   q15_t * pSrc,
6654*e8380792SMatthias Ringwald   float32_t * pDst,
6655*e8380792SMatthias Ringwald   uint32_t blockSize);
6656*e8380792SMatthias Ringwald 
6657*e8380792SMatthias Ringwald 
6658*e8380792SMatthias Ringwald   /**
6659*e8380792SMatthias Ringwald    * @brief  Converts the elements of the Q15 vector to Q31 vector.
6660*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6661*e8380792SMatthias Ringwald    * @param[out] pDst       is output pointer
6662*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6663*e8380792SMatthias Ringwald    */
6664*e8380792SMatthias Ringwald   void arm_q15_to_q31(
6665*e8380792SMatthias Ringwald   q15_t * pSrc,
6666*e8380792SMatthias Ringwald   q31_t * pDst,
6667*e8380792SMatthias Ringwald   uint32_t blockSize);
6668*e8380792SMatthias Ringwald 
6669*e8380792SMatthias Ringwald 
6670*e8380792SMatthias Ringwald   /**
6671*e8380792SMatthias Ringwald    * @brief  Converts the elements of the Q15 vector to Q7 vector.
6672*e8380792SMatthias Ringwald    * @param[in]  pSrc       is input pointer
6673*e8380792SMatthias Ringwald    * @param[out] pDst       is output pointer
6674*e8380792SMatthias Ringwald    * @param[in]  blockSize  is the number of samples to process
6675*e8380792SMatthias Ringwald    */
6676*e8380792SMatthias Ringwald   void arm_q15_to_q7(
6677*e8380792SMatthias Ringwald   q15_t * pSrc,
6678*e8380792SMatthias Ringwald   q7_t * pDst,
6679*e8380792SMatthias Ringwald   uint32_t blockSize);
6680*e8380792SMatthias Ringwald 
6681*e8380792SMatthias Ringwald 
6682*e8380792SMatthias Ringwald   /**
6683*e8380792SMatthias Ringwald    * @ingroup groupInterpolation
6684*e8380792SMatthias Ringwald    */
6685*e8380792SMatthias Ringwald 
6686*e8380792SMatthias Ringwald   /**
6687*e8380792SMatthias Ringwald    * @defgroup BilinearInterpolate Bilinear Interpolation
6688*e8380792SMatthias Ringwald    *
6689*e8380792SMatthias Ringwald    * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid.
6690*e8380792SMatthias Ringwald    * The underlying function <code>f(x, y)</code> is sampled on a regular grid and the interpolation process
6691*e8380792SMatthias Ringwald    * determines values between the grid points.
6692*e8380792SMatthias Ringwald    * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension.
6693*e8380792SMatthias Ringwald    * Bilinear interpolation is often used in image processing to rescale images.
6694*e8380792SMatthias Ringwald    * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types.
6695*e8380792SMatthias Ringwald    *
6696*e8380792SMatthias Ringwald    * <b>Algorithm</b>
6697*e8380792SMatthias Ringwald    * \par
6698*e8380792SMatthias Ringwald    * The instance structure used by the bilinear interpolation functions describes a two dimensional data table.
6699*e8380792SMatthias Ringwald    * For floating-point, the instance structure is defined as:
6700*e8380792SMatthias Ringwald    * <pre>
6701*e8380792SMatthias Ringwald    *   typedef struct
6702*e8380792SMatthias Ringwald    *   {
6703*e8380792SMatthias Ringwald    *     uint16_t numRows;
6704*e8380792SMatthias Ringwald    *     uint16_t numCols;
6705*e8380792SMatthias Ringwald    *     float32_t *pData;
6706*e8380792SMatthias Ringwald    * } arm_bilinear_interp_instance_f32;
6707*e8380792SMatthias Ringwald    * </pre>
6708*e8380792SMatthias Ringwald    *
6709*e8380792SMatthias Ringwald    * \par
6710*e8380792SMatthias Ringwald    * where <code>numRows</code> specifies the number of rows in the table;
6711*e8380792SMatthias Ringwald    * <code>numCols</code> specifies the number of columns in the table;
6712*e8380792SMatthias Ringwald    * and <code>pData</code> points to an array of size <code>numRows*numCols</code> values.
6713*e8380792SMatthias Ringwald    * The data table <code>pTable</code> is organized in row order and the supplied data values fall on integer indexes.
6714*e8380792SMatthias Ringwald    * That is, table element (x,y) is located at <code>pTable[x + y*numCols]</code> where x and y are integers.
6715*e8380792SMatthias Ringwald    *
6716*e8380792SMatthias Ringwald    * \par
6717*e8380792SMatthias Ringwald    * Let <code>(x, y)</code> specify the desired interpolation point.  Then define:
6718*e8380792SMatthias Ringwald    * <pre>
6719*e8380792SMatthias Ringwald    *     XF = floor(x)
6720*e8380792SMatthias Ringwald    *     YF = floor(y)
6721*e8380792SMatthias Ringwald    * </pre>
6722*e8380792SMatthias Ringwald    * \par
6723*e8380792SMatthias Ringwald    * The interpolated output point is computed as:
6724*e8380792SMatthias Ringwald    * <pre>
6725*e8380792SMatthias Ringwald    *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
6726*e8380792SMatthias Ringwald    *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
6727*e8380792SMatthias Ringwald    *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
6728*e8380792SMatthias Ringwald    *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
6729*e8380792SMatthias Ringwald    * </pre>
6730*e8380792SMatthias Ringwald    * Note that the coordinates (x, y) contain integer and fractional components.
6731*e8380792SMatthias Ringwald    * The integer components specify which portion of the table to use while the
6732*e8380792SMatthias Ringwald    * fractional components control the interpolation processor.
6733*e8380792SMatthias Ringwald    *
6734*e8380792SMatthias Ringwald    * \par
6735*e8380792SMatthias Ringwald    * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output.
6736*e8380792SMatthias Ringwald    */
6737*e8380792SMatthias Ringwald 
6738*e8380792SMatthias Ringwald   /**
6739*e8380792SMatthias Ringwald    * @addtogroup BilinearInterpolate
6740*e8380792SMatthias Ringwald    * @{
6741*e8380792SMatthias Ringwald    */
6742*e8380792SMatthias Ringwald 
6743*e8380792SMatthias Ringwald 
6744*e8380792SMatthias Ringwald   /**
6745*e8380792SMatthias Ringwald   *
6746*e8380792SMatthias Ringwald   * @brief  Floating-point bilinear interpolation.
6747*e8380792SMatthias Ringwald   * @param[in,out] S  points to an instance of the interpolation structure.
6748*e8380792SMatthias Ringwald   * @param[in]     X  interpolation coordinate.
6749*e8380792SMatthias Ringwald   * @param[in]     Y  interpolation coordinate.
6750*e8380792SMatthias Ringwald   * @return out interpolated value.
6751*e8380792SMatthias Ringwald   */
arm_bilinear_interp_f32(const arm_bilinear_interp_instance_f32 * S,float32_t X,float32_t Y)6752*e8380792SMatthias Ringwald   static __INLINE float32_t arm_bilinear_interp_f32(
6753*e8380792SMatthias Ringwald   const arm_bilinear_interp_instance_f32 * S,
6754*e8380792SMatthias Ringwald   float32_t X,
6755*e8380792SMatthias Ringwald   float32_t Y)
6756*e8380792SMatthias Ringwald   {
6757*e8380792SMatthias Ringwald     float32_t out;
6758*e8380792SMatthias Ringwald     float32_t f00, f01, f10, f11;
6759*e8380792SMatthias Ringwald     float32_t *pData = S->pData;
6760*e8380792SMatthias Ringwald     int32_t xIndex, yIndex, index;
6761*e8380792SMatthias Ringwald     float32_t xdiff, ydiff;
6762*e8380792SMatthias Ringwald     float32_t b1, b2, b3, b4;
6763*e8380792SMatthias Ringwald 
6764*e8380792SMatthias Ringwald     xIndex = (int32_t) X;
6765*e8380792SMatthias Ringwald     yIndex = (int32_t) Y;
6766*e8380792SMatthias Ringwald 
6767*e8380792SMatthias Ringwald     /* Care taken for table outside boundary */
6768*e8380792SMatthias Ringwald     /* Returns zero output when values are outside table boundary */
6769*e8380792SMatthias Ringwald     if(xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 || yIndex > (S->numCols - 1))
6770*e8380792SMatthias Ringwald     {
6771*e8380792SMatthias Ringwald       return (0);
6772*e8380792SMatthias Ringwald     }
6773*e8380792SMatthias Ringwald 
6774*e8380792SMatthias Ringwald     /* Calculation of index for two nearest points in X-direction */
6775*e8380792SMatthias Ringwald     index = (xIndex - 1) + (yIndex - 1) * S->numCols;
6776*e8380792SMatthias Ringwald 
6777*e8380792SMatthias Ringwald 
6778*e8380792SMatthias Ringwald     /* Read two nearest points in X-direction */
6779*e8380792SMatthias Ringwald     f00 = pData[index];
6780*e8380792SMatthias Ringwald     f01 = pData[index + 1];
6781*e8380792SMatthias Ringwald 
6782*e8380792SMatthias Ringwald     /* Calculation of index for two nearest points in Y-direction */
6783*e8380792SMatthias Ringwald     index = (xIndex - 1) + (yIndex) * S->numCols;
6784*e8380792SMatthias Ringwald 
6785*e8380792SMatthias Ringwald 
6786*e8380792SMatthias Ringwald     /* Read two nearest points in Y-direction */
6787*e8380792SMatthias Ringwald     f10 = pData[index];
6788*e8380792SMatthias Ringwald     f11 = pData[index + 1];
6789*e8380792SMatthias Ringwald 
6790*e8380792SMatthias Ringwald     /* Calculation of intermediate values */
6791*e8380792SMatthias Ringwald     b1 = f00;
6792*e8380792SMatthias Ringwald     b2 = f01 - f00;
6793*e8380792SMatthias Ringwald     b3 = f10 - f00;
6794*e8380792SMatthias Ringwald     b4 = f00 - f01 - f10 + f11;
6795*e8380792SMatthias Ringwald 
6796*e8380792SMatthias Ringwald     /* Calculation of fractional part in X */
6797*e8380792SMatthias Ringwald     xdiff = X - xIndex;
6798*e8380792SMatthias Ringwald 
6799*e8380792SMatthias Ringwald     /* Calculation of fractional part in Y */
6800*e8380792SMatthias Ringwald     ydiff = Y - yIndex;
6801*e8380792SMatthias Ringwald 
6802*e8380792SMatthias Ringwald     /* Calculation of bi-linear interpolated output */
6803*e8380792SMatthias Ringwald     out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff;
6804*e8380792SMatthias Ringwald 
6805*e8380792SMatthias Ringwald     /* return to application */
6806*e8380792SMatthias Ringwald     return (out);
6807*e8380792SMatthias Ringwald   }
6808*e8380792SMatthias Ringwald 
6809*e8380792SMatthias Ringwald 
6810*e8380792SMatthias Ringwald   /**
6811*e8380792SMatthias Ringwald   *
6812*e8380792SMatthias Ringwald   * @brief  Q31 bilinear interpolation.
6813*e8380792SMatthias Ringwald   * @param[in,out] S  points to an instance of the interpolation structure.
6814*e8380792SMatthias Ringwald   * @param[in]     X  interpolation coordinate in 12.20 format.
6815*e8380792SMatthias Ringwald   * @param[in]     Y  interpolation coordinate in 12.20 format.
6816*e8380792SMatthias Ringwald   * @return out interpolated value.
6817*e8380792SMatthias Ringwald   */
arm_bilinear_interp_q31(arm_bilinear_interp_instance_q31 * S,q31_t X,q31_t Y)6818*e8380792SMatthias Ringwald   static __INLINE q31_t arm_bilinear_interp_q31(
6819*e8380792SMatthias Ringwald   arm_bilinear_interp_instance_q31 * S,
6820*e8380792SMatthias Ringwald   q31_t X,
6821*e8380792SMatthias Ringwald   q31_t Y)
6822*e8380792SMatthias Ringwald   {
6823*e8380792SMatthias Ringwald     q31_t out;                                   /* Temporary output */
6824*e8380792SMatthias Ringwald     q31_t acc = 0;                               /* output */
6825*e8380792SMatthias Ringwald     q31_t xfract, yfract;                        /* X, Y fractional parts */
6826*e8380792SMatthias Ringwald     q31_t x1, x2, y1, y2;                        /* Nearest output values */
6827*e8380792SMatthias Ringwald     int32_t rI, cI;                              /* Row and column indices */
6828*e8380792SMatthias Ringwald     q31_t *pYData = S->pData;                    /* pointer to output table values */
6829*e8380792SMatthias Ringwald     uint32_t nCols = S->numCols;                 /* num of rows */
6830*e8380792SMatthias Ringwald 
6831*e8380792SMatthias Ringwald     /* Input is in 12.20 format */
6832*e8380792SMatthias Ringwald     /* 12 bits for the table index */
6833*e8380792SMatthias Ringwald     /* Index value calculation */
6834*e8380792SMatthias Ringwald     rI = ((X & (q31_t)0xFFF00000) >> 20);
6835*e8380792SMatthias Ringwald 
6836*e8380792SMatthias Ringwald     /* Input is in 12.20 format */
6837*e8380792SMatthias Ringwald     /* 12 bits for the table index */
6838*e8380792SMatthias Ringwald     /* Index value calculation */
6839*e8380792SMatthias Ringwald     cI = ((Y & (q31_t)0xFFF00000) >> 20);
6840*e8380792SMatthias Ringwald 
6841*e8380792SMatthias Ringwald     /* Care taken for table outside boundary */
6842*e8380792SMatthias Ringwald     /* Returns zero output when values are outside table boundary */
6843*e8380792SMatthias Ringwald     if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1))
6844*e8380792SMatthias Ringwald     {
6845*e8380792SMatthias Ringwald       return (0);
6846*e8380792SMatthias Ringwald     }
6847*e8380792SMatthias Ringwald 
6848*e8380792SMatthias Ringwald     /* 20 bits for the fractional part */
6849*e8380792SMatthias Ringwald     /* shift left xfract by 11 to keep 1.31 format */
6850*e8380792SMatthias Ringwald     xfract = (X & 0x000FFFFF) << 11u;
6851*e8380792SMatthias Ringwald 
6852*e8380792SMatthias Ringwald     /* Read two nearest output values from the index */
6853*e8380792SMatthias Ringwald     x1 = pYData[(rI) + (int32_t)nCols * (cI)    ];
6854*e8380792SMatthias Ringwald     x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1];
6855*e8380792SMatthias Ringwald 
6856*e8380792SMatthias Ringwald     /* 20 bits for the fractional part */
6857*e8380792SMatthias Ringwald     /* shift left yfract by 11 to keep 1.31 format */
6858*e8380792SMatthias Ringwald     yfract = (Y & 0x000FFFFF) << 11u;
6859*e8380792SMatthias Ringwald 
6860*e8380792SMatthias Ringwald     /* Read two nearest output values from the index */
6861*e8380792SMatthias Ringwald     y1 = pYData[(rI) + (int32_t)nCols * (cI + 1)    ];
6862*e8380792SMatthias Ringwald     y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1];
6863*e8380792SMatthias Ringwald 
6864*e8380792SMatthias Ringwald     /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */
6865*e8380792SMatthias Ringwald     out = ((q31_t) (((q63_t) x1  * (0x7FFFFFFF - xfract)) >> 32));
6866*e8380792SMatthias Ringwald     acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32));
6867*e8380792SMatthias Ringwald 
6868*e8380792SMatthias Ringwald     /* x2 * (xfract) * (1-yfract)  in 3.29(q29) and adding to acc */
6869*e8380792SMatthias Ringwald     out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32));
6870*e8380792SMatthias Ringwald     acc += ((q31_t) ((q63_t) out * (xfract) >> 32));
6871*e8380792SMatthias Ringwald 
6872*e8380792SMatthias Ringwald     /* y1 * (1 - xfract) * (yfract)  in 3.29(q29) and adding to acc */
6873*e8380792SMatthias Ringwald     out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32));
6874*e8380792SMatthias Ringwald     acc += ((q31_t) ((q63_t) out * (yfract) >> 32));
6875*e8380792SMatthias Ringwald 
6876*e8380792SMatthias Ringwald     /* y2 * (xfract) * (yfract)  in 3.29(q29) and adding to acc */
6877*e8380792SMatthias Ringwald     out = ((q31_t) ((q63_t) y2 * (xfract) >> 32));
6878*e8380792SMatthias Ringwald     acc += ((q31_t) ((q63_t) out * (yfract) >> 32));
6879*e8380792SMatthias Ringwald 
6880*e8380792SMatthias Ringwald     /* Convert acc to 1.31(q31) format */
6881*e8380792SMatthias Ringwald     return ((q31_t)(acc << 2));
6882*e8380792SMatthias Ringwald   }
6883*e8380792SMatthias Ringwald 
6884*e8380792SMatthias Ringwald 
6885*e8380792SMatthias Ringwald   /**
6886*e8380792SMatthias Ringwald   * @brief  Q15 bilinear interpolation.
6887*e8380792SMatthias Ringwald   * @param[in,out] S  points to an instance of the interpolation structure.
6888*e8380792SMatthias Ringwald   * @param[in]     X  interpolation coordinate in 12.20 format.
6889*e8380792SMatthias Ringwald   * @param[in]     Y  interpolation coordinate in 12.20 format.
6890*e8380792SMatthias Ringwald   * @return out interpolated value.
6891*e8380792SMatthias Ringwald   */
arm_bilinear_interp_q15(arm_bilinear_interp_instance_q15 * S,q31_t X,q31_t Y)6892*e8380792SMatthias Ringwald   static __INLINE q15_t arm_bilinear_interp_q15(
6893*e8380792SMatthias Ringwald   arm_bilinear_interp_instance_q15 * S,
6894*e8380792SMatthias Ringwald   q31_t X,
6895*e8380792SMatthias Ringwald   q31_t Y)
6896*e8380792SMatthias Ringwald   {
6897*e8380792SMatthias Ringwald     q63_t acc = 0;                               /* output */
6898*e8380792SMatthias Ringwald     q31_t out;                                   /* Temporary output */
6899*e8380792SMatthias Ringwald     q15_t x1, x2, y1, y2;                        /* Nearest output values */
6900*e8380792SMatthias Ringwald     q31_t xfract, yfract;                        /* X, Y fractional parts */
6901*e8380792SMatthias Ringwald     int32_t rI, cI;                              /* Row and column indices */
6902*e8380792SMatthias Ringwald     q15_t *pYData = S->pData;                    /* pointer to output table values */
6903*e8380792SMatthias Ringwald     uint32_t nCols = S->numCols;                 /* num of rows */
6904*e8380792SMatthias Ringwald 
6905*e8380792SMatthias Ringwald     /* Input is in 12.20 format */
6906*e8380792SMatthias Ringwald     /* 12 bits for the table index */
6907*e8380792SMatthias Ringwald     /* Index value calculation */
6908*e8380792SMatthias Ringwald     rI = ((X & (q31_t)0xFFF00000) >> 20);
6909*e8380792SMatthias Ringwald 
6910*e8380792SMatthias Ringwald     /* Input is in 12.20 format */
6911*e8380792SMatthias Ringwald     /* 12 bits for the table index */
6912*e8380792SMatthias Ringwald     /* Index value calculation */
6913*e8380792SMatthias Ringwald     cI = ((Y & (q31_t)0xFFF00000) >> 20);
6914*e8380792SMatthias Ringwald 
6915*e8380792SMatthias Ringwald     /* Care taken for table outside boundary */
6916*e8380792SMatthias Ringwald     /* Returns zero output when values are outside table boundary */
6917*e8380792SMatthias Ringwald     if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1))
6918*e8380792SMatthias Ringwald     {
6919*e8380792SMatthias Ringwald       return (0);
6920*e8380792SMatthias Ringwald     }
6921*e8380792SMatthias Ringwald 
6922*e8380792SMatthias Ringwald     /* 20 bits for the fractional part */
6923*e8380792SMatthias Ringwald     /* xfract should be in 12.20 format */
6924*e8380792SMatthias Ringwald     xfract = (X & 0x000FFFFF);
6925*e8380792SMatthias Ringwald 
6926*e8380792SMatthias Ringwald     /* Read two nearest output values from the index */
6927*e8380792SMatthias Ringwald     x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI)    ];
6928*e8380792SMatthias Ringwald     x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1];
6929*e8380792SMatthias Ringwald 
6930*e8380792SMatthias Ringwald     /* 20 bits for the fractional part */
6931*e8380792SMatthias Ringwald     /* yfract should be in 12.20 format */
6932*e8380792SMatthias Ringwald     yfract = (Y & 0x000FFFFF);
6933*e8380792SMatthias Ringwald 
6934*e8380792SMatthias Ringwald     /* Read two nearest output values from the index */
6935*e8380792SMatthias Ringwald     y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1)    ];
6936*e8380792SMatthias Ringwald     y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1];
6937*e8380792SMatthias Ringwald 
6938*e8380792SMatthias Ringwald     /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */
6939*e8380792SMatthias Ringwald 
6940*e8380792SMatthias Ringwald     /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */
6941*e8380792SMatthias Ringwald     /* convert 13.35 to 13.31 by right shifting  and out is in 1.31 */
6942*e8380792SMatthias Ringwald     out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u);
6943*e8380792SMatthias Ringwald     acc = ((q63_t) out * (0xFFFFF - yfract));
6944*e8380792SMatthias Ringwald 
6945*e8380792SMatthias Ringwald     /* x2 * (xfract) * (1-yfract)  in 1.51 and adding to acc */
6946*e8380792SMatthias Ringwald     out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u);
6947*e8380792SMatthias Ringwald     acc += ((q63_t) out * (xfract));
6948*e8380792SMatthias Ringwald 
6949*e8380792SMatthias Ringwald     /* y1 * (1 - xfract) * (yfract)  in 1.51 and adding to acc */
6950*e8380792SMatthias Ringwald     out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u);
6951*e8380792SMatthias Ringwald     acc += ((q63_t) out * (yfract));
6952*e8380792SMatthias Ringwald 
6953*e8380792SMatthias Ringwald     /* y2 * (xfract) * (yfract)  in 1.51 and adding to acc */
6954*e8380792SMatthias Ringwald     out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u);
6955*e8380792SMatthias Ringwald     acc += ((q63_t) out * (yfract));
6956*e8380792SMatthias Ringwald 
6957*e8380792SMatthias Ringwald     /* acc is in 13.51 format and down shift acc by 36 times */
6958*e8380792SMatthias Ringwald     /* Convert out to 1.15 format */
6959*e8380792SMatthias Ringwald     return ((q15_t)(acc >> 36));
6960*e8380792SMatthias Ringwald   }
6961*e8380792SMatthias Ringwald 
6962*e8380792SMatthias Ringwald 
6963*e8380792SMatthias Ringwald   /**
6964*e8380792SMatthias Ringwald   * @brief  Q7 bilinear interpolation.
6965*e8380792SMatthias Ringwald   * @param[in,out] S  points to an instance of the interpolation structure.
6966*e8380792SMatthias Ringwald   * @param[in]     X  interpolation coordinate in 12.20 format.
6967*e8380792SMatthias Ringwald   * @param[in]     Y  interpolation coordinate in 12.20 format.
6968*e8380792SMatthias Ringwald   * @return out interpolated value.
6969*e8380792SMatthias Ringwald   */
arm_bilinear_interp_q7(arm_bilinear_interp_instance_q7 * S,q31_t X,q31_t Y)6970*e8380792SMatthias Ringwald   static __INLINE q7_t arm_bilinear_interp_q7(
6971*e8380792SMatthias Ringwald   arm_bilinear_interp_instance_q7 * S,
6972*e8380792SMatthias Ringwald   q31_t X,
6973*e8380792SMatthias Ringwald   q31_t Y)
6974*e8380792SMatthias Ringwald   {
6975*e8380792SMatthias Ringwald     q63_t acc = 0;                               /* output */
6976*e8380792SMatthias Ringwald     q31_t out;                                   /* Temporary output */
6977*e8380792SMatthias Ringwald     q31_t xfract, yfract;                        /* X, Y fractional parts */
6978*e8380792SMatthias Ringwald     q7_t x1, x2, y1, y2;                         /* Nearest output values */
6979*e8380792SMatthias Ringwald     int32_t rI, cI;                              /* Row and column indices */
6980*e8380792SMatthias Ringwald     q7_t *pYData = S->pData;                     /* pointer to output table values */
6981*e8380792SMatthias Ringwald     uint32_t nCols = S->numCols;                 /* num of rows */
6982*e8380792SMatthias Ringwald 
6983*e8380792SMatthias Ringwald     /* Input is in 12.20 format */
6984*e8380792SMatthias Ringwald     /* 12 bits for the table index */
6985*e8380792SMatthias Ringwald     /* Index value calculation */
6986*e8380792SMatthias Ringwald     rI = ((X & (q31_t)0xFFF00000) >> 20);
6987*e8380792SMatthias Ringwald 
6988*e8380792SMatthias Ringwald     /* Input is in 12.20 format */
6989*e8380792SMatthias Ringwald     /* 12 bits for the table index */
6990*e8380792SMatthias Ringwald     /* Index value calculation */
6991*e8380792SMatthias Ringwald     cI = ((Y & (q31_t)0xFFF00000) >> 20);
6992*e8380792SMatthias Ringwald 
6993*e8380792SMatthias Ringwald     /* Care taken for table outside boundary */
6994*e8380792SMatthias Ringwald     /* Returns zero output when values are outside table boundary */
6995*e8380792SMatthias Ringwald     if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1))
6996*e8380792SMatthias Ringwald     {
6997*e8380792SMatthias Ringwald       return (0);
6998*e8380792SMatthias Ringwald     }
6999*e8380792SMatthias Ringwald 
7000*e8380792SMatthias Ringwald     /* 20 bits for the fractional part */
7001*e8380792SMatthias Ringwald     /* xfract should be in 12.20 format */
7002*e8380792SMatthias Ringwald     xfract = (X & (q31_t)0x000FFFFF);
7003*e8380792SMatthias Ringwald 
7004*e8380792SMatthias Ringwald     /* Read two nearest output values from the index */
7005*e8380792SMatthias Ringwald     x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI)    ];
7006*e8380792SMatthias Ringwald     x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1];
7007*e8380792SMatthias Ringwald 
7008*e8380792SMatthias Ringwald     /* 20 bits for the fractional part */
7009*e8380792SMatthias Ringwald     /* yfract should be in 12.20 format */
7010*e8380792SMatthias Ringwald     yfract = (Y & (q31_t)0x000FFFFF);
7011*e8380792SMatthias Ringwald 
7012*e8380792SMatthias Ringwald     /* Read two nearest output values from the index */
7013*e8380792SMatthias Ringwald     y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1)    ];
7014*e8380792SMatthias Ringwald     y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1];
7015*e8380792SMatthias Ringwald 
7016*e8380792SMatthias Ringwald     /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */
7017*e8380792SMatthias Ringwald     out = ((x1 * (0xFFFFF - xfract)));
7018*e8380792SMatthias Ringwald     acc = (((q63_t) out * (0xFFFFF - yfract)));
7019*e8380792SMatthias Ringwald 
7020*e8380792SMatthias Ringwald     /* x2 * (xfract) * (1-yfract)  in 2.22 and adding to acc */
7021*e8380792SMatthias Ringwald     out = ((x2 * (0xFFFFF - yfract)));
7022*e8380792SMatthias Ringwald     acc += (((q63_t) out * (xfract)));
7023*e8380792SMatthias Ringwald 
7024*e8380792SMatthias Ringwald     /* y1 * (1 - xfract) * (yfract)  in 2.22 and adding to acc */
7025*e8380792SMatthias Ringwald     out = ((y1 * (0xFFFFF - xfract)));
7026*e8380792SMatthias Ringwald     acc += (((q63_t) out * (yfract)));
7027*e8380792SMatthias Ringwald 
7028*e8380792SMatthias Ringwald     /* y2 * (xfract) * (yfract)  in 2.22 and adding to acc */
7029*e8380792SMatthias Ringwald     out = ((y2 * (yfract)));
7030*e8380792SMatthias Ringwald     acc += (((q63_t) out * (xfract)));
7031*e8380792SMatthias Ringwald 
7032*e8380792SMatthias Ringwald     /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */
7033*e8380792SMatthias Ringwald     return ((q7_t)(acc >> 40));
7034*e8380792SMatthias Ringwald   }
7035*e8380792SMatthias Ringwald 
7036*e8380792SMatthias Ringwald   /**
7037*e8380792SMatthias Ringwald    * @} end of BilinearInterpolate group
7038*e8380792SMatthias Ringwald    */
7039*e8380792SMatthias Ringwald 
7040*e8380792SMatthias Ringwald 
7041*e8380792SMatthias Ringwald /* SMMLAR */
7042*e8380792SMatthias Ringwald #define multAcc_32x32_keep32_R(a, x, y) \
7043*e8380792SMatthias Ringwald     a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32)
7044*e8380792SMatthias Ringwald 
7045*e8380792SMatthias Ringwald /* SMMLSR */
7046*e8380792SMatthias Ringwald #define multSub_32x32_keep32_R(a, x, y) \
7047*e8380792SMatthias Ringwald     a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32)
7048*e8380792SMatthias Ringwald 
7049*e8380792SMatthias Ringwald /* SMMULR */
7050*e8380792SMatthias Ringwald #define mult_32x32_keep32_R(a, x, y) \
7051*e8380792SMatthias Ringwald     a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32)
7052*e8380792SMatthias Ringwald 
7053*e8380792SMatthias Ringwald /* SMMLA */
7054*e8380792SMatthias Ringwald #define multAcc_32x32_keep32(a, x, y) \
7055*e8380792SMatthias Ringwald     a += (q31_t) (((q63_t) x * y) >> 32)
7056*e8380792SMatthias Ringwald 
7057*e8380792SMatthias Ringwald /* SMMLS */
7058*e8380792SMatthias Ringwald #define multSub_32x32_keep32(a, x, y) \
7059*e8380792SMatthias Ringwald     a -= (q31_t) (((q63_t) x * y) >> 32)
7060*e8380792SMatthias Ringwald 
7061*e8380792SMatthias Ringwald /* SMMUL */
7062*e8380792SMatthias Ringwald #define mult_32x32_keep32(a, x, y) \
7063*e8380792SMatthias Ringwald     a = (q31_t) (((q63_t) x * y ) >> 32)
7064*e8380792SMatthias Ringwald 
7065*e8380792SMatthias Ringwald 
7066*e8380792SMatthias Ringwald #if defined ( __CC_ARM )
7067*e8380792SMatthias Ringwald   /* Enter low optimization region - place directly above function definition */
7068*e8380792SMatthias Ringwald   #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7)
7069*e8380792SMatthias Ringwald     #define LOW_OPTIMIZATION_ENTER \
7070*e8380792SMatthias Ringwald        _Pragma ("push")         \
7071*e8380792SMatthias Ringwald        _Pragma ("O1")
7072*e8380792SMatthias Ringwald   #else
7073*e8380792SMatthias Ringwald     #define LOW_OPTIMIZATION_ENTER
7074*e8380792SMatthias Ringwald   #endif
7075*e8380792SMatthias Ringwald 
7076*e8380792SMatthias Ringwald   /* Exit low optimization region - place directly after end of function definition */
7077*e8380792SMatthias Ringwald   #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7)
7078*e8380792SMatthias Ringwald     #define LOW_OPTIMIZATION_EXIT \
7079*e8380792SMatthias Ringwald        _Pragma ("pop")
7080*e8380792SMatthias Ringwald   #else
7081*e8380792SMatthias Ringwald     #define LOW_OPTIMIZATION_EXIT
7082*e8380792SMatthias Ringwald   #endif
7083*e8380792SMatthias Ringwald 
7084*e8380792SMatthias Ringwald   /* Enter low optimization region - place directly above function definition */
7085*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_ENTER
7086*e8380792SMatthias Ringwald 
7087*e8380792SMatthias Ringwald   /* Exit low optimization region - place directly after end of function definition */
7088*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
7089*e8380792SMatthias Ringwald 
7090*e8380792SMatthias Ringwald #elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
7091*e8380792SMatthias Ringwald   #define LOW_OPTIMIZATION_ENTER
7092*e8380792SMatthias Ringwald   #define LOW_OPTIMIZATION_EXIT
7093*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_ENTER
7094*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
7095*e8380792SMatthias Ringwald 
7096*e8380792SMatthias Ringwald #elif defined(__GNUC__)
7097*e8380792SMatthias Ringwald   #define LOW_OPTIMIZATION_ENTER __attribute__(( optimize("-O1") ))
7098*e8380792SMatthias Ringwald   #define LOW_OPTIMIZATION_EXIT
7099*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_ENTER
7100*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
7101*e8380792SMatthias Ringwald 
7102*e8380792SMatthias Ringwald #elif defined(__ICCARM__)
7103*e8380792SMatthias Ringwald   /* Enter low optimization region - place directly above function definition */
7104*e8380792SMatthias Ringwald   #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7)
7105*e8380792SMatthias Ringwald     #define LOW_OPTIMIZATION_ENTER \
7106*e8380792SMatthias Ringwald        _Pragma ("optimize=low")
7107*e8380792SMatthias Ringwald   #else
7108*e8380792SMatthias Ringwald     #define LOW_OPTIMIZATION_ENTER
7109*e8380792SMatthias Ringwald   #endif
7110*e8380792SMatthias Ringwald 
7111*e8380792SMatthias Ringwald   /* Exit low optimization region - place directly after end of function definition */
7112*e8380792SMatthias Ringwald   #define LOW_OPTIMIZATION_EXIT
7113*e8380792SMatthias Ringwald 
7114*e8380792SMatthias Ringwald   /* Enter low optimization region - place directly above function definition */
7115*e8380792SMatthias Ringwald   #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7)
7116*e8380792SMatthias Ringwald     #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \
7117*e8380792SMatthias Ringwald        _Pragma ("optimize=low")
7118*e8380792SMatthias Ringwald   #else
7119*e8380792SMatthias Ringwald     #define IAR_ONLY_LOW_OPTIMIZATION_ENTER
7120*e8380792SMatthias Ringwald   #endif
7121*e8380792SMatthias Ringwald 
7122*e8380792SMatthias Ringwald   /* Exit low optimization region - place directly after end of function definition */
7123*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
7124*e8380792SMatthias Ringwald 
7125*e8380792SMatthias Ringwald #elif defined(__CSMC__)
7126*e8380792SMatthias Ringwald   #define LOW_OPTIMIZATION_ENTER
7127*e8380792SMatthias Ringwald   #define LOW_OPTIMIZATION_EXIT
7128*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_ENTER
7129*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
7130*e8380792SMatthias Ringwald 
7131*e8380792SMatthias Ringwald #elif defined(__TASKING__)
7132*e8380792SMatthias Ringwald   #define LOW_OPTIMIZATION_ENTER
7133*e8380792SMatthias Ringwald   #define LOW_OPTIMIZATION_EXIT
7134*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_ENTER
7135*e8380792SMatthias Ringwald   #define IAR_ONLY_LOW_OPTIMIZATION_EXIT
7136*e8380792SMatthias Ringwald 
7137*e8380792SMatthias Ringwald #endif
7138*e8380792SMatthias Ringwald 
7139*e8380792SMatthias Ringwald 
7140*e8380792SMatthias Ringwald #ifdef   __cplusplus
7141*e8380792SMatthias Ringwald }
7142*e8380792SMatthias Ringwald #endif
7143*e8380792SMatthias Ringwald 
7144*e8380792SMatthias Ringwald 
7145*e8380792SMatthias Ringwald #if defined ( __GNUC__ )
7146*e8380792SMatthias Ringwald #pragma GCC diagnostic pop
7147*e8380792SMatthias Ringwald #endif
7148*e8380792SMatthias Ringwald 
7149*e8380792SMatthias Ringwald #endif /* _ARM_MATH_H */
7150*e8380792SMatthias Ringwald 
7151*e8380792SMatthias Ringwald /**
7152*e8380792SMatthias Ringwald  *
7153*e8380792SMatthias Ringwald  * End of file.
7154*e8380792SMatthias Ringwald  */
7155