CMSIS DSP library

Dependents:   KL25Z_FFT_Demo Hat_Board_v5_1 KL25Z_FFT_Demo_tony KL25Z_FFT_Demo_tony ... more

Fork of mbed-dsp by mbed official

Committer:
mbed_official
Date:
Fri Nov 08 13:45:10 2013 +0000
Revision:
3:7a284390b0ce
Parent:
2:da51fb522205
Synchronized with git revision e69956aba2f68a2a26ac26b051f8d349deaa1ce8

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
emilmont 1:fdd22bb7aa52 280 #include "ARMCM4.h"
emilmont 1:fdd22bb7aa52 281 #warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
emilmont 1:fdd22bb7aa52 282 #endif
emilmont 1:fdd22bb7aa52 283
emilmont 1:fdd22bb7aa52 284 #undef __CMSIS_GENERIC /* enable NVIC and Systick functions */
emilmont 1:fdd22bb7aa52 285 #include "string.h"
emilmont 1:fdd22bb7aa52 286 #include "math.h"
emilmont 2:da51fb522205 287 #ifdef __cplusplus
emilmont 1:fdd22bb7aa52 288 extern "C"
emilmont 1:fdd22bb7aa52 289 {
emilmont 1:fdd22bb7aa52 290 #endif
emilmont 1:fdd22bb7aa52 291
emilmont 1:fdd22bb7aa52 292
emilmont 1:fdd22bb7aa52 293 /**
emilmont 1:fdd22bb7aa52 294 * @brief Macros required for reciprocal calculation in Normalized LMS
emilmont 1:fdd22bb7aa52 295 */
emilmont 1:fdd22bb7aa52 296
emilmont 2:da51fb522205 297 #define DELTA_Q31 (0x100)
emilmont 2:da51fb522205 298 #define DELTA_Q15 0x5
emilmont 2:da51fb522205 299 #define INDEX_MASK 0x0000003F
emilmont 1:fdd22bb7aa52 300 #ifndef PI
emilmont 2:da51fb522205 301 #define PI 3.14159265358979f
emilmont 1:fdd22bb7aa52 302 #endif
emilmont 1:fdd22bb7aa52 303
emilmont 1:fdd22bb7aa52 304 /**
emilmont 1:fdd22bb7aa52 305 * @brief Macros required for SINE and COSINE Fast math approximations
emilmont 1:fdd22bb7aa52 306 */
emilmont 1:fdd22bb7aa52 307
emilmont 2:da51fb522205 308 #define TABLE_SIZE 256
emilmont 2:da51fb522205 309 #define TABLE_SPACING_Q31 0x800000
emilmont 2:da51fb522205 310 #define TABLE_SPACING_Q15 0x80
emilmont 1:fdd22bb7aa52 311
emilmont 1:fdd22bb7aa52 312 /**
emilmont 1:fdd22bb7aa52 313 * @brief Macros required for SINE and COSINE Controller functions
emilmont 1:fdd22bb7aa52 314 */
emilmont 1:fdd22bb7aa52 315 /* 1.31(q31) Fixed value of 2/360 */
emilmont 1:fdd22bb7aa52 316 /* -1 to +1 is divided into 360 values so total spacing is (2/360) */
emilmont 2:da51fb522205 317 #define INPUT_SPACING 0xB60B61
emilmont 1:fdd22bb7aa52 318
emilmont 1:fdd22bb7aa52 319 /**
emilmont 1:fdd22bb7aa52 320 * @brief Macro for Unaligned Support
emilmont 1:fdd22bb7aa52 321 */
emilmont 1:fdd22bb7aa52 322 #ifndef UNALIGNED_SUPPORT_DISABLE
emilmont 1:fdd22bb7aa52 323 #define ALIGN4
emilmont 1:fdd22bb7aa52 324 #else
emilmont 1:fdd22bb7aa52 325 #if defined (__GNUC__)
emilmont 1:fdd22bb7aa52 326 #define ALIGN4 __attribute__((aligned(4)))
emilmont 1:fdd22bb7aa52 327 #else
emilmont 1:fdd22bb7aa52 328 #define ALIGN4 __align(4)
emilmont 1:fdd22bb7aa52 329 #endif
emilmont 2:da51fb522205 330 #endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */
emilmont 1:fdd22bb7aa52 331
emilmont 1:fdd22bb7aa52 332 /**
emilmont 1:fdd22bb7aa52 333 * @brief Error status returned by some functions in the library.
emilmont 1:fdd22bb7aa52 334 */
emilmont 1:fdd22bb7aa52 335
emilmont 1:fdd22bb7aa52 336 typedef enum
emilmont 1:fdd22bb7aa52 337 {
emilmont 1:fdd22bb7aa52 338 ARM_MATH_SUCCESS = 0, /**< No error */
emilmont 1:fdd22bb7aa52 339 ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */
emilmont 1:fdd22bb7aa52 340 ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */
emilmont 1:fdd22bb7aa52 341 ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */
emilmont 1:fdd22bb7aa52 342 ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */
emilmont 1:fdd22bb7aa52 343 ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */
emilmont 1:fdd22bb7aa52 344 ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */
emilmont 1:fdd22bb7aa52 345 } arm_status;
emilmont 1:fdd22bb7aa52 346
emilmont 1:fdd22bb7aa52 347 /**
emilmont 1:fdd22bb7aa52 348 * @brief 8-bit fractional data type in 1.7 format.
emilmont 1:fdd22bb7aa52 349 */
emilmont 1:fdd22bb7aa52 350 typedef int8_t q7_t;
emilmont 1:fdd22bb7aa52 351
emilmont 1:fdd22bb7aa52 352 /**
emilmont 1:fdd22bb7aa52 353 * @brief 16-bit fractional data type in 1.15 format.
emilmont 1:fdd22bb7aa52 354 */
emilmont 1:fdd22bb7aa52 355 typedef int16_t q15_t;
emilmont 1:fdd22bb7aa52 356
emilmont 1:fdd22bb7aa52 357 /**
emilmont 1:fdd22bb7aa52 358 * @brief 32-bit fractional data type in 1.31 format.
emilmont 1:fdd22bb7aa52 359 */
emilmont 1:fdd22bb7aa52 360 typedef int32_t q31_t;
emilmont 1:fdd22bb7aa52 361
emilmont 1:fdd22bb7aa52 362 /**
emilmont 1:fdd22bb7aa52 363 * @brief 64-bit fractional data type in 1.63 format.
emilmont 1:fdd22bb7aa52 364 */
emilmont 1:fdd22bb7aa52 365 typedef int64_t q63_t;
emilmont 1:fdd22bb7aa52 366
emilmont 1:fdd22bb7aa52 367 /**
emilmont 1:fdd22bb7aa52 368 * @brief 32-bit floating-point type definition.
emilmont 1:fdd22bb7aa52 369 */
emilmont 1:fdd22bb7aa52 370 typedef float float32_t;
emilmont 1:fdd22bb7aa52 371
emilmont 1:fdd22bb7aa52 372 /**
emilmont 1:fdd22bb7aa52 373 * @brief 64-bit floating-point type definition.
emilmont 1:fdd22bb7aa52 374 */
emilmont 1:fdd22bb7aa52 375 typedef double float64_t;
emilmont 1:fdd22bb7aa52 376
emilmont 1:fdd22bb7aa52 377 /**
emilmont 1:fdd22bb7aa52 378 * @brief definition to read/write two 16 bit values.
emilmont 1:fdd22bb7aa52 379 */
mbed_official 3:7a284390b0ce 380 #if defined __CC_ARM
mbed_official 3:7a284390b0ce 381 #define __SIMD32_TYPE int32_t __packed
mbed_official 3:7a284390b0ce 382 #define CMSIS_UNUSED __attribute__((unused))
mbed_official 3:7a284390b0ce 383 #elif defined __ICCARM__
mbed_official 3:7a284390b0ce 384 #define CMSIS_UNUSED
mbed_official 3:7a284390b0ce 385 #define __SIMD32_TYPE int32_t __packed
mbed_official 3:7a284390b0ce 386 #elif defined __GNUC__
mbed_official 3:7a284390b0ce 387 #define __SIMD32_TYPE int32_t
mbed_official 3:7a284390b0ce 388 #define CMSIS_UNUSED __attribute__((unused))
emilmont 1:fdd22bb7aa52 389 #else
mbed_official 3:7a284390b0ce 390 #error Unknown compiler
mbed_official 3:7a284390b0ce 391 #endif
mbed_official 3:7a284390b0ce 392
mbed_official 3:7a284390b0ce 393 #define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr))
mbed_official 3:7a284390b0ce 394 #define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr))
mbed_official 3:7a284390b0ce 395
mbed_official 3:7a284390b0ce 396 #define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr))
mbed_official 3:7a284390b0ce 397
mbed_official 3:7a284390b0ce 398 #define __SIMD64(addr) (*(int64_t **) & (addr))
mbed_official 3:7a284390b0ce 399
mbed_official 3:7a284390b0ce 400 #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
emilmont 1:fdd22bb7aa52 401 /**
emilmont 1:fdd22bb7aa52 402 * @brief definition to pack two 16 bit values.
emilmont 1:fdd22bb7aa52 403 */
emilmont 1:fdd22bb7aa52 404 #define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \
emilmont 1:fdd22bb7aa52 405 (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) )
emilmont 1:fdd22bb7aa52 406 #define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \
emilmont 1:fdd22bb7aa52 407 (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) )
emilmont 1:fdd22bb7aa52 408
emilmont 1:fdd22bb7aa52 409 #endif
emilmont 1:fdd22bb7aa52 410
emilmont 1:fdd22bb7aa52 411
emilmont 1:fdd22bb7aa52 412 /**
emilmont 1:fdd22bb7aa52 413 * @brief definition to pack four 8 bit values.
emilmont 1:fdd22bb7aa52 414 */
emilmont 1:fdd22bb7aa52 415 #ifndef ARM_MATH_BIG_ENDIAN
emilmont 1:fdd22bb7aa52 416
emilmont 2:da51fb522205 417 #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \
emilmont 2:da51fb522205 418 (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \
emilmont 2:da51fb522205 419 (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \
emilmont 2:da51fb522205 420 (((int32_t)(v3) << 24) & (int32_t)0xFF000000) )
emilmont 1:fdd22bb7aa52 421 #else
emilmont 1:fdd22bb7aa52 422
emilmont 2:da51fb522205 423 #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \
emilmont 2:da51fb522205 424 (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \
emilmont 2:da51fb522205 425 (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \
emilmont 2:da51fb522205 426 (((int32_t)(v0) << 24) & (int32_t)0xFF000000) )
emilmont 1:fdd22bb7aa52 427
emilmont 1:fdd22bb7aa52 428 #endif
emilmont 1:fdd22bb7aa52 429
emilmont 1:fdd22bb7aa52 430
emilmont 1:fdd22bb7aa52 431 /**
emilmont 1:fdd22bb7aa52 432 * @brief Clips Q63 to Q31 values.
emilmont 1:fdd22bb7aa52 433 */
mbed_official 3:7a284390b0ce 434 static __INLINE q31_t clip_q63_to_q31(
emilmont 1:fdd22bb7aa52 435 q63_t x)
emilmont 1:fdd22bb7aa52 436 {
emilmont 1:fdd22bb7aa52 437 return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
emilmont 1:fdd22bb7aa52 438 ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x;
emilmont 1:fdd22bb7aa52 439 }
emilmont 1:fdd22bb7aa52 440
emilmont 1:fdd22bb7aa52 441 /**
emilmont 1:fdd22bb7aa52 442 * @brief Clips Q63 to Q15 values.
emilmont 1:fdd22bb7aa52 443 */
mbed_official 3:7a284390b0ce 444 static __INLINE q15_t clip_q63_to_q15(
emilmont 1:fdd22bb7aa52 445 q63_t x)
emilmont 1:fdd22bb7aa52 446 {
emilmont 1:fdd22bb7aa52 447 return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?
emilmont 1:fdd22bb7aa52 448 ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15);
emilmont 1:fdd22bb7aa52 449 }
emilmont 1:fdd22bb7aa52 450
emilmont 1:fdd22bb7aa52 451 /**
emilmont 1:fdd22bb7aa52 452 * @brief Clips Q31 to Q7 values.
emilmont 1:fdd22bb7aa52 453 */
mbed_official 3:7a284390b0ce 454 static __INLINE q7_t clip_q31_to_q7(
emilmont 1:fdd22bb7aa52 455 q31_t x)
emilmont 1:fdd22bb7aa52 456 {
emilmont 1:fdd22bb7aa52 457 return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ?
emilmont 1:fdd22bb7aa52 458 ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x;
emilmont 1:fdd22bb7aa52 459 }
emilmont 1:fdd22bb7aa52 460
emilmont 1:fdd22bb7aa52 461 /**
emilmont 1:fdd22bb7aa52 462 * @brief Clips Q31 to Q15 values.
emilmont 1:fdd22bb7aa52 463 */
mbed_official 3:7a284390b0ce 464 static __INLINE q15_t clip_q31_to_q15(
emilmont 1:fdd22bb7aa52 465 q31_t x)
emilmont 1:fdd22bb7aa52 466 {
emilmont 1:fdd22bb7aa52 467 return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ?
emilmont 1:fdd22bb7aa52 468 ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x;
emilmont 1:fdd22bb7aa52 469 }
emilmont 1:fdd22bb7aa52 470
emilmont 1:fdd22bb7aa52 471 /**
emilmont 1:fdd22bb7aa52 472 * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format.
emilmont 1:fdd22bb7aa52 473 */
emilmont 1:fdd22bb7aa52 474
mbed_official 3:7a284390b0ce 475 static __INLINE q63_t mult32x64(
emilmont 1:fdd22bb7aa52 476 q63_t x,
emilmont 1:fdd22bb7aa52 477 q31_t y)
emilmont 1:fdd22bb7aa52 478 {
emilmont 1:fdd22bb7aa52 479 return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) +
emilmont 1:fdd22bb7aa52 480 (((q63_t) (x >> 32) * y)));
emilmont 1:fdd22bb7aa52 481 }
emilmont 1:fdd22bb7aa52 482
emilmont 1:fdd22bb7aa52 483
mbed_official 3:7a284390b0ce 484 #if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM )
emilmont 1:fdd22bb7aa52 485 #define __CLZ __clz
mbed_official 3:7a284390b0ce 486 #elif defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) || defined (__TASKING__) )
mbed_official 3:7a284390b0ce 487
mbed_official 3:7a284390b0ce 488 static __INLINE uint32_t __CLZ(
mbed_official 3:7a284390b0ce 489 q31_t data);
mbed_official 3:7a284390b0ce 490
mbed_official 3:7a284390b0ce 491
mbed_official 3:7a284390b0ce 492 static __INLINE uint32_t __CLZ(
mbed_official 3:7a284390b0ce 493 q31_t data)
emilmont 1:fdd22bb7aa52 494 {
emilmont 1:fdd22bb7aa52 495 uint32_t count = 0;
emilmont 1:fdd22bb7aa52 496 uint32_t mask = 0x80000000;
emilmont 1:fdd22bb7aa52 497
emilmont 1:fdd22bb7aa52 498 while((data & mask) == 0)
emilmont 1:fdd22bb7aa52 499 {
emilmont 1:fdd22bb7aa52 500 count += 1u;
emilmont 1:fdd22bb7aa52 501 mask = mask >> 1u;
emilmont 1:fdd22bb7aa52 502 }
emilmont 1:fdd22bb7aa52 503
emilmont 1:fdd22bb7aa52 504 return (count);
emilmont 1:fdd22bb7aa52 505
emilmont 1:fdd22bb7aa52 506 }
emilmont 1:fdd22bb7aa52 507
emilmont 1:fdd22bb7aa52 508 #endif
emilmont 1:fdd22bb7aa52 509
emilmont 1:fdd22bb7aa52 510 /**
mbed_official 3:7a284390b0ce 511 * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type.
mbed_official 3:7a284390b0ce 512 */
mbed_official 3:7a284390b0ce 513
mbed_official 3:7a284390b0ce 514 static __INLINE uint32_t arm_recip_q31(
emilmont 1:fdd22bb7aa52 515 q31_t in,
emilmont 1:fdd22bb7aa52 516 q31_t * dst,
emilmont 1:fdd22bb7aa52 517 q31_t * pRecipTable)
emilmont 1:fdd22bb7aa52 518 {
emilmont 1:fdd22bb7aa52 519
emilmont 1:fdd22bb7aa52 520 uint32_t out, tempVal;
emilmont 1:fdd22bb7aa52 521 uint32_t index, i;
emilmont 1:fdd22bb7aa52 522 uint32_t signBits;
emilmont 1:fdd22bb7aa52 523
emilmont 1:fdd22bb7aa52 524 if(in > 0)
emilmont 1:fdd22bb7aa52 525 {
emilmont 1:fdd22bb7aa52 526 signBits = __CLZ(in) - 1;
emilmont 1:fdd22bb7aa52 527 }
emilmont 1:fdd22bb7aa52 528 else
emilmont 1:fdd22bb7aa52 529 {
emilmont 1:fdd22bb7aa52 530 signBits = __CLZ(-in) - 1;
emilmont 1:fdd22bb7aa52 531 }
emilmont 1:fdd22bb7aa52 532
emilmont 1:fdd22bb7aa52 533 /* Convert input sample to 1.31 format */
emilmont 1:fdd22bb7aa52 534 in = in << signBits;
emilmont 1:fdd22bb7aa52 535
emilmont 1:fdd22bb7aa52 536 /* calculation of index for initial approximated Val */
emilmont 1:fdd22bb7aa52 537 index = (uint32_t) (in >> 24u);
emilmont 1:fdd22bb7aa52 538 index = (index & INDEX_MASK);
emilmont 1:fdd22bb7aa52 539
emilmont 1:fdd22bb7aa52 540 /* 1.31 with exp 1 */
emilmont 1:fdd22bb7aa52 541 out = pRecipTable[index];
emilmont 1:fdd22bb7aa52 542
emilmont 1:fdd22bb7aa52 543 /* calculation of reciprocal value */
emilmont 1:fdd22bb7aa52 544 /* running approximation for two iterations */
emilmont 1:fdd22bb7aa52 545 for (i = 0u; i < 2u; i++)
emilmont 1:fdd22bb7aa52 546 {
emilmont 1:fdd22bb7aa52 547 tempVal = (q31_t) (((q63_t) in * out) >> 31u);
emilmont 1:fdd22bb7aa52 548 tempVal = 0x7FFFFFFF - tempVal;
emilmont 1:fdd22bb7aa52 549 /* 1.31 with exp 1 */
emilmont 1:fdd22bb7aa52 550 //out = (q31_t) (((q63_t) out * tempVal) >> 30u);
emilmont 1:fdd22bb7aa52 551 out = (q31_t) clip_q63_to_q31(((q63_t) out * tempVal) >> 30u);
emilmont 1:fdd22bb7aa52 552 }
emilmont 1:fdd22bb7aa52 553
emilmont 1:fdd22bb7aa52 554 /* write output */
emilmont 1:fdd22bb7aa52 555 *dst = out;
emilmont 1:fdd22bb7aa52 556
emilmont 1:fdd22bb7aa52 557 /* return num of signbits of out = 1/in value */
emilmont 1:fdd22bb7aa52 558 return (signBits + 1u);
emilmont 1:fdd22bb7aa52 559
emilmont 1:fdd22bb7aa52 560 }
emilmont 1:fdd22bb7aa52 561
emilmont 1:fdd22bb7aa52 562 /**
mbed_official 3:7a284390b0ce 563 * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type.
mbed_official 3:7a284390b0ce 564 */
mbed_official 3:7a284390b0ce 565 static __INLINE uint32_t arm_recip_q15(
emilmont 1:fdd22bb7aa52 566 q15_t in,
emilmont 1:fdd22bb7aa52 567 q15_t * dst,
emilmont 1:fdd22bb7aa52 568 q15_t * pRecipTable)
emilmont 1:fdd22bb7aa52 569 {
emilmont 1:fdd22bb7aa52 570
emilmont 1:fdd22bb7aa52 571 uint32_t out = 0, tempVal = 0;
emilmont 1:fdd22bb7aa52 572 uint32_t index = 0, i = 0;
emilmont 1:fdd22bb7aa52 573 uint32_t signBits = 0;
emilmont 1:fdd22bb7aa52 574
emilmont 1:fdd22bb7aa52 575 if(in > 0)
emilmont 1:fdd22bb7aa52 576 {
emilmont 1:fdd22bb7aa52 577 signBits = __CLZ(in) - 17;
emilmont 1:fdd22bb7aa52 578 }
emilmont 1:fdd22bb7aa52 579 else
emilmont 1:fdd22bb7aa52 580 {
emilmont 1:fdd22bb7aa52 581 signBits = __CLZ(-in) - 17;
emilmont 1:fdd22bb7aa52 582 }
emilmont 1:fdd22bb7aa52 583
emilmont 1:fdd22bb7aa52 584 /* Convert input sample to 1.15 format */
emilmont 1:fdd22bb7aa52 585 in = in << signBits;
emilmont 1:fdd22bb7aa52 586
emilmont 1:fdd22bb7aa52 587 /* calculation of index for initial approximated Val */
emilmont 1:fdd22bb7aa52 588 index = in >> 8;
emilmont 1:fdd22bb7aa52 589 index = (index & INDEX_MASK);
emilmont 1:fdd22bb7aa52 590
emilmont 1:fdd22bb7aa52 591 /* 1.15 with exp 1 */
emilmont 1:fdd22bb7aa52 592 out = pRecipTable[index];
emilmont 1:fdd22bb7aa52 593
emilmont 1:fdd22bb7aa52 594 /* calculation of reciprocal value */
emilmont 1:fdd22bb7aa52 595 /* running approximation for two iterations */
emilmont 1:fdd22bb7aa52 596 for (i = 0; i < 2; i++)
emilmont 1:fdd22bb7aa52 597 {
emilmont 1:fdd22bb7aa52 598 tempVal = (q15_t) (((q31_t) in * out) >> 15);
emilmont 1:fdd22bb7aa52 599 tempVal = 0x7FFF - tempVal;
emilmont 1:fdd22bb7aa52 600 /* 1.15 with exp 1 */
emilmont 1:fdd22bb7aa52 601 out = (q15_t) (((q31_t) out * tempVal) >> 14);
emilmont 1:fdd22bb7aa52 602 }
emilmont 1:fdd22bb7aa52 603
emilmont 1:fdd22bb7aa52 604 /* write output */
emilmont 1:fdd22bb7aa52 605 *dst = out;
emilmont 1:fdd22bb7aa52 606
emilmont 1:fdd22bb7aa52 607 /* return num of signbits of out = 1/in value */
emilmont 1:fdd22bb7aa52 608 return (signBits + 1);
emilmont 1:fdd22bb7aa52 609
emilmont 1:fdd22bb7aa52 610 }
emilmont 1:fdd22bb7aa52 611
emilmont 1:fdd22bb7aa52 612
emilmont 1:fdd22bb7aa52 613 /*
emilmont 1:fdd22bb7aa52 614 * @brief C custom defined intrinisic function for only M0 processors
emilmont 1:fdd22bb7aa52 615 */
mbed_official 3:7a284390b0ce 616 #if defined(ARM_MATH_CM0_FAMILY)
mbed_official 3:7a284390b0ce 617
mbed_official 3:7a284390b0ce 618 static __INLINE q31_t __SSAT(
emilmont 1:fdd22bb7aa52 619 q31_t x,
emilmont 1:fdd22bb7aa52 620 uint32_t y)
emilmont 1:fdd22bb7aa52 621 {
emilmont 1:fdd22bb7aa52 622 int32_t posMax, negMin;
emilmont 1:fdd22bb7aa52 623 uint32_t i;
emilmont 1:fdd22bb7aa52 624
emilmont 1:fdd22bb7aa52 625 posMax = 1;
emilmont 1:fdd22bb7aa52 626 for (i = 0; i < (y - 1); i++)
emilmont 1:fdd22bb7aa52 627 {
emilmont 1:fdd22bb7aa52 628 posMax = posMax * 2;
emilmont 1:fdd22bb7aa52 629 }
emilmont 1:fdd22bb7aa52 630
emilmont 1:fdd22bb7aa52 631 if(x > 0)
emilmont 1:fdd22bb7aa52 632 {
emilmont 1:fdd22bb7aa52 633 posMax = (posMax - 1);
emilmont 1:fdd22bb7aa52 634
emilmont 1:fdd22bb7aa52 635 if(x > posMax)
emilmont 1:fdd22bb7aa52 636 {
emilmont 1:fdd22bb7aa52 637 x = posMax;
emilmont 1:fdd22bb7aa52 638 }
emilmont 1:fdd22bb7aa52 639 }
emilmont 1:fdd22bb7aa52 640 else
emilmont 1:fdd22bb7aa52 641 {
emilmont 1:fdd22bb7aa52 642 negMin = -posMax;
emilmont 1:fdd22bb7aa52 643
emilmont 1:fdd22bb7aa52 644 if(x < negMin)
emilmont 1:fdd22bb7aa52 645 {
emilmont 1:fdd22bb7aa52 646 x = negMin;
emilmont 1:fdd22bb7aa52 647 }
emilmont 1:fdd22bb7aa52 648 }
emilmont 1:fdd22bb7aa52 649 return (x);
emilmont 1:fdd22bb7aa52 650
emilmont 1:fdd22bb7aa52 651
emilmont 1:fdd22bb7aa52 652 }
emilmont 1:fdd22bb7aa52 653
mbed_official 3:7a284390b0ce 654 #endif /* end of ARM_MATH_CM0_FAMILY */
emilmont 1:fdd22bb7aa52 655
emilmont 1:fdd22bb7aa52 656
emilmont 1:fdd22bb7aa52 657
emilmont 1:fdd22bb7aa52 658 /*
emilmont 1:fdd22bb7aa52 659 * @brief C custom defined intrinsic function for M3 and M0 processors
emilmont 1:fdd22bb7aa52 660 */
mbed_official 3:7a284390b0ce 661 #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
emilmont 1:fdd22bb7aa52 662
emilmont 1:fdd22bb7aa52 663 /*
emilmont 1:fdd22bb7aa52 664 * @brief C custom defined QADD8 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 665 */
mbed_official 3:7a284390b0ce 666 static __INLINE q31_t __QADD8(
emilmont 1:fdd22bb7aa52 667 q31_t x,
emilmont 1:fdd22bb7aa52 668 q31_t y)
emilmont 1:fdd22bb7aa52 669 {
emilmont 1:fdd22bb7aa52 670
emilmont 1:fdd22bb7aa52 671 q31_t sum;
emilmont 1:fdd22bb7aa52 672 q7_t r, s, t, u;
emilmont 1:fdd22bb7aa52 673
emilmont 1:fdd22bb7aa52 674 r = (q7_t) x;
emilmont 1:fdd22bb7aa52 675 s = (q7_t) y;
emilmont 1:fdd22bb7aa52 676
emilmont 1:fdd22bb7aa52 677 r = __SSAT((q31_t) (r + s), 8);
emilmont 1:fdd22bb7aa52 678 s = __SSAT(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8);
emilmont 1:fdd22bb7aa52 679 t = __SSAT(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8);
emilmont 1:fdd22bb7aa52 680 u = __SSAT(((q31_t) ((x >> 24) + (y >> 24))), 8);
emilmont 1:fdd22bb7aa52 681
emilmont 1:fdd22bb7aa52 682 sum =
emilmont 1:fdd22bb7aa52 683 (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) |
emilmont 1:fdd22bb7aa52 684 (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF);
emilmont 1:fdd22bb7aa52 685
emilmont 1:fdd22bb7aa52 686 return sum;
emilmont 1:fdd22bb7aa52 687
emilmont 1:fdd22bb7aa52 688 }
emilmont 1:fdd22bb7aa52 689
emilmont 1:fdd22bb7aa52 690 /*
emilmont 1:fdd22bb7aa52 691 * @brief C custom defined QSUB8 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 692 */
mbed_official 3:7a284390b0ce 693 static __INLINE q31_t __QSUB8(
emilmont 1:fdd22bb7aa52 694 q31_t x,
emilmont 1:fdd22bb7aa52 695 q31_t y)
emilmont 1:fdd22bb7aa52 696 {
emilmont 1:fdd22bb7aa52 697
emilmont 1:fdd22bb7aa52 698 q31_t sum;
emilmont 1:fdd22bb7aa52 699 q31_t r, s, t, u;
emilmont 1:fdd22bb7aa52 700
emilmont 1:fdd22bb7aa52 701 r = (q7_t) x;
emilmont 1:fdd22bb7aa52 702 s = (q7_t) y;
emilmont 1:fdd22bb7aa52 703
emilmont 1:fdd22bb7aa52 704 r = __SSAT((r - s), 8);
emilmont 1:fdd22bb7aa52 705 s = __SSAT(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8;
emilmont 1:fdd22bb7aa52 706 t = __SSAT(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16;
emilmont 1:fdd22bb7aa52 707 u = __SSAT(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24;
emilmont 1:fdd22bb7aa52 708
emilmont 1:fdd22bb7aa52 709 sum =
emilmont 1:fdd22bb7aa52 710 (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r &
emilmont 1:fdd22bb7aa52 711 0x000000FF);
emilmont 1:fdd22bb7aa52 712
emilmont 1:fdd22bb7aa52 713 return sum;
emilmont 1:fdd22bb7aa52 714 }
emilmont 1:fdd22bb7aa52 715
emilmont 1:fdd22bb7aa52 716 /*
emilmont 1:fdd22bb7aa52 717 * @brief C custom defined QADD16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 718 */
emilmont 1:fdd22bb7aa52 719
emilmont 1:fdd22bb7aa52 720 /*
emilmont 1:fdd22bb7aa52 721 * @brief C custom defined QADD16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 722 */
mbed_official 3:7a284390b0ce 723 static __INLINE q31_t __QADD16(
emilmont 1:fdd22bb7aa52 724 q31_t x,
emilmont 1:fdd22bb7aa52 725 q31_t y)
emilmont 1:fdd22bb7aa52 726 {
emilmont 1:fdd22bb7aa52 727
emilmont 1:fdd22bb7aa52 728 q31_t sum;
emilmont 1:fdd22bb7aa52 729 q31_t r, s;
emilmont 1:fdd22bb7aa52 730
emilmont 1:fdd22bb7aa52 731 r = (short) x;
emilmont 1:fdd22bb7aa52 732 s = (short) y;
emilmont 1:fdd22bb7aa52 733
emilmont 1:fdd22bb7aa52 734 r = __SSAT(r + s, 16);
emilmont 1:fdd22bb7aa52 735 s = __SSAT(((q31_t) ((x >> 16) + (y >> 16))), 16) << 16;
emilmont 1:fdd22bb7aa52 736
emilmont 1:fdd22bb7aa52 737 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 738
emilmont 1:fdd22bb7aa52 739 return sum;
emilmont 1:fdd22bb7aa52 740
emilmont 1:fdd22bb7aa52 741 }
emilmont 1:fdd22bb7aa52 742
emilmont 1:fdd22bb7aa52 743 /*
emilmont 1:fdd22bb7aa52 744 * @brief C custom defined SHADD16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 745 */
mbed_official 3:7a284390b0ce 746 static __INLINE q31_t __SHADD16(
emilmont 1:fdd22bb7aa52 747 q31_t x,
emilmont 1:fdd22bb7aa52 748 q31_t y)
emilmont 1:fdd22bb7aa52 749 {
emilmont 1:fdd22bb7aa52 750
emilmont 1:fdd22bb7aa52 751 q31_t sum;
emilmont 1:fdd22bb7aa52 752 q31_t r, s;
emilmont 1:fdd22bb7aa52 753
emilmont 1:fdd22bb7aa52 754 r = (short) x;
emilmont 1:fdd22bb7aa52 755 s = (short) y;
emilmont 1:fdd22bb7aa52 756
emilmont 1:fdd22bb7aa52 757 r = ((r >> 1) + (s >> 1));
emilmont 1:fdd22bb7aa52 758 s = ((q31_t) ((x >> 17) + (y >> 17))) << 16;
emilmont 1:fdd22bb7aa52 759
emilmont 1:fdd22bb7aa52 760 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 761
emilmont 1:fdd22bb7aa52 762 return sum;
emilmont 1:fdd22bb7aa52 763
emilmont 1:fdd22bb7aa52 764 }
emilmont 1:fdd22bb7aa52 765
emilmont 1:fdd22bb7aa52 766 /*
emilmont 1:fdd22bb7aa52 767 * @brief C custom defined QSUB16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 768 */
mbed_official 3:7a284390b0ce 769 static __INLINE q31_t __QSUB16(
emilmont 1:fdd22bb7aa52 770 q31_t x,
emilmont 1:fdd22bb7aa52 771 q31_t y)
emilmont 1:fdd22bb7aa52 772 {
emilmont 1:fdd22bb7aa52 773
emilmont 1:fdd22bb7aa52 774 q31_t sum;
emilmont 1:fdd22bb7aa52 775 q31_t r, s;
emilmont 1:fdd22bb7aa52 776
emilmont 1:fdd22bb7aa52 777 r = (short) x;
emilmont 1:fdd22bb7aa52 778 s = (short) y;
emilmont 1:fdd22bb7aa52 779
emilmont 1:fdd22bb7aa52 780 r = __SSAT(r - s, 16);
emilmont 1:fdd22bb7aa52 781 s = __SSAT(((q31_t) ((x >> 16) - (y >> 16))), 16) << 16;
emilmont 1:fdd22bb7aa52 782
emilmont 1:fdd22bb7aa52 783 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 784
emilmont 1:fdd22bb7aa52 785 return sum;
emilmont 1:fdd22bb7aa52 786 }
emilmont 1:fdd22bb7aa52 787
emilmont 1:fdd22bb7aa52 788 /*
emilmont 1:fdd22bb7aa52 789 * @brief C custom defined SHSUB16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 790 */
mbed_official 3:7a284390b0ce 791 static __INLINE q31_t __SHSUB16(
emilmont 1:fdd22bb7aa52 792 q31_t x,
emilmont 1:fdd22bb7aa52 793 q31_t y)
emilmont 1:fdd22bb7aa52 794 {
emilmont 1:fdd22bb7aa52 795
emilmont 1:fdd22bb7aa52 796 q31_t diff;
emilmont 1:fdd22bb7aa52 797 q31_t r, s;
emilmont 1:fdd22bb7aa52 798
emilmont 1:fdd22bb7aa52 799 r = (short) x;
emilmont 1:fdd22bb7aa52 800 s = (short) y;
emilmont 1:fdd22bb7aa52 801
emilmont 1:fdd22bb7aa52 802 r = ((r >> 1) - (s >> 1));
emilmont 1:fdd22bb7aa52 803 s = (((x >> 17) - (y >> 17)) << 16);
emilmont 1:fdd22bb7aa52 804
emilmont 1:fdd22bb7aa52 805 diff = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 806
emilmont 1:fdd22bb7aa52 807 return diff;
emilmont 1:fdd22bb7aa52 808 }
emilmont 1:fdd22bb7aa52 809
emilmont 1:fdd22bb7aa52 810 /*
emilmont 1:fdd22bb7aa52 811 * @brief C custom defined QASX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 812 */
mbed_official 3:7a284390b0ce 813 static __INLINE q31_t __QASX(
emilmont 1:fdd22bb7aa52 814 q31_t x,
emilmont 1:fdd22bb7aa52 815 q31_t y)
emilmont 1:fdd22bb7aa52 816 {
emilmont 1:fdd22bb7aa52 817
emilmont 1:fdd22bb7aa52 818 q31_t sum = 0;
emilmont 1:fdd22bb7aa52 819
emilmont 1:fdd22bb7aa52 820 sum =
emilmont 1:fdd22bb7aa52 821 ((sum +
emilmont 1:fdd22bb7aa52 822 clip_q31_to_q15((q31_t) ((short) (x >> 16) + (short) y))) << 16) +
emilmont 1:fdd22bb7aa52 823 clip_q31_to_q15((q31_t) ((short) x - (short) (y >> 16)));
emilmont 1:fdd22bb7aa52 824
emilmont 1:fdd22bb7aa52 825 return sum;
emilmont 1:fdd22bb7aa52 826 }
emilmont 1:fdd22bb7aa52 827
emilmont 1:fdd22bb7aa52 828 /*
emilmont 1:fdd22bb7aa52 829 * @brief C custom defined SHASX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 830 */
mbed_official 3:7a284390b0ce 831 static __INLINE q31_t __SHASX(
emilmont 1:fdd22bb7aa52 832 q31_t x,
emilmont 1:fdd22bb7aa52 833 q31_t y)
emilmont 1:fdd22bb7aa52 834 {
emilmont 1:fdd22bb7aa52 835
emilmont 1:fdd22bb7aa52 836 q31_t sum;
emilmont 1:fdd22bb7aa52 837 q31_t r, s;
emilmont 1:fdd22bb7aa52 838
emilmont 1:fdd22bb7aa52 839 r = (short) x;
emilmont 1:fdd22bb7aa52 840 s = (short) y;
emilmont 1:fdd22bb7aa52 841
emilmont 1:fdd22bb7aa52 842 r = ((r >> 1) - (y >> 17));
emilmont 1:fdd22bb7aa52 843 s = (((x >> 17) + (s >> 1)) << 16);
emilmont 1:fdd22bb7aa52 844
emilmont 1:fdd22bb7aa52 845 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 846
emilmont 1:fdd22bb7aa52 847 return sum;
emilmont 1:fdd22bb7aa52 848 }
emilmont 1:fdd22bb7aa52 849
emilmont 1:fdd22bb7aa52 850
emilmont 1:fdd22bb7aa52 851 /*
emilmont 1:fdd22bb7aa52 852 * @brief C custom defined QSAX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 853 */
mbed_official 3:7a284390b0ce 854 static __INLINE q31_t __QSAX(
emilmont 1:fdd22bb7aa52 855 q31_t x,
emilmont 1:fdd22bb7aa52 856 q31_t y)
emilmont 1:fdd22bb7aa52 857 {
emilmont 1:fdd22bb7aa52 858
emilmont 1:fdd22bb7aa52 859 q31_t sum = 0;
emilmont 1:fdd22bb7aa52 860
emilmont 1:fdd22bb7aa52 861 sum =
emilmont 1:fdd22bb7aa52 862 ((sum +
emilmont 1:fdd22bb7aa52 863 clip_q31_to_q15((q31_t) ((short) (x >> 16) - (short) y))) << 16) +
emilmont 1:fdd22bb7aa52 864 clip_q31_to_q15((q31_t) ((short) x + (short) (y >> 16)));
emilmont 1:fdd22bb7aa52 865
emilmont 1:fdd22bb7aa52 866 return sum;
emilmont 1:fdd22bb7aa52 867 }
emilmont 1:fdd22bb7aa52 868
emilmont 1:fdd22bb7aa52 869 /*
emilmont 1:fdd22bb7aa52 870 * @brief C custom defined SHSAX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 871 */
mbed_official 3:7a284390b0ce 872 static __INLINE q31_t __SHSAX(
emilmont 1:fdd22bb7aa52 873 q31_t x,
emilmont 1:fdd22bb7aa52 874 q31_t y)
emilmont 1:fdd22bb7aa52 875 {
emilmont 1:fdd22bb7aa52 876
emilmont 1:fdd22bb7aa52 877 q31_t sum;
emilmont 1:fdd22bb7aa52 878 q31_t r, s;
emilmont 1:fdd22bb7aa52 879
emilmont 1:fdd22bb7aa52 880 r = (short) x;
emilmont 1:fdd22bb7aa52 881 s = (short) y;
emilmont 1:fdd22bb7aa52 882
emilmont 1:fdd22bb7aa52 883 r = ((r >> 1) + (y >> 17));
emilmont 1:fdd22bb7aa52 884 s = (((x >> 17) - (s >> 1)) << 16);
emilmont 1:fdd22bb7aa52 885
emilmont 1:fdd22bb7aa52 886 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF);
emilmont 1:fdd22bb7aa52 887
emilmont 1:fdd22bb7aa52 888 return sum;
emilmont 1:fdd22bb7aa52 889 }
emilmont 1:fdd22bb7aa52 890
emilmont 1:fdd22bb7aa52 891 /*
emilmont 1:fdd22bb7aa52 892 * @brief C custom defined SMUSDX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 893 */
mbed_official 3:7a284390b0ce 894 static __INLINE q31_t __SMUSDX(
emilmont 1:fdd22bb7aa52 895 q31_t x,
emilmont 1:fdd22bb7aa52 896 q31_t y)
emilmont 1:fdd22bb7aa52 897 {
emilmont 1:fdd22bb7aa52 898
emilmont 1:fdd22bb7aa52 899 return ((q31_t) (((short) x * (short) (y >> 16)) -
emilmont 1:fdd22bb7aa52 900 ((short) (x >> 16) * (short) y)));
emilmont 1:fdd22bb7aa52 901 }
emilmont 1:fdd22bb7aa52 902
emilmont 1:fdd22bb7aa52 903 /*
emilmont 1:fdd22bb7aa52 904 * @brief C custom defined SMUADX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 905 */
mbed_official 3:7a284390b0ce 906 static __INLINE q31_t __SMUADX(
emilmont 1:fdd22bb7aa52 907 q31_t x,
emilmont 1:fdd22bb7aa52 908 q31_t y)
emilmont 1:fdd22bb7aa52 909 {
emilmont 1:fdd22bb7aa52 910
emilmont 1:fdd22bb7aa52 911 return ((q31_t) (((short) x * (short) (y >> 16)) +
emilmont 1:fdd22bb7aa52 912 ((short) (x >> 16) * (short) y)));
emilmont 1:fdd22bb7aa52 913 }
emilmont 1:fdd22bb7aa52 914
emilmont 1:fdd22bb7aa52 915 /*
emilmont 1:fdd22bb7aa52 916 * @brief C custom defined QADD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 917 */
mbed_official 3:7a284390b0ce 918 static __INLINE q31_t __QADD(
emilmont 1:fdd22bb7aa52 919 q31_t x,
emilmont 1:fdd22bb7aa52 920 q31_t y)
emilmont 1:fdd22bb7aa52 921 {
emilmont 1:fdd22bb7aa52 922 return clip_q63_to_q31((q63_t) x + y);
emilmont 1:fdd22bb7aa52 923 }
emilmont 1:fdd22bb7aa52 924
emilmont 1:fdd22bb7aa52 925 /*
emilmont 1:fdd22bb7aa52 926 * @brief C custom defined QSUB for M3 and M0 processors
emilmont 1:fdd22bb7aa52 927 */
mbed_official 3:7a284390b0ce 928 static __INLINE q31_t __QSUB(
emilmont 1:fdd22bb7aa52 929 q31_t x,
emilmont 1:fdd22bb7aa52 930 q31_t y)
emilmont 1:fdd22bb7aa52 931 {
emilmont 1:fdd22bb7aa52 932 return clip_q63_to_q31((q63_t) x - y);
emilmont 1:fdd22bb7aa52 933 }
emilmont 1:fdd22bb7aa52 934
emilmont 1:fdd22bb7aa52 935 /*
emilmont 1:fdd22bb7aa52 936 * @brief C custom defined SMLAD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 937 */
mbed_official 3:7a284390b0ce 938 static __INLINE q31_t __SMLAD(
emilmont 1:fdd22bb7aa52 939 q31_t x,
emilmont 1:fdd22bb7aa52 940 q31_t y,
emilmont 1:fdd22bb7aa52 941 q31_t sum)
emilmont 1:fdd22bb7aa52 942 {
emilmont 1:fdd22bb7aa52 943
emilmont 1:fdd22bb7aa52 944 return (sum + ((short) (x >> 16) * (short) (y >> 16)) +
emilmont 1:fdd22bb7aa52 945 ((short) x * (short) y));
emilmont 1:fdd22bb7aa52 946 }
emilmont 1:fdd22bb7aa52 947
emilmont 1:fdd22bb7aa52 948 /*
emilmont 1:fdd22bb7aa52 949 * @brief C custom defined SMLADX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 950 */
mbed_official 3:7a284390b0ce 951 static __INLINE q31_t __SMLADX(
emilmont 1:fdd22bb7aa52 952 q31_t x,
emilmont 1:fdd22bb7aa52 953 q31_t y,
emilmont 1:fdd22bb7aa52 954 q31_t sum)
emilmont 1:fdd22bb7aa52 955 {
emilmont 1:fdd22bb7aa52 956
emilmont 1:fdd22bb7aa52 957 return (sum + ((short) (x >> 16) * (short) (y)) +
emilmont 1:fdd22bb7aa52 958 ((short) x * (short) (y >> 16)));
emilmont 1:fdd22bb7aa52 959 }
emilmont 1:fdd22bb7aa52 960
emilmont 1:fdd22bb7aa52 961 /*
emilmont 1:fdd22bb7aa52 962 * @brief C custom defined SMLSDX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 963 */
mbed_official 3:7a284390b0ce 964 static __INLINE q31_t __SMLSDX(
emilmont 1:fdd22bb7aa52 965 q31_t x,
emilmont 1:fdd22bb7aa52 966 q31_t y,
emilmont 1:fdd22bb7aa52 967 q31_t sum)
emilmont 1:fdd22bb7aa52 968 {
emilmont 1:fdd22bb7aa52 969
emilmont 1:fdd22bb7aa52 970 return (sum - ((short) (x >> 16) * (short) (y)) +
emilmont 1:fdd22bb7aa52 971 ((short) x * (short) (y >> 16)));
emilmont 1:fdd22bb7aa52 972 }
emilmont 1:fdd22bb7aa52 973
emilmont 1:fdd22bb7aa52 974 /*
emilmont 1:fdd22bb7aa52 975 * @brief C custom defined SMLALD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 976 */
mbed_official 3:7a284390b0ce 977 static __INLINE q63_t __SMLALD(
emilmont 1:fdd22bb7aa52 978 q31_t x,
emilmont 1:fdd22bb7aa52 979 q31_t y,
emilmont 1:fdd22bb7aa52 980 q63_t sum)
emilmont 1:fdd22bb7aa52 981 {
emilmont 1:fdd22bb7aa52 982
emilmont 1:fdd22bb7aa52 983 return (sum + ((short) (x >> 16) * (short) (y >> 16)) +
emilmont 1:fdd22bb7aa52 984 ((short) x * (short) y));
emilmont 1:fdd22bb7aa52 985 }
emilmont 1:fdd22bb7aa52 986
emilmont 1:fdd22bb7aa52 987 /*
emilmont 1:fdd22bb7aa52 988 * @brief C custom defined SMLALDX for M3 and M0 processors
emilmont 1:fdd22bb7aa52 989 */
mbed_official 3:7a284390b0ce 990 static __INLINE q63_t __SMLALDX(
emilmont 1:fdd22bb7aa52 991 q31_t x,
emilmont 1:fdd22bb7aa52 992 q31_t y,
emilmont 1:fdd22bb7aa52 993 q63_t sum)
emilmont 1:fdd22bb7aa52 994 {
emilmont 1:fdd22bb7aa52 995
emilmont 1:fdd22bb7aa52 996 return (sum + ((short) (x >> 16) * (short) y)) +
emilmont 1:fdd22bb7aa52 997 ((short) x * (short) (y >> 16));
emilmont 1:fdd22bb7aa52 998 }
emilmont 1:fdd22bb7aa52 999
emilmont 1:fdd22bb7aa52 1000 /*
emilmont 1:fdd22bb7aa52 1001 * @brief C custom defined SMUAD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1002 */
mbed_official 3:7a284390b0ce 1003 static __INLINE q31_t __SMUAD(
emilmont 1:fdd22bb7aa52 1004 q31_t x,
emilmont 1:fdd22bb7aa52 1005 q31_t y)
emilmont 1:fdd22bb7aa52 1006 {
emilmont 1:fdd22bb7aa52 1007
emilmont 1:fdd22bb7aa52 1008 return (((x >> 16) * (y >> 16)) +
emilmont 1:fdd22bb7aa52 1009 (((x << 16) >> 16) * ((y << 16) >> 16)));
emilmont 1:fdd22bb7aa52 1010 }
emilmont 1:fdd22bb7aa52 1011
emilmont 1:fdd22bb7aa52 1012 /*
emilmont 1:fdd22bb7aa52 1013 * @brief C custom defined SMUSD for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1014 */
mbed_official 3:7a284390b0ce 1015 static __INLINE q31_t __SMUSD(
emilmont 1:fdd22bb7aa52 1016 q31_t x,
emilmont 1:fdd22bb7aa52 1017 q31_t y)
emilmont 1:fdd22bb7aa52 1018 {
emilmont 1:fdd22bb7aa52 1019
emilmont 1:fdd22bb7aa52 1020 return (-((x >> 16) * (y >> 16)) +
emilmont 1:fdd22bb7aa52 1021 (((x << 16) >> 16) * ((y << 16) >> 16)));
emilmont 1:fdd22bb7aa52 1022 }
emilmont 1:fdd22bb7aa52 1023
emilmont 1:fdd22bb7aa52 1024
emilmont 1:fdd22bb7aa52 1025 /*
emilmont 1:fdd22bb7aa52 1026 * @brief C custom defined SXTB16 for M3 and M0 processors
emilmont 1:fdd22bb7aa52 1027 */
mbed_official 3:7a284390b0ce 1028 static __INLINE q31_t __SXTB16(
emilmont 1:fdd22bb7aa52 1029 q31_t x)
emilmont 1:fdd22bb7aa52 1030 {
emilmont 1:fdd22bb7aa52 1031
emilmont 1:fdd22bb7aa52 1032 return ((((x << 24) >> 24) & 0x0000FFFF) |
emilmont 1:fdd22bb7aa52 1033 (((x << 8) >> 8) & 0xFFFF0000));
emilmont 1:fdd22bb7aa52 1034 }
emilmont 1:fdd22bb7aa52 1035
emilmont 1:fdd22bb7aa52 1036
mbed_official 3:7a284390b0ce 1037 #endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */
emilmont 1:fdd22bb7aa52 1038
emilmont 1:fdd22bb7aa52 1039
emilmont 1:fdd22bb7aa52 1040 /**
emilmont 1:fdd22bb7aa52 1041 * @brief Instance structure for the Q7 FIR filter.
emilmont 1:fdd22bb7aa52 1042 */
emilmont 1:fdd22bb7aa52 1043 typedef struct
emilmont 1:fdd22bb7aa52 1044 {
emilmont 1:fdd22bb7aa52 1045 uint16_t numTaps; /**< number of filter coefficients in the filter. */
emilmont 1:fdd22bb7aa52 1046 q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 1047 q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 1048 } arm_fir_instance_q7;
emilmont 1:fdd22bb7aa52 1049
emilmont 1:fdd22bb7aa52 1050 /**
emilmont 1:fdd22bb7aa52 1051 * @brief Instance structure for the Q15 FIR filter.
emilmont 1:fdd22bb7aa52 1052 */
emilmont 1:fdd22bb7aa52 1053 typedef struct
emilmont 1:fdd22bb7aa52 1054 {
emilmont 1:fdd22bb7aa52 1055 uint16_t numTaps; /**< number of filter coefficients in the filter. */
emilmont 1:fdd22bb7aa52 1056 q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 1057 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/
emilmont 1:fdd22bb7aa52 1058 } arm_fir_instance_q15;
emilmont 1:fdd22bb7aa52 1059
emilmont 1:fdd22bb7aa52 1060 /**
emilmont 1:fdd22bb7aa52 1061 * @brief Instance structure for the Q31 FIR filter.
emilmont 1:fdd22bb7aa52 1062 */
emilmont 1:fdd22bb7aa52 1063 typedef struct
emilmont 1:fdd22bb7aa52 1064 {
emilmont 1:fdd22bb7aa52 1065 uint16_t numTaps; /**< number of filter coefficients in the filter. */
emilmont 1:fdd22bb7aa52 1066 q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 1067 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 1068 } arm_fir_instance_q31;
emilmont 1:fdd22bb7aa52 1069
emilmont 1:fdd22bb7aa52 1070 /**
emilmont 1:fdd22bb7aa52 1071 * @brief Instance structure for the floating-point FIR filter.
emilmont 1:fdd22bb7aa52 1072 */
emilmont 1:fdd22bb7aa52 1073 typedef struct
emilmont 1:fdd22bb7aa52 1074 {
emilmont 1:fdd22bb7aa52 1075 uint16_t numTaps; /**< number of filter coefficients in the filter. */
emilmont 1:fdd22bb7aa52 1076 float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
emilmont 1:fdd22bb7aa52 1077 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */
emilmont 1:fdd22bb7aa52 1078 } arm_fir_instance_f32;
emilmont 1:fdd22bb7aa52 1079
emilmont 1:fdd22bb7aa52 1080
emilmont 1:fdd22bb7aa52 1081 /**
emilmont 1:fdd22bb7aa52 1082 * @brief Processing function for the Q7 FIR filter.
emilmont 1:fdd22bb7aa52 1083 * @param[in] *S points to an instance of the Q7 FIR filter structure.
emilmont 1:fdd22bb7aa52 1084 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1085 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1086 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1087 * @return none.
emilmont 1:fdd22bb7aa52 1088 */
emilmont 1:fdd22bb7aa52 1089 void arm_fir_q7(
emilmont 1:fdd22bb7aa52 1090 const arm_fir_instance_q7 * S,
emilmont 1:fdd22bb7aa52 1091 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 1092 q7_t * pDst,
emilmont 1:fdd22bb7aa52 1093 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1094
emilmont 1:fdd22bb7aa52 1095
emilmont 1:fdd22bb7aa52 1096 /**
emilmont 1:fdd22bb7aa52 1097 * @brief Initialization function for the Q7 FIR filter.
emilmont 1:fdd22bb7aa52 1098 * @param[in,out] *S points to an instance of the Q7 FIR structure.
emilmont 1:fdd22bb7aa52 1099 * @param[in] numTaps Number of filter coefficients in the filter.
emilmont 1:fdd22bb7aa52 1100 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1101 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1102 * @param[in] blockSize number of samples that are processed.
emilmont 1:fdd22bb7aa52 1103 * @return none
emilmont 1:fdd22bb7aa52 1104 */
emilmont 1:fdd22bb7aa52 1105 void arm_fir_init_q7(
emilmont 1:fdd22bb7aa52 1106 arm_fir_instance_q7 * S,
emilmont 1:fdd22bb7aa52 1107 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 1108 q7_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1109 q7_t * pState,
emilmont 1:fdd22bb7aa52 1110 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1111
emilmont 1:fdd22bb7aa52 1112
emilmont 1:fdd22bb7aa52 1113 /**
emilmont 1:fdd22bb7aa52 1114 * @brief Processing function for the Q15 FIR filter.
emilmont 1:fdd22bb7aa52 1115 * @param[in] *S points to an instance of the Q15 FIR structure.
emilmont 1:fdd22bb7aa52 1116 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1117 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1118 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1119 * @return none.
emilmont 1:fdd22bb7aa52 1120 */
emilmont 1:fdd22bb7aa52 1121 void arm_fir_q15(
emilmont 1:fdd22bb7aa52 1122 const arm_fir_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1123 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 1124 q15_t * pDst,
emilmont 1:fdd22bb7aa52 1125 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1126
emilmont 1:fdd22bb7aa52 1127 /**
emilmont 1:fdd22bb7aa52 1128 * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 1129 * @param[in] *S points to an instance of the Q15 FIR filter structure.
emilmont 1:fdd22bb7aa52 1130 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1131 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1132 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1133 * @return none.
emilmont 1:fdd22bb7aa52 1134 */
emilmont 1:fdd22bb7aa52 1135 void arm_fir_fast_q15(
emilmont 1:fdd22bb7aa52 1136 const arm_fir_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1137 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 1138 q15_t * pDst,
emilmont 1:fdd22bb7aa52 1139 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1140
emilmont 1:fdd22bb7aa52 1141 /**
emilmont 1:fdd22bb7aa52 1142 * @brief Initialization function for the Q15 FIR filter.
emilmont 1:fdd22bb7aa52 1143 * @param[in,out] *S points to an instance of the Q15 FIR filter structure.
emilmont 1:fdd22bb7aa52 1144 * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4.
emilmont 1:fdd22bb7aa52 1145 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1146 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1147 * @param[in] blockSize number of samples that are processed at a time.
emilmont 1:fdd22bb7aa52 1148 * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if
emilmont 1:fdd22bb7aa52 1149 * <code>numTaps</code> is not a supported value.
emilmont 1:fdd22bb7aa52 1150 */
emilmont 1:fdd22bb7aa52 1151
emilmont 1:fdd22bb7aa52 1152 arm_status arm_fir_init_q15(
emilmont 1:fdd22bb7aa52 1153 arm_fir_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1154 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 1155 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1156 q15_t * pState,
emilmont 1:fdd22bb7aa52 1157 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1158
emilmont 1:fdd22bb7aa52 1159 /**
emilmont 1:fdd22bb7aa52 1160 * @brief Processing function for the Q31 FIR filter.
emilmont 1:fdd22bb7aa52 1161 * @param[in] *S points to an instance of the Q31 FIR filter structure.
emilmont 1:fdd22bb7aa52 1162 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1163 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1164 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1165 * @return none.
emilmont 1:fdd22bb7aa52 1166 */
emilmont 1:fdd22bb7aa52 1167 void arm_fir_q31(
emilmont 1:fdd22bb7aa52 1168 const arm_fir_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1169 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 1170 q31_t * pDst,
emilmont 1:fdd22bb7aa52 1171 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1172
emilmont 1:fdd22bb7aa52 1173 /**
emilmont 1:fdd22bb7aa52 1174 * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 1175 * @param[in] *S points to an instance of the Q31 FIR structure.
emilmont 1:fdd22bb7aa52 1176 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1177 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1178 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1179 * @return none.
emilmont 1:fdd22bb7aa52 1180 */
emilmont 1:fdd22bb7aa52 1181 void arm_fir_fast_q31(
emilmont 1:fdd22bb7aa52 1182 const arm_fir_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1183 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 1184 q31_t * pDst,
emilmont 1:fdd22bb7aa52 1185 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1186
emilmont 1:fdd22bb7aa52 1187 /**
emilmont 1:fdd22bb7aa52 1188 * @brief Initialization function for the Q31 FIR filter.
emilmont 1:fdd22bb7aa52 1189 * @param[in,out] *S points to an instance of the Q31 FIR structure.
emilmont 2:da51fb522205 1190 * @param[in] numTaps Number of filter coefficients in the filter.
emilmont 2:da51fb522205 1191 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 2:da51fb522205 1192 * @param[in] *pState points to the state buffer.
emilmont 2:da51fb522205 1193 * @param[in] blockSize number of samples that are processed at a time.
emilmont 2:da51fb522205 1194 * @return none.
emilmont 1:fdd22bb7aa52 1195 */
emilmont 1:fdd22bb7aa52 1196 void arm_fir_init_q31(
emilmont 1:fdd22bb7aa52 1197 arm_fir_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1198 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 1199 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1200 q31_t * pState,
emilmont 1:fdd22bb7aa52 1201 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1202
emilmont 1:fdd22bb7aa52 1203 /**
emilmont 1:fdd22bb7aa52 1204 * @brief Processing function for the floating-point FIR filter.
emilmont 1:fdd22bb7aa52 1205 * @param[in] *S points to an instance of the floating-point FIR structure.
emilmont 1:fdd22bb7aa52 1206 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1207 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1208 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1209 * @return none.
emilmont 1:fdd22bb7aa52 1210 */
emilmont 1:fdd22bb7aa52 1211 void arm_fir_f32(
emilmont 1:fdd22bb7aa52 1212 const arm_fir_instance_f32 * S,
emilmont 1:fdd22bb7aa52 1213 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 1214 float32_t * pDst,
emilmont 1:fdd22bb7aa52 1215 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1216
emilmont 1:fdd22bb7aa52 1217 /**
emilmont 1:fdd22bb7aa52 1218 * @brief Initialization function for the floating-point FIR filter.
emilmont 1:fdd22bb7aa52 1219 * @param[in,out] *S points to an instance of the floating-point FIR filter structure.
emilmont 2:da51fb522205 1220 * @param[in] numTaps Number of filter coefficients in the filter.
emilmont 2:da51fb522205 1221 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 2:da51fb522205 1222 * @param[in] *pState points to the state buffer.
emilmont 2:da51fb522205 1223 * @param[in] blockSize number of samples that are processed at a time.
emilmont 2:da51fb522205 1224 * @return none.
emilmont 1:fdd22bb7aa52 1225 */
emilmont 1:fdd22bb7aa52 1226 void arm_fir_init_f32(
emilmont 1:fdd22bb7aa52 1227 arm_fir_instance_f32 * S,
emilmont 1:fdd22bb7aa52 1228 uint16_t numTaps,
emilmont 1:fdd22bb7aa52 1229 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1230 float32_t * pState,
emilmont 1:fdd22bb7aa52 1231 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1232
emilmont 1:fdd22bb7aa52 1233
emilmont 1:fdd22bb7aa52 1234 /**
emilmont 1:fdd22bb7aa52 1235 * @brief Instance structure for the Q15 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1236 */
emilmont 1:fdd22bb7aa52 1237 typedef struct
emilmont 1:fdd22bb7aa52 1238 {
emilmont 1:fdd22bb7aa52 1239 int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
emilmont 1:fdd22bb7aa52 1240 q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */
emilmont 1:fdd22bb7aa52 1241 q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */
emilmont 1:fdd22bb7aa52 1242 int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */
emilmont 1:fdd22bb7aa52 1243
emilmont 1:fdd22bb7aa52 1244 } arm_biquad_casd_df1_inst_q15;
emilmont 1:fdd22bb7aa52 1245
emilmont 1:fdd22bb7aa52 1246
emilmont 1:fdd22bb7aa52 1247 /**
emilmont 1:fdd22bb7aa52 1248 * @brief Instance structure for the Q31 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1249 */
emilmont 1:fdd22bb7aa52 1250 typedef struct
emilmont 1:fdd22bb7aa52 1251 {
emilmont 1:fdd22bb7aa52 1252 uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
emilmont 1:fdd22bb7aa52 1253 q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */
emilmont 1:fdd22bb7aa52 1254 q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */
emilmont 1:fdd22bb7aa52 1255 uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */
emilmont 1:fdd22bb7aa52 1256
emilmont 1:fdd22bb7aa52 1257 } arm_biquad_casd_df1_inst_q31;
emilmont 1:fdd22bb7aa52 1258
emilmont 1:fdd22bb7aa52 1259 /**
emilmont 1:fdd22bb7aa52 1260 * @brief Instance structure for the floating-point Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1261 */
emilmont 1:fdd22bb7aa52 1262 typedef struct
emilmont 1:fdd22bb7aa52 1263 {
emilmont 1:fdd22bb7aa52 1264 uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */
emilmont 1:fdd22bb7aa52 1265 float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */
emilmont 1:fdd22bb7aa52 1266 float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */
emilmont 1:fdd22bb7aa52 1267
emilmont 1:fdd22bb7aa52 1268
emilmont 1:fdd22bb7aa52 1269 } arm_biquad_casd_df1_inst_f32;
emilmont 1:fdd22bb7aa52 1270
emilmont 1:fdd22bb7aa52 1271
emilmont 1:fdd22bb7aa52 1272
emilmont 1:fdd22bb7aa52 1273 /**
emilmont 1:fdd22bb7aa52 1274 * @brief Processing function for the Q15 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1275 * @param[in] *S points to an instance of the Q15 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1276 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1277 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1278 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1279 * @return none.
emilmont 1:fdd22bb7aa52 1280 */
emilmont 1:fdd22bb7aa52 1281
emilmont 1:fdd22bb7aa52 1282 void arm_biquad_cascade_df1_q15(
emilmont 1:fdd22bb7aa52 1283 const arm_biquad_casd_df1_inst_q15 * S,
emilmont 1:fdd22bb7aa52 1284 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 1285 q15_t * pDst,
emilmont 1:fdd22bb7aa52 1286 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1287
emilmont 1:fdd22bb7aa52 1288 /**
emilmont 1:fdd22bb7aa52 1289 * @brief Initialization function for the Q15 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1290 * @param[in,out] *S points to an instance of the Q15 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1291 * @param[in] numStages number of 2nd order stages in the filter.
emilmont 1:fdd22bb7aa52 1292 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1293 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1294 * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format
emilmont 1:fdd22bb7aa52 1295 * @return none
emilmont 1:fdd22bb7aa52 1296 */
emilmont 1:fdd22bb7aa52 1297
emilmont 1:fdd22bb7aa52 1298 void arm_biquad_cascade_df1_init_q15(
emilmont 1:fdd22bb7aa52 1299 arm_biquad_casd_df1_inst_q15 * S,
emilmont 1:fdd22bb7aa52 1300 uint8_t numStages,
emilmont 1:fdd22bb7aa52 1301 q15_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1302 q15_t * pState,
emilmont 1:fdd22bb7aa52 1303 int8_t postShift);
emilmont 1:fdd22bb7aa52 1304
emilmont 1:fdd22bb7aa52 1305
emilmont 1:fdd22bb7aa52 1306 /**
emilmont 1:fdd22bb7aa52 1307 * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 1308 * @param[in] *S points to an instance of the Q15 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1309 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1310 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1311 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1312 * @return none.
emilmont 1:fdd22bb7aa52 1313 */
emilmont 1:fdd22bb7aa52 1314
emilmont 1:fdd22bb7aa52 1315 void arm_biquad_cascade_df1_fast_q15(
emilmont 1:fdd22bb7aa52 1316 const arm_biquad_casd_df1_inst_q15 * S,
emilmont 1:fdd22bb7aa52 1317 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 1318 q15_t * pDst,
emilmont 1:fdd22bb7aa52 1319 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1320
emilmont 1:fdd22bb7aa52 1321
emilmont 1:fdd22bb7aa52 1322 /**
emilmont 1:fdd22bb7aa52 1323 * @brief Processing function for the Q31 Biquad cascade filter
emilmont 1:fdd22bb7aa52 1324 * @param[in] *S points to an instance of the Q31 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1325 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1326 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1327 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1328 * @return none.
emilmont 1:fdd22bb7aa52 1329 */
emilmont 1:fdd22bb7aa52 1330
emilmont 1:fdd22bb7aa52 1331 void arm_biquad_cascade_df1_q31(
emilmont 1:fdd22bb7aa52 1332 const arm_biquad_casd_df1_inst_q31 * S,
emilmont 1:fdd22bb7aa52 1333 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 1334 q31_t * pDst,
emilmont 1:fdd22bb7aa52 1335 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1336
emilmont 1:fdd22bb7aa52 1337 /**
emilmont 1:fdd22bb7aa52 1338 * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4.
emilmont 1:fdd22bb7aa52 1339 * @param[in] *S points to an instance of the Q31 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1340 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1341 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1342 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1343 * @return none.
emilmont 1:fdd22bb7aa52 1344 */
emilmont 1:fdd22bb7aa52 1345
emilmont 1:fdd22bb7aa52 1346 void arm_biquad_cascade_df1_fast_q31(
emilmont 1:fdd22bb7aa52 1347 const arm_biquad_casd_df1_inst_q31 * S,
emilmont 1:fdd22bb7aa52 1348 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 1349 q31_t * pDst,
emilmont 1:fdd22bb7aa52 1350 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1351
emilmont 1:fdd22bb7aa52 1352 /**
emilmont 1:fdd22bb7aa52 1353 * @brief Initialization function for the Q31 Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1354 * @param[in,out] *S points to an instance of the Q31 Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1355 * @param[in] numStages number of 2nd order stages in the filter.
emilmont 1:fdd22bb7aa52 1356 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1357 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1358 * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format
emilmont 1:fdd22bb7aa52 1359 * @return none
emilmont 1:fdd22bb7aa52 1360 */
emilmont 1:fdd22bb7aa52 1361
emilmont 1:fdd22bb7aa52 1362 void arm_biquad_cascade_df1_init_q31(
emilmont 1:fdd22bb7aa52 1363 arm_biquad_casd_df1_inst_q31 * S,
emilmont 1:fdd22bb7aa52 1364 uint8_t numStages,
emilmont 1:fdd22bb7aa52 1365 q31_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1366 q31_t * pState,
emilmont 1:fdd22bb7aa52 1367 int8_t postShift);
emilmont 1:fdd22bb7aa52 1368
emilmont 1:fdd22bb7aa52 1369 /**
emilmont 1:fdd22bb7aa52 1370 * @brief Processing function for the floating-point Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1371 * @param[in] *S points to an instance of the floating-point Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1372 * @param[in] *pSrc points to the block of input data.
emilmont 1:fdd22bb7aa52 1373 * @param[out] *pDst points to the block of output data.
emilmont 1:fdd22bb7aa52 1374 * @param[in] blockSize number of samples to process.
emilmont 1:fdd22bb7aa52 1375 * @return none.
emilmont 1:fdd22bb7aa52 1376 */
emilmont 1:fdd22bb7aa52 1377
emilmont 1:fdd22bb7aa52 1378 void arm_biquad_cascade_df1_f32(
emilmont 1:fdd22bb7aa52 1379 const arm_biquad_casd_df1_inst_f32 * S,
emilmont 1:fdd22bb7aa52 1380 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 1381 float32_t * pDst,
emilmont 1:fdd22bb7aa52 1382 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1383
emilmont 1:fdd22bb7aa52 1384 /**
emilmont 1:fdd22bb7aa52 1385 * @brief Initialization function for the floating-point Biquad cascade filter.
emilmont 1:fdd22bb7aa52 1386 * @param[in,out] *S points to an instance of the floating-point Biquad cascade structure.
emilmont 1:fdd22bb7aa52 1387 * @param[in] numStages number of 2nd order stages in the filter.
emilmont 1:fdd22bb7aa52 1388 * @param[in] *pCoeffs points to the filter coefficients.
emilmont 1:fdd22bb7aa52 1389 * @param[in] *pState points to the state buffer.
emilmont 1:fdd22bb7aa52 1390 * @return none
emilmont 1:fdd22bb7aa52 1391 */
emilmont 1:fdd22bb7aa52 1392
emilmont 1:fdd22bb7aa52 1393 void arm_biquad_cascade_df1_init_f32(
emilmont 1:fdd22bb7aa52 1394 arm_biquad_casd_df1_inst_f32 * S,
emilmont 1:fdd22bb7aa52 1395 uint8_t numStages,
emilmont 1:fdd22bb7aa52 1396 float32_t * pCoeffs,
emilmont 1:fdd22bb7aa52 1397 float32_t * pState);
emilmont 1:fdd22bb7aa52 1398
emilmont 1:fdd22bb7aa52 1399
emilmont 1:fdd22bb7aa52 1400 /**
emilmont 1:fdd22bb7aa52 1401 * @brief Instance structure for the floating-point matrix structure.
emilmont 1:fdd22bb7aa52 1402 */
emilmont 1:fdd22bb7aa52 1403
emilmont 1:fdd22bb7aa52 1404 typedef struct
emilmont 1:fdd22bb7aa52 1405 {
emilmont 1:fdd22bb7aa52 1406 uint16_t numRows; /**< number of rows of the matrix. */
emilmont 1:fdd22bb7aa52 1407 uint16_t numCols; /**< number of columns of the matrix. */
emilmont 1:fdd22bb7aa52 1408 float32_t *pData; /**< points to the data of the matrix. */
emilmont 1:fdd22bb7aa52 1409 } arm_matrix_instance_f32;
emilmont 1:fdd22bb7aa52 1410
emilmont 1:fdd22bb7aa52 1411 /**
emilmont 1:fdd22bb7aa52 1412 * @brief Instance structure for the Q15 matrix structure.
emilmont 1:fdd22bb7aa52 1413 */
emilmont 1:fdd22bb7aa52 1414
emilmont 1:fdd22bb7aa52 1415 typedef struct
emilmont 1:fdd22bb7aa52 1416 {
emilmont 1:fdd22bb7aa52 1417 uint16_t numRows; /**< number of rows of the matrix. */
emilmont 1:fdd22bb7aa52 1418 uint16_t numCols; /**< number of columns of the matrix. */
emilmont 1:fdd22bb7aa52 1419 q15_t *pData; /**< points to the data of the matrix. */
emilmont 1:fdd22bb7aa52 1420
emilmont 1:fdd22bb7aa52 1421 } arm_matrix_instance_q15;
emilmont 1:fdd22bb7aa52 1422
emilmont 1:fdd22bb7aa52 1423 /**
emilmont 1:fdd22bb7aa52 1424 * @brief Instance structure for the Q31 matrix structure.
emilmont 1:fdd22bb7aa52 1425 */
emilmont 1:fdd22bb7aa52 1426
emilmont 1:fdd22bb7aa52 1427 typedef struct
emilmont 1:fdd22bb7aa52 1428 {
emilmont 1:fdd22bb7aa52 1429 uint16_t numRows; /**< number of rows of the matrix. */
emilmont 1:fdd22bb7aa52 1430 uint16_t numCols; /**< number of columns of the matrix. */
emilmont 1:fdd22bb7aa52 1431 q31_t *pData; /**< points to the data of the matrix. */
emilmont 1:fdd22bb7aa52 1432
emilmont 1:fdd22bb7aa52 1433 } arm_matrix_instance_q31;
emilmont 1:fdd22bb7aa52 1434
emilmont 1:fdd22bb7aa52 1435
emilmont 1:fdd22bb7aa52 1436
emilmont 1:fdd22bb7aa52 1437 /**
emilmont 1:fdd22bb7aa52 1438 * @brief Floating-point matrix addition.
emilmont 1:fdd22bb7aa52 1439 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1440 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1441 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1442 * @return The function returns either
emilmont 1:fdd22bb7aa52 1443 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1444 */
emilmont 1:fdd22bb7aa52 1445
emilmont 1:fdd22bb7aa52 1446 arm_status arm_mat_add_f32(
emilmont 1:fdd22bb7aa52 1447 const arm_matrix_instance_f32 * pSrcA,
emilmont 1:fdd22bb7aa52 1448 const arm_matrix_instance_f32 * pSrcB,
emilmont 1:fdd22bb7aa52 1449 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1450
emilmont 1:fdd22bb7aa52 1451 /**
emilmont 1:fdd22bb7aa52 1452 * @brief Q15 matrix addition.
emilmont 1:fdd22bb7aa52 1453 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1454 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1455 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1456 * @return The function returns either
emilmont 1:fdd22bb7aa52 1457 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1458 */
emilmont 1:fdd22bb7aa52 1459
emilmont 1:fdd22bb7aa52 1460 arm_status arm_mat_add_q15(
emilmont 1:fdd22bb7aa52 1461 const arm_matrix_instance_q15 * pSrcA,
emilmont 1:fdd22bb7aa52 1462 const arm_matrix_instance_q15 * pSrcB,
emilmont 1:fdd22bb7aa52 1463 arm_matrix_instance_q15 * pDst);
emilmont 1:fdd22bb7aa52 1464
emilmont 1:fdd22bb7aa52 1465 /**
emilmont 1:fdd22bb7aa52 1466 * @brief Q31 matrix addition.
emilmont 1:fdd22bb7aa52 1467 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1468 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1469 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1470 * @return The function returns either
emilmont 1:fdd22bb7aa52 1471 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1472 */
emilmont 1:fdd22bb7aa52 1473
emilmont 1:fdd22bb7aa52 1474 arm_status arm_mat_add_q31(
emilmont 1:fdd22bb7aa52 1475 const arm_matrix_instance_q31 * pSrcA,
emilmont 1:fdd22bb7aa52 1476 const arm_matrix_instance_q31 * pSrcB,
emilmont 1:fdd22bb7aa52 1477 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1478
emilmont 1:fdd22bb7aa52 1479
emilmont 1:fdd22bb7aa52 1480 /**
emilmont 1:fdd22bb7aa52 1481 * @brief Floating-point matrix transpose.
emilmont 1:fdd22bb7aa52 1482 * @param[in] *pSrc points to the input matrix
emilmont 1:fdd22bb7aa52 1483 * @param[out] *pDst points to the output matrix
emilmont 2:da51fb522205 1484 * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
emilmont 1:fdd22bb7aa52 1485 * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1486 */
emilmont 1:fdd22bb7aa52 1487
emilmont 1:fdd22bb7aa52 1488 arm_status arm_mat_trans_f32(
emilmont 1:fdd22bb7aa52 1489 const arm_matrix_instance_f32 * pSrc,
emilmont 1:fdd22bb7aa52 1490 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1491
emilmont 1:fdd22bb7aa52 1492
emilmont 1:fdd22bb7aa52 1493 /**
emilmont 1:fdd22bb7aa52 1494 * @brief Q15 matrix transpose.
emilmont 1:fdd22bb7aa52 1495 * @param[in] *pSrc points to the input matrix
emilmont 1:fdd22bb7aa52 1496 * @param[out] *pDst points to the output matrix
emilmont 2:da51fb522205 1497 * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
emilmont 1:fdd22bb7aa52 1498 * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1499 */
emilmont 1:fdd22bb7aa52 1500
emilmont 1:fdd22bb7aa52 1501 arm_status arm_mat_trans_q15(
emilmont 1:fdd22bb7aa52 1502 const arm_matrix_instance_q15 * pSrc,
emilmont 1:fdd22bb7aa52 1503 arm_matrix_instance_q15 * pDst);
emilmont 1:fdd22bb7aa52 1504
emilmont 1:fdd22bb7aa52 1505 /**
emilmont 1:fdd22bb7aa52 1506 * @brief Q31 matrix transpose.
emilmont 1:fdd22bb7aa52 1507 * @param[in] *pSrc points to the input matrix
emilmont 1:fdd22bb7aa52 1508 * @param[out] *pDst points to the output matrix
emilmont 2:da51fb522205 1509 * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code>
emilmont 1:fdd22bb7aa52 1510 * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1511 */
emilmont 1:fdd22bb7aa52 1512
emilmont 1:fdd22bb7aa52 1513 arm_status arm_mat_trans_q31(
emilmont 1:fdd22bb7aa52 1514 const arm_matrix_instance_q31 * pSrc,
emilmont 1:fdd22bb7aa52 1515 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1516
emilmont 1:fdd22bb7aa52 1517
emilmont 1:fdd22bb7aa52 1518 /**
emilmont 1:fdd22bb7aa52 1519 * @brief Floating-point matrix multiplication
emilmont 1:fdd22bb7aa52 1520 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1521 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1522 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1523 * @return The function returns either
emilmont 1:fdd22bb7aa52 1524 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1525 */
emilmont 1:fdd22bb7aa52 1526
emilmont 1:fdd22bb7aa52 1527 arm_status arm_mat_mult_f32(
emilmont 1:fdd22bb7aa52 1528 const arm_matrix_instance_f32 * pSrcA,
emilmont 1:fdd22bb7aa52 1529 const arm_matrix_instance_f32 * pSrcB,
emilmont 1:fdd22bb7aa52 1530 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1531
emilmont 1:fdd22bb7aa52 1532 /**
emilmont 1:fdd22bb7aa52 1533 * @brief Q15 matrix multiplication
emilmont 1:fdd22bb7aa52 1534 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1535 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1536 * @param[out] *pDst points to output matrix structure
mbed_official 3:7a284390b0ce 1537 * @param[in] *pState points to the array for storing intermediate results
emilmont 1:fdd22bb7aa52 1538 * @return The function returns either
emilmont 1:fdd22bb7aa52 1539 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1540 */
emilmont 1:fdd22bb7aa52 1541
emilmont 1:fdd22bb7aa52 1542 arm_status arm_mat_mult_q15(
emilmont 1:fdd22bb7aa52 1543 const arm_matrix_instance_q15 * pSrcA,
emilmont 1:fdd22bb7aa52 1544 const arm_matrix_instance_q15 * pSrcB,
emilmont 1:fdd22bb7aa52 1545 arm_matrix_instance_q15 * pDst,
emilmont 1:fdd22bb7aa52 1546 q15_t * pState);
emilmont 1:fdd22bb7aa52 1547
emilmont 1:fdd22bb7aa52 1548 /**
emilmont 1:fdd22bb7aa52 1549 * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 1550 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1551 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1552 * @param[out] *pDst points to output matrix structure
mbed_official 3:7a284390b0ce 1553 * @param[in] *pState points to the array for storing intermediate results
emilmont 1:fdd22bb7aa52 1554 * @return The function returns either
emilmont 1:fdd22bb7aa52 1555 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1556 */
emilmont 1:fdd22bb7aa52 1557
emilmont 1:fdd22bb7aa52 1558 arm_status arm_mat_mult_fast_q15(
emilmont 1:fdd22bb7aa52 1559 const arm_matrix_instance_q15 * pSrcA,
emilmont 1:fdd22bb7aa52 1560 const arm_matrix_instance_q15 * pSrcB,
emilmont 1:fdd22bb7aa52 1561 arm_matrix_instance_q15 * pDst,
emilmont 1:fdd22bb7aa52 1562 q15_t * pState);
emilmont 1:fdd22bb7aa52 1563
emilmont 1:fdd22bb7aa52 1564 /**
emilmont 1:fdd22bb7aa52 1565 * @brief Q31 matrix multiplication
emilmont 1:fdd22bb7aa52 1566 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1567 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1568 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1569 * @return The function returns either
emilmont 1:fdd22bb7aa52 1570 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1571 */
emilmont 1:fdd22bb7aa52 1572
emilmont 1:fdd22bb7aa52 1573 arm_status arm_mat_mult_q31(
emilmont 1:fdd22bb7aa52 1574 const arm_matrix_instance_q31 * pSrcA,
emilmont 1:fdd22bb7aa52 1575 const arm_matrix_instance_q31 * pSrcB,
emilmont 1:fdd22bb7aa52 1576 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1577
emilmont 1:fdd22bb7aa52 1578 /**
emilmont 1:fdd22bb7aa52 1579 * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 1580 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1581 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1582 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1583 * @return The function returns either
emilmont 1:fdd22bb7aa52 1584 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1585 */
emilmont 1:fdd22bb7aa52 1586
emilmont 1:fdd22bb7aa52 1587 arm_status arm_mat_mult_fast_q31(
emilmont 1:fdd22bb7aa52 1588 const arm_matrix_instance_q31 * pSrcA,
emilmont 1:fdd22bb7aa52 1589 const arm_matrix_instance_q31 * pSrcB,
emilmont 1:fdd22bb7aa52 1590 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1591
emilmont 1:fdd22bb7aa52 1592
emilmont 1:fdd22bb7aa52 1593 /**
emilmont 1:fdd22bb7aa52 1594 * @brief Floating-point matrix subtraction
emilmont 1:fdd22bb7aa52 1595 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1596 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1597 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1598 * @return The function returns either
emilmont 1:fdd22bb7aa52 1599 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1600 */
emilmont 1:fdd22bb7aa52 1601
emilmont 1:fdd22bb7aa52 1602 arm_status arm_mat_sub_f32(
emilmont 1:fdd22bb7aa52 1603 const arm_matrix_instance_f32 * pSrcA,
emilmont 1:fdd22bb7aa52 1604 const arm_matrix_instance_f32 * pSrcB,
emilmont 1:fdd22bb7aa52 1605 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1606
emilmont 1:fdd22bb7aa52 1607 /**
emilmont 1:fdd22bb7aa52 1608 * @brief Q15 matrix subtraction
emilmont 1:fdd22bb7aa52 1609 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1610 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1611 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1612 * @return The function returns either
emilmont 1:fdd22bb7aa52 1613 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1614 */
emilmont 1:fdd22bb7aa52 1615
emilmont 1:fdd22bb7aa52 1616 arm_status arm_mat_sub_q15(
emilmont 1:fdd22bb7aa52 1617 const arm_matrix_instance_q15 * pSrcA,
emilmont 1:fdd22bb7aa52 1618 const arm_matrix_instance_q15 * pSrcB,
emilmont 1:fdd22bb7aa52 1619 arm_matrix_instance_q15 * pDst);
emilmont 1:fdd22bb7aa52 1620
emilmont 1:fdd22bb7aa52 1621 /**
emilmont 1:fdd22bb7aa52 1622 * @brief Q31 matrix subtraction
emilmont 1:fdd22bb7aa52 1623 * @param[in] *pSrcA points to the first input matrix structure
emilmont 1:fdd22bb7aa52 1624 * @param[in] *pSrcB points to the second input matrix structure
emilmont 1:fdd22bb7aa52 1625 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1626 * @return The function returns either
emilmont 1:fdd22bb7aa52 1627 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1628 */
emilmont 1:fdd22bb7aa52 1629
emilmont 1:fdd22bb7aa52 1630 arm_status arm_mat_sub_q31(
emilmont 1:fdd22bb7aa52 1631 const arm_matrix_instance_q31 * pSrcA,
emilmont 1:fdd22bb7aa52 1632 const arm_matrix_instance_q31 * pSrcB,
emilmont 1:fdd22bb7aa52 1633 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1634
emilmont 1:fdd22bb7aa52 1635 /**
emilmont 1:fdd22bb7aa52 1636 * @brief Floating-point matrix scaling.
emilmont 1:fdd22bb7aa52 1637 * @param[in] *pSrc points to the input matrix
emilmont 1:fdd22bb7aa52 1638 * @param[in] scale scale factor
emilmont 1:fdd22bb7aa52 1639 * @param[out] *pDst points to the output matrix
emilmont 1:fdd22bb7aa52 1640 * @return The function returns either
emilmont 1:fdd22bb7aa52 1641 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1642 */
emilmont 1:fdd22bb7aa52 1643
emilmont 1:fdd22bb7aa52 1644 arm_status arm_mat_scale_f32(
emilmont 1:fdd22bb7aa52 1645 const arm_matrix_instance_f32 * pSrc,
emilmont 1:fdd22bb7aa52 1646 float32_t scale,
emilmont 1:fdd22bb7aa52 1647 arm_matrix_instance_f32 * pDst);
emilmont 1:fdd22bb7aa52 1648
emilmont 1:fdd22bb7aa52 1649 /**
emilmont 1:fdd22bb7aa52 1650 * @brief Q15 matrix scaling.
emilmont 1:fdd22bb7aa52 1651 * @param[in] *pSrc points to input matrix
emilmont 1:fdd22bb7aa52 1652 * @param[in] scaleFract fractional portion of the scale factor
emilmont 1:fdd22bb7aa52 1653 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 1654 * @param[out] *pDst points to output matrix
emilmont 1:fdd22bb7aa52 1655 * @return The function returns either
emilmont 1:fdd22bb7aa52 1656 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1657 */
emilmont 1:fdd22bb7aa52 1658
emilmont 1:fdd22bb7aa52 1659 arm_status arm_mat_scale_q15(
emilmont 1:fdd22bb7aa52 1660 const arm_matrix_instance_q15 * pSrc,
emilmont 1:fdd22bb7aa52 1661 q15_t scaleFract,
emilmont 1:fdd22bb7aa52 1662 int32_t shift,
emilmont 1:fdd22bb7aa52 1663 arm_matrix_instance_q15 * pDst);
emilmont 1:fdd22bb7aa52 1664
emilmont 1:fdd22bb7aa52 1665 /**
emilmont 1:fdd22bb7aa52 1666 * @brief Q31 matrix scaling.
emilmont 1:fdd22bb7aa52 1667 * @param[in] *pSrc points to input matrix
emilmont 1:fdd22bb7aa52 1668 * @param[in] scaleFract fractional portion of the scale factor
emilmont 1:fdd22bb7aa52 1669 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 1670 * @param[out] *pDst points to output matrix structure
emilmont 1:fdd22bb7aa52 1671 * @return The function returns either
emilmont 1:fdd22bb7aa52 1672 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.
emilmont 1:fdd22bb7aa52 1673 */
emilmont 1:fdd22bb7aa52 1674
emilmont 1:fdd22bb7aa52 1675 arm_status arm_mat_scale_q31(
emilmont 1:fdd22bb7aa52 1676 const arm_matrix_instance_q31 * pSrc,
emilmont 1:fdd22bb7aa52 1677 q31_t scaleFract,
emilmont 1:fdd22bb7aa52 1678 int32_t shift,
emilmont 1:fdd22bb7aa52 1679 arm_matrix_instance_q31 * pDst);
emilmont 1:fdd22bb7aa52 1680
emilmont 1:fdd22bb7aa52 1681
emilmont 1:fdd22bb7aa52 1682 /**
emilmont 1:fdd22bb7aa52 1683 * @brief Q31 matrix initialization.
emilmont 1:fdd22bb7aa52 1684 * @param[in,out] *S points to an instance of the floating-point matrix structure.
emilmont 1:fdd22bb7aa52 1685 * @param[in] nRows number of rows in the matrix.
emilmont 1:fdd22bb7aa52 1686 * @param[in] nColumns number of columns in the matrix.
emilmont 2:da51fb522205 1687 * @param[in] *pData points to the matrix data array.
emilmont 1:fdd22bb7aa52 1688 * @return none
emilmont 1:fdd22bb7aa52 1689 */
emilmont 1:fdd22bb7aa52 1690
emilmont 1:fdd22bb7aa52 1691 void arm_mat_init_q31(
emilmont 1:fdd22bb7aa52 1692 arm_matrix_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1693 uint16_t nRows,
emilmont 1:fdd22bb7aa52 1694 uint16_t nColumns,
emilmont 1:fdd22bb7aa52 1695 q31_t * pData);
emilmont 1:fdd22bb7aa52 1696
emilmont 1:fdd22bb7aa52 1697 /**
emilmont 1:fdd22bb7aa52 1698 * @brief Q15 matrix initialization.
emilmont 1:fdd22bb7aa52 1699 * @param[in,out] *S points to an instance of the floating-point matrix structure.
emilmont 1:fdd22bb7aa52 1700 * @param[in] nRows number of rows in the matrix.
emilmont 1:fdd22bb7aa52 1701 * @param[in] nColumns number of columns in the matrix.
emilmont 2:da51fb522205 1702 * @param[in] *pData points to the matrix data array.
emilmont 1:fdd22bb7aa52 1703 * @return none
emilmont 1:fdd22bb7aa52 1704 */
emilmont 1:fdd22bb7aa52 1705
emilmont 1:fdd22bb7aa52 1706 void arm_mat_init_q15(
emilmont 1:fdd22bb7aa52 1707 arm_matrix_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1708 uint16_t nRows,
emilmont 1:fdd22bb7aa52 1709 uint16_t nColumns,
emilmont 1:fdd22bb7aa52 1710 q15_t * pData);
emilmont 1:fdd22bb7aa52 1711
emilmont 1:fdd22bb7aa52 1712 /**
emilmont 1:fdd22bb7aa52 1713 * @brief Floating-point matrix initialization.
emilmont 1:fdd22bb7aa52 1714 * @param[in,out] *S points to an instance of the floating-point matrix structure.
emilmont 1:fdd22bb7aa52 1715 * @param[in] nRows number of rows in the matrix.
emilmont 1:fdd22bb7aa52 1716 * @param[in] nColumns number of columns in the matrix.
emilmont 2:da51fb522205 1717 * @param[in] *pData points to the matrix data array.
emilmont 1:fdd22bb7aa52 1718 * @return none
emilmont 1:fdd22bb7aa52 1719 */
emilmont 1:fdd22bb7aa52 1720
emilmont 1:fdd22bb7aa52 1721 void arm_mat_init_f32(
emilmont 1:fdd22bb7aa52 1722 arm_matrix_instance_f32 * S,
emilmont 1:fdd22bb7aa52 1723 uint16_t nRows,
emilmont 1:fdd22bb7aa52 1724 uint16_t nColumns,
emilmont 1:fdd22bb7aa52 1725 float32_t * pData);
emilmont 1:fdd22bb7aa52 1726
emilmont 1:fdd22bb7aa52 1727
emilmont 1:fdd22bb7aa52 1728
emilmont 1:fdd22bb7aa52 1729 /**
emilmont 1:fdd22bb7aa52 1730 * @brief Instance structure for the Q15 PID Control.
emilmont 1:fdd22bb7aa52 1731 */
emilmont 1:fdd22bb7aa52 1732 typedef struct
emilmont 1:fdd22bb7aa52 1733 {
emilmont 1:fdd22bb7aa52 1734 q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
mbed_official 3:7a284390b0ce 1735 #ifdef ARM_MATH_CM0_FAMILY
emilmont 1:fdd22bb7aa52 1736 q15_t A1;
emilmont 1:fdd22bb7aa52 1737 q15_t A2;
emilmont 1:fdd22bb7aa52 1738 #else
emilmont 1:fdd22bb7aa52 1739 q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/
emilmont 1:fdd22bb7aa52 1740 #endif
emilmont 1:fdd22bb7aa52 1741 q15_t state[3]; /**< The state array of length 3. */
emilmont 1:fdd22bb7aa52 1742 q15_t Kp; /**< The proportional gain. */
emilmont 1:fdd22bb7aa52 1743 q15_t Ki; /**< The integral gain. */
emilmont 1:fdd22bb7aa52 1744 q15_t Kd; /**< The derivative gain. */
emilmont 1:fdd22bb7aa52 1745 } arm_pid_instance_q15;
emilmont 1:fdd22bb7aa52 1746
emilmont 1:fdd22bb7aa52 1747 /**
emilmont 1:fdd22bb7aa52 1748 * @brief Instance structure for the Q31 PID Control.
emilmont 1:fdd22bb7aa52 1749 */
emilmont 1:fdd22bb7aa52 1750 typedef struct
emilmont 1:fdd22bb7aa52 1751 {
emilmont 1:fdd22bb7aa52 1752 q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
emilmont 1:fdd22bb7aa52 1753 q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */
emilmont 1:fdd22bb7aa52 1754 q31_t A2; /**< The derived gain, A2 = Kd . */
emilmont 1:fdd22bb7aa52 1755 q31_t state[3]; /**< The state array of length 3. */
emilmont 1:fdd22bb7aa52 1756 q31_t Kp; /**< The proportional gain. */
emilmont 1:fdd22bb7aa52 1757 q31_t Ki; /**< The integral gain. */
emilmont 1:fdd22bb7aa52 1758 q31_t Kd; /**< The derivative gain. */
emilmont 1:fdd22bb7aa52 1759
emilmont 1:fdd22bb7aa52 1760 } arm_pid_instance_q31;
emilmont 1:fdd22bb7aa52 1761
emilmont 1:fdd22bb7aa52 1762 /**
emilmont 1:fdd22bb7aa52 1763 * @brief Instance structure for the floating-point PID Control.
emilmont 1:fdd22bb7aa52 1764 */
emilmont 1:fdd22bb7aa52 1765 typedef struct
emilmont 1:fdd22bb7aa52 1766 {
emilmont 1:fdd22bb7aa52 1767 float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */
emilmont 1:fdd22bb7aa52 1768 float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */
emilmont 1:fdd22bb7aa52 1769 float32_t A2; /**< The derived gain, A2 = Kd . */
emilmont 1:fdd22bb7aa52 1770 float32_t state[3]; /**< The state array of length 3. */
emilmont 1:fdd22bb7aa52 1771 float32_t Kp; /**< The proportional gain. */
emilmont 1:fdd22bb7aa52 1772 float32_t Ki; /**< The integral gain. */
emilmont 1:fdd22bb7aa52 1773 float32_t Kd; /**< The derivative gain. */
emilmont 1:fdd22bb7aa52 1774 } arm_pid_instance_f32;
emilmont 1:fdd22bb7aa52 1775
emilmont 1:fdd22bb7aa52 1776
emilmont 1:fdd22bb7aa52 1777
emilmont 1:fdd22bb7aa52 1778 /**
emilmont 1:fdd22bb7aa52 1779 * @brief Initialization function for the floating-point PID Control.
emilmont 1:fdd22bb7aa52 1780 * @param[in,out] *S points to an instance of the PID structure.
emilmont 1:fdd22bb7aa52 1781 * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
emilmont 1:fdd22bb7aa52 1782 * @return none.
emilmont 1:fdd22bb7aa52 1783 */
emilmont 1:fdd22bb7aa52 1784 void arm_pid_init_f32(
emilmont 1:fdd22bb7aa52 1785 arm_pid_instance_f32 * S,
emilmont 1:fdd22bb7aa52 1786 int32_t resetStateFlag);
emilmont 1:fdd22bb7aa52 1787
emilmont 1:fdd22bb7aa52 1788 /**
emilmont 1:fdd22bb7aa52 1789 * @brief Reset function for the floating-point PID Control.
emilmont 1:fdd22bb7aa52 1790 * @param[in,out] *S is an instance of the floating-point PID Control structure
emilmont 1:fdd22bb7aa52 1791 * @return none
emilmont 1:fdd22bb7aa52 1792 */
emilmont 1:fdd22bb7aa52 1793 void arm_pid_reset_f32(
emilmont 1:fdd22bb7aa52 1794 arm_pid_instance_f32 * S);
emilmont 1:fdd22bb7aa52 1795
emilmont 1:fdd22bb7aa52 1796
emilmont 1:fdd22bb7aa52 1797 /**
emilmont 1:fdd22bb7aa52 1798 * @brief Initialization function for the Q31 PID Control.
emilmont 1:fdd22bb7aa52 1799 * @param[in,out] *S points to an instance of the Q15 PID structure.
emilmont 1:fdd22bb7aa52 1800 * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
emilmont 1:fdd22bb7aa52 1801 * @return none.
emilmont 1:fdd22bb7aa52 1802 */
emilmont 1:fdd22bb7aa52 1803 void arm_pid_init_q31(
emilmont 1:fdd22bb7aa52 1804 arm_pid_instance_q31 * S,
emilmont 1:fdd22bb7aa52 1805 int32_t resetStateFlag);
emilmont 1:fdd22bb7aa52 1806
emilmont 1:fdd22bb7aa52 1807
emilmont 1:fdd22bb7aa52 1808 /**
emilmont 1:fdd22bb7aa52 1809 * @brief Reset function for the Q31 PID Control.
emilmont 1:fdd22bb7aa52 1810 * @param[in,out] *S points to an instance of the Q31 PID Control structure
emilmont 1:fdd22bb7aa52 1811 * @return none
emilmont 1:fdd22bb7aa52 1812 */
emilmont 1:fdd22bb7aa52 1813
emilmont 1:fdd22bb7aa52 1814 void arm_pid_reset_q31(
emilmont 1:fdd22bb7aa52 1815 arm_pid_instance_q31 * S);
emilmont 1:fdd22bb7aa52 1816
emilmont 1:fdd22bb7aa52 1817 /**
emilmont 1:fdd22bb7aa52 1818 * @brief Initialization function for the Q15 PID Control.
emilmont 1:fdd22bb7aa52 1819 * @param[in,out] *S points to an instance of the Q15 PID structure.
emilmont 1:fdd22bb7aa52 1820 * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state.
emilmont 1:fdd22bb7aa52 1821 * @return none.
emilmont 1:fdd22bb7aa52 1822 */
emilmont 1:fdd22bb7aa52 1823 void arm_pid_init_q15(
emilmont 1:fdd22bb7aa52 1824 arm_pid_instance_q15 * S,
emilmont 1:fdd22bb7aa52 1825 int32_t resetStateFlag);
emilmont 1:fdd22bb7aa52 1826
emilmont 1:fdd22bb7aa52 1827 /**
emilmont 1:fdd22bb7aa52 1828 * @brief Reset function for the Q15 PID Control.
emilmont 1:fdd22bb7aa52 1829 * @param[in,out] *S points to an instance of the q15 PID Control structure
emilmont 1:fdd22bb7aa52 1830 * @return none
emilmont 1:fdd22bb7aa52 1831 */
emilmont 1:fdd22bb7aa52 1832 void arm_pid_reset_q15(
emilmont 1:fdd22bb7aa52 1833 arm_pid_instance_q15 * S);
emilmont 1:fdd22bb7aa52 1834
emilmont 1:fdd22bb7aa52 1835
emilmont 1:fdd22bb7aa52 1836 /**
emilmont 1:fdd22bb7aa52 1837 * @brief Instance structure for the floating-point Linear Interpolate function.
emilmont 1:fdd22bb7aa52 1838 */
emilmont 1:fdd22bb7aa52 1839 typedef struct
emilmont 1:fdd22bb7aa52 1840 {
emilmont 1:fdd22bb7aa52 1841 uint32_t nValues; /**< nValues */
emilmont 1:fdd22bb7aa52 1842 float32_t x1; /**< x1 */
emilmont 1:fdd22bb7aa52 1843 float32_t xSpacing; /**< xSpacing */
emilmont 1:fdd22bb7aa52 1844 float32_t *pYData; /**< pointer to the table of Y values */
emilmont 1:fdd22bb7aa52 1845 } arm_linear_interp_instance_f32;
emilmont 1:fdd22bb7aa52 1846
emilmont 1:fdd22bb7aa52 1847 /**
emilmont 1:fdd22bb7aa52 1848 * @brief Instance structure for the floating-point bilinear interpolation function.
emilmont 1:fdd22bb7aa52 1849 */
emilmont 1:fdd22bb7aa52 1850
emilmont 1:fdd22bb7aa52 1851 typedef struct
emilmont 1:fdd22bb7aa52 1852 {
emilmont 1:fdd22bb7aa52 1853 uint16_t numRows; /**< number of rows in the data table. */
emilmont 1:fdd22bb7aa52 1854 uint16_t numCols; /**< number of columns in the data table. */
emilmont 1:fdd22bb7aa52 1855 float32_t *pData; /**< points to the data table. */
emilmont 1:fdd22bb7aa52 1856 } arm_bilinear_interp_instance_f32;
emilmont 1:fdd22bb7aa52 1857
emilmont 1:fdd22bb7aa52 1858 /**
emilmont 1:fdd22bb7aa52 1859 * @brief Instance structure for the Q31 bilinear interpolation function.
emilmont 1:fdd22bb7aa52 1860 */
emilmont 1:fdd22bb7aa52 1861
emilmont 1:fdd22bb7aa52 1862 typedef struct
emilmont 1:fdd22bb7aa52 1863 {
emilmont 1:fdd22bb7aa52 1864 uint16_t numRows; /**< number of rows in the data table. */
emilmont 1:fdd22bb7aa52 1865 uint16_t numCols; /**< number of columns in the data table. */
emilmont 1:fdd22bb7aa52 1866 q31_t *pData; /**< points to the data table. */
emilmont 1:fdd22bb7aa52 1867 } arm_bilinear_interp_instance_q31;
emilmont 1:fdd22bb7aa52 1868
emilmont 1:fdd22bb7aa52 1869 /**
emilmont 1:fdd22bb7aa52 1870 * @brief Instance structure for the Q15 bilinear interpolation function.
emilmont 1:fdd22bb7aa52 1871 */
emilmont 1:fdd22bb7aa52 1872
emilmont 1:fdd22bb7aa52 1873 typedef struct
emilmont 1:fdd22bb7aa52 1874 {
emilmont 1:fdd22bb7aa52 1875 uint16_t numRows; /**< number of rows in the data table. */
emilmont 1:fdd22bb7aa52 1876 uint16_t numCols; /**< number of columns in the data table. */
emilmont 1:fdd22bb7aa52 1877 q15_t *pData; /**< points to the data table. */
emilmont 1:fdd22bb7aa52 1878 } arm_bilinear_interp_instance_q15;
emilmont 1:fdd22bb7aa52 1879
emilmont 1:fdd22bb7aa52 1880 /**
emilmont 1:fdd22bb7aa52 1881 * @brief Instance structure for the Q15 bilinear interpolation function.
emilmont 1:fdd22bb7aa52 1882 */
emilmont 1:fdd22bb7aa52 1883
emilmont 1:fdd22bb7aa52 1884 typedef struct
emilmont 1:fdd22bb7aa52 1885 {
emilmont 1:fdd22bb7aa52 1886 uint16_t numRows; /**< number of rows in the data table. */
emilmont 1:fdd22bb7aa52 1887 uint16_t numCols; /**< number of columns in the data table. */
emilmont 1:fdd22bb7aa52 1888 q7_t *pData; /**< points to the data table. */
emilmont 1:fdd22bb7aa52 1889 } arm_bilinear_interp_instance_q7;
emilmont 1:fdd22bb7aa52 1890
emilmont 1:fdd22bb7aa52 1891
emilmont 1:fdd22bb7aa52 1892 /**
emilmont 1:fdd22bb7aa52 1893 * @brief Q7 vector multiplication.
emilmont 1:fdd22bb7aa52 1894 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 1895 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 1896 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 1897 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 1898 * @return none.
emilmont 1:fdd22bb7aa52 1899 */
emilmont 1:fdd22bb7aa52 1900
emilmont 1:fdd22bb7aa52 1901 void arm_mult_q7(
emilmont 1:fdd22bb7aa52 1902 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 1903 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 1904 q7_t * pDst,
emilmont 1:fdd22bb7aa52 1905 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1906
emilmont 1:fdd22bb7aa52 1907 /**
emilmont 1:fdd22bb7aa52 1908 * @brief Q15 vector multiplication.
emilmont 1:fdd22bb7aa52 1909 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 1910 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 1911 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 1912 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 1913 * @return none.
emilmont 1:fdd22bb7aa52 1914 */
emilmont 1:fdd22bb7aa52 1915
emilmont 1:fdd22bb7aa52 1916 void arm_mult_q15(
emilmont 1:fdd22bb7aa52 1917 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 1918 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 1919 q15_t * pDst,
emilmont 1:fdd22bb7aa52 1920 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1921
emilmont 1:fdd22bb7aa52 1922 /**
emilmont 1:fdd22bb7aa52 1923 * @brief Q31 vector multiplication.
emilmont 1:fdd22bb7aa52 1924 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 1925 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 1926 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 1927 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 1928 * @return none.
emilmont 1:fdd22bb7aa52 1929 */
emilmont 1:fdd22bb7aa52 1930
emilmont 1:fdd22bb7aa52 1931 void arm_mult_q31(
emilmont 1:fdd22bb7aa52 1932 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 1933 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 1934 q31_t * pDst,
emilmont 1:fdd22bb7aa52 1935 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1936
emilmont 1:fdd22bb7aa52 1937 /**
emilmont 1:fdd22bb7aa52 1938 * @brief Floating-point vector multiplication.
emilmont 1:fdd22bb7aa52 1939 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 1940 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 1941 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 1942 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 1943 * @return none.
emilmont 1:fdd22bb7aa52 1944 */
emilmont 1:fdd22bb7aa52 1945
emilmont 1:fdd22bb7aa52 1946 void arm_mult_f32(
emilmont 1:fdd22bb7aa52 1947 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 1948 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 1949 float32_t * pDst,
emilmont 1:fdd22bb7aa52 1950 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 1951
emilmont 1:fdd22bb7aa52 1952
mbed_official 3:7a284390b0ce 1953
mbed_official 3:7a284390b0ce 1954
emilmont 1:fdd22bb7aa52 1955
emilmont 1:fdd22bb7aa52 1956
emilmont 1:fdd22bb7aa52 1957 /**
emilmont 1:fdd22bb7aa52 1958 * @brief Instance structure for the Q15 CFFT/CIFFT function.
emilmont 1:fdd22bb7aa52 1959 */
emilmont 1:fdd22bb7aa52 1960
emilmont 1:fdd22bb7aa52 1961 typedef struct
emilmont 1:fdd22bb7aa52 1962 {
emilmont 1:fdd22bb7aa52 1963 uint16_t fftLen; /**< length of the FFT. */
emilmont 1:fdd22bb7aa52 1964 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
emilmont 1:fdd22bb7aa52 1965 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 1966 q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */
emilmont 1:fdd22bb7aa52 1967 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
emilmont 1:fdd22bb7aa52 1968 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 1969 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
emilmont 1:fdd22bb7aa52 1970 } arm_cfft_radix2_instance_q15;
emilmont 1:fdd22bb7aa52 1971
mbed_official 3:7a284390b0ce 1972 arm_status arm_cfft_radix2_init_q15(
mbed_official 3:7a284390b0ce 1973 arm_cfft_radix2_instance_q15 * S,
mbed_official 3:7a284390b0ce 1974 uint16_t fftLen,
mbed_official 3:7a284390b0ce 1975 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 1976 uint8_t bitReverseFlag);
mbed_official 3:7a284390b0ce 1977
mbed_official 3:7a284390b0ce 1978 void arm_cfft_radix2_q15(
mbed_official 3:7a284390b0ce 1979 const arm_cfft_radix2_instance_q15 * S,
mbed_official 3:7a284390b0ce 1980 q15_t * pSrc);
mbed_official 3:7a284390b0ce 1981
mbed_official 3:7a284390b0ce 1982
mbed_official 3:7a284390b0ce 1983
mbed_official 3:7a284390b0ce 1984 /**
mbed_official 3:7a284390b0ce 1985 * @brief Instance structure for the Q15 CFFT/CIFFT function.
mbed_official 3:7a284390b0ce 1986 */
mbed_official 3:7a284390b0ce 1987
mbed_official 3:7a284390b0ce 1988 typedef struct
mbed_official 3:7a284390b0ce 1989 {
mbed_official 3:7a284390b0ce 1990 uint16_t fftLen; /**< length of the FFT. */
mbed_official 3:7a284390b0ce 1991 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
mbed_official 3:7a284390b0ce 1992 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
mbed_official 3:7a284390b0ce 1993 q15_t *pTwiddle; /**< points to the twiddle factor table. */
mbed_official 3:7a284390b0ce 1994 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
mbed_official 3:7a284390b0ce 1995 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
mbed_official 3:7a284390b0ce 1996 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
mbed_official 3:7a284390b0ce 1997 } arm_cfft_radix4_instance_q15;
mbed_official 3:7a284390b0ce 1998
mbed_official 3:7a284390b0ce 1999 arm_status arm_cfft_radix4_init_q15(
mbed_official 3:7a284390b0ce 2000 arm_cfft_radix4_instance_q15 * S,
mbed_official 3:7a284390b0ce 2001 uint16_t fftLen,
mbed_official 3:7a284390b0ce 2002 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 2003 uint8_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2004
mbed_official 3:7a284390b0ce 2005 void arm_cfft_radix4_q15(
mbed_official 3:7a284390b0ce 2006 const arm_cfft_radix4_instance_q15 * S,
mbed_official 3:7a284390b0ce 2007 q15_t * pSrc);
mbed_official 3:7a284390b0ce 2008
emilmont 1:fdd22bb7aa52 2009 /**
emilmont 1:fdd22bb7aa52 2010 * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function.
emilmont 1:fdd22bb7aa52 2011 */
emilmont 1:fdd22bb7aa52 2012
emilmont 1:fdd22bb7aa52 2013 typedef struct
emilmont 1:fdd22bb7aa52 2014 {
emilmont 1:fdd22bb7aa52 2015 uint16_t fftLen; /**< length of the FFT. */
emilmont 1:fdd22bb7aa52 2016 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
emilmont 1:fdd22bb7aa52 2017 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2018 q31_t *pTwiddle; /**< points to the Twiddle factor table. */
emilmont 1:fdd22bb7aa52 2019 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
emilmont 1:fdd22bb7aa52 2020 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2021 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
emilmont 1:fdd22bb7aa52 2022 } arm_cfft_radix2_instance_q31;
emilmont 1:fdd22bb7aa52 2023
mbed_official 3:7a284390b0ce 2024 arm_status arm_cfft_radix2_init_q31(
mbed_official 3:7a284390b0ce 2025 arm_cfft_radix2_instance_q31 * S,
mbed_official 3:7a284390b0ce 2026 uint16_t fftLen,
mbed_official 3:7a284390b0ce 2027 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 2028 uint8_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2029
mbed_official 3:7a284390b0ce 2030 void arm_cfft_radix2_q31(
mbed_official 3:7a284390b0ce 2031 const arm_cfft_radix2_instance_q31 * S,
mbed_official 3:7a284390b0ce 2032 q31_t * pSrc);
mbed_official 3:7a284390b0ce 2033
mbed_official 3:7a284390b0ce 2034 /**
mbed_official 3:7a284390b0ce 2035 * @brief Instance structure for the Q31 CFFT/CIFFT function.
mbed_official 3:7a284390b0ce 2036 */
mbed_official 3:7a284390b0ce 2037
mbed_official 3:7a284390b0ce 2038 typedef struct
mbed_official 3:7a284390b0ce 2039 {
mbed_official 3:7a284390b0ce 2040 uint16_t fftLen; /**< length of the FFT. */
mbed_official 3:7a284390b0ce 2041 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
mbed_official 3:7a284390b0ce 2042 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
mbed_official 3:7a284390b0ce 2043 q31_t *pTwiddle; /**< points to the twiddle factor table. */
mbed_official 3:7a284390b0ce 2044 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
mbed_official 3:7a284390b0ce 2045 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
mbed_official 3:7a284390b0ce 2046 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
mbed_official 3:7a284390b0ce 2047 } arm_cfft_radix4_instance_q31;
mbed_official 3:7a284390b0ce 2048
mbed_official 3:7a284390b0ce 2049
mbed_official 3:7a284390b0ce 2050 void arm_cfft_radix4_q31(
mbed_official 3:7a284390b0ce 2051 const arm_cfft_radix4_instance_q31 * S,
mbed_official 3:7a284390b0ce 2052 q31_t * pSrc);
mbed_official 3:7a284390b0ce 2053
mbed_official 3:7a284390b0ce 2054 arm_status arm_cfft_radix4_init_q31(
mbed_official 3:7a284390b0ce 2055 arm_cfft_radix4_instance_q31 * S,
mbed_official 3:7a284390b0ce 2056 uint16_t fftLen,
mbed_official 3:7a284390b0ce 2057 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 2058 uint8_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2059
emilmont 1:fdd22bb7aa52 2060 /**
emilmont 1:fdd22bb7aa52 2061 * @brief Instance structure for the floating-point CFFT/CIFFT function.
emilmont 1:fdd22bb7aa52 2062 */
emilmont 1:fdd22bb7aa52 2063
emilmont 1:fdd22bb7aa52 2064 typedef struct
emilmont 1:fdd22bb7aa52 2065 {
emilmont 1:fdd22bb7aa52 2066 uint16_t fftLen; /**< length of the FFT. */
emilmont 1:fdd22bb7aa52 2067 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
emilmont 1:fdd22bb7aa52 2068 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2069 float32_t *pTwiddle; /**< points to the Twiddle factor table. */
emilmont 1:fdd22bb7aa52 2070 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
emilmont 1:fdd22bb7aa52 2071 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2072 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
emilmont 1:fdd22bb7aa52 2073 float32_t onebyfftLen; /**< value of 1/fftLen. */
emilmont 1:fdd22bb7aa52 2074 } arm_cfft_radix2_instance_f32;
emilmont 1:fdd22bb7aa52 2075
mbed_official 3:7a284390b0ce 2076 /* Deprecated */
emilmont 1:fdd22bb7aa52 2077 arm_status arm_cfft_radix2_init_f32(
emilmont 1:fdd22bb7aa52 2078 arm_cfft_radix2_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2079 uint16_t fftLen,
emilmont 1:fdd22bb7aa52 2080 uint8_t ifftFlag,
emilmont 1:fdd22bb7aa52 2081 uint8_t bitReverseFlag);
emilmont 1:fdd22bb7aa52 2082
mbed_official 3:7a284390b0ce 2083 /* Deprecated */
mbed_official 3:7a284390b0ce 2084 void arm_cfft_radix2_f32(
mbed_official 3:7a284390b0ce 2085 const arm_cfft_radix2_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2086 float32_t * pSrc);
emilmont 1:fdd22bb7aa52 2087
emilmont 1:fdd22bb7aa52 2088 /**
mbed_official 3:7a284390b0ce 2089 * @brief Instance structure for the floating-point CFFT/CIFFT function.
mbed_official 3:7a284390b0ce 2090 */
mbed_official 3:7a284390b0ce 2091
mbed_official 3:7a284390b0ce 2092 typedef struct
mbed_official 3:7a284390b0ce 2093 {
mbed_official 3:7a284390b0ce 2094 uint16_t fftLen; /**< length of the FFT. */
mbed_official 3:7a284390b0ce 2095 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
mbed_official 3:7a284390b0ce 2096 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
mbed_official 3:7a284390b0ce 2097 float32_t *pTwiddle; /**< points to the Twiddle factor table. */
mbed_official 3:7a284390b0ce 2098 uint16_t *pBitRevTable; /**< points to the bit reversal table. */
mbed_official 3:7a284390b0ce 2099 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
mbed_official 3:7a284390b0ce 2100 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
mbed_official 3:7a284390b0ce 2101 float32_t onebyfftLen; /**< value of 1/fftLen. */
mbed_official 3:7a284390b0ce 2102 } arm_cfft_radix4_instance_f32;
mbed_official 3:7a284390b0ce 2103
mbed_official 3:7a284390b0ce 2104 /* Deprecated */
emilmont 1:fdd22bb7aa52 2105 arm_status arm_cfft_radix4_init_f32(
emilmont 1:fdd22bb7aa52 2106 arm_cfft_radix4_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2107 uint16_t fftLen,
emilmont 1:fdd22bb7aa52 2108 uint8_t ifftFlag,
emilmont 1:fdd22bb7aa52 2109 uint8_t bitReverseFlag);
emilmont 1:fdd22bb7aa52 2110
mbed_official 3:7a284390b0ce 2111 /* Deprecated */
mbed_official 3:7a284390b0ce 2112 void arm_cfft_radix4_f32(
mbed_official 3:7a284390b0ce 2113 const arm_cfft_radix4_instance_f32 * S,
mbed_official 3:7a284390b0ce 2114 float32_t * pSrc);
mbed_official 3:7a284390b0ce 2115
mbed_official 3:7a284390b0ce 2116 /**
mbed_official 3:7a284390b0ce 2117 * @brief Instance structure for the floating-point CFFT/CIFFT function.
mbed_official 3:7a284390b0ce 2118 */
mbed_official 3:7a284390b0ce 2119
mbed_official 3:7a284390b0ce 2120 typedef struct
mbed_official 3:7a284390b0ce 2121 {
mbed_official 3:7a284390b0ce 2122 uint16_t fftLen; /**< length of the FFT. */
mbed_official 3:7a284390b0ce 2123 const float32_t *pTwiddle; /**< points to the Twiddle factor table. */
mbed_official 3:7a284390b0ce 2124 const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
mbed_official 3:7a284390b0ce 2125 uint16_t bitRevLength; /**< bit reversal table length. */
mbed_official 3:7a284390b0ce 2126 } arm_cfft_instance_f32;
mbed_official 3:7a284390b0ce 2127
mbed_official 3:7a284390b0ce 2128 void arm_cfft_f32(
mbed_official 3:7a284390b0ce 2129 const arm_cfft_instance_f32 * S,
mbed_official 3:7a284390b0ce 2130 float32_t * p1,
mbed_official 3:7a284390b0ce 2131 uint8_t ifftFlag,
mbed_official 3:7a284390b0ce 2132 uint8_t bitReverseFlag);
emilmont 1:fdd22bb7aa52 2133
emilmont 1:fdd22bb7aa52 2134 /**
emilmont 1:fdd22bb7aa52 2135 * @brief Instance structure for the Q15 RFFT/RIFFT function.
emilmont 1:fdd22bb7aa52 2136 */
emilmont 1:fdd22bb7aa52 2137
emilmont 1:fdd22bb7aa52 2138 typedef struct
emilmont 1:fdd22bb7aa52 2139 {
emilmont 1:fdd22bb7aa52 2140 uint32_t fftLenReal; /**< length of the real FFT. */
emilmont 1:fdd22bb7aa52 2141 uint32_t fftLenBy2; /**< length of the complex FFT. */
emilmont 1:fdd22bb7aa52 2142 uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
emilmont 1:fdd22bb7aa52 2143 uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2144 uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2145 q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */
emilmont 1:fdd22bb7aa52 2146 q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */
emilmont 1:fdd22bb7aa52 2147 arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2148 } arm_rfft_instance_q15;
emilmont 1:fdd22bb7aa52 2149
mbed_official 3:7a284390b0ce 2150 arm_status arm_rfft_init_q15(
mbed_official 3:7a284390b0ce 2151 arm_rfft_instance_q15 * S,
mbed_official 3:7a284390b0ce 2152 arm_cfft_radix4_instance_q15 * S_CFFT,
mbed_official 3:7a284390b0ce 2153 uint32_t fftLenReal,
mbed_official 3:7a284390b0ce 2154 uint32_t ifftFlagR,
mbed_official 3:7a284390b0ce 2155 uint32_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2156
mbed_official 3:7a284390b0ce 2157 void arm_rfft_q15(
mbed_official 3:7a284390b0ce 2158 const arm_rfft_instance_q15 * S,
mbed_official 3:7a284390b0ce 2159 q15_t * pSrc,
mbed_official 3:7a284390b0ce 2160 q15_t * pDst);
mbed_official 3:7a284390b0ce 2161
emilmont 1:fdd22bb7aa52 2162 /**
emilmont 1:fdd22bb7aa52 2163 * @brief Instance structure for the Q31 RFFT/RIFFT function.
emilmont 1:fdd22bb7aa52 2164 */
emilmont 1:fdd22bb7aa52 2165
emilmont 1:fdd22bb7aa52 2166 typedef struct
emilmont 1:fdd22bb7aa52 2167 {
emilmont 1:fdd22bb7aa52 2168 uint32_t fftLenReal; /**< length of the real FFT. */
emilmont 1:fdd22bb7aa52 2169 uint32_t fftLenBy2; /**< length of the complex FFT. */
emilmont 1:fdd22bb7aa52 2170 uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
emilmont 1:fdd22bb7aa52 2171 uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2172 uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2173 q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */
emilmont 1:fdd22bb7aa52 2174 q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */
emilmont 1:fdd22bb7aa52 2175 arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2176 } arm_rfft_instance_q31;
emilmont 1:fdd22bb7aa52 2177
mbed_official 3:7a284390b0ce 2178 arm_status arm_rfft_init_q31(
mbed_official 3:7a284390b0ce 2179 arm_rfft_instance_q31 * S,
mbed_official 3:7a284390b0ce 2180 arm_cfft_radix4_instance_q31 * S_CFFT,
mbed_official 3:7a284390b0ce 2181 uint32_t fftLenReal,
mbed_official 3:7a284390b0ce 2182 uint32_t ifftFlagR,
mbed_official 3:7a284390b0ce 2183 uint32_t bitReverseFlag);
mbed_official 3:7a284390b0ce 2184
mbed_official 3:7a284390b0ce 2185 void arm_rfft_q31(
mbed_official 3:7a284390b0ce 2186 const arm_rfft_instance_q31 * S,
mbed_official 3:7a284390b0ce 2187 q31_t * pSrc,
mbed_official 3:7a284390b0ce 2188 q31_t * pDst);
mbed_official 3:7a284390b0ce 2189
emilmont 1:fdd22bb7aa52 2190 /**
emilmont 1:fdd22bb7aa52 2191 * @brief Instance structure for the floating-point RFFT/RIFFT function.
emilmont 1:fdd22bb7aa52 2192 */
emilmont 1:fdd22bb7aa52 2193
emilmont 1:fdd22bb7aa52 2194 typedef struct
emilmont 1:fdd22bb7aa52 2195 {
emilmont 1:fdd22bb7aa52 2196 uint32_t fftLenReal; /**< length of the real FFT. */
emilmont 1:fdd22bb7aa52 2197 uint16_t fftLenBy2; /**< length of the complex FFT. */
emilmont 1:fdd22bb7aa52 2198 uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
emilmont 1:fdd22bb7aa52 2199 uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
emilmont 1:fdd22bb7aa52 2200 uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
emilmont 1:fdd22bb7aa52 2201 float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */
emilmont 1:fdd22bb7aa52 2202 float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */
emilmont 1:fdd22bb7aa52 2203 arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2204 } arm_rfft_instance_f32;
emilmont 1:fdd22bb7aa52 2205
emilmont 1:fdd22bb7aa52 2206 arm_status arm_rfft_init_f32(
emilmont 1:fdd22bb7aa52 2207 arm_rfft_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2208 arm_cfft_radix4_instance_f32 * S_CFFT,
emilmont 1:fdd22bb7aa52 2209 uint32_t fftLenReal,
emilmont 1:fdd22bb7aa52 2210 uint32_t ifftFlagR,
emilmont 1:fdd22bb7aa52 2211 uint32_t bitReverseFlag);
emilmont 1:fdd22bb7aa52 2212
emilmont 1:fdd22bb7aa52 2213 void arm_rfft_f32(
emilmont 1:fdd22bb7aa52 2214 const arm_rfft_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2215 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2216 float32_t * pDst);
emilmont 1:fdd22bb7aa52 2217
emilmont 1:fdd22bb7aa52 2218 /**
mbed_official 3:7a284390b0ce 2219 * @brief Instance structure for the floating-point RFFT/RIFFT function.
mbed_official 3:7a284390b0ce 2220 */
mbed_official 3:7a284390b0ce 2221
mbed_official 3:7a284390b0ce 2222 typedef struct
mbed_official 3:7a284390b0ce 2223 {
mbed_official 3:7a284390b0ce 2224 arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */
mbed_official 3:7a284390b0ce 2225 uint16_t fftLenRFFT; /**< length of the real sequence */
mbed_official 3:7a284390b0ce 2226 float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */
mbed_official 3:7a284390b0ce 2227 } arm_rfft_fast_instance_f32 ;
mbed_official 3:7a284390b0ce 2228
mbed_official 3:7a284390b0ce 2229 arm_status arm_rfft_fast_init_f32 (
mbed_official 3:7a284390b0ce 2230 arm_rfft_fast_instance_f32 * S,
mbed_official 3:7a284390b0ce 2231 uint16_t fftLen);
mbed_official 3:7a284390b0ce 2232
mbed_official 3:7a284390b0ce 2233 void arm_rfft_fast_f32(
mbed_official 3:7a284390b0ce 2234 arm_rfft_fast_instance_f32 * S,
mbed_official 3:7a284390b0ce 2235 float32_t * p, float32_t * pOut,
mbed_official 3:7a284390b0ce 2236 uint8_t ifftFlag);
mbed_official 3:7a284390b0ce 2237
mbed_official 3:7a284390b0ce 2238 /**
emilmont 1:fdd22bb7aa52 2239 * @brief Instance structure for the floating-point DCT4/IDCT4 function.
emilmont 1:fdd22bb7aa52 2240 */
emilmont 1:fdd22bb7aa52 2241
emilmont 1:fdd22bb7aa52 2242 typedef struct
emilmont 1:fdd22bb7aa52 2243 {
emilmont 1:fdd22bb7aa52 2244 uint16_t N; /**< length of the DCT4. */
emilmont 1:fdd22bb7aa52 2245 uint16_t Nby2; /**< half of the length of the DCT4. */
emilmont 1:fdd22bb7aa52 2246 float32_t normalize; /**< normalizing factor. */
emilmont 1:fdd22bb7aa52 2247 float32_t *pTwiddle; /**< points to the twiddle factor table. */
emilmont 1:fdd22bb7aa52 2248 float32_t *pCosFactor; /**< points to the cosFactor table. */
emilmont 1:fdd22bb7aa52 2249 arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */
emilmont 1:fdd22bb7aa52 2250 arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2251 } arm_dct4_instance_f32;
emilmont 1:fdd22bb7aa52 2252
emilmont 1:fdd22bb7aa52 2253 /**
emilmont 1:fdd22bb7aa52 2254 * @brief Initialization function for the floating-point DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2255 * @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure.
emilmont 1:fdd22bb7aa52 2256 * @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure.
emilmont 1:fdd22bb7aa52 2257 * @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure.
emilmont 1:fdd22bb7aa52 2258 * @param[in] N length of the DCT4.
emilmont 1:fdd22bb7aa52 2259 * @param[in] Nby2 half of the length of the DCT4.
emilmont 1:fdd22bb7aa52 2260 * @param[in] normalize normalizing factor.
emilmont 2:da51fb522205 2261 * @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 2262 */
emilmont 1:fdd22bb7aa52 2263
emilmont 1:fdd22bb7aa52 2264 arm_status arm_dct4_init_f32(
emilmont 1:fdd22bb7aa52 2265 arm_dct4_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2266 arm_rfft_instance_f32 * S_RFFT,
emilmont 1:fdd22bb7aa52 2267 arm_cfft_radix4_instance_f32 * S_CFFT,
emilmont 1:fdd22bb7aa52 2268 uint16_t N,
emilmont 1:fdd22bb7aa52 2269 uint16_t Nby2,
emilmont 1:fdd22bb7aa52 2270 float32_t normalize);
emilmont 1:fdd22bb7aa52 2271
emilmont 1:fdd22bb7aa52 2272 /**
emilmont 1:fdd22bb7aa52 2273 * @brief Processing function for the floating-point DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2274 * @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure.
emilmont 1:fdd22bb7aa52 2275 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 2276 * @param[in,out] *pInlineBuffer points to the in-place input and output buffer.
emilmont 1:fdd22bb7aa52 2277 * @return none.
emilmont 1:fdd22bb7aa52 2278 */
emilmont 1:fdd22bb7aa52 2279
emilmont 1:fdd22bb7aa52 2280 void arm_dct4_f32(
emilmont 1:fdd22bb7aa52 2281 const arm_dct4_instance_f32 * S,
emilmont 1:fdd22bb7aa52 2282 float32_t * pState,
emilmont 1:fdd22bb7aa52 2283 float32_t * pInlineBuffer);
emilmont 1:fdd22bb7aa52 2284
emilmont 1:fdd22bb7aa52 2285 /**
emilmont 1:fdd22bb7aa52 2286 * @brief Instance structure for the Q31 DCT4/IDCT4 function.
emilmont 1:fdd22bb7aa52 2287 */
emilmont 1:fdd22bb7aa52 2288
emilmont 1:fdd22bb7aa52 2289 typedef struct
emilmont 1:fdd22bb7aa52 2290 {
emilmont 1:fdd22bb7aa52 2291 uint16_t N; /**< length of the DCT4. */
emilmont 1:fdd22bb7aa52 2292 uint16_t Nby2; /**< half of the length of the DCT4. */
emilmont 1:fdd22bb7aa52 2293 q31_t normalize; /**< normalizing factor. */
emilmont 1:fdd22bb7aa52 2294 q31_t *pTwiddle; /**< points to the twiddle factor table. */
emilmont 1:fdd22bb7aa52 2295 q31_t *pCosFactor; /**< points to the cosFactor table. */
emilmont 1:fdd22bb7aa52 2296 arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */
emilmont 1:fdd22bb7aa52 2297 arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2298 } arm_dct4_instance_q31;
emilmont 1:fdd22bb7aa52 2299
emilmont 1:fdd22bb7aa52 2300 /**
emilmont 1:fdd22bb7aa52 2301 * @brief Initialization function for the Q31 DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2302 * @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure.
emilmont 1:fdd22bb7aa52 2303 * @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure
emilmont 1:fdd22bb7aa52 2304 * @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure
emilmont 1:fdd22bb7aa52 2305 * @param[in] N length of the DCT4.
emilmont 1:fdd22bb7aa52 2306 * @param[in] Nby2 half of the length of the DCT4.
emilmont 1:fdd22bb7aa52 2307 * @param[in] normalize normalizing factor.
emilmont 2:da51fb522205 2308 * @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 2309 */
emilmont 1:fdd22bb7aa52 2310
emilmont 1:fdd22bb7aa52 2311 arm_status arm_dct4_init_q31(
emilmont 1:fdd22bb7aa52 2312 arm_dct4_instance_q31 * S,
emilmont 1:fdd22bb7aa52 2313 arm_rfft_instance_q31 * S_RFFT,
emilmont 1:fdd22bb7aa52 2314 arm_cfft_radix4_instance_q31 * S_CFFT,
emilmont 1:fdd22bb7aa52 2315 uint16_t N,
emilmont 1:fdd22bb7aa52 2316 uint16_t Nby2,
emilmont 1:fdd22bb7aa52 2317 q31_t normalize);
emilmont 1:fdd22bb7aa52 2318
emilmont 1:fdd22bb7aa52 2319 /**
emilmont 1:fdd22bb7aa52 2320 * @brief Processing function for the Q31 DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2321 * @param[in] *S points to an instance of the Q31 DCT4 structure.
emilmont 1:fdd22bb7aa52 2322 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 2323 * @param[in,out] *pInlineBuffer points to the in-place input and output buffer.
emilmont 1:fdd22bb7aa52 2324 * @return none.
emilmont 1:fdd22bb7aa52 2325 */
emilmont 1:fdd22bb7aa52 2326
emilmont 1:fdd22bb7aa52 2327 void arm_dct4_q31(
emilmont 1:fdd22bb7aa52 2328 const arm_dct4_instance_q31 * S,
emilmont 1:fdd22bb7aa52 2329 q31_t * pState,
emilmont 1:fdd22bb7aa52 2330 q31_t * pInlineBuffer);
emilmont 1:fdd22bb7aa52 2331
emilmont 1:fdd22bb7aa52 2332 /**
emilmont 1:fdd22bb7aa52 2333 * @brief Instance structure for the Q15 DCT4/IDCT4 function.
emilmont 1:fdd22bb7aa52 2334 */
emilmont 1:fdd22bb7aa52 2335
emilmont 1:fdd22bb7aa52 2336 typedef struct
emilmont 1:fdd22bb7aa52 2337 {
emilmont 1:fdd22bb7aa52 2338 uint16_t N; /**< length of the DCT4. */
emilmont 1:fdd22bb7aa52 2339 uint16_t Nby2; /**< half of the length of the DCT4. */
emilmont 1:fdd22bb7aa52 2340 q15_t normalize; /**< normalizing factor. */
emilmont 1:fdd22bb7aa52 2341 q15_t *pTwiddle; /**< points to the twiddle factor table. */
emilmont 1:fdd22bb7aa52 2342 q15_t *pCosFactor; /**< points to the cosFactor table. */
emilmont 1:fdd22bb7aa52 2343 arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */
emilmont 1:fdd22bb7aa52 2344 arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */
emilmont 1:fdd22bb7aa52 2345 } arm_dct4_instance_q15;
emilmont 1:fdd22bb7aa52 2346
emilmont 1:fdd22bb7aa52 2347 /**
emilmont 1:fdd22bb7aa52 2348 * @brief Initialization function for the Q15 DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2349 * @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure.
emilmont 1:fdd22bb7aa52 2350 * @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure.
emilmont 1:fdd22bb7aa52 2351 * @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure.
emilmont 1:fdd22bb7aa52 2352 * @param[in] N length of the DCT4.
emilmont 1:fdd22bb7aa52 2353 * @param[in] Nby2 half of the length of the DCT4.
emilmont 1:fdd22bb7aa52 2354 * @param[in] normalize normalizing factor.
emilmont 2:da51fb522205 2355 * @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 2356 */
emilmont 1:fdd22bb7aa52 2357
emilmont 1:fdd22bb7aa52 2358 arm_status arm_dct4_init_q15(
emilmont 1:fdd22bb7aa52 2359 arm_dct4_instance_q15 * S,
emilmont 1:fdd22bb7aa52 2360 arm_rfft_instance_q15 * S_RFFT,
emilmont 1:fdd22bb7aa52 2361 arm_cfft_radix4_instance_q15 * S_CFFT,
emilmont 1:fdd22bb7aa52 2362 uint16_t N,
emilmont 1:fdd22bb7aa52 2363 uint16_t Nby2,
emilmont 1:fdd22bb7aa52 2364 q15_t normalize);
emilmont 1:fdd22bb7aa52 2365
emilmont 1:fdd22bb7aa52 2366 /**
emilmont 1:fdd22bb7aa52 2367 * @brief Processing function for the Q15 DCT4/IDCT4.
emilmont 1:fdd22bb7aa52 2368 * @param[in] *S points to an instance of the Q15 DCT4 structure.
emilmont 1:fdd22bb7aa52 2369 * @param[in] *pState points to state buffer.
emilmont 1:fdd22bb7aa52 2370 * @param[in,out] *pInlineBuffer points to the in-place input and output buffer.
emilmont 1:fdd22bb7aa52 2371 * @return none.
emilmont 1:fdd22bb7aa52 2372 */
emilmont 1:fdd22bb7aa52 2373
emilmont 1:fdd22bb7aa52 2374 void arm_dct4_q15(
emilmont 1:fdd22bb7aa52 2375 const arm_dct4_instance_q15 * S,
emilmont 1:fdd22bb7aa52 2376 q15_t * pState,
emilmont 1:fdd22bb7aa52 2377 q15_t * pInlineBuffer);
emilmont 1:fdd22bb7aa52 2378
emilmont 1:fdd22bb7aa52 2379 /**
emilmont 1:fdd22bb7aa52 2380 * @brief Floating-point vector addition.
emilmont 1:fdd22bb7aa52 2381 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2382 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2383 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2384 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2385 * @return none.
emilmont 1:fdd22bb7aa52 2386 */
emilmont 1:fdd22bb7aa52 2387
emilmont 1:fdd22bb7aa52 2388 void arm_add_f32(
emilmont 1:fdd22bb7aa52 2389 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 2390 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 2391 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2392 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2393
emilmont 1:fdd22bb7aa52 2394 /**
emilmont 1:fdd22bb7aa52 2395 * @brief Q7 vector addition.
emilmont 1:fdd22bb7aa52 2396 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2397 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2398 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2399 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2400 * @return none.
emilmont 1:fdd22bb7aa52 2401 */
emilmont 1:fdd22bb7aa52 2402
emilmont 1:fdd22bb7aa52 2403 void arm_add_q7(
emilmont 1:fdd22bb7aa52 2404 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 2405 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 2406 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2407 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2408
emilmont 1:fdd22bb7aa52 2409 /**
emilmont 1:fdd22bb7aa52 2410 * @brief Q15 vector addition.
emilmont 1:fdd22bb7aa52 2411 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2412 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2413 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2414 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2415 * @return none.
emilmont 1:fdd22bb7aa52 2416 */
emilmont 1:fdd22bb7aa52 2417
emilmont 1:fdd22bb7aa52 2418 void arm_add_q15(
emilmont 1:fdd22bb7aa52 2419 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 2420 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 2421 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2422 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2423
emilmont 1:fdd22bb7aa52 2424 /**
emilmont 1:fdd22bb7aa52 2425 * @brief Q31 vector addition.
emilmont 1:fdd22bb7aa52 2426 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2427 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2428 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2429 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2430 * @return none.
emilmont 1:fdd22bb7aa52 2431 */
emilmont 1:fdd22bb7aa52 2432
emilmont 1:fdd22bb7aa52 2433 void arm_add_q31(
emilmont 1:fdd22bb7aa52 2434 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 2435 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 2436 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2437 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2438
emilmont 1:fdd22bb7aa52 2439 /**
emilmont 1:fdd22bb7aa52 2440 * @brief Floating-point vector subtraction.
emilmont 1:fdd22bb7aa52 2441 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2442 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2443 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2444 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2445 * @return none.
emilmont 1:fdd22bb7aa52 2446 */
emilmont 1:fdd22bb7aa52 2447
emilmont 1:fdd22bb7aa52 2448 void arm_sub_f32(
emilmont 1:fdd22bb7aa52 2449 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 2450 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 2451 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2452 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2453
emilmont 1:fdd22bb7aa52 2454 /**
emilmont 1:fdd22bb7aa52 2455 * @brief Q7 vector subtraction.
emilmont 1:fdd22bb7aa52 2456 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2457 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2458 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2459 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2460 * @return none.
emilmont 1:fdd22bb7aa52 2461 */
emilmont 1:fdd22bb7aa52 2462
emilmont 1:fdd22bb7aa52 2463 void arm_sub_q7(
emilmont 1:fdd22bb7aa52 2464 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 2465 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 2466 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2467 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2468
emilmont 1:fdd22bb7aa52 2469 /**
emilmont 1:fdd22bb7aa52 2470 * @brief Q15 vector subtraction.
emilmont 1:fdd22bb7aa52 2471 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2472 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2473 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2474 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2475 * @return none.
emilmont 1:fdd22bb7aa52 2476 */
emilmont 1:fdd22bb7aa52 2477
emilmont 1:fdd22bb7aa52 2478 void arm_sub_q15(
emilmont 1:fdd22bb7aa52 2479 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 2480 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 2481 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2482 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2483
emilmont 1:fdd22bb7aa52 2484 /**
emilmont 1:fdd22bb7aa52 2485 * @brief Q31 vector subtraction.
emilmont 1:fdd22bb7aa52 2486 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2487 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2488 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2489 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2490 * @return none.
emilmont 1:fdd22bb7aa52 2491 */
emilmont 1:fdd22bb7aa52 2492
emilmont 1:fdd22bb7aa52 2493 void arm_sub_q31(
emilmont 1:fdd22bb7aa52 2494 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 2495 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 2496 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2497 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2498
emilmont 1:fdd22bb7aa52 2499 /**
emilmont 1:fdd22bb7aa52 2500 * @brief Multiplies a floating-point vector by a scalar.
emilmont 1:fdd22bb7aa52 2501 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2502 * @param[in] scale scale factor to be applied
emilmont 1:fdd22bb7aa52 2503 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2504 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2505 * @return none.
emilmont 1:fdd22bb7aa52 2506 */
emilmont 1:fdd22bb7aa52 2507
emilmont 1:fdd22bb7aa52 2508 void arm_scale_f32(
emilmont 1:fdd22bb7aa52 2509 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2510 float32_t scale,
emilmont 1:fdd22bb7aa52 2511 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2512 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2513
emilmont 1:fdd22bb7aa52 2514 /**
emilmont 1:fdd22bb7aa52 2515 * @brief Multiplies a Q7 vector by a scalar.
emilmont 1:fdd22bb7aa52 2516 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2517 * @param[in] scaleFract fractional portion of the scale value
emilmont 1:fdd22bb7aa52 2518 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 2519 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2520 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2521 * @return none.
emilmont 1:fdd22bb7aa52 2522 */
emilmont 1:fdd22bb7aa52 2523
emilmont 1:fdd22bb7aa52 2524 void arm_scale_q7(
emilmont 1:fdd22bb7aa52 2525 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2526 q7_t scaleFract,
emilmont 1:fdd22bb7aa52 2527 int8_t shift,
emilmont 1:fdd22bb7aa52 2528 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2529 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2530
emilmont 1:fdd22bb7aa52 2531 /**
emilmont 1:fdd22bb7aa52 2532 * @brief Multiplies a Q15 vector by a scalar.
emilmont 1:fdd22bb7aa52 2533 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2534 * @param[in] scaleFract fractional portion of the scale value
emilmont 1:fdd22bb7aa52 2535 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 2536 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2537 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2538 * @return none.
emilmont 1:fdd22bb7aa52 2539 */
emilmont 1:fdd22bb7aa52 2540
emilmont 1:fdd22bb7aa52 2541 void arm_scale_q15(
emilmont 1:fdd22bb7aa52 2542 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2543 q15_t scaleFract,
emilmont 1:fdd22bb7aa52 2544 int8_t shift,
emilmont 1:fdd22bb7aa52 2545 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2546 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2547
emilmont 1:fdd22bb7aa52 2548 /**
emilmont 1:fdd22bb7aa52 2549 * @brief Multiplies a Q31 vector by a scalar.
emilmont 1:fdd22bb7aa52 2550 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2551 * @param[in] scaleFract fractional portion of the scale value
emilmont 1:fdd22bb7aa52 2552 * @param[in] shift number of bits to shift the result by
emilmont 1:fdd22bb7aa52 2553 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2554 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2555 * @return none.
emilmont 1:fdd22bb7aa52 2556 */
emilmont 1:fdd22bb7aa52 2557
emilmont 1:fdd22bb7aa52 2558 void arm_scale_q31(
emilmont 1:fdd22bb7aa52 2559 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2560 q31_t scaleFract,
emilmont 1:fdd22bb7aa52 2561 int8_t shift,
emilmont 1:fdd22bb7aa52 2562 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2563 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2564
emilmont 1:fdd22bb7aa52 2565 /**
emilmont 1:fdd22bb7aa52 2566 * @brief Q7 vector absolute value.
emilmont 1:fdd22bb7aa52 2567 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 2568 * @param[out] *pDst points to the output buffer
emilmont 1:fdd22bb7aa52 2569 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2570 * @return none.
emilmont 1:fdd22bb7aa52 2571 */
emilmont 1:fdd22bb7aa52 2572
emilmont 1:fdd22bb7aa52 2573 void arm_abs_q7(
emilmont 1:fdd22bb7aa52 2574 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2575 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2576 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2577
emilmont 1:fdd22bb7aa52 2578 /**
emilmont 1:fdd22bb7aa52 2579 * @brief Floating-point vector absolute value.
emilmont 1:fdd22bb7aa52 2580 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 2581 * @param[out] *pDst points to the output buffer
emilmont 1:fdd22bb7aa52 2582 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2583 * @return none.
emilmont 1:fdd22bb7aa52 2584 */
emilmont 1:fdd22bb7aa52 2585
emilmont 1:fdd22bb7aa52 2586 void arm_abs_f32(
emilmont 1:fdd22bb7aa52 2587 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2588 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2589 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2590
emilmont 1:fdd22bb7aa52 2591 /**
emilmont 1:fdd22bb7aa52 2592 * @brief Q15 vector absolute value.
emilmont 1:fdd22bb7aa52 2593 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 2594 * @param[out] *pDst points to the output buffer
emilmont 1:fdd22bb7aa52 2595 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2596 * @return none.
emilmont 1:fdd22bb7aa52 2597 */
emilmont 1:fdd22bb7aa52 2598
emilmont 1:fdd22bb7aa52 2599 void arm_abs_q15(
emilmont 1:fdd22bb7aa52 2600 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2601 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2602 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2603
emilmont 1:fdd22bb7aa52 2604 /**
emilmont 1:fdd22bb7aa52 2605 * @brief Q31 vector absolute value.
emilmont 1:fdd22bb7aa52 2606 * @param[in] *pSrc points to the input buffer
emilmont 1:fdd22bb7aa52 2607 * @param[out] *pDst points to the output buffer
emilmont 1:fdd22bb7aa52 2608 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2609 * @return none.
emilmont 1:fdd22bb7aa52 2610 */
emilmont 1:fdd22bb7aa52 2611
emilmont 1:fdd22bb7aa52 2612 void arm_abs_q31(
emilmont 1:fdd22bb7aa52 2613 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2614 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2615 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2616
emilmont 1:fdd22bb7aa52 2617 /**
emilmont 1:fdd22bb7aa52 2618 * @brief Dot product of floating-point vectors.
emilmont 1:fdd22bb7aa52 2619 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2620 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2621 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2622 * @param[out] *result output result returned here
emilmont 1:fdd22bb7aa52 2623 * @return none.
emilmont 1:fdd22bb7aa52 2624 */
emilmont 1:fdd22bb7aa52 2625
emilmont 1:fdd22bb7aa52 2626 void arm_dot_prod_f32(
emilmont 1:fdd22bb7aa52 2627 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 2628 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 2629 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 2630 float32_t * result);
emilmont 1:fdd22bb7aa52 2631
emilmont 1:fdd22bb7aa52 2632 /**
emilmont 1:fdd22bb7aa52 2633 * @brief Dot product of Q7 vectors.
emilmont 1:fdd22bb7aa52 2634 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2635 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2636 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2637 * @param[out] *result output result returned here
emilmont 1:fdd22bb7aa52 2638 * @return none.
emilmont 1:fdd22bb7aa52 2639 */
emilmont 1:fdd22bb7aa52 2640
emilmont 1:fdd22bb7aa52 2641 void arm_dot_prod_q7(
emilmont 1:fdd22bb7aa52 2642 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 2643 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 2644 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 2645 q31_t * result);
emilmont 1:fdd22bb7aa52 2646
emilmont 1:fdd22bb7aa52 2647 /**
emilmont 1:fdd22bb7aa52 2648 * @brief Dot product of Q15 vectors.
emilmont 1:fdd22bb7aa52 2649 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2650 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2651 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2652 * @param[out] *result output result returned here
emilmont 1:fdd22bb7aa52 2653 * @return none.
emilmont 1:fdd22bb7aa52 2654 */
emilmont 1:fdd22bb7aa52 2655
emilmont 1:fdd22bb7aa52 2656 void arm_dot_prod_q15(
emilmont 1:fdd22bb7aa52 2657 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 2658 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 2659 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 2660 q63_t * result);
emilmont 1:fdd22bb7aa52 2661
emilmont 1:fdd22bb7aa52 2662 /**
emilmont 1:fdd22bb7aa52 2663 * @brief Dot product of Q31 vectors.
emilmont 1:fdd22bb7aa52 2664 * @param[in] *pSrcA points to the first input vector
emilmont 1:fdd22bb7aa52 2665 * @param[in] *pSrcB points to the second input vector
emilmont 1:fdd22bb7aa52 2666 * @param[in] blockSize number of samples in each vector
emilmont 1:fdd22bb7aa52 2667 * @param[out] *result output result returned here
emilmont 1:fdd22bb7aa52 2668 * @return none.
emilmont 1:fdd22bb7aa52 2669 */
emilmont 1:fdd22bb7aa52 2670
emilmont 1:fdd22bb7aa52 2671 void arm_dot_prod_q31(
emilmont 1:fdd22bb7aa52 2672 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 2673 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 2674 uint32_t blockSize,
emilmont 1:fdd22bb7aa52 2675 q63_t * result);
emilmont 1:fdd22bb7aa52 2676
emilmont 1:fdd22bb7aa52 2677 /**
emilmont 1:fdd22bb7aa52 2678 * @brief Shifts the elements of a Q7 vector a specified number of bits.
emilmont 1:fdd22bb7aa52 2679 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2680 * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
emilmont 1:fdd22bb7aa52 2681 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2682 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2683 * @return none.
emilmont 1:fdd22bb7aa52 2684 */
emilmont 1:fdd22bb7aa52 2685
emilmont 1:fdd22bb7aa52 2686 void arm_shift_q7(
emilmont 1:fdd22bb7aa52 2687 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2688 int8_t shiftBits,
emilmont 1:fdd22bb7aa52 2689 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2690 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2691
emilmont 1:fdd22bb7aa52 2692 /**
emilmont 1:fdd22bb7aa52 2693 * @brief Shifts the elements of a Q15 vector a specified number of bits.
emilmont 1:fdd22bb7aa52 2694 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2695 * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
emilmont 1:fdd22bb7aa52 2696 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2697 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2698 * @return none.
emilmont 1:fdd22bb7aa52 2699 */
emilmont 1:fdd22bb7aa52 2700
emilmont 1:fdd22bb7aa52 2701 void arm_shift_q15(
emilmont 1:fdd22bb7aa52 2702 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2703 int8_t shiftBits,
emilmont 1:fdd22bb7aa52 2704 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2705 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2706
emilmont 1:fdd22bb7aa52 2707 /**
emilmont 1:fdd22bb7aa52 2708 * @brief Shifts the elements of a Q31 vector a specified number of bits.
emilmont 1:fdd22bb7aa52 2709 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2710 * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right.
emilmont 1:fdd22bb7aa52 2711 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2712 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2713 * @return none.
emilmont 1:fdd22bb7aa52 2714 */
emilmont 1:fdd22bb7aa52 2715
emilmont 1:fdd22bb7aa52 2716 void arm_shift_q31(
emilmont 1:fdd22bb7aa52 2717 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2718 int8_t shiftBits,
emilmont 1:fdd22bb7aa52 2719 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2720 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2721
emilmont 1:fdd22bb7aa52 2722 /**
emilmont 1:fdd22bb7aa52 2723 * @brief Adds a constant offset to a floating-point vector.
emilmont 1:fdd22bb7aa52 2724 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2725 * @param[in] offset is the offset to be added
emilmont 1:fdd22bb7aa52 2726 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2727 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2728 * @return none.
emilmont 1:fdd22bb7aa52 2729 */
emilmont 1:fdd22bb7aa52 2730
emilmont 1:fdd22bb7aa52 2731 void arm_offset_f32(
emilmont 1:fdd22bb7aa52 2732 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2733 float32_t offset,
emilmont 1:fdd22bb7aa52 2734 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2735 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2736
emilmont 1:fdd22bb7aa52 2737 /**
emilmont 1:fdd22bb7aa52 2738 * @brief Adds a constant offset to a Q7 vector.
emilmont 1:fdd22bb7aa52 2739 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2740 * @param[in] offset is the offset to be added
emilmont 1:fdd22bb7aa52 2741 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2742 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2743 * @return none.
emilmont 1:fdd22bb7aa52 2744 */
emilmont 1:fdd22bb7aa52 2745
emilmont 1:fdd22bb7aa52 2746 void arm_offset_q7(
emilmont 1:fdd22bb7aa52 2747 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2748 q7_t offset,
emilmont 1:fdd22bb7aa52 2749 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2750 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2751
emilmont 1:fdd22bb7aa52 2752 /**
emilmont 1:fdd22bb7aa52 2753 * @brief Adds a constant offset to a Q15 vector.
emilmont 1:fdd22bb7aa52 2754 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2755 * @param[in] offset is the offset to be added
emilmont 1:fdd22bb7aa52 2756 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2757 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2758 * @return none.
emilmont 1:fdd22bb7aa52 2759 */
emilmont 1:fdd22bb7aa52 2760
emilmont 1:fdd22bb7aa52 2761 void arm_offset_q15(
emilmont 1:fdd22bb7aa52 2762 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2763 q15_t offset,
emilmont 1:fdd22bb7aa52 2764 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2765 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2766
emilmont 1:fdd22bb7aa52 2767 /**
emilmont 1:fdd22bb7aa52 2768 * @brief Adds a constant offset to a Q31 vector.
emilmont 1:fdd22bb7aa52 2769 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2770 * @param[in] offset is the offset to be added
emilmont 1:fdd22bb7aa52 2771 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2772 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2773 * @return none.
emilmont 1:fdd22bb7aa52 2774 */
emilmont 1:fdd22bb7aa52 2775
emilmont 1:fdd22bb7aa52 2776 void arm_offset_q31(
emilmont 1:fdd22bb7aa52 2777 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2778 q31_t offset,
emilmont 1:fdd22bb7aa52 2779 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2780 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2781
emilmont 1:fdd22bb7aa52 2782 /**
emilmont 1:fdd22bb7aa52 2783 * @brief Negates the elements of a floating-point vector.
emilmont 1:fdd22bb7aa52 2784 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2785 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2786 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2787 * @return none.
emilmont 1:fdd22bb7aa52 2788 */
emilmont 1:fdd22bb7aa52 2789
emilmont 1:fdd22bb7aa52 2790 void arm_negate_f32(
emilmont 1:fdd22bb7aa52 2791 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2792 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2793 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2794
emilmont 1:fdd22bb7aa52 2795 /**
emilmont 1:fdd22bb7aa52 2796 * @brief Negates the elements of a Q7 vector.
emilmont 1:fdd22bb7aa52 2797 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2798 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2799 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2800 * @return none.
emilmont 1:fdd22bb7aa52 2801 */
emilmont 1:fdd22bb7aa52 2802
emilmont 1:fdd22bb7aa52 2803 void arm_negate_q7(
emilmont 1:fdd22bb7aa52 2804 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2805 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2806 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2807
emilmont 1:fdd22bb7aa52 2808 /**
emilmont 1:fdd22bb7aa52 2809 * @brief Negates the elements of a Q15 vector.
emilmont 1:fdd22bb7aa52 2810 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2811 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2812 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2813 * @return none.
emilmont 1:fdd22bb7aa52 2814 */
emilmont 1:fdd22bb7aa52 2815
emilmont 1:fdd22bb7aa52 2816 void arm_negate_q15(
emilmont 1:fdd22bb7aa52 2817 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2818 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2819 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2820
emilmont 1:fdd22bb7aa52 2821 /**
emilmont 1:fdd22bb7aa52 2822 * @brief Negates the elements of a Q31 vector.
emilmont 1:fdd22bb7aa52 2823 * @param[in] *pSrc points to the input vector
emilmont 1:fdd22bb7aa52 2824 * @param[out] *pDst points to the output vector
emilmont 1:fdd22bb7aa52 2825 * @param[in] blockSize number of samples in the vector
emilmont 1:fdd22bb7aa52 2826 * @return none.
emilmont 1:fdd22bb7aa52 2827 */
emilmont 1:fdd22bb7aa52 2828
emilmont 1:fdd22bb7aa52 2829 void arm_negate_q31(
emilmont 1:fdd22bb7aa52 2830 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2831 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2832 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2833 /**
mbed_official 3:7a284390b0ce 2834 * @brief Copies the elements of a floating-point vector.
emilmont 1:fdd22bb7aa52 2835 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 2836 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2837 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2838 * @return none.
emilmont 1:fdd22bb7aa52 2839 */
emilmont 1:fdd22bb7aa52 2840 void arm_copy_f32(
emilmont 1:fdd22bb7aa52 2841 float32_t * pSrc,
emilmont 1:fdd22bb7aa52 2842 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2843 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2844
emilmont 1:fdd22bb7aa52 2845 /**
mbed_official 3:7a284390b0ce 2846 * @brief Copies the elements of a Q7 vector.
emilmont 1:fdd22bb7aa52 2847 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 2848 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2849 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2850 * @return none.
emilmont 1:fdd22bb7aa52 2851 */
emilmont 1:fdd22bb7aa52 2852 void arm_copy_q7(
emilmont 1:fdd22bb7aa52 2853 q7_t * pSrc,
emilmont 1:fdd22bb7aa52 2854 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2855 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2856
emilmont 1:fdd22bb7aa52 2857 /**
mbed_official 3:7a284390b0ce 2858 * @brief Copies the elements of a Q15 vector.
emilmont 1:fdd22bb7aa52 2859 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 2860 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2861 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2862 * @return none.
emilmont 1:fdd22bb7aa52 2863 */
emilmont 1:fdd22bb7aa52 2864 void arm_copy_q15(
emilmont 1:fdd22bb7aa52 2865 q15_t * pSrc,
emilmont 1:fdd22bb7aa52 2866 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2867 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2868
emilmont 1:fdd22bb7aa52 2869 /**
mbed_official 3:7a284390b0ce 2870 * @brief Copies the elements of a Q31 vector.
emilmont 1:fdd22bb7aa52 2871 * @param[in] *pSrc input pointer
emilmont 1:fdd22bb7aa52 2872 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2873 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2874 * @return none.
emilmont 1:fdd22bb7aa52 2875 */
emilmont 1:fdd22bb7aa52 2876 void arm_copy_q31(
emilmont 1:fdd22bb7aa52 2877 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 2878 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2879 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2880 /**
mbed_official 3:7a284390b0ce 2881 * @brief Fills a constant value into a floating-point vector.
emilmont 1:fdd22bb7aa52 2882 * @param[in] value input value to be filled
emilmont 1:fdd22bb7aa52 2883 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2884 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2885 * @return none.
emilmont 1:fdd22bb7aa52 2886 */
emilmont 1:fdd22bb7aa52 2887 void arm_fill_f32(
emilmont 1:fdd22bb7aa52 2888 float32_t value,
emilmont 1:fdd22bb7aa52 2889 float32_t * pDst,
emilmont 1:fdd22bb7aa52 2890 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2891
emilmont 1:fdd22bb7aa52 2892 /**
mbed_official 3:7a284390b0ce 2893 * @brief Fills a constant value into a Q7 vector.
emilmont 1:fdd22bb7aa52 2894 * @param[in] value input value to be filled
emilmont 1:fdd22bb7aa52 2895 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2896 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2897 * @return none.
emilmont 1:fdd22bb7aa52 2898 */
emilmont 1:fdd22bb7aa52 2899 void arm_fill_q7(
emilmont 1:fdd22bb7aa52 2900 q7_t value,
emilmont 1:fdd22bb7aa52 2901 q7_t * pDst,
emilmont 1:fdd22bb7aa52 2902 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2903
emilmont 1:fdd22bb7aa52 2904 /**
mbed_official 3:7a284390b0ce 2905 * @brief Fills a constant value into a Q15 vector.
emilmont 1:fdd22bb7aa52 2906 * @param[in] value input value to be filled
emilmont 1:fdd22bb7aa52 2907 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2908 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2909 * @return none.
emilmont 1:fdd22bb7aa52 2910 */
emilmont 1:fdd22bb7aa52 2911 void arm_fill_q15(
emilmont 1:fdd22bb7aa52 2912 q15_t value,
emilmont 1:fdd22bb7aa52 2913 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2914 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2915
emilmont 1:fdd22bb7aa52 2916 /**
mbed_official 3:7a284390b0ce 2917 * @brief Fills a constant value into a Q31 vector.
emilmont 1:fdd22bb7aa52 2918 * @param[in] value input value to be filled
emilmont 1:fdd22bb7aa52 2919 * @param[out] *pDst output pointer
emilmont 1:fdd22bb7aa52 2920 * @param[in] blockSize number of samples to process
emilmont 1:fdd22bb7aa52 2921 * @return none.
emilmont 1:fdd22bb7aa52 2922 */
emilmont 1:fdd22bb7aa52 2923 void arm_fill_q31(
emilmont 1:fdd22bb7aa52 2924 q31_t value,
emilmont 1:fdd22bb7aa52 2925 q31_t * pDst,
emilmont 1:fdd22bb7aa52 2926 uint32_t blockSize);
emilmont 1:fdd22bb7aa52 2927
mbed_official 3:7a284390b0ce 2928 /**
mbed_official 3:7a284390b0ce 2929 * @brief Convolution of floating-point sequences.
mbed_official 3:7a284390b0ce 2930 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 2931 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 2932 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 2933 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 2934 * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 2935 * @return none.
emilmont 1:fdd22bb7aa52 2936 */
emilmont 1:fdd22bb7aa52 2937
emilmont 1:fdd22bb7aa52 2938 void arm_conv_f32(
emilmont 1:fdd22bb7aa52 2939 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 2940 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 2941 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 2942 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 2943 float32_t * pDst);
emilmont 1:fdd22bb7aa52 2944
mbed_official 3:7a284390b0ce 2945
mbed_official 3:7a284390b0ce 2946 /**
mbed_official 3:7a284390b0ce 2947 * @brief Convolution of Q15 sequences.
mbed_official 3:7a284390b0ce 2948 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 2949 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 2950 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 2951 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 2952 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 2953 * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 2954 * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 2955 * @return none.
emilmont 1:fdd22bb7aa52 2956 */
emilmont 1:fdd22bb7aa52 2957
emilmont 1:fdd22bb7aa52 2958
emilmont 1:fdd22bb7aa52 2959 void arm_conv_opt_q15(
emilmont 1:fdd22bb7aa52 2960 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 2961 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 2962 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 2963 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 2964 q15_t * pDst,
emilmont 1:fdd22bb7aa52 2965 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 2966 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 2967
emilmont 1:fdd22bb7aa52 2968
mbed_official 3:7a284390b0ce 2969 /**
mbed_official 3:7a284390b0ce 2970 * @brief Convolution of Q15 sequences.
mbed_official 3:7a284390b0ce 2971 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 2972 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 2973 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 2974 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 2975 * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 2976 * @return none.
emilmont 1:fdd22bb7aa52 2977 */
emilmont 1:fdd22bb7aa52 2978
emilmont 1:fdd22bb7aa52 2979 void arm_conv_q15(
emilmont 1:fdd22bb7aa52 2980 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 2981 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 2982 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 2983 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 2984 q15_t * pDst);
emilmont 1:fdd22bb7aa52 2985
emilmont 1:fdd22bb7aa52 2986 /**
emilmont 1:fdd22bb7aa52 2987 * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 2988 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 2989 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 2990 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 2991 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 2992 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
emilmont 1:fdd22bb7aa52 2993 * @return none.
emilmont 1:fdd22bb7aa52 2994 */
emilmont 1:fdd22bb7aa52 2995
emilmont 1:fdd22bb7aa52 2996 void arm_conv_fast_q15(
emilmont 2:da51fb522205 2997 q15_t * pSrcA,
emilmont 2:da51fb522205 2998 uint32_t srcALen,
emilmont 2:da51fb522205 2999 q15_t * pSrcB,
emilmont 2:da51fb522205 3000 uint32_t srcBLen,
emilmont 2:da51fb522205 3001 q15_t * pDst);
emilmont 1:fdd22bb7aa52 3002
emilmont 1:fdd22bb7aa52 3003 /**
emilmont 1:fdd22bb7aa52 3004 * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 3005 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3006 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3007 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3008 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3009 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 3010 * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
mbed_official 3:7a284390b0ce 3011 * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 3012 * @return none.
emilmont 1:fdd22bb7aa52 3013 */
emilmont 1:fdd22bb7aa52 3014
emilmont 1:fdd22bb7aa52 3015 void arm_conv_fast_opt_q15(
emilmont 1:fdd22bb7aa52 3016 q15_t * pSrcA,
emilmont 1:fdd22bb7aa52 3017 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3018 q15_t * pSrcB,
emilmont 1:fdd22bb7aa52 3019 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3020 q15_t * pDst,
emilmont 1:fdd22bb7aa52 3021 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 3022 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 3023
emilmont 1:fdd22bb7aa52 3024
emilmont 1:fdd22bb7aa52 3025
emilmont 1:fdd22bb7aa52 3026 /**
emilmont 1:fdd22bb7aa52 3027 * @brief Convolution of Q31 sequences.
emilmont 1:fdd22bb7aa52 3028 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3029 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3030 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3031 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3032 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
emilmont 1:fdd22bb7aa52 3033 * @return none.
emilmont 1:fdd22bb7aa52 3034 */
emilmont 1:fdd22bb7aa52 3035
emilmont 1:fdd22bb7aa52 3036 void arm_conv_q31(
emilmont 1:fdd22bb7aa52 3037 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 3038 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3039 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 3040 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3041 q31_t * pDst);
emilmont 1:fdd22bb7aa52 3042
emilmont 1:fdd22bb7aa52 3043 /**
emilmont 1:fdd22bb7aa52 3044 * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4
emilmont 1:fdd22bb7aa52 3045 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3046 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3047 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3048 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3049 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
emilmont 1:fdd22bb7aa52 3050 * @return none.
emilmont 1:fdd22bb7aa52 3051 */
emilmont 1:fdd22bb7aa52 3052
emilmont 1:fdd22bb7aa52 3053 void arm_conv_fast_q31(
emilmont 1:fdd22bb7aa52 3054 q31_t * pSrcA,
emilmont 1:fdd22bb7aa52 3055 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3056 q31_t * pSrcB,
emilmont 1:fdd22bb7aa52 3057 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3058 q31_t * pDst);
emilmont 1:fdd22bb7aa52 3059
emilmont 1:fdd22bb7aa52 3060
mbed_official 3:7a284390b0ce 3061 /**
mbed_official 3:7a284390b0ce 3062 * @brief Convolution of Q7 sequences.
mbed_official 3:7a284390b0ce 3063 * @param[in] *pSrcA points to the first input sequence.
mbed_official 3:7a284390b0ce 3064 * @param[in] srcALen length of the first input sequence.
mbed_official 3:7a284390b0ce 3065 * @param[in] *pSrcB points to the second input sequence.
mbed_official 3:7a284390b0ce 3066 * @param[in] srcBLen length of the second input sequence.
mbed_official 3:7a284390b0ce 3067 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
mbed_official 3:7a284390b0ce 3068 * @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 3069 * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
mbed_official 3:7a284390b0ce 3070 * @return none.
emilmont 1:fdd22bb7aa52 3071 */
emilmont 1:fdd22bb7aa52 3072
emilmont 1:fdd22bb7aa52 3073 void arm_conv_opt_q7(
emilmont 1:fdd22bb7aa52 3074 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 3075 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3076 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 3077 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3078 q7_t * pDst,
emilmont 1:fdd22bb7aa52 3079 q15_t * pScratch1,
emilmont 1:fdd22bb7aa52 3080 q15_t * pScratch2);
emilmont 1:fdd22bb7aa52 3081
emilmont 1:fdd22bb7aa52 3082
emilmont 1:fdd22bb7aa52 3083
emilmont 1:fdd22bb7aa52 3084 /**
emilmont 1:fdd22bb7aa52 3085 * @brief Convolution of Q7 sequences.
emilmont 1:fdd22bb7aa52 3086 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3087 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3088 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3089 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3090 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1.
emilmont 1:fdd22bb7aa52 3091 * @return none.
emilmont 1:fdd22bb7aa52 3092 */
emilmont 1:fdd22bb7aa52 3093
emilmont 1:fdd22bb7aa52 3094 void arm_conv_q7(
emilmont 1:fdd22bb7aa52 3095 q7_t * pSrcA,
emilmont 1:fdd22bb7aa52 3096 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3097 q7_t * pSrcB,
emilmont 1:fdd22bb7aa52 3098 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3099 q7_t * pDst);
emilmont 1:fdd22bb7aa52 3100
emilmont 1:fdd22bb7aa52 3101
emilmont 1:fdd22bb7aa52 3102 /**
emilmont 1:fdd22bb7aa52 3103 * @brief Partial convolution of floating-point sequences.
emilmont 1:fdd22bb7aa52 3104 * @param[in] *pSrcA points to the first input sequence.
emilmont 1:fdd22bb7aa52 3105 * @param[in] srcALen length of the first input sequence.
emilmont 1:fdd22bb7aa52 3106 * @param[in] *pSrcB points to the second input sequence.
emilmont 1:fdd22bb7aa52 3107 * @param[in] srcBLen length of the second input sequence.
emilmont 1:fdd22bb7aa52 3108 * @param[out] *pDst points to the block of output data
emilmont 1:fdd22bb7aa52 3109 * @param[in] firstIndex is the first output sample to start with.
emilmont 1:fdd22bb7aa52 3110 * @param[in] numPoints is the number of output points to be computed.
emilmont 1:fdd22bb7aa52 3111 * @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 3112 */
emilmont 1:fdd22bb7aa52 3113
emilmont 1:fdd22bb7aa52 3114 arm_status arm_conv_partial_f32(
emilmont 1:fdd22bb7aa52 3115 float32_t * pSrcA,
emilmont 1:fdd22bb7aa52 3116 uint32_t srcALen,
emilmont 1:fdd22bb7aa52 3117 float32_t * pSrcB,
emilmont 1:fdd22bb7aa52 3118 uint32_t srcBLen,
emilmont 1:fdd22bb7aa52 3119 float32_t * pDst,
emilmont 1:fdd22bb7aa52 3120 uint32_t firstIndex,
emilmont 1:fdd22bb7aa52 3121 uint32_t numPoints);
emilmont 1:fdd22bb7aa52 3122
mbed_official 3:7a284390b0ce 3123 /**
mbed_official 3:7a284390b0ce 3124 * @brief Partial convolution of Q15 sequences.
mbed_official <