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