Lora4MakerFaire

Dependencies:   HC_SR04_Ultrasonic_Library X_NUCLEO_IKS01A2 mbed LoRaWAN-lib SX1272Lib

Fork of LoRaWANdemo72 by FabLab LoRa

arm_math.h

Committer:
salvatoregulfo
Date:
2017-10-03
Revision:
8:346c55cb6033

File content as of revision 8:346c55cb6033:

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