hhh

Dependencies:   X_NUCLEO_IKS01A2 mbed LoRaWAN-lib SX1272Lib

Fork of LoRaWAN-demo-72 by Semtech

Files at this revision

API Documentation at this revision

Comitter:
salvatoregulfo
Date:
Tue Oct 03 13:11:33 2017 +0000
Parent:
7:5077515c163b
Commit message:
LoRaWan

Changed in this revision

X_NUCLEO_IKS01A2.lib Show annotated file Show diff for this revision Revisions of this file
app/Commissioning.h Show annotated file Show diff for this revision Revisions of this file
app/main.cpp Show annotated file Show diff for this revision Revisions of this file
arm_math.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X_NUCLEO_IKS01A2.lib	Tue Oct 03 13:11:33 2017 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/salvatoregulfo/code/X_NUCLEO_IKS01A2/#98c301bb7d1b
--- a/app/Commissioning.h	Mon Apr 24 13:29:34 2017 +0000
+++ b/app/Commissioning.h	Tue Oct 03 13:11:33 2017 +0000
@@ -19,7 +19,7 @@
  * When set to 1 the application uses the Over-the-Air activation procedure
  * When set to 0 the application uses the Personalization activation procedure
  */
-#define OVER_THE_AIR_ACTIVATION                     1
+#define OVER_THE_AIR_ACTIVATION                     0
 
 /*!
  * Indicates if the end-device is to be connected to a private or public network
@@ -35,12 +35,12 @@
 /*!
  * Mote device IEEE EUI (big endian)
  */
-#define LORAWAN_DEVICE_EUI                          { IEEE_OUI, 0x44, 0x55, 0x66, 0x77, 0x88 }
+#define LORAWAN_DEVICE_EUI                          { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88 }
 
 /*!
  * Application IEEE EUI (big endian)
  */
-#define LORAWAN_APPLICATION_EUI                     { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+#define LORAWAN_APPLICATION_EUI                     { 0x00, 0x80, 0x00, 0x00, 0xA0, 0x00, 0x00, 0x80 }
 
 /*!
  * AES encryption/decryption cipher application key
@@ -50,21 +50,26 @@
 /*!
  * Current network ID
  */
-#define LORAWAN_NETWORK_ID                          ( uint32_t )0
+#define LORAWAN_NETWORK_ID                          0
 
 /*!
  * Device address on the network (big endian)
  */
-#define LORAWAN_DEVICE_ADDRESS                      ( uint32_t )0x12345678
+#define LORAWAN_DEVICE_ADDRESS                      0x00000002
 
 /*!
  * AES encryption/decryption cipher network session key
  */
-#define LORAWAN_NWKSKEY                             { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
+#define LORAWAN_NWKSKEY                             { 0x2A, 0x91, 0xD4, 0xE6, 0x6B, 0x55, 0x4A, 0x40, 0x1A, 0xE7, 0xD3, 0x7D, 0x47, 0x95, 0xD2, 0x37 }
 
 /*!
  * AES encryption/decryption cipher application session key
  */
-#define LORAWAN_APPSKEY                             { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
+#define LORAWAN_APPSKEY                             { 0x6D, 0x31, 0xDF, 0x5B, 0x8B, 0x8E, 0x87, 0x00, 0x20, 0xBC, 0x1C, 0x2F, 0x89, 0xA6, 0xAD, 0x9D }
 
 #endif // __LORA_COMMISSIONING_H__
+
+//99    0x65, 0x6A, 0x43, 0x5E, 0x15, 0x3E, 0x5F, 0x23, 0xCF, 0x0C, 0x11, 0x77, 0x30, 0x83, 0xA3, 0x5D
+ //     0x3C, 0xC4, 0xFE, 0xAD, 0x9B, 0xC7, 0x7D, 0x9F, 0xCF, 0x9D, 0x0A, 0xE0, 0x96, 0x2F, 0xF1, 0xFD
+// 88   0x2A, 0x91, 0xD4, 0xE6, 0x6B, 0x55, 0x4A, 0x40, 0x1A, 0xE7, 0xD3, 0x7D, 0x47, 0x95, 0xD2, 0x37
+//      0x6D, 0x31, 0xDF, 0x5B, 0x8B, 0x8E, 0x87, 0x00, 0x20, 0xBC, 0x1C, 0x2F, 0x89, 0xA6, 0xAD, 0x9D
\ No newline at end of file
--- a/app/main.cpp	Mon Apr 24 13:29:34 2017 +0000
+++ b/app/main.cpp	Tue Oct 03 13:11:33 2017 +0000
@@ -19,6 +19,16 @@
 #include "LoRaMac.h"
 #include "Commissioning.h"
 #include "SerialDisplay.h"
