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:
emilmont
Date:
Wed Nov 28 12:30:09 2012 +0000
Revision:
1:fdd22bb7aa52
Child:
2:da51fb522205
DSP library code

Who changed what in which revision?

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