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