+#include "XNucleoIKS01A2.h"
+#include "string.h"
+
+/* Instantiate the expansion board */
+static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
+
+/* Retrieve the composing elements of the expansion board */
+static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
+//static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
+//static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
 
 /*!
  * Defines the application data transmission duty cycle. 5s, value in [ms].
@@ -34,7 +44,7 @@
 /*!
  * Default datarate
  */
-#define LORAWAN_DEFAULT_DATARATE                    DR_0
+#define LORAWAN_DEFAULT_DATARATE                    DR_0                      //SF 12
 
 /*!
  * LoRaWAN confirmed messages
@@ -57,7 +67,7 @@
  *
  * \remark Please note that ETSI mandates duty cycled transmissions. Use only for test purposes
  */
-#define LORAWAN_DUTYCYCLE_ON                        false
+#define LORAWAN_DUTYCYCLE_ON                        true
 
 #define USE_SEMTECH_DEFAULT_CHANNEL_LINEUP          1
 
@@ -78,7 +88,7 @@
 /*!
  * LoRaWAN application port
  */
-#define LORAWAN_APP_PORT                            15
+#define LORAWAN_APP_PORT                            13
 
 /*!
  * User application data buffer size
@@ -165,6 +175,43 @@
  */
 static bool NextTx = true;
 
+/* Helper function for printing floats & doubles */
+static char *print_double(char* str, double v, int decimalDigits=2)
+{
+  int i = 1;
+  int intPart;
+  int fractPart;
+  int len;
+  char *ptr;
+
+  /* prepare decimal digits multiplicator */
+  for (;decimalDigits!=0; i*=10, decimalDigits--);
+
+  /* calculate integer & fractional parts */
+  intPart = (int)v;
+  fractPart = (int)((v-(double)(int)v)*i);
+
+  /* fill in integer part */
+  sprintf(str, "%i.", intPart);
+
+  /* prepare fill in of fractional part */
+  len = strlen(str);
+  ptr = &str[len];
+
+  /* fill in leading fractional zeros */
+  for (i/=10;i>1; i/=10, ptr++) {
+    if (fractPart >= i) {
+      break;
+    }
+    *ptr = '0';
+  }
+
+  /* fill in (rest of) fractional part */
+  sprintf(ptr, "%i", fractPart);
+
+  return str;
+}
+
 /*!
  * Device states
  */
@@ -214,7 +261,8 @@
     uint8_t Port;
     uint8_t *Buffer;
     uint8_t BufferSize;
-}LoRaMacUplinkStatus;
+    
+    }LoRaMacUplinkStatus;
 volatile bool UplinkStatusUpdated = false;
 
 /*!
@@ -284,10 +332,75 @@
 /*!
  * \brief   Prepares the payload of the frame
  */
