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