Subversion Repositories LedShow

Rev

Blame | Last modification | View Log | Download | RSS feed

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