+    float value1, value2;
+    char buffer1[32];
+  //  int16_t Myaxes_int[3];
+  //  float Myaxes[3];
+  //  float sensitivity;
+ //   int32_t axes[3];
+ //   char Cont[64];
+   uint32_t Cont[64];
+ //  InterruptIn BlueButton(USER_BUTTON);  
 static void PrepareTxFrame( uint8_t port )
 {
+    
     switch( port )
     {
+        
+    case 13:
+    
+        hum_temp->get_temperature(&value1);
+        hum_temp->get_humidity(&value2);
+        strcpy((char*)Cont, (char*) print_double(buffer1,value2) );
+//       strcat((char*)Cont, " " );
+ //       strcat((char*)Cont, print_double(buffer1,value2) );
+ //       strcat((char*)Cont, " ");
+    //    strcat((char*)Cont,  print_double(buffer1,value2));
+   //     strcat((char*)Cont, " ");
+        
+ /*          acc_gyro->get_x_axes(axes);   
+           strcpy(Cont,(char*) print_double(buffer1,axes[0]));
+           strcat(Cont, " ");
+           strcat(Cont,(char*)print_double(buffer1,axes[1]));
+           strcat(Cont, " ");
+           strcat(Cont,(char*)print_double(buffer1,axes[2]));
+           strcat(Cont, " ");
+           strcat(Cont, (char*)print_double(buffer1,value1));
+           strcat(Cont, " ");
+           strcat(Cont, (char*)print_double(buffer1,value2));
+           AppDataSize = sprintf ((char*)AppData, Cont);     
+           
+         acc_gyro->get_x_axes_raw(Myaxes_int);
+         acc_gyro->get_x_sensitivity(&sensitivity);
+         Myaxes[0]=((float)(Myaxes_int[0]))*sensitivity;
+         Myaxes[1]=((float)(Myaxes_int[1]))*sensitivity;
+         Myaxes[2]=((float)(Myaxes_int[2]))*sensitivity;
+         strcpy(Cont, (char*) print_double(buffer1, value1));
+         strcat(Cont, " ");
+         strcat(Cont, (char*) print_double(buffer1, value2));
+         strcat(Cont, " ");         
+         strcat(Cont, (char*) print_double(buffer1, Myaxes[0]));
+         strcat(Cont, " ");
+         strcat(Cont, (char*) print_double(buffer1, Myaxes[1]));
+         strcat(Cont, " ");
+         strcat(Cont, (char*) print_double(buffer1, Myaxes[2]));
+         strcat(Cont, " ");
+         strcat(Cont, (char*) print_double(buffer1, value1));
+         strcat(Cont, " ");
+         strcat(Cont, (char*) print_double(buffer1, value2)); */
+         
+       // while(1) {
+        AppDataSize = sprintf ((char*)AppData,(char*)Cont);    
+  /*       if (BlueButton)
+         { AppDataSize = sprintf((char*)AppData, "0");   
+          break;  }
+          else
+       {  AppDataSize = sprintf((char*)AppData, "1");   
+         break;        }  
+ //   AppDataSize = sprintf((char*)AppData, "69"); 
+         //} */
+    break;
+    
     case 15:
         {
             AppData[0] = AppLedStateOn;
@@ -300,7 +413,7 @@
                 AppData[5] = LoRaMacDownlinkStatus.Snr;
             }
         }
-        break;
+        break;     
     case 224:
         if( ComplianceTest.LinkCheck == true )
         {
@@ -336,7 +449,8 @@
  *
  * \retval  [0: frame could be send, 1: error]
  */
-static bool SendFrame( void )
+static bool SendFrame(void)
+
 {
     McpsReq_t mcpsReq;
     LoRaMacTxInfo_t txInfo;
@@ -764,6 +878,12 @@
     LoRaMacPrimitives_t LoRaMacPrimitives;
     LoRaMacCallback_t LoRaMacCallbacks;
     MibRequestConfirm_t mibReq;
+    
+    //enable sensors
+  //  accelerometer -> enable();
+    hum_temp -> enable();
+   // acc_gyro->enable_x();
+   // acc_gyro->enable_g();
 
     BoardInit( );
     SerialDisplayInit( );
@@ -771,6 +891,9 @@
     SerialDisplayUpdateEui( 5, DevEui );
     SerialDisplayUpdateEui( 6, AppEui );
     SerialDisplayUpdateKey( 7, AppKey );
+    
+    
+    
 
 #if( OVER_THE_AIR_ACTIVATION == 0 )
     SerialDisplayUpdateNwkId( LORAWAN_NETWORK_ID );
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/arm_math.h	Tue Oct 03 13:11:33 2017 +0000
@@ -0,0 +1,7555 @@
+/* ----------------------------------------------------------------------
+  * 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  */
\ No newline at end of file