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