mbed-os 6.10 versione

Committer:
michelericcio
Date:
Mon Jun 21 10:16:02 2021 +0000
Revision:
5:ed60e5c5c2a8
Parent:
3:7a284390b0ce
mbed-dsp working on ST Nucleo F767ZI and mbed-OS 6

Who changed what in which revision?

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