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