This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
vipinranka
Date:
Wed Jan 11 11:41:30 2017 +0000
Revision:
12:9a20164dcc47
This is the final version MGAS Project for Renesas GR Peach Design Contest

Who changed what in which revision?

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