CMSIS DSP Library from CMSIS 2.0. See http://www.onarm.com/cmsis/ for full details

Dependents:   K22F_DSP_Matrix_least_square BNO055-ELEC3810 1BNO055 ECE4180Project--Slave2 ... more

Committer:
simon
Date:
Thu Mar 10 15:29:46 2011 +0000
Revision:
2:208cacc9d789
Parent:
0:1014af42efd9
Version of the CMSIS DSP library that will work with v29 of the mbed library, currently in beta

Who changed what in which revision?

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