Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of TUKS-COURSE-TIMER by
arm_math.h
00001 /* ---------------------------------------------------------------------- 00002 * Copyright (C) 2010-2015 ARM Limited. All rights reserved. 00003 * 00004 * $Date: 19. March 2015 00005 * $Revision: V.1.4.5 00006 * 00007 * Project: CMSIS DSP Library 00008 * Title: arm_math.h 00009 * 00010 * Description: Public header file for CMSIS DSP Library 00011 * 00012 * Target Processor: Cortex-M7/Cortex-M4/Cortex-M3/Cortex-M0 00013 * 00014 * Redistribution and use in source and binary forms, with or without 00015 * modification, are permitted provided that the following conditions 00016 * are met: 00017 * - Redistributions of source code must retain the above copyright 00018 * notice, this list of conditions and the following disclaimer. 00019 * - Redistributions in binary form must reproduce the above copyright 00020 * notice, this list of conditions and the following disclaimer in 00021 * the documentation and/or other materials provided with the 00022 * distribution. 00023 * - Neither the name of ARM LIMITED nor the names of its contributors 00024 * may be used to endorse or promote products derived from this 00025 * software without specific prior written permission. 00026 * 00027 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00028 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00029 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 00030 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 00031 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 00032 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 00033 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 00034 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00035 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00036 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 00037 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00038 * POSSIBILITY OF SUCH DAMAGE. 00039 * -------------------------------------------------------------------- */ 00040 00041 /** 00042 \mainpage CMSIS DSP Software Library 00043 * 00044 * Introduction 00045 * ------------ 00046 * 00047 * This user manual describes the CMSIS DSP software library, 00048 * a suite of common signal processing functions for use on Cortex-M processor based devices. 00049 * 00050 * The library is divided into a number of functions each covering a specific category: 00051 * - Basic math functions 00052 * - Fast math functions 00053 * - Complex math functions 00054 * - Filters 00055 * - Matrix functions 00056 * - Transforms 00057 * - Motor control functions 00058 * - Statistical functions 00059 * - Support functions 00060 * - Interpolation functions 00061 * 00062 * The library has separate functions for operating on 8-bit integers, 16-bit integers, 00063 * 32-bit integer and 32-bit floating-point values. 00064 * 00065 * Using the Library 00066 * ------------ 00067 * 00068 * The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder. 00069 * - arm_cortexM7lfdp_math.lib (Little endian and Double Precision Floating Point Unit on Cortex-M7) 00070 * - arm_cortexM7bfdp_math.lib (Big endian and Double Precision Floating Point Unit on Cortex-M7) 00071 * - arm_cortexM7lfsp_math.lib (Little endian and Single Precision Floating Point Unit on Cortex-M7) 00072 * - arm_cortexM7bfsp_math.lib (Big endian and Single Precision Floating Point Unit on Cortex-M7) 00073 * - arm_cortexM7l_math.lib (Little endian on Cortex-M7) 00074 * - arm_cortexM7b_math.lib (Big endian on Cortex-M7) 00075 * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4) 00076 * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4) 00077 * - arm_cortexM4l_math.lib (Little endian on Cortex-M4) 00078 * - arm_cortexM4b_math.lib (Big endian on Cortex-M4) 00079 * - arm_cortexM3l_math.lib (Little endian on Cortex-M3) 00080 * - arm_cortexM3b_math.lib (Big endian on Cortex-M3) 00081 * - arm_cortexM0l_math.lib (Little endian on Cortex-M0 / CortexM0+) 00082 * - arm_cortexM0b_math.lib (Big endian on Cortex-M0 / CortexM0+) 00083 * 00084 * The library functions are declared in the public file <code>arm_math.h</code> which is placed in the <code>Include</code> folder. 00085 * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single 00086 * 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. 00087 * Define the appropriate pre processor MACRO ARM_MATH_CM7 or ARM_MATH_CM4 or ARM_MATH_CM3 or 00088 * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application. 00089 * 00090 * Examples 00091 * -------- 00092 * 00093 * The library ships with a number of examples which demonstrate how to use the library functions. 00094 * 00095 * Toolchain Support 00096 * ------------ 00097 * 00098 * The library has been developed and tested with MDK-ARM version 5.14.0.0 00099 * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. 00100 * 00101 * Building the Library 00102 * ------------ 00103 * 00104 * 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. 00105 * - arm_cortexM_math.uvprojx 00106 * 00107 * 00108 * 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. 00109 * 00110 * Pre-processor Macros 00111 * ------------ 00112 * 00113 * Each library project have differant pre-processor macros. 00114 * 00115 * - UNALIGNED_SUPPORT_DISABLE: 00116 * 00117 * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access 00118 * 00119 * - ARM_MATH_BIG_ENDIAN: 00120 * 00121 * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. 00122 * 00123 * - ARM_MATH_MATRIX_CHECK: 00124 * 00125 * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices 00126 * 00127 * - ARM_MATH_ROUNDING: 00128 * 00129 * Define macro ARM_MATH_ROUNDING for rounding on support functions 00130 * 00131 * - ARM_MATH_CMx: 00132 * 00133 * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target 00134 * and ARM_MATH_CM0 for building library on Cortex-M0 target, ARM_MATH_CM0PLUS for building library on Cortex-M0+ target, and 00135 * ARM_MATH_CM7 for building the library on cortex-M7. 00136 * 00137 * - __FPU_PRESENT: 00138 * 00139 * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries 00140 * 00141 * <hr> 00142 * CMSIS-DSP in ARM::CMSIS Pack 00143 * ----------------------------- 00144 * 00145 * The following files relevant to CMSIS-DSP are present in the <b>ARM::CMSIS</b> Pack directories: 00146 * |File/Folder |Content | 00147 * |------------------------------|------------------------------------------------------------------------| 00148 * |\b CMSIS\\Documentation\\DSP | This documentation | 00149 * |\b CMSIS\\DSP_Lib | Software license agreement (license.txt) | 00150 * |\b CMSIS\\DSP_Lib\\Examples | Example projects demonstrating the usage of the library functions | 00151 * |\b CMSIS\\DSP_Lib\\Source | Source files for rebuilding the library | 00152 * 00153 * <hr> 00154 * Revision History of CMSIS-DSP 00155 * ------------ 00156 * Please refer to \ref ChangeLog_pg. 00157 * 00158 * Copyright Notice 00159 * ------------ 00160 * 00161 * Copyright (C) 2010-2015 ARM Limited. All rights reserved. 00162 */ 00163 00164 00165 /** 00166 * @defgroup groupMath Basic Math Functions 00167 */ 00168 00169 /** 00170 * @defgroup groupFastMath Fast Math Functions 00171 * This set of functions provides a fast approximation to sine, cosine, and square root. 00172 * As compared to most of the other functions in the CMSIS math library, the fast math functions 00173 * operate on individual values and not arrays. 00174 * There are separate functions for Q15, Q31, and floating-point data. 00175 * 00176 */ 00177 00178 /** 00179 * @defgroup groupCmplxMath Complex Math Functions 00180 * This set of functions operates on complex data vectors. 00181 * The data in the complex arrays is stored in an interleaved fashion 00182 * (real, imag, real, imag, ...). 00183 * In the API functions, the number of samples in a complex array refers 00184 * to the number of complex values; the array contains twice this number of 00185 * real values. 00186 */ 00187 00188 /** 00189 * @defgroup groupFilters Filtering Functions 00190 */ 00191 00192 /** 00193 * @defgroup groupMatrix Matrix Functions 00194 * 00195 * This set of functions provides basic matrix math operations. 00196 * The functions operate on matrix data structures. For example, 00197 * the type 00198 * definition for the floating-point matrix structure is shown 00199 * below: 00200 * <pre> 00201 * typedef struct 00202 * { 00203 * uint16_t numRows; // number of rows of the matrix. 00204 * uint16_t numCols; // number of columns of the matrix. 00205 * float32_t *pData; // points to the data of the matrix. 00206 * } arm_matrix_instance_f32; 00207 * </pre> 00208 * There are similar definitions for Q15 and Q31 data types. 00209 * 00210 * The structure specifies the size of the matrix and then points to 00211 * an array of data. The array is of size <code>numRows X numCols</code> 00212 * and the values are arranged in row order. That is, the 00213 * matrix element (i, j) is stored at: 00214 * <pre> 00215 * pData[i*numCols + j] 00216 * </pre> 00217 * 00218 * \par Init Functions 00219 * There is an associated initialization function for each type of matrix 00220 * data structure. 00221 * The initialization function sets the values of the internal structure fields. 00222 * Refer to the function <code>arm_mat_init_f32()</code>, <code>arm_mat_init_q31()</code> 00223 * and <code>arm_mat_init_q15()</code> for floating-point, Q31 and Q15 types, respectively. 00224 * 00225 * \par 00226 * Use of the initialization function is optional. However, if initialization function is used 00227 * then the instance structure cannot be placed into a const data section. 00228 * To place the instance structure in a const data 00229 * section, manually initialize the data structure. For example: 00230 * <pre> 00231 * <code>arm_matrix_instance_f32 S = {nRows, nColumns, pData};</code> 00232 * <code>arm_matrix_instance_q31 S = {nRows, nColumns, pData};</code> 00233 * <code>arm_matrix_instance_q15 S = {nRows, nColumns, pData};</code> 00234 * </pre> 00235 * where <code>nRows</code> specifies the number of rows, <code>nColumns</code> 00236 * specifies the number of columns, and <code>pData</code> points to the 00237 * data array. 00238 * 00239 * \par Size Checking 00240 * By default all of the matrix functions perform size checking on the input and 00241 * output matrices. For example, the matrix addition function verifies that the 00242 * two input matrices and the output matrix all have the same number of rows and 00243 * columns. If the size check fails the functions return: 00244 * <pre> 00245 * ARM_MATH_SIZE_MISMATCH 00246 * </pre> 00247 * Otherwise the functions return 00248 * <pre> 00249 * ARM_MATH_SUCCESS 00250 * </pre> 00251 * There is some overhead associated with this matrix size checking. 00252 * The matrix size checking is enabled via the \#define 00253 * <pre> 00254 * ARM_MATH_MATRIX_CHECK 00255 * </pre> 00256 * within the library project settings. By default this macro is defined 00257 * and size checking is enabled. By changing the project settings and 00258 * undefining this macro size checking is eliminated and the functions 00259 * run a bit faster. With size checking disabled the functions always 00260 * return <code>ARM_MATH_SUCCESS</code>. 00261 */ 00262 00263 /** 00264 * @defgroup groupTransforms Transform Functions 00265 */ 00266 00267 /** 00268 * @defgroup groupController Controller Functions 00269 */ 00270 00271 /** 00272 * @defgroup groupStats Statistics Functions 00273 */ 00274 /** 00275 * @defgroup groupSupport Support Functions 00276 */ 00277 00278 /** 00279 * @defgroup groupInterpolation Interpolation Functions 00280 * These functions perform 1- and 2-dimensional interpolation of data. 00281 * Linear interpolation is used for 1-dimensional data and 00282 * bilinear interpolation is used for 2-dimensional data. 00283 */ 00284 00285 /** 00286 * @defgroup groupExamples Examples 00287 */ 00288 #ifndef _ARM_MATH_H 00289 #define _ARM_MATH_H 00290 00291 #define __CMSIS_GENERIC /* disable NVIC and Systick functions */ 00292 00293 #if defined(ARM_MATH_CM7) 00294 #include "core_cm7.h" 00295 #elif defined (ARM_MATH_CM4) 00296 #include "core_cm4.h" 00297 #elif defined (ARM_MATH_CM3) 00298 #include "core_cm3.h" 00299 #elif defined (ARM_MATH_CM0) 00300 #include "core_cm0.h" 00301 #define ARM_MATH_CM0_FAMILY 00302 #elif defined (ARM_MATH_CM0PLUS) 00303 #include "core_cm0plus.h" 00304 #define ARM_MATH_CM0_FAMILY 00305 #else 00306 #error "Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS or ARM_MATH_CM0" 00307 #endif 00308 00309 #undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ 00310 #include "string.h" 00311 #include "math.h" 00312 #ifdef __cplusplus 00313 extern "C" 00314 { 00315 #endif 00316 00317 00318 /** 00319 * @brief Macros required for reciprocal calculation in Normalized LMS 00320 */ 00321 00322 #define DELTA_Q31 (0x100) 00323 #define DELTA_Q15 0x5 00324 #define INDEX_MASK 0x0000003F 00325 #ifndef PI 00326 #define PI 3.14159265358979f 00327 #endif 00328 00329 /** 00330 * @brief Macros required for SINE and COSINE Fast math approximations 00331 */ 00332 00333 #define FAST_MATH_TABLE_SIZE 512 00334 #define FAST_MATH_Q31_SHIFT (32 - 10) 00335 #define FAST_MATH_Q15_SHIFT (16 - 10) 00336 #define CONTROLLER_Q31_SHIFT (32 - 9) 00337 #define TABLE_SIZE 256 00338 #define TABLE_SPACING_Q31 0x400000 00339 #define TABLE_SPACING_Q15 0x80 00340 00341 /** 00342 * @brief Macros required for SINE and COSINE Controller functions 00343 */ 00344 /* 1.31(q31) Fixed value of 2/360 */ 00345 /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ 00346 #define INPUT_SPACING 0xB60B61 00347 00348 /** 00349 * @brief Macro for Unaligned Support 00350 */ 00351 #ifndef UNALIGNED_SUPPORT_DISABLE 00352 #define ALIGN4 00353 #else 00354 #if defined (__GNUC__) 00355 #define ALIGN4 __attribute__((aligned(4))) 00356 #else 00357 #define ALIGN4 __align(4) 00358 #endif 00359 #endif /* #ifndef UNALIGNED_SUPPORT_DISABLE */ 00360 00361 /** 00362 * @brief Error status returned by some functions in the library. 00363 */ 00364 00365 typedef enum 00366 { 00367 ARM_MATH_SUCCESS = 0, /**< No error */ 00368 ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ 00369 ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ 00370 ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ 00371 ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ 00372 ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ 00373 ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ 00374 } arm_status; 00375 00376 /** 00377 * @brief 8-bit fractional data type in 1.7 format. 00378 */ 00379 typedef int8_t q7_t; 00380 00381 /** 00382 * @brief 16-bit fractional data type in 1.15 format. 00383 */ 00384 typedef int16_t q15_t; 00385 00386 /** 00387 * @brief 32-bit fractional data type in 1.31 format. 00388 */ 00389 typedef int32_t q31_t; 00390 00391 /** 00392 * @brief 64-bit fractional data type in 1.63 format. 00393 */ 00394 typedef int64_t q63_t; 00395 00396 /** 00397 * @brief 32-bit floating-point type definition. 00398 */ 00399 typedef float float32_t; 00400 00401 /** 00402 * @brief 64-bit floating-point type definition. 00403 */ 00404 typedef double float64_t; 00405 00406 /** 00407 * @brief definition to read/write two 16 bit values. 00408 */ 00409 #if defined __CC_ARM 00410 #define __SIMD32_TYPE int32_t __packed 00411 #define CMSIS_UNUSED __attribute__((unused)) 00412 #elif defined __ICCARM__ 00413 #define __SIMD32_TYPE int32_t __packed 00414 #define CMSIS_UNUSED 00415 #elif defined __GNUC__ 00416 #define __SIMD32_TYPE int32_t 00417 #define CMSIS_UNUSED __attribute__((unused)) 00418 #elif defined __CSMC__ /* Cosmic */ 00419 #define __SIMD32_TYPE int32_t 00420 #define CMSIS_UNUSED 00421 #elif defined __TASKING__ 00422 #define __SIMD32_TYPE __unaligned int32_t 00423 #define CMSIS_UNUSED 00424 #else 00425 #error Unknown compiler 00426 #endif 00427 00428 #define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) 00429 #define __SIMD32_CONST(addr) ((__SIMD32_TYPE *)(addr)) 00430 00431 #define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE *) (addr)) 00432 00433 #define __SIMD64(addr) (*(int64_t **) & (addr)) 00434 00435 #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) 00436 /** 00437 * @brief definition to pack two 16 bit values. 00438 */ 00439 #define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ 00440 (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) 00441 #define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ 00442 (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) 00443 00444 #endif 00445 00446 00447 /** 00448 * @brief definition to pack four 8 bit values. 00449 */ 00450 #ifndef ARM_MATH_BIG_ENDIAN 00451 00452 #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ 00453 (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ 00454 (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ 00455 (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) 00456 #else 00457 00458 #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ 00459 (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ 00460 (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ 00461 (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) 00462 00463 #endif 00464 00465 00466 /** 00467 * @brief Clips Q63 to Q31 values. 00468 */ 00469 static __INLINE q31_t clip_q63_to_q31( 00470 q63_t x) 00471 { 00472 return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? 00473 ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; 00474 } 00475 00476 /** 00477 * @brief Clips Q63 to Q15 values. 00478 */ 00479 static __INLINE q15_t clip_q63_to_q15( 00480 q63_t x) 00481 { 00482 return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? 00483 ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); 00484 } 00485 00486 /** 00487 * @brief Clips Q31 to Q7 values. 00488 */ 00489 static __INLINE q7_t clip_q31_to_q7( 00490 q31_t x) 00491 { 00492 return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? 00493 ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; 00494 } 00495 00496 /** 00497 * @brief Clips Q31 to Q15 values. 00498 */ 00499 static __INLINE q15_t clip_q31_to_q15( 00500 q31_t x) 00501 { 00502 return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? 00503 ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; 00504 } 00505 00506 /** 00507 * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. 00508 */ 00509 00510 static __INLINE q63_t mult32x64( 00511 q63_t x, 00512 q31_t y) 00513 { 00514 return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + 00515 (((q63_t) (x >> 32) * y))); 00516 } 00517 00518 00519 //#if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM ) 00520 //#define __CLZ __clz 00521 //#endif 00522 00523 //note: function can be removed when all toolchain support __CLZ for Cortex-M0 00524 #if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__)) ) 00525 00526 static __INLINE uint32_t __CLZ( 00527 q31_t data); 00528 00529 00530 static __INLINE uint32_t __CLZ( 00531 q31_t data) 00532 { 00533 uint32_t count = 0; 00534 uint32_t mask = 0x80000000; 00535 00536 while((data & mask) == 0) 00537 { 00538 count += 1u; 00539 mask = mask >> 1u; 00540 } 00541 00542 return (count); 00543 00544 } 00545 00546 #endif 00547 00548 /** 00549 * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. 00550 */ 00551 00552 static __INLINE uint32_t arm_recip_q31( 00553 q31_t in, 00554 q31_t * dst, 00555 q31_t * pRecipTable) 00556 { 00557 00558 uint32_t out, tempVal; 00559 uint32_t index, i; 00560 uint32_t signBits; 00561 00562 if(in > 0) 00563 { 00564 signBits = __CLZ(in) - 1; 00565 } 00566 else 00567 { 00568 signBits = __CLZ(-in) - 1; 00569 } 00570 00571 /* Convert input sample to 1.31 format */ 00572 in = in << signBits; 00573 00574 /* calculation of index for initial approximated Val */ 00575 index = (uint32_t) (in >> 24u); 00576 index = (index & INDEX_MASK); 00577 00578 /* 1.31 with exp 1 */ 00579 out = pRecipTable[index]; 00580 00581 /* calculation of reciprocal value */ 00582 /* running approximation for two iterations */ 00583 for (i = 0u; i < 2u; i++) 00584 { 00585 tempVal = (q31_t) (((q63_t) in * out) >> 31u); 00586 tempVal = 0x7FFFFFFF - tempVal; 00587 /* 1.31 with exp 1 */ 00588 //out = (q31_t) (((q63_t) out * tempVal) >> 30u); 00589 out = (q31_t) clip_q63_to_q31(((q63_t) out * tempVal) >> 30u); 00590 } 00591 00592 /* write output */ 00593 *dst = out; 00594 00595 /* return num of signbits of out = 1/in value */ 00596 return (signBits + 1u); 00597 00598 } 00599 00600 /** 00601 * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. 00602 */ 00603 static __INLINE uint32_t arm_recip_q15( 00604 q15_t in, 00605 q15_t * dst, 00606 q15_t * pRecipTable) 00607 { 00608 00609 uint32_t out = 0, tempVal = 0; 00610 uint32_t index = 0, i = 0; 00611 uint32_t signBits = 0; 00612 00613 if(in > 0) 00614 { 00615 signBits = __CLZ(in) - 17; 00616 } 00617 else 00618 { 00619 signBits = __CLZ(-in) - 17; 00620 } 00621 00622 /* Convert input sample to 1.15 format */ 00623 in = in << signBits; 00624 00625 /* calculation of index for initial approximated Val */ 00626 index = in >> 8; 00627 index = (index & INDEX_MASK); 00628 00629 /* 1.15 with exp 1 */ 00630 out = pRecipTable[index]; 00631 00632 /* calculation of reciprocal value */ 00633 /* running approximation for two iterations */ 00634 for (i = 0; i < 2; i++) 00635 { 00636 tempVal = (q15_t) (((q31_t) in * out) >> 15); 00637 tempVal = 0x7FFF - tempVal; 00638 /* 1.15 with exp 1 */ 00639 out = (q15_t) (((q31_t) out * tempVal) >> 14); 00640 } 00641 00642 /* write output */ 00643 *dst = out; 00644 00645 /* return num of signbits of out = 1/in value */ 00646 return (signBits + 1); 00647 00648 } 00649 00650 00651 /* 00652 * @brief C custom defined intrinisic function for only M0 processors 00653 */ 00654 #if defined(ARM_MATH_CM0_FAMILY) 00655 00656 static __INLINE q31_t __SSAT( 00657 q31_t x, 00658 uint32_t y) 00659 { 00660 int32_t posMax, negMin; 00661 uint32_t i; 00662 00663 posMax = 1; 00664 for (i = 0; i < (y - 1); i++) 00665 { 00666 posMax = posMax * 2; 00667 } 00668 00669 if(x > 0) 00670 { 00671 posMax = (posMax - 1); 00672 00673 if(x > posMax) 00674 { 00675 x = posMax; 00676 } 00677 } 00678 else 00679 { 00680 negMin = -posMax; 00681 00682 if(x < negMin) 00683 { 00684 x = negMin; 00685 } 00686 } 00687 return (x); 00688 00689 00690 } 00691 00692 #endif /* end of ARM_MATH_CM0_FAMILY */ 00693 00694 00695 00696 /* 00697 * @brief C custom defined intrinsic function for M3 and M0 processors 00698 */ 00699 #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) 00700 00701 /* 00702 * @brief C custom defined QADD8 for M3 and M0 processors 00703 */ 00704 static __INLINE q31_t __QADD8( 00705 q31_t x, 00706 q31_t y) 00707 { 00708 00709 q31_t sum; 00710 q7_t r, s, t, u; 00711 00712 r = (q7_t) x; 00713 s = (q7_t) y; 00714 00715 r = __SSAT((q31_t) (r + s), 8); 00716 s = __SSAT(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8); 00717 t = __SSAT(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); 00718 u = __SSAT(((q31_t) ((x >> 24) + (y >> 24))), 8); 00719 00720 sum = 00721 (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | 00722 (((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); 00723 00724 return sum; 00725 00726 } 00727 00728 /* 00729 * @brief C custom defined QSUB8 for M3 and M0 processors 00730 */ 00731 static __INLINE q31_t __QSUB8( 00732 q31_t x, 00733 q31_t y) 00734 { 00735 00736 q31_t sum; 00737 q31_t r, s, t, u; 00738 00739 r = (q7_t) x; 00740 s = (q7_t) y; 00741 00742 r = __SSAT((r - s), 8); 00743 s = __SSAT(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; 00744 t = __SSAT(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; 00745 u = __SSAT(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; 00746 00747 sum = 00748 (u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 00749 0x000000FF); 00750 00751 return sum; 00752 } 00753 00754 /* 00755 * @brief C custom defined QADD16 for M3 and M0 processors 00756 */ 00757 00758 /* 00759 * @brief C custom defined QADD16 for M3 and M0 processors 00760 */ 00761 static __INLINE q31_t __QADD16( 00762 q31_t x, 00763 q31_t y) 00764 { 00765 00766 q31_t sum; 00767 q31_t r, s; 00768 00769 r = (q15_t) x; 00770 s = (q15_t) y; 00771 00772 r = __SSAT(r + s, 16); 00773 s = __SSAT(((q31_t) ((x >> 16) + (y >> 16))), 16) << 16; 00774 00775 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); 00776 00777 return sum; 00778 00779 } 00780 00781 /* 00782 * @brief C custom defined SHADD16 for M3 and M0 processors 00783 */ 00784 static __INLINE q31_t __SHADD16( 00785 q31_t x, 00786 q31_t y) 00787 { 00788 00789 q31_t sum; 00790 q31_t r, s; 00791 00792 r = (q15_t) x; 00793 s = (q15_t) y; 00794 00795 r = ((r >> 1) + (s >> 1)); 00796 s = ((q31_t) ((x >> 17) + (y >> 17))) << 16; 00797 00798 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); 00799 00800 return sum; 00801 00802 } 00803 00804 /* 00805 * @brief C custom defined QSUB16 for M3 and M0 processors 00806 */ 00807 static __INLINE q31_t __QSUB16( 00808 q31_t x, 00809 q31_t y) 00810 { 00811 00812 q31_t sum; 00813 q31_t r, s; 00814 00815 r = (q15_t) x; 00816 s = (q15_t) y; 00817 00818 r = __SSAT(r - s, 16); 00819 s = __SSAT(((q31_t) ((x >> 16) - (y >> 16))), 16) << 16; 00820 00821 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); 00822 00823 return sum; 00824 } 00825 00826 /* 00827 * @brief C custom defined SHSUB16 for M3 and M0 processors 00828 */ 00829 static __INLINE q31_t __SHSUB16( 00830 q31_t x, 00831 q31_t y) 00832 { 00833 00834 q31_t diff; 00835 q31_t r, s; 00836 00837 r = (q15_t) x; 00838 s = (q15_t) y; 00839 00840 r = ((r >> 1) - (s >> 1)); 00841 s = (((x >> 17) - (y >> 17)) << 16); 00842 00843 diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); 00844 00845 return diff; 00846 } 00847 00848 /* 00849 * @brief C custom defined QASX for M3 and M0 processors 00850 */ 00851 static __INLINE q31_t __QASX( 00852 q31_t x, 00853 q31_t y) 00854 { 00855 00856 q31_t sum = 0; 00857 00858 sum = 00859 ((sum + 00860 clip_q31_to_q15((q31_t) ((q15_t) (x >> 16) + (q15_t) y))) << 16) + 00861 clip_q31_to_q15((q31_t) ((q15_t) x - (q15_t) (y >> 16))); 00862 00863 return sum; 00864 } 00865 00866 /* 00867 * @brief C custom defined SHASX for M3 and M0 processors 00868 */ 00869 static __INLINE q31_t __SHASX( 00870 q31_t x, 00871 q31_t y) 00872 { 00873 00874 q31_t sum; 00875 q31_t r, s; 00876 00877 r = (q15_t) x; 00878 s = (q15_t) y; 00879 00880 r = ((r >> 1) - (y >> 17)); 00881 s = (((x >> 17) + (s >> 1)) << 16); 00882 00883 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); 00884 00885 return sum; 00886 } 00887 00888 00889 /* 00890 * @brief C custom defined QSAX for M3 and M0 processors 00891 */ 00892 static __INLINE q31_t __QSAX( 00893 q31_t x, 00894 q31_t y) 00895 { 00896 00897 q31_t sum = 0; 00898 00899 sum = 00900 ((sum + 00901 clip_q31_to_q15((q31_t) ((q15_t) (x >> 16) - (q15_t) y))) << 16) + 00902 clip_q31_to_q15((q31_t) ((q15_t) x + (q15_t) (y >> 16))); 00903 00904 return sum; 00905 } 00906 00907 /* 00908 * @brief C custom defined SHSAX for M3 and M0 processors 00909 */ 00910 static __INLINE q31_t __SHSAX( 00911 q31_t x, 00912 q31_t y) 00913 { 00914 00915 q31_t sum; 00916 q31_t r, s; 00917 00918 r = (q15_t) x; 00919 s = (q15_t) y; 00920 00921 r = ((r >> 1) + (y >> 17)); 00922 s = (((x >> 17) - (s >> 1)) << 16); 00923 00924 sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); 00925 00926 return sum; 00927 } 00928 00929 /* 00930 * @brief C custom defined SMUSDX for M3 and M0 processors 00931 */ 00932 static __INLINE q31_t __SMUSDX( 00933 q31_t x, 00934 q31_t y) 00935 { 00936 00937 return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) - 00938 ((q15_t) (x >> 16) * (q15_t) y))); 00939 } 00940 00941 /* 00942 * @brief C custom defined SMUADX for M3 and M0 processors 00943 */ 00944 static __INLINE q31_t __SMUADX( 00945 q31_t x, 00946 q31_t y) 00947 { 00948 00949 return ((q31_t) (((q15_t) x * (q15_t) (y >> 16)) + 00950 ((q15_t) (x >> 16) * (q15_t) y))); 00951 } 00952 00953 /* 00954 * @brief C custom defined QADD for M3 and M0 processors 00955 */ 00956 static __INLINE q31_t __QADD( 00957 q31_t x, 00958 q31_t y) 00959 { 00960 return clip_q63_to_q31((q63_t) x + y); 00961 } 00962 00963 /* 00964 * @brief C custom defined QSUB for M3 and M0 processors 00965 */ 00966 static __INLINE q31_t __QSUB( 00967 q31_t x, 00968 q31_t y) 00969 { 00970 return clip_q63_to_q31((q63_t) x - y); 00971 } 00972 00973 /* 00974 * @brief C custom defined SMLAD for M3 and M0 processors 00975 */ 00976 static __INLINE q31_t __SMLAD( 00977 q31_t x, 00978 q31_t y, 00979 q31_t sum) 00980 { 00981 00982 return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + 00983 ((q15_t) x * (q15_t) y)); 00984 } 00985 00986 /* 00987 * @brief C custom defined SMLADX for M3 and M0 processors 00988 */ 00989 static __INLINE q31_t __SMLADX( 00990 q31_t x, 00991 q31_t y, 00992 q31_t sum) 00993 { 00994 00995 return (sum + ((q15_t) (x >> 16) * (q15_t) (y)) + 00996 ((q15_t) x * (q15_t) (y >> 16))); 00997 } 00998 00999 /* 01000 * @brief C custom defined SMLSDX for M3 and M0 processors 01001 */ 01002 static __INLINE q31_t __SMLSDX( 01003 q31_t x, 01004 q31_t y, 01005 q31_t sum) 01006 { 01007 01008 return (sum - ((q15_t) (x >> 16) * (q15_t) (y)) + 01009 ((q15_t) x * (q15_t) (y >> 16))); 01010 } 01011 01012 /* 01013 * @brief C custom defined SMLALD for M3 and M0 processors 01014 */ 01015 static __INLINE q63_t __SMLALD( 01016 q31_t x, 01017 q31_t y, 01018 q63_t sum) 01019 { 01020 01021 return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + 01022 ((q15_t) x * (q15_t) y)); 01023 } 01024 01025 /* 01026 * @brief C custom defined SMLALDX for M3 and M0 processors 01027 */ 01028 static __INLINE q63_t __SMLALDX( 01029 q31_t x, 01030 q31_t y, 01031 q63_t sum) 01032 { 01033 01034 return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + 01035 ((q15_t) x * (q15_t) (y >> 16)); 01036 } 01037 01038 /* 01039 * @brief C custom defined SMUAD for M3 and M0 processors 01040 */ 01041 static __INLINE q31_t __SMUAD( 01042 q31_t x, 01043 q31_t y) 01044 { 01045 01046 return (((x >> 16) * (y >> 16)) + 01047 (((x << 16) >> 16) * ((y << 16) >> 16))); 01048 } 01049 01050 /* 01051 * @brief C custom defined SMUSD for M3 and M0 processors 01052 */ 01053 static __INLINE q31_t __SMUSD( 01054 q31_t x, 01055 q31_t y) 01056 { 01057 01058 return (-((x >> 16) * (y >> 16)) + 01059 (((x << 16) >> 16) * ((y << 16) >> 16))); 01060 } 01061 01062 01063 /* 01064 * @brief C custom defined SXTB16 for M3 and M0 processors 01065 */ 01066 static __INLINE q31_t __SXTB16( 01067 q31_t x) 01068 { 01069 01070 return ((((x << 24) >> 24) & 0x0000FFFF) | 01071 (((x << 8) >> 8) & 0xFFFF0000)); 01072 } 01073 01074 01075 #endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */ 01076 01077 01078 /** 01079 * @brief Instance structure for the Q7 FIR filter. 01080 */ 01081 typedef struct 01082 { 01083 uint16_t numTaps; /**< number of filter coefficients in the filter. */ 01084 q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 01085 q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ 01086 } arm_fir_instance_q7; 01087 01088 /** 01089 * @brief Instance structure for the Q15 FIR filter. 01090 */ 01091 typedef struct 01092 { 01093 uint16_t numTaps; /**< number of filter coefficients in the filter. */ 01094 q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 01095 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ 01096 } arm_fir_instance_q15; 01097 01098 /** 01099 * @brief Instance structure for the Q31 FIR filter. 01100 */ 01101 typedef struct 01102 { 01103 uint16_t numTaps; /**< number of filter coefficients in the filter. */ 01104 q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 01105 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ 01106 } arm_fir_instance_q31; 01107 01108 /** 01109 * @brief Instance structure for the floating-point FIR filter. 01110 */ 01111 typedef struct 01112 { 01113 uint16_t numTaps; /**< number of filter coefficients in the filter. */ 01114 float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 01115 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ 01116 } arm_fir_instance_f32; 01117 01118 01119 /** 01120 * @brief Processing function for the Q7 FIR filter. 01121 * @param[in] *S points to an instance of the Q7 FIR filter structure. 01122 * @param[in] *pSrc points to the block of input data. 01123 * @param[out] *pDst points to the block of output data. 01124 * @param[in] blockSize number of samples to process. 01125 * @return none. 01126 */ 01127 void arm_fir_q7( 01128 const arm_fir_instance_q7 * S, 01129 q7_t * pSrc, 01130 q7_t * pDst, 01131 uint32_t blockSize); 01132 01133 01134 /** 01135 * @brief Initialization function for the Q7 FIR filter. 01136 * @param[in,out] *S points to an instance of the Q7 FIR structure. 01137 * @param[in] numTaps Number of filter coefficients in the filter. 01138 * @param[in] *pCoeffs points to the filter coefficients. 01139 * @param[in] *pState points to the state buffer. 01140 * @param[in] blockSize number of samples that are processed. 01141 * @return none 01142 */ 01143 void arm_fir_init_q7( 01144 arm_fir_instance_q7 * S, 01145 uint16_t numTaps, 01146 q7_t * pCoeffs, 01147 q7_t * pState, 01148 uint32_t blockSize); 01149 01150 01151 /** 01152 * @brief Processing function for the Q15 FIR filter. 01153 * @param[in] *S points to an instance of the Q15 FIR structure. 01154 * @param[in] *pSrc points to the block of input data. 01155 * @param[out] *pDst points to the block of output data. 01156 * @param[in] blockSize number of samples to process. 01157 * @return none. 01158 */ 01159 void arm_fir_q15( 01160 const arm_fir_instance_q15 * S, 01161 q15_t * pSrc, 01162 q15_t * pDst, 01163 uint32_t blockSize); 01164 01165 /** 01166 * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. 01167 * @param[in] *S points to an instance of the Q15 FIR filter structure. 01168 * @param[in] *pSrc points to the block of input data. 01169 * @param[out] *pDst points to the block of output data. 01170 * @param[in] blockSize number of samples to process. 01171 * @return none. 01172 */ 01173 void arm_fir_fast_q15( 01174 const arm_fir_instance_q15 * S, 01175 q15_t * pSrc, 01176 q15_t * pDst, 01177 uint32_t blockSize); 01178 01179 /** 01180 * @brief Initialization function for the Q15 FIR filter. 01181 * @param[in,out] *S points to an instance of the Q15 FIR filter structure. 01182 * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. 01183 * @param[in] *pCoeffs points to the filter coefficients. 01184 * @param[in] *pState points to the state buffer. 01185 * @param[in] blockSize number of samples that are processed at a time. 01186 * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if 01187 * <code>numTaps</code> is not a supported value. 01188 */ 01189 01190 arm_status arm_fir_init_q15( 01191 arm_fir_instance_q15 * S, 01192 uint16_t numTaps, 01193 q15_t * pCoeffs, 01194 q15_t * pState, 01195 uint32_t blockSize); 01196 01197 /** 01198 * @brief Processing function for the Q31 FIR filter. 01199 * @param[in] *S points to an instance of the Q31 FIR filter structure. 01200 * @param[in] *pSrc points to the block of input data. 01201 * @param[out] *pDst points to the block of output data. 01202 * @param[in] blockSize number of samples to process. 01203 * @return none. 01204 */ 01205 void arm_fir_q31( 01206 const arm_fir_instance_q31 * S, 01207 q31_t * pSrc, 01208 q31_t * pDst, 01209 uint32_t blockSize); 01210 01211 /** 01212 * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. 01213 * @param[in] *S points to an instance of the Q31 FIR structure. 01214 * @param[in] *pSrc points to the block of input data. 01215 * @param[out] *pDst points to the block of output data. 01216 * @param[in] blockSize number of samples to process. 01217 * @return none. 01218 */ 01219 void arm_fir_fast_q31( 01220 const arm_fir_instance_q31 * S, 01221 q31_t * pSrc, 01222 q31_t * pDst, 01223 uint32_t blockSize); 01224 01225 /** 01226 * @brief Initialization function for the Q31 FIR filter. 01227 * @param[in,out] *S points to an instance of the Q31 FIR structure. 01228 * @param[in] numTaps Number of filter coefficients in the filter. 01229 * @param[in] *pCoeffs points to the filter coefficients. 01230 * @param[in] *pState points to the state buffer. 01231 * @param[in] blockSize number of samples that are processed at a time. 01232 * @return none. 01233 */ 01234 void arm_fir_init_q31( 01235 arm_fir_instance_q31 * S, 01236 uint16_t numTaps, 01237 q31_t * pCoeffs, 01238 q31_t * pState, 01239 uint32_t blockSize); 01240 01241 /** 01242 * @brief Processing function for the floating-point FIR filter. 01243 * @param[in] *S points to an instance of the floating-point FIR structure. 01244 * @param[in] *pSrc points to the block of input data. 01245 * @param[out] *pDst points to the block of output data. 01246 * @param[in] blockSize number of samples to process. 01247 * @return none. 01248 */ 01249 void arm_fir_f32( 01250 const arm_fir_instance_f32 * S, 01251 float32_t * pSrc, 01252 float32_t * pDst, 01253 uint32_t blockSize); 01254 01255 /** 01256 * @brief Initialization function for the floating-point FIR filter. 01257 * @param[in,out] *S points to an instance of the floating-point FIR filter structure. 01258 * @param[in] numTaps Number of filter coefficients in the filter. 01259 * @param[in] *pCoeffs points to the filter coefficients. 01260 * @param[in] *pState points to the state buffer. 01261 * @param[in] blockSize number of samples that are processed at a time. 01262 * @return none. 01263 */ 01264 void arm_fir_init_f32( 01265 arm_fir_instance_f32 * S, 01266 uint16_t numTaps, 01267 float32_t * pCoeffs, 01268 float32_t * pState, 01269 uint32_t blockSize); 01270 01271 01272 /** 01273 * @brief Instance structure for the Q15 Biquad cascade filter. 01274 */ 01275 typedef struct 01276 { 01277 int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ 01278 q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ 01279 q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ 01280 int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ 01281 01282 } arm_biquad_casd_df1_inst_q15; 01283 01284 01285 /** 01286 * @brief Instance structure for the Q31 Biquad cascade filter. 01287 */ 01288 typedef struct 01289 { 01290 uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ 01291 q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ 01292 q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ 01293 uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ 01294 01295 } arm_biquad_casd_df1_inst_q31; 01296 01297 /** 01298 * @brief Instance structure for the floating-point Biquad cascade filter. 01299 */ 01300 typedef struct 01301 { 01302 uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ 01303 float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ 01304 float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ 01305 01306 01307 } arm_biquad_casd_df1_inst_f32; 01308 01309 01310 01311 /** 01312 * @brief Processing function for the Q15 Biquad cascade filter. 01313 * @param[in] *S points to an instance of the Q15 Biquad cascade structure. 01314 * @param[in] *pSrc points to the block of input data. 01315 * @param[out] *pDst points to the block of output data. 01316 * @param[in] blockSize number of samples to process. 01317 * @return none. 01318 */ 01319 01320 void arm_biquad_cascade_df1_q15( 01321 const arm_biquad_casd_df1_inst_q15 * S, 01322 q15_t * pSrc, 01323 q15_t * pDst, 01324 uint32_t blockSize); 01325 01326 /** 01327 * @brief Initialization function for the Q15 Biquad cascade filter. 01328 * @param[in,out] *S points to an instance of the Q15 Biquad cascade structure. 01329 * @param[in] numStages number of 2nd order stages in the filter. 01330 * @param[in] *pCoeffs points to the filter coefficients. 01331 * @param[in] *pState points to the state buffer. 01332 * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format 01333 * @return none 01334 */ 01335 01336 void arm_biquad_cascade_df1_init_q15( 01337 arm_biquad_casd_df1_inst_q15 * S, 01338 uint8_t numStages, 01339 q15_t * pCoeffs, 01340 q15_t * pState, 01341 int8_t postShift); 01342 01343 01344 /** 01345 * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. 01346 * @param[in] *S points to an instance of the Q15 Biquad cascade structure. 01347 * @param[in] *pSrc points to the block of input data. 01348 * @param[out] *pDst points to the block of output data. 01349 * @param[in] blockSize number of samples to process. 01350 * @return none. 01351 */ 01352 01353 void arm_biquad_cascade_df1_fast_q15( 01354 const arm_biquad_casd_df1_inst_q15 * S, 01355 q15_t * pSrc, 01356 q15_t * pDst, 01357 uint32_t blockSize); 01358 01359 01360 /** 01361 * @brief Processing function for the Q31 Biquad cascade filter 01362 * @param[in] *S points to an instance of the Q31 Biquad cascade structure. 01363 * @param[in] *pSrc points to the block of input data. 01364 * @param[out] *pDst points to the block of output data. 01365 * @param[in] blockSize number of samples to process. 01366 * @return none. 01367 */ 01368 01369 void arm_biquad_cascade_df1_q31( 01370 const arm_biquad_casd_df1_inst_q31 * S, 01371 q31_t * pSrc, 01372 q31_t * pDst, 01373 uint32_t blockSize); 01374 01375 /** 01376 * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. 01377 * @param[in] *S points to an instance of the Q31 Biquad cascade structure. 01378 * @param[in] *pSrc points to the block of input data. 01379 * @param[out] *pDst points to the block of output data. 01380 * @param[in] blockSize number of samples to process. 01381 * @return none. 01382 */ 01383 01384 void arm_biquad_cascade_df1_fast_q31( 01385 const arm_biquad_casd_df1_inst_q31 * S, 01386 q31_t * pSrc, 01387 q31_t * pDst, 01388 uint32_t blockSize); 01389 01390 /** 01391 * @brief Initialization function for the Q31 Biquad cascade filter. 01392 * @param[in,out] *S points to an instance of the Q31 Biquad cascade structure. 01393 * @param[in] numStages number of 2nd order stages in the filter. 01394 * @param[in] *pCoeffs points to the filter coefficients. 01395 * @param[in] *pState points to the state buffer. 01396 * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format 01397 * @return none 01398 */ 01399 01400 void arm_biquad_cascade_df1_init_q31( 01401 arm_biquad_casd_df1_inst_q31 * S, 01402 uint8_t numStages, 01403 q31_t * pCoeffs, 01404 q31_t * pState, 01405 int8_t postShift); 01406 01407 /** 01408 * @brief Processing function for the floating-point Biquad cascade filter. 01409 * @param[in] *S points to an instance of the floating-point Biquad cascade structure. 01410 * @param[in] *pSrc points to the block of input data. 01411 * @param[out] *pDst points to the block of output data. 01412 * @param[in] blockSize number of samples to process. 01413 * @return none. 01414 */ 01415 01416 void arm_biquad_cascade_df1_f32( 01417 const arm_biquad_casd_df1_inst_f32 * S, 01418 float32_t * pSrc, 01419 float32_t * pDst, 01420 uint32_t blockSize); 01421 01422 /** 01423 * @brief Initialization function for the floating-point Biquad cascade filter. 01424 * @param[in,out] *S points to an instance of the floating-point Biquad cascade structure. 01425 * @param[in] numStages number of 2nd order stages in the filter. 01426 * @param[in] *pCoeffs points to the filter coefficients. 01427 * @param[in] *pState points to the state buffer. 01428 * @return none 01429 */ 01430 01431 void arm_biquad_cascade_df1_init_f32( 01432 arm_biquad_casd_df1_inst_f32 * S, 01433 uint8_t numStages, 01434 float32_t * pCoeffs, 01435 float32_t * pState); 01436 01437 01438 /** 01439 * @brief Instance structure for the floating-point matrix structure. 01440 */ 01441 01442 typedef struct 01443 { 01444 uint16_t numRows; /**< number of rows of the matrix. */ 01445 uint16_t numCols; /**< number of columns of the matrix. */ 01446 float32_t *pData; /**< points to the data of the matrix. */ 01447 } arm_matrix_instance_f32; 01448 01449 01450 /** 01451 * @brief Instance structure for the floating-point matrix structure. 01452 */ 01453 01454 typedef struct 01455 { 01456 uint16_t numRows; /**< number of rows of the matrix. */ 01457 uint16_t numCols; /**< number of columns of the matrix. */ 01458 float64_t *pData; /**< points to the data of the matrix. */ 01459 } arm_matrix_instance_f64; 01460 01461 /** 01462 * @brief Instance structure for the Q15 matrix structure. 01463 */ 01464 01465 typedef struct 01466 { 01467 uint16_t numRows; /**< number of rows of the matrix. */ 01468 uint16_t numCols; /**< number of columns of the matrix. */ 01469 q15_t *pData; /**< points to the data of the matrix. */ 01470 01471 } arm_matrix_instance_q15; 01472 01473 /** 01474 * @brief Instance structure for the Q31 matrix structure. 01475 */ 01476 01477 typedef struct 01478 { 01479 uint16_t numRows; /**< number of rows of the matrix. */ 01480 uint16_t numCols; /**< number of columns of the matrix. */ 01481 q31_t *pData; /**< points to the data of the matrix. */ 01482 01483 } arm_matrix_instance_q31; 01484 01485 01486 01487 /** 01488 * @brief Floating-point matrix addition. 01489 * @param[in] *pSrcA points to the first input matrix structure 01490 * @param[in] *pSrcB points to the second input matrix structure 01491 * @param[out] *pDst points to output matrix structure 01492 * @return The function returns either 01493 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01494 */ 01495 01496 arm_status arm_mat_add_f32( 01497 const arm_matrix_instance_f32 * pSrcA, 01498 const arm_matrix_instance_f32 * pSrcB, 01499 arm_matrix_instance_f32 * pDst); 01500 01501 /** 01502 * @brief Q15 matrix addition. 01503 * @param[in] *pSrcA points to the first input matrix structure 01504 * @param[in] *pSrcB points to the second input matrix structure 01505 * @param[out] *pDst points to output matrix structure 01506 * @return The function returns either 01507 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01508 */ 01509 01510 arm_status arm_mat_add_q15( 01511 const arm_matrix_instance_q15 * pSrcA, 01512 const arm_matrix_instance_q15 * pSrcB, 01513 arm_matrix_instance_q15 * pDst); 01514 01515 /** 01516 * @brief Q31 matrix addition. 01517 * @param[in] *pSrcA points to the first input matrix structure 01518 * @param[in] *pSrcB points to the second input matrix structure 01519 * @param[out] *pDst points to output matrix structure 01520 * @return The function returns either 01521 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01522 */ 01523 01524 arm_status arm_mat_add_q31( 01525 const arm_matrix_instance_q31 * pSrcA, 01526 const arm_matrix_instance_q31 * pSrcB, 01527 arm_matrix_instance_q31 * pDst); 01528 01529 /** 01530 * @brief Floating-point, complex, matrix multiplication. 01531 * @param[in] *pSrcA points to the first input matrix structure 01532 * @param[in] *pSrcB points to the second input matrix structure 01533 * @param[out] *pDst points to output matrix structure 01534 * @return The function returns either 01535 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01536 */ 01537 01538 arm_status arm_mat_cmplx_mult_f32( 01539 const arm_matrix_instance_f32 * pSrcA, 01540 const arm_matrix_instance_f32 * pSrcB, 01541 arm_matrix_instance_f32 * pDst); 01542 01543 /** 01544 * @brief Q15, complex, matrix multiplication. 01545 * @param[in] *pSrcA points to the first input matrix structure 01546 * @param[in] *pSrcB points to the second input matrix structure 01547 * @param[out] *pDst points to output matrix structure 01548 * @return The function returns either 01549 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01550 */ 01551 01552 arm_status arm_mat_cmplx_mult_q15( 01553 const arm_matrix_instance_q15 * pSrcA, 01554 const arm_matrix_instance_q15 * pSrcB, 01555 arm_matrix_instance_q15 * pDst, 01556 q15_t * pScratch); 01557 01558 /** 01559 * @brief Q31, complex, matrix multiplication. 01560 * @param[in] *pSrcA points to the first input matrix structure 01561 * @param[in] *pSrcB points to the second input matrix structure 01562 * @param[out] *pDst points to output matrix structure 01563 * @return The function returns either 01564 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01565 */ 01566 01567 arm_status arm_mat_cmplx_mult_q31( 01568 const arm_matrix_instance_q31 * pSrcA, 01569 const arm_matrix_instance_q31 * pSrcB, 01570 arm_matrix_instance_q31 * pDst); 01571 01572 01573 /** 01574 * @brief Floating-point matrix transpose. 01575 * @param[in] *pSrc points to the input matrix 01576 * @param[out] *pDst points to the output matrix 01577 * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> 01578 * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01579 */ 01580 01581 arm_status arm_mat_trans_f32( 01582 const arm_matrix_instance_f32 * pSrc, 01583 arm_matrix_instance_f32 * pDst); 01584 01585 01586 /** 01587 * @brief Q15 matrix transpose. 01588 * @param[in] *pSrc points to the input matrix 01589 * @param[out] *pDst points to the output matrix 01590 * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> 01591 * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01592 */ 01593 01594 arm_status arm_mat_trans_q15( 01595 const arm_matrix_instance_q15 * pSrc, 01596 arm_matrix_instance_q15 * pDst); 01597 01598 /** 01599 * @brief Q31 matrix transpose. 01600 * @param[in] *pSrc points to the input matrix 01601 * @param[out] *pDst points to the output matrix 01602 * @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> 01603 * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01604 */ 01605 01606 arm_status arm_mat_trans_q31( 01607 const arm_matrix_instance_q31 * pSrc, 01608 arm_matrix_instance_q31 * pDst); 01609 01610 01611 /** 01612 * @brief Floating-point matrix multiplication 01613 * @param[in] *pSrcA points to the first input matrix structure 01614 * @param[in] *pSrcB points to the second input matrix structure 01615 * @param[out] *pDst points to output matrix structure 01616 * @return The function returns either 01617 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01618 */ 01619 01620 arm_status arm_mat_mult_f32( 01621 const arm_matrix_instance_f32 * pSrcA, 01622 const arm_matrix_instance_f32 * pSrcB, 01623 arm_matrix_instance_f32 * pDst); 01624 01625 /** 01626 * @brief Q15 matrix multiplication 01627 * @param[in] *pSrcA points to the first input matrix structure 01628 * @param[in] *pSrcB points to the second input matrix structure 01629 * @param[out] *pDst points to output matrix structure 01630 * @param[in] *pState points to the array for storing intermediate results 01631 * @return The function returns either 01632 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01633 */ 01634 01635 arm_status arm_mat_mult_q15( 01636 const arm_matrix_instance_q15 * pSrcA, 01637 const arm_matrix_instance_q15 * pSrcB, 01638 arm_matrix_instance_q15 * pDst, 01639 q15_t * pState); 01640 01641 /** 01642 * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 01643 * @param[in] *pSrcA points to the first input matrix structure 01644 * @param[in] *pSrcB points to the second input matrix structure 01645 * @param[out] *pDst points to output matrix structure 01646 * @param[in] *pState points to the array for storing intermediate results 01647 * @return The function returns either 01648 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01649 */ 01650 01651 arm_status arm_mat_mult_fast_q15( 01652 const arm_matrix_instance_q15 * pSrcA, 01653 const arm_matrix_instance_q15 * pSrcB, 01654 arm_matrix_instance_q15 * pDst, 01655 q15_t * pState); 01656 01657 /** 01658 * @brief Q31 matrix multiplication 01659 * @param[in] *pSrcA points to the first input matrix structure 01660 * @param[in] *pSrcB points to the second input matrix structure 01661 * @param[out] *pDst points to output matrix structure 01662 * @return The function returns either 01663 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01664 */ 01665 01666 arm_status arm_mat_mult_q31( 01667 const arm_matrix_instance_q31 * pSrcA, 01668 const arm_matrix_instance_q31 * pSrcB, 01669 arm_matrix_instance_q31 * pDst); 01670 01671 /** 01672 * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 01673 * @param[in] *pSrcA points to the first input matrix structure 01674 * @param[in] *pSrcB points to the second input matrix structure 01675 * @param[out] *pDst points to output matrix structure 01676 * @return The function returns either 01677 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01678 */ 01679 01680 arm_status arm_mat_mult_fast_q31( 01681 const arm_matrix_instance_q31 * pSrcA, 01682 const arm_matrix_instance_q31 * pSrcB, 01683 arm_matrix_instance_q31 * pDst); 01684 01685 01686 /** 01687 * @brief Floating-point matrix subtraction 01688 * @param[in] *pSrcA points to the first input matrix structure 01689 * @param[in] *pSrcB points to the second input matrix structure 01690 * @param[out] *pDst points to output matrix structure 01691 * @return The function returns either 01692 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01693 */ 01694 01695 arm_status arm_mat_sub_f32( 01696 const arm_matrix_instance_f32 * pSrcA, 01697 const arm_matrix_instance_f32 * pSrcB, 01698 arm_matrix_instance_f32 * pDst); 01699 01700 /** 01701 * @brief Q15 matrix subtraction 01702 * @param[in] *pSrcA points to the first input matrix structure 01703 * @param[in] *pSrcB points to the second input matrix structure 01704 * @param[out] *pDst points to output matrix structure 01705 * @return The function returns either 01706 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01707 */ 01708 01709 arm_status arm_mat_sub_q15( 01710 const arm_matrix_instance_q15 * pSrcA, 01711 const arm_matrix_instance_q15 * pSrcB, 01712 arm_matrix_instance_q15 * pDst); 01713 01714 /** 01715 * @brief Q31 matrix subtraction 01716 * @param[in] *pSrcA points to the first input matrix structure 01717 * @param[in] *pSrcB points to the second input matrix structure 01718 * @param[out] *pDst points to output matrix structure 01719 * @return The function returns either 01720 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01721 */ 01722 01723 arm_status arm_mat_sub_q31( 01724 const arm_matrix_instance_q31 * pSrcA, 01725 const arm_matrix_instance_q31 * pSrcB, 01726 arm_matrix_instance_q31 * pDst); 01727 01728 /** 01729 * @brief Floating-point matrix scaling. 01730 * @param[in] *pSrc points to the input matrix 01731 * @param[in] scale scale factor 01732 * @param[out] *pDst points to the output matrix 01733 * @return The function returns either 01734 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01735 */ 01736 01737 arm_status arm_mat_scale_f32( 01738 const arm_matrix_instance_f32 * pSrc, 01739 float32_t scale, 01740 arm_matrix_instance_f32 * pDst); 01741 01742 /** 01743 * @brief Q15 matrix scaling. 01744 * @param[in] *pSrc points to input matrix 01745 * @param[in] scaleFract fractional portion of the scale factor 01746 * @param[in] shift number of bits to shift the result by 01747 * @param[out] *pDst points to output matrix 01748 * @return The function returns either 01749 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01750 */ 01751 01752 arm_status arm_mat_scale_q15( 01753 const arm_matrix_instance_q15 * pSrc, 01754 q15_t scaleFract, 01755 int32_t shift, 01756 arm_matrix_instance_q15 * pDst); 01757 01758 /** 01759 * @brief Q31 matrix scaling. 01760 * @param[in] *pSrc points to input matrix 01761 * @param[in] scaleFract fractional portion of the scale factor 01762 * @param[in] shift number of bits to shift the result by 01763 * @param[out] *pDst points to output matrix structure 01764 * @return The function returns either 01765 * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. 01766 */ 01767 01768 arm_status arm_mat_scale_q31( 01769 const arm_matrix_instance_q31 * pSrc, 01770 q31_t scaleFract, 01771 int32_t shift, 01772 arm_matrix_instance_q31 * pDst); 01773 01774 01775 /** 01776 * @brief Q31 matrix initialization. 01777 * @param[in,out] *S points to an instance of the floating-point matrix structure. 01778 * @param[in] nRows number of rows in the matrix. 01779 * @param[in] nColumns number of columns in the matrix. 01780 * @param[in] *pData points to the matrix data array. 01781 * @return none 01782 */ 01783 01784 void arm_mat_init_q31( 01785 arm_matrix_instance_q31 * S, 01786 uint16_t nRows, 01787 uint16_t nColumns, 01788 q31_t * pData); 01789 01790 /** 01791 * @brief Q15 matrix initialization. 01792 * @param[in,out] *S points to an instance of the floating-point matrix structure. 01793 * @param[in] nRows number of rows in the matrix. 01794 * @param[in] nColumns number of columns in the matrix. 01795 * @param[in] *pData points to the matrix data array. 01796 * @return none 01797 */ 01798 01799 void arm_mat_init_q15( 01800 arm_matrix_instance_q15 * S, 01801 uint16_t nRows, 01802 uint16_t nColumns, 01803 q15_t * pData); 01804 01805 /** 01806 * @brief Floating-point matrix initialization. 01807 * @param[in,out] *S points to an instance of the floating-point matrix structure. 01808 * @param[in] nRows number of rows in the matrix. 01809 * @param[in] nColumns number of columns in the matrix. 01810 * @param[in] *pData points to the matrix data array. 01811 * @return none 01812 */ 01813 01814 void arm_mat_init_f32( 01815 arm_matrix_instance_f32 * S, 01816 uint16_t nRows, 01817 uint16_t nColumns, 01818 float32_t * pData); 01819 01820 01821 01822 /** 01823 * @brief Instance structure for the Q15 PID Control. 01824 */ 01825 typedef struct 01826 { 01827 q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ 01828 #ifdef ARM_MATH_CM0_FAMILY 01829 q15_t A1; 01830 q15_t A2; 01831 #else 01832 q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ 01833 #endif 01834 q15_t state[3]; /**< The state array of length 3. */ 01835 q15_t Kp; /**< The proportional gain. */ 01836 q15_t Ki; /**< The integral gain. */ 01837 q15_t Kd; /**< The derivative gain. */ 01838 } arm_pid_instance_q15; 01839 01840 /** 01841 * @brief Instance structure for the Q31 PID Control. 01842 */ 01843 typedef struct 01844 { 01845 q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ 01846 q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ 01847 q31_t A2; /**< The derived gain, A2 = Kd . */ 01848 q31_t state[3]; /**< The state array of length 3. */ 01849 q31_t Kp; /**< The proportional gain. */ 01850 q31_t Ki; /**< The integral gain. */ 01851 q31_t Kd; /**< The derivative gain. */ 01852 01853 } arm_pid_instance_q31; 01854 01855 /** 01856 * @brief Instance structure for the floating-point PID Control. 01857 */ 01858 typedef struct 01859 { 01860 float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ 01861 float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ 01862 float32_t A2; /**< The derived gain, A2 = Kd . */ 01863 float32_t state[3]; /**< The state array of length 3. */ 01864 float32_t Kp; /**< The proportional gain. */ 01865 float32_t Ki; /**< The integral gain. */ 01866 float32_t Kd; /**< The derivative gain. */ 01867 } arm_pid_instance_f32; 01868 01869 01870 01871 /** 01872 * @brief Initialization function for the floating-point PID Control. 01873 * @param[in,out] *S points to an instance of the PID structure. 01874 * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. 01875 * @return none. 01876 */ 01877 void arm_pid_init_f32( 01878 arm_pid_instance_f32 * S, 01879 int32_t resetStateFlag); 01880 01881 /** 01882 * @brief Reset function for the floating-point PID Control. 01883 * @param[in,out] *S is an instance of the floating-point PID Control structure 01884 * @return none 01885 */ 01886 void arm_pid_reset_f32( 01887 arm_pid_instance_f32 * S); 01888 01889 01890 /** 01891 * @brief Initialization function for the Q31 PID Control. 01892 * @param[in,out] *S points to an instance of the Q15 PID structure. 01893 * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. 01894 * @return none. 01895 */ 01896 void arm_pid_init_q31( 01897 arm_pid_instance_q31 * S, 01898 int32_t resetStateFlag); 01899 01900 01901 /** 01902 * @brief Reset function for the Q31 PID Control. 01903 * @param[in,out] *S points to an instance of the Q31 PID Control structure 01904 * @return none 01905 */ 01906 01907 void arm_pid_reset_q31( 01908 arm_pid_instance_q31 * S); 01909 01910 /** 01911 * @brief Initialization function for the Q15 PID Control. 01912 * @param[in,out] *S points to an instance of the Q15 PID structure. 01913 * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. 01914 * @return none. 01915 */ 01916 void arm_pid_init_q15( 01917 arm_pid_instance_q15 * S, 01918 int32_t resetStateFlag); 01919 01920 /** 01921 * @brief Reset function for the Q15 PID Control. 01922 * @param[in,out] *S points to an instance of the q15 PID Control structure 01923 * @return none 01924 */ 01925 void arm_pid_reset_q15( 01926 arm_pid_instance_q15 * S); 01927 01928 01929 /** 01930 * @brief Instance structure for the floating-point Linear Interpolate function. 01931 */ 01932 typedef struct 01933 { 01934 uint32_t nValues; /**< nValues */ 01935 float32_t x1; /**< x1 */ 01936 float32_t xSpacing; /**< xSpacing */ 01937 float32_t *pYData; /**< pointer to the table of Y values */ 01938 } arm_linear_interp_instance_f32; 01939 01940 /** 01941 * @brief Instance structure for the floating-point bilinear interpolation function. 01942 */ 01943 01944 typedef struct 01945 { 01946 uint16_t numRows; /**< number of rows in the data table. */ 01947 uint16_t numCols; /**< number of columns in the data table. */ 01948 float32_t *pData; /**< points to the data table. */ 01949 } arm_bilinear_interp_instance_f32; 01950 01951 /** 01952 * @brief Instance structure for the Q31 bilinear interpolation function. 01953 */ 01954 01955 typedef struct 01956 { 01957 uint16_t numRows; /**< number of rows in the data table. */ 01958 uint16_t numCols; /**< number of columns in the data table. */ 01959 q31_t *pData; /**< points to the data table. */ 01960 } arm_bilinear_interp_instance_q31; 01961 01962 /** 01963 * @brief Instance structure for the Q15 bilinear interpolation function. 01964 */ 01965 01966 typedef struct 01967 { 01968 uint16_t numRows; /**< number of rows in the data table. */ 01969 uint16_t numCols; /**< number of columns in the data table. */ 01970 q15_t *pData; /**< points to the data table. */ 01971 } arm_bilinear_interp_instance_q15; 01972 01973 /** 01974 * @brief Instance structure for the Q15 bilinear interpolation function. 01975 */ 01976 01977 typedef struct 01978 { 01979 uint16_t numRows; /**< number of rows in the data table. */ 01980 uint16_t numCols; /**< number of columns in the data table. */ 01981 q7_t *pData; /**< points to the data table. */ 01982 } arm_bilinear_interp_instance_q7; 01983 01984 01985 /** 01986 * @brief Q7 vector multiplication. 01987 * @param[in] *pSrcA points to the first input vector 01988 * @param[in] *pSrcB points to the second input vector 01989 * @param[out] *pDst points to the output vector 01990 * @param[in] blockSize number of samples in each vector 01991 * @return none. 01992 */ 01993 01994 void arm_mult_q7( 01995 q7_t * pSrcA, 01996 q7_t * pSrcB, 01997 q7_t * pDst, 01998 uint32_t blockSize); 01999 02000 /** 02001 * @brief Q15 vector multiplication. 02002 * @param[in] *pSrcA points to the first input vector 02003 * @param[in] *pSrcB points to the second input vector 02004 * @param[out] *pDst points to the output vector 02005 * @param[in] blockSize number of samples in each vector 02006 * @return none. 02007 */ 02008 02009 void arm_mult_q15( 02010 q15_t * pSrcA, 02011 q15_t * pSrcB, 02012 q15_t * pDst, 02013 uint32_t blockSize); 02014 02015 /** 02016 * @brief Q31 vector multiplication. 02017 * @param[in] *pSrcA points to the first input vector 02018 * @param[in] *pSrcB points to the second input vector 02019 * @param[out] *pDst points to the output vector 02020 * @param[in] blockSize number of samples in each vector 02021 * @return none. 02022 */ 02023 02024 void arm_mult_q31( 02025 q31_t * pSrcA, 02026 q31_t * pSrcB, 02027 q31_t * pDst, 02028 uint32_t blockSize); 02029 02030 /** 02031 * @brief Floating-point vector multiplication. 02032 * @param[in] *pSrcA points to the first input vector 02033 * @param[in] *pSrcB points to the second input vector 02034 * @param[out] *pDst points to the output vector 02035 * @param[in] blockSize number of samples in each vector 02036 * @return none. 02037 */ 02038 02039 void arm_mult_f32( 02040 float32_t * pSrcA, 02041 float32_t * pSrcB, 02042 float32_t * pDst, 02043 uint32_t blockSize); 02044 02045 02046 02047 02048 02049 02050 /** 02051 * @brief Instance structure for the Q15 CFFT/CIFFT function. 02052 */ 02053 02054 typedef struct 02055 { 02056 uint16_t fftLen; /**< length of the FFT. */ 02057 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ 02058 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ 02059 q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ 02060 uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 02061 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 02062 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ 02063 } arm_cfft_radix2_instance_q15; 02064 02065 /* Deprecated */ 02066 arm_status arm_cfft_radix2_init_q15( 02067 arm_cfft_radix2_instance_q15 * S, 02068 uint16_t fftLen, 02069 uint8_t ifftFlag, 02070 uint8_t bitReverseFlag); 02071 02072 /* Deprecated */ 02073 void arm_cfft_radix2_q15( 02074 const arm_cfft_radix2_instance_q15 * S, 02075 q15_t * pSrc); 02076 02077 02078 02079 /** 02080 * @brief Instance structure for the Q15 CFFT/CIFFT function. 02081 */ 02082 02083 typedef struct 02084 { 02085 uint16_t fftLen; /**< length of the FFT. */ 02086 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ 02087 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ 02088 q15_t *pTwiddle; /**< points to the twiddle factor table. */ 02089 uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 02090 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 02091 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ 02092 } arm_cfft_radix4_instance_q15; 02093 02094 /* Deprecated */ 02095 arm_status arm_cfft_radix4_init_q15( 02096 arm_cfft_radix4_instance_q15 * S, 02097 uint16_t fftLen, 02098 uint8_t ifftFlag, 02099 uint8_t bitReverseFlag); 02100 02101 /* Deprecated */ 02102 void arm_cfft_radix4_q15( 02103 const arm_cfft_radix4_instance_q15 * S, 02104 q15_t * pSrc); 02105 02106 /** 02107 * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. 02108 */ 02109 02110 typedef struct 02111 { 02112 uint16_t fftLen; /**< length of the FFT. */ 02113 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ 02114 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ 02115 q31_t *pTwiddle; /**< points to the Twiddle factor table. */ 02116 uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 02117 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 02118 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ 02119 } arm_cfft_radix2_instance_q31; 02120 02121 /* Deprecated */ 02122 arm_status arm_cfft_radix2_init_q31( 02123 arm_cfft_radix2_instance_q31 * S, 02124 uint16_t fftLen, 02125 uint8_t ifftFlag, 02126 uint8_t bitReverseFlag); 02127 02128 /* Deprecated */ 02129 void arm_cfft_radix2_q31( 02130 const arm_cfft_radix2_instance_q31 * S, 02131 q31_t * pSrc); 02132 02133 /** 02134 * @brief Instance structure for the Q31 CFFT/CIFFT function. 02135 */ 02136 02137 typedef struct 02138 { 02139 uint16_t fftLen; /**< length of the FFT. */ 02140 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ 02141 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ 02142 q31_t *pTwiddle; /**< points to the twiddle factor table. */ 02143 uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 02144 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 02145 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ 02146 } arm_cfft_radix4_instance_q31; 02147 02148 /* Deprecated */ 02149 void arm_cfft_radix4_q31( 02150 const arm_cfft_radix4_instance_q31 * S, 02151 q31_t * pSrc); 02152 02153 /* Deprecated */ 02154 arm_status arm_cfft_radix4_init_q31( 02155 arm_cfft_radix4_instance_q31 * S, 02156 uint16_t fftLen, 02157 uint8_t ifftFlag, 02158 uint8_t bitReverseFlag); 02159 02160 /** 02161 * @brief Instance structure for the floating-point CFFT/CIFFT function. 02162 */ 02163 02164 typedef struct 02165 { 02166 uint16_t fftLen; /**< length of the FFT. */ 02167 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ 02168 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ 02169 float32_t *pTwiddle; /**< points to the Twiddle factor table. */ 02170 uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 02171 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 02172 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ 02173 float32_t onebyfftLen; /**< value of 1/fftLen. */ 02174 } arm_cfft_radix2_instance_f32; 02175 02176 /* Deprecated */ 02177 arm_status arm_cfft_radix2_init_f32( 02178 arm_cfft_radix2_instance_f32 * S, 02179 uint16_t fftLen, 02180 uint8_t ifftFlag, 02181 uint8_t bitReverseFlag); 02182 02183 /* Deprecated */ 02184 void arm_cfft_radix2_f32( 02185 const arm_cfft_radix2_instance_f32 * S, 02186 float32_t * pSrc); 02187 02188 /** 02189 * @brief Instance structure for the floating-point CFFT/CIFFT function. 02190 */ 02191 02192 typedef struct 02193 { 02194 uint16_t fftLen; /**< length of the FFT. */ 02195 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ 02196 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ 02197 float32_t *pTwiddle; /**< points to the Twiddle factor table. */ 02198 uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 02199 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 02200 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ 02201 float32_t onebyfftLen; /**< value of 1/fftLen. */ 02202 } arm_cfft_radix4_instance_f32; 02203 02204 /* Deprecated */ 02205 arm_status arm_cfft_radix4_init_f32( 02206 arm_cfft_radix4_instance_f32 * S, 02207 uint16_t fftLen, 02208 uint8_t ifftFlag, 02209 uint8_t bitReverseFlag); 02210 02211 /* Deprecated */ 02212 void arm_cfft_radix4_f32( 02213 const arm_cfft_radix4_instance_f32 * S, 02214 float32_t * pSrc); 02215 02216 /** 02217 * @brief Instance structure for the fixed-point CFFT/CIFFT function. 02218 */ 02219 02220 typedef struct 02221 { 02222 uint16_t fftLen; /**< length of the FFT. */ 02223 const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ 02224 const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 02225 uint16_t bitRevLength; /**< bit reversal table length. */ 02226 } arm_cfft_instance_q15; 02227 02228 void arm_cfft_q15( 02229 const arm_cfft_instance_q15 * S, 02230 q15_t * p1, 02231 uint8_t ifftFlag, 02232 uint8_t bitReverseFlag); 02233 02234 /** 02235 * @brief Instance structure for the fixed-point CFFT/CIFFT function. 02236 */ 02237 02238 typedef struct 02239 { 02240 uint16_t fftLen; /**< length of the FFT. */ 02241 const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ 02242 const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 02243 uint16_t bitRevLength; /**< bit reversal table length. */ 02244 } arm_cfft_instance_q31; 02245 02246 void arm_cfft_q31( 02247 const arm_cfft_instance_q31 * S, 02248 q31_t * p1, 02249 uint8_t ifftFlag, 02250 uint8_t bitReverseFlag); 02251 02252 /** 02253 * @brief Instance structure for the floating-point CFFT/CIFFT function. 02254 */ 02255 02256 typedef struct 02257 { 02258 uint16_t fftLen; /**< length of the FFT. */ 02259 const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ 02260 const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 02261 uint16_t bitRevLength; /**< bit reversal table length. */ 02262 } arm_cfft_instance_f32; 02263 02264 void arm_cfft_f32( 02265 const arm_cfft_instance_f32 * S, 02266 float32_t * p1, 02267 uint8_t ifftFlag, 02268 uint8_t bitReverseFlag); 02269 02270 /** 02271 * @brief Instance structure for the Q15 RFFT/RIFFT function. 02272 */ 02273 02274 typedef struct 02275 { 02276 uint32_t fftLenReal; /**< length of the real FFT. */ 02277 uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ 02278 uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ 02279 uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 02280 q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ 02281 q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ 02282 const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ 02283 } arm_rfft_instance_q15; 02284 02285 arm_status arm_rfft_init_q15( 02286 arm_rfft_instance_q15 * S, 02287 uint32_t fftLenReal, 02288 uint32_t ifftFlagR, 02289 uint32_t bitReverseFlag); 02290 02291 void arm_rfft_q15( 02292 const arm_rfft_instance_q15 * S, 02293 q15_t * pSrc, 02294 q15_t * pDst); 02295 02296 /** 02297 * @brief Instance structure for the Q31 RFFT/RIFFT function. 02298 */ 02299 02300 typedef struct 02301 { 02302 uint32_t fftLenReal; /**< length of the real FFT. */ 02303 uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ 02304 uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ 02305 uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 02306 q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ 02307 q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ 02308 const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ 02309 } arm_rfft_instance_q31; 02310 02311 arm_status arm_rfft_init_q31( 02312 arm_rfft_instance_q31 * S, 02313 uint32_t fftLenReal, 02314 uint32_t ifftFlagR, 02315 uint32_t bitReverseFlag); 02316 02317 void arm_rfft_q31( 02318 const arm_rfft_instance_q31 * S, 02319 q31_t * pSrc, 02320 q31_t * pDst); 02321 02322 /** 02323 * @brief Instance structure for the floating-point RFFT/RIFFT function. 02324 */ 02325 02326 typedef struct 02327 { 02328 uint32_t fftLenReal; /**< length of the real FFT. */ 02329 uint16_t fftLenBy2; /**< length of the complex FFT. */ 02330 uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ 02331 uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ 02332 uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 02333 float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ 02334 float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ 02335 arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ 02336 } arm_rfft_instance_f32; 02337 02338 arm_status arm_rfft_init_f32( 02339 arm_rfft_instance_f32 * S, 02340 arm_cfft_radix4_instance_f32 * S_CFFT, 02341 uint32_t fftLenReal, 02342 uint32_t ifftFlagR, 02343 uint32_t bitReverseFlag); 02344 02345 void arm_rfft_f32( 02346 const arm_rfft_instance_f32 * S, 02347 float32_t * pSrc, 02348 float32_t * pDst); 02349 02350 /** 02351 * @brief Instance structure for the floating-point RFFT/RIFFT function. 02352 */ 02353 02354 typedef struct 02355 { 02356 arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ 02357 uint16_t fftLenRFFT; /**< length of the real sequence */ 02358 float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ 02359 } arm_rfft_fast_instance_f32 ; 02360 02361 arm_status arm_rfft_fast_init_f32 ( 02362 arm_rfft_fast_instance_f32 * S, 02363 uint16_t fftLen); 02364 02365 void arm_rfft_fast_f32( 02366 arm_rfft_fast_instance_f32 * S, 02367 float32_t * p, float32_t * pOut, 02368 uint8_t ifftFlag); 02369 02370 /** 02371 * @brief Instance structure for the floating-point DCT4/IDCT4 function. 02372 */ 02373 02374 typedef struct 02375 { 02376 uint16_t N; /**< length of the DCT4. */ 02377 uint16_t Nby2; /**< half of the length of the DCT4. */ 02378 float32_t normalize; /**< normalizing factor. */ 02379 float32_t *pTwiddle; /**< points to the twiddle factor table. */ 02380 float32_t *pCosFactor; /**< points to the cosFactor table. */ 02381 arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ 02382 arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ 02383 } arm_dct4_instance_f32; 02384 02385 /** 02386 * @brief Initialization function for the floating-point DCT4/IDCT4. 02387 * @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure. 02388 * @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure. 02389 * @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure. 02390 * @param[in] N length of the DCT4. 02391 * @param[in] Nby2 half of the length of the DCT4. 02392 * @param[in] normalize normalizing factor. 02393 * @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. 02394 */ 02395 02396 arm_status arm_dct4_init_f32( 02397 arm_dct4_instance_f32 * S, 02398 arm_rfft_instance_f32 * S_RFFT, 02399 arm_cfft_radix4_instance_f32 * S_CFFT, 02400 uint16_t N, 02401 uint16_t Nby2, 02402 float32_t normalize); 02403 02404 /** 02405 * @brief Processing function for the floating-point DCT4/IDCT4. 02406 * @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure. 02407 * @param[in] *pState points to state buffer. 02408 * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. 02409 * @return none. 02410 */ 02411 02412 void arm_dct4_f32( 02413 const arm_dct4_instance_f32 * S, 02414 float32_t * pState, 02415 float32_t * pInlineBuffer); 02416 02417 /** 02418 * @brief Instance structure for the Q31 DCT4/IDCT4 function. 02419 */ 02420 02421 typedef struct 02422 { 02423 uint16_t N; /**< length of the DCT4. */ 02424 uint16_t Nby2; /**< half of the length of the DCT4. */ 02425 q31_t normalize; /**< normalizing factor. */ 02426 q31_t *pTwiddle; /**< points to the twiddle factor table. */ 02427 q31_t *pCosFactor; /**< points to the cosFactor table. */ 02428 arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ 02429 arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ 02430 } arm_dct4_instance_q31; 02431 02432 /** 02433 * @brief Initialization function for the Q31 DCT4/IDCT4. 02434 * @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure. 02435 * @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure 02436 * @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure 02437 * @param[in] N length of the DCT4. 02438 * @param[in] Nby2 half of the length of the DCT4. 02439 * @param[in] normalize normalizing factor. 02440 * @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. 02441 */ 02442 02443 arm_status arm_dct4_init_q31( 02444 arm_dct4_instance_q31 * S, 02445 arm_rfft_instance_q31 * S_RFFT, 02446 arm_cfft_radix4_instance_q31 * S_CFFT, 02447 uint16_t N, 02448 uint16_t Nby2, 02449 q31_t normalize); 02450 02451 /** 02452 * @brief Processing function for the Q31 DCT4/IDCT4. 02453 * @param[in] *S points to an instance of the Q31 DCT4 structure. 02454 * @param[in] *pState points to state buffer. 02455 * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. 02456 * @return none. 02457 */ 02458 02459 void arm_dct4_q31( 02460 const arm_dct4_instance_q31 * S, 02461 q31_t * pState, 02462 q31_t * pInlineBuffer); 02463 02464 /** 02465 * @brief Instance structure for the Q15 DCT4/IDCT4 function. 02466 */ 02467 02468 typedef struct 02469 { 02470 uint16_t N; /**< length of the DCT4. */ 02471 uint16_t Nby2; /**< half of the length of the DCT4. */ 02472 q15_t normalize; /**< normalizing factor. */ 02473 q15_t *pTwiddle; /**< points to the twiddle factor table. */ 02474 q15_t *pCosFactor; /**< points to the cosFactor table. */ 02475 arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ 02476 arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ 02477 } arm_dct4_instance_q15; 02478 02479 /** 02480 * @brief Initialization function for the Q15 DCT4/IDCT4. 02481 * @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure. 02482 * @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure. 02483 * @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure. 02484 * @param[in] N length of the DCT4. 02485 * @param[in] Nby2 half of the length of the DCT4. 02486 * @param[in] normalize normalizing factor. 02487 * @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. 02488 */ 02489 02490 arm_status arm_dct4_init_q15( 02491 arm_dct4_instance_q15 * S, 02492 arm_rfft_instance_q15 * S_RFFT, 02493 arm_cfft_radix4_instance_q15 * S_CFFT, 02494 uint16_t N, 02495 uint16_t Nby2, 02496 q15_t normalize); 02497 02498 /** 02499 * @brief Processing function for the Q15 DCT4/IDCT4. 02500 * @param[in] *S points to an instance of the Q15 DCT4 structure. 02501 * @param[in] *pState points to state buffer. 02502 * @param[in,out] *pInlineBuffer points to the in-place input and output buffer. 02503 * @return none. 02504 */ 02505 02506 void arm_dct4_q15( 02507 const arm_dct4_instance_q15 * S, 02508 q15_t * pState, 02509 q15_t * pInlineBuffer); 02510 02511 /** 02512 * @brief Floating-point vector addition. 02513 * @param[in] *pSrcA points to the first input vector 02514 * @param[in] *pSrcB points to the second input vector 02515 * @param[out] *pDst points to the output vector 02516 * @param[in] blockSize number of samples in each vector 02517 * @return none. 02518 */ 02519 02520 void arm_add_f32( 02521 float32_t * pSrcA, 02522 float32_t * pSrcB, 02523 float32_t * pDst, 02524 uint32_t blockSize); 02525 02526 /** 02527 * @brief Q7 vector addition. 02528 * @param[in] *pSrcA points to the first input vector 02529 * @param[in] *pSrcB points to the second input vector 02530 * @param[out] *pDst points to the output vector 02531 * @param[in] blockSize number of samples in each vector 02532 * @return none. 02533 */ 02534 02535 void arm_add_q7( 02536 q7_t * pSrcA, 02537 q7_t * pSrcB, 02538 q7_t * pDst, 02539 uint32_t blockSize); 02540 02541 /** 02542 * @brief Q15 vector addition. 02543 * @param[in] *pSrcA points to the first input vector 02544 * @param[in] *pSrcB points to the second input vector 02545 * @param[out] *pDst points to the output vector 02546 * @param[in] blockSize number of samples in each vector 02547 * @return none. 02548 */ 02549 02550 void arm_add_q15( 02551 q15_t * pSrcA, 02552 q15_t * pSrcB, 02553 q15_t * pDst, 02554 uint32_t blockSize); 02555 02556 /** 02557 * @brief Q31 vector addition. 02558 * @param[in] *pSrcA points to the first input vector 02559 * @param[in] *pSrcB points to the second input vector 02560 * @param[out] *pDst points to the output vector 02561 * @param[in] blockSize number of samples in each vector 02562 * @return none. 02563 */ 02564 02565 void arm_add_q31( 02566 q31_t * pSrcA, 02567 q31_t * pSrcB, 02568 q31_t * pDst, 02569 uint32_t blockSize); 02570 02571 /** 02572 * @brief Floating-point vector subtraction. 02573 * @param[in] *pSrcA points to the first input vector 02574 * @param[in] *pSrcB points to the second input vector 02575 * @param[out] *pDst points to the output vector 02576 * @param[in] blockSize number of samples in each vector 02577 * @return none. 02578 */ 02579 02580 void arm_sub_f32( 02581 float32_t * pSrcA, 02582 float32_t * pSrcB, 02583 float32_t * pDst, 02584 uint32_t blockSize); 02585 02586 /** 02587 * @brief Q7 vector subtraction. 02588 * @param[in] *pSrcA points to the first input vector 02589 * @param[in] *pSrcB points to the second input vector 02590 * @param[out] *pDst points to the output vector 02591 * @param[in] blockSize number of samples in each vector 02592 * @return none. 02593 */ 02594 02595 void arm_sub_q7( 02596 q7_t * pSrcA, 02597 q7_t * pSrcB, 02598 q7_t * pDst, 02599 uint32_t blockSize); 02600 02601 /** 02602 * @brief Q15 vector subtraction. 02603 * @param[in] *pSrcA points to the first input vector 02604 * @param[in] *pSrcB points to the second input vector 02605 * @param[out] *pDst points to the output vector 02606 * @param[in] blockSize number of samples in each vector 02607 * @return none. 02608 */ 02609 02610 void arm_sub_q15( 02611 q15_t * pSrcA, 02612 q15_t * pSrcB, 02613 q15_t * pDst, 02614 uint32_t blockSize); 02615 02616 /** 02617 * @brief Q31 vector subtraction. 02618 * @param[in] *pSrcA points to the first input vector 02619 * @param[in] *pSrcB points to the second input vector 02620 * @param[out] *pDst points to the output vector 02621 * @param[in] blockSize number of samples in each vector 02622 * @return none. 02623 */ 02624 02625 void arm_sub_q31( 02626 q31_t * pSrcA, 02627 q31_t * pSrcB, 02628 q31_t * pDst, 02629 uint32_t blockSize); 02630 02631 /** 02632 * @brief Multiplies a floating-point vector by a scalar. 02633 * @param[in] *pSrc points to the input vector 02634 * @param[in] scale scale factor to be applied 02635 * @param[out] *pDst points to the output vector 02636 * @param[in] blockSize number of samples in the vector 02637 * @return none. 02638 */ 02639 02640 void arm_scale_f32( 02641 float32_t * pSrc, 02642 float32_t scale, 02643 float32_t * pDst, 02644 uint32_t blockSize); 02645 02646 /** 02647 * @brief Multiplies a Q7 vector by a scalar. 02648 * @param[in] *pSrc points to the input vector 02649 * @param[in] scaleFract fractional portion of the scale value 02650 * @param[in] shift number of bits to shift the result by 02651 * @param[out] *pDst points to the output vector 02652 * @param[in] blockSize number of samples in the vector 02653 * @return none. 02654 */ 02655 02656 void arm_scale_q7( 02657 q7_t * pSrc, 02658 q7_t scaleFract, 02659 int8_t shift, 02660 q7_t * pDst, 02661 uint32_t blockSize); 02662 02663 /** 02664 * @brief Multiplies a Q15 vector by a scalar. 02665 * @param[in] *pSrc points to the input vector 02666 * @param[in] scaleFract fractional portion of the scale value 02667 * @param[in] shift number of bits to shift the result by 02668 * @param[out] *pDst points to the output vector 02669 * @param[in] blockSize number of samples in the vector 02670 * @return none. 02671 */ 02672 02673 void arm_scale_q15( 02674 q15_t * pSrc, 02675 q15_t scaleFract, 02676 int8_t shift, 02677 q15_t * pDst, 02678 uint32_t blockSize); 02679 02680 /** 02681 * @brief Multiplies a Q31 vector by a scalar. 02682 * @param[in] *pSrc points to the input vector 02683 * @param[in] scaleFract fractional portion of the scale value 02684 * @param[in] shift number of bits to shift the result by 02685 * @param[out] *pDst points to the output vector 02686 * @param[in] blockSize number of samples in the vector 02687 * @return none. 02688 */ 02689 02690 void arm_scale_q31( 02691 q31_t * pSrc, 02692 q31_t scaleFract, 02693 int8_t shift, 02694 q31_t * pDst, 02695 uint32_t blockSize); 02696 02697 /** 02698 * @brief Q7 vector absolute value. 02699 * @param[in] *pSrc points to the input buffer 02700 * @param[out] *pDst points to the output buffer 02701 * @param[in] blockSize number of samples in each vector 02702 * @return none. 02703 */ 02704 02705 void arm_abs_q7( 02706 q7_t * pSrc, 02707 q7_t * pDst, 02708 uint32_t blockSize); 02709 02710 /** 02711 * @brief Floating-point vector absolute value. 02712 * @param[in] *pSrc points to the input buffer 02713 * @param[out] *pDst points to the output buffer 02714 * @param[in] blockSize number of samples in each vector 02715 * @return none. 02716 */ 02717 02718 void arm_abs_f32( 02719 float32_t * pSrc, 02720 float32_t * pDst, 02721 uint32_t blockSize); 02722 02723 /** 02724 * @brief Q15 vector absolute value. 02725 * @param[in] *pSrc points to the input buffer 02726 * @param[out] *pDst points to the output buffer 02727 * @param[in] blockSize number of samples in each vector 02728 * @return none. 02729 */ 02730 02731 void arm_abs_q15( 02732 q15_t * pSrc, 02733 q15_t * pDst, 02734 uint32_t blockSize); 02735 02736 /** 02737 * @brief Q31 vector absolute value. 02738 * @param[in] *pSrc points to the input buffer 02739 * @param[out] *pDst points to the output buffer 02740 * @param[in] blockSize number of samples in each vector 02741 * @return none. 02742 */ 02743 02744 void arm_abs_q31( 02745 q31_t * pSrc, 02746 q31_t * pDst, 02747 uint32_t blockSize); 02748 02749 /** 02750 * @brief Dot product of floating-point vectors. 02751 * @param[in] *pSrcA points to the first input vector 02752 * @param[in] *pSrcB points to the second input vector 02753 * @param[in] blockSize number of samples in each vector 02754 * @param[out] *result output result returned here 02755 * @return none. 02756 */ 02757 02758 void arm_dot_prod_f32( 02759 float32_t * pSrcA, 02760 float32_t * pSrcB, 02761 uint32_t blockSize, 02762 float32_t * result); 02763 02764 /** 02765 * @brief Dot product of Q7 vectors. 02766 * @param[in] *pSrcA points to the first input vector 02767 * @param[in] *pSrcB points to the second input vector 02768 * @param[in] blockSize number of samples in each vector 02769 * @param[out] *result output result returned here 02770 * @return none. 02771 */ 02772 02773 void arm_dot_prod_q7( 02774 q7_t * pSrcA, 02775 q7_t * pSrcB, 02776 uint32_t blockSize, 02777 q31_t * result); 02778 02779 /** 02780 * @brief Dot product of Q15 vectors. 02781 * @param[in] *pSrcA points to the first input vector 02782 * @param[in] *pSrcB points to the second input vector 02783 * @param[in] blockSize number of samples in each vector 02784 * @param[out] *result output result returned here 02785 * @return none. 02786 */ 02787 02788 void arm_dot_prod_q15( 02789 q15_t * pSrcA, 02790 q15_t * pSrcB, 02791 uint32_t blockSize, 02792 q63_t * result); 02793 02794 /** 02795 * @brief Dot product of Q31 vectors. 02796 * @param[in] *pSrcA points to the first input vector 02797 * @param[in] *pSrcB points to the second input vector 02798 * @param[in] blockSize number of samples in each vector 02799 * @param[out] *result output result returned here 02800 * @return none. 02801 */ 02802 02803 void arm_dot_prod_q31( 02804 q31_t * pSrcA, 02805 q31_t * pSrcB, 02806 uint32_t blockSize, 02807 q63_t * result); 02808 02809 /** 02810 * @brief Shifts the elements of a Q7 vector a specified number of bits. 02811 * @param[in] *pSrc points to the input vector 02812 * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. 02813 * @param[out] *pDst points to the output vector 02814 * @param[in] blockSize number of samples in the vector 02815 * @return none. 02816 */ 02817 02818 void arm_shift_q7( 02819 q7_t * pSrc, 02820 int8_t shiftBits, 02821 q7_t * pDst, 02822 uint32_t blockSize); 02823 02824 /** 02825 * @brief Shifts the elements of a Q15 vector a specified number of bits. 02826 * @param[in] *pSrc points to the input vector 02827 * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. 02828 * @param[out] *pDst points to the output vector 02829 * @param[in] blockSize number of samples in the vector 02830 * @return none. 02831 */ 02832 02833 void arm_shift_q15( 02834 q15_t * pSrc, 02835 int8_t shiftBits, 02836 q15_t * pDst, 02837 uint32_t blockSize); 02838 02839 /** 02840 * @brief Shifts the elements of a Q31 vector a specified number of bits. 02841 * @param[in] *pSrc points to the input vector 02842 * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. 02843 * @param[out] *pDst points to the output vector 02844 * @param[in] blockSize number of samples in the vector 02845 * @return none. 02846 */ 02847 02848 void arm_shift_q31( 02849 q31_t * pSrc, 02850 int8_t shiftBits, 02851 q31_t * pDst, 02852 uint32_t blockSize); 02853 02854 /** 02855 * @brief Adds a constant offset to a floating-point vector. 02856 * @param[in] *pSrc points to the input vector 02857 * @param[in] offset is the offset to be added 02858 * @param[out] *pDst points to the output vector 02859 * @param[in] blockSize number of samples in the vector 02860 * @return none. 02861 */ 02862 02863 void arm_offset_f32( 02864 float32_t * pSrc, 02865 float32_t offset, 02866 float32_t * pDst, 02867 uint32_t blockSize); 02868 02869 /** 02870 * @brief Adds a constant offset to a Q7 vector. 02871 * @param[in] *pSrc points to the input vector 02872 * @param[in] offset is the offset to be added 02873 * @param[out] *pDst points to the output vector 02874 * @param[in] blockSize number of samples in the vector 02875 * @return none. 02876 */ 02877 02878 void arm_offset_q7( 02879 q7_t * pSrc, 02880 q7_t offset, 02881 q7_t * pDst, 02882 uint32_t blockSize); 02883 02884 /** 02885 * @brief Adds a constant offset to a Q15 vector. 02886 * @param[in] *pSrc points to the input vector 02887 * @param[in] offset is the offset to be added 02888 * @param[out] *pDst points to the output vector 02889 * @param[in] blockSize number of samples in the vector 02890 * @return none. 02891 */ 02892 02893 void arm_offset_q15( 02894 q15_t * pSrc, 02895 q15_t offset, 02896 q15_t * pDst, 02897 uint32_t blockSize); 02898 02899 /** 02900 * @brief Adds a constant offset to a Q31 vector. 02901 * @param[in] *pSrc points to the input vector 02902 * @param[in] offset is the offset to be added 02903 * @param[out] *pDst points to the output vector 02904 * @param[in] blockSize number of samples in the vector 02905 * @return none. 02906 */ 02907 02908 void arm_offset_q31( 02909 q31_t * pSrc, 02910 q31_t offset, 02911 q31_t * pDst, 02912 uint32_t blockSize); 02913 02914 /** 02915 * @brief Negates the elements of a floating-point vector. 02916 * @param[in] *pSrc points to the input vector 02917 * @param[out] *pDst points to the output vector 02918 * @param[in] blockSize number of samples in the vector 02919 * @return none. 02920 */ 02921 02922 void arm_negate_f32( 02923 float32_t * pSrc, 02924 float32_t * pDst, 02925 uint32_t blockSize); 02926 02927 /** 02928 * @brief Negates the elements of a Q7 vector. 02929 * @param[in] *pSrc points to the input vector 02930 * @param[out] *pDst points to the output vector 02931 * @param[in] blockSize number of samples in the vector 02932 * @return none. 02933 */ 02934 02935 void arm_negate_q7( 02936 q7_t * pSrc, 02937 q7_t * pDst, 02938 uint32_t blockSize); 02939 02940 /** 02941 * @brief Negates the elements of a Q15 vector. 02942 * @param[in] *pSrc points to the input vector 02943 * @param[out] *pDst points to the output vector 02944 * @param[in] blockSize number of samples in the vector 02945 * @return none. 02946 */ 02947 02948 void arm_negate_q15( 02949 q15_t * pSrc, 02950 q15_t * pDst, 02951 uint32_t blockSize); 02952 02953 /** 02954 * @brief Negates the elements of a Q31 vector. 02955 * @param[in] *pSrc points to the input vector 02956 * @param[out] *pDst points to the output vector 02957 * @param[in] blockSize number of samples in the vector 02958 * @return none. 02959 */ 02960 02961 void arm_negate_q31( 02962 q31_t * pSrc, 02963 q31_t * pDst, 02964 uint32_t blockSize); 02965 /** 02966 * @brief Copies the elements of a floating-point vector. 02967 * @param[in] *pSrc input pointer 02968 * @param[out] *pDst output pointer 02969 * @param[in] blockSize number of samples to process 02970 * @return none. 02971 */ 02972 void arm_copy_f32( 02973 float32_t * pSrc, 02974 float32_t * pDst, 02975 uint32_t blockSize); 02976 02977 /** 02978 * @brief Copies the elements of a Q7 vector. 02979 * @param[in] *pSrc input pointer 02980 * @param[out] *pDst output pointer 02981 * @param[in] blockSize number of samples to process 02982 * @return none. 02983 */ 02984 void arm_copy_q7( 02985 q7_t * pSrc, 02986 q7_t * pDst, 02987 uint32_t blockSize); 02988 02989 /** 02990 * @brief Copies the elements of a Q15 vector. 02991 * @param[in] *pSrc input pointer 02992 * @param[out] *pDst output pointer 02993 * @param[in] blockSize number of samples to process 02994 * @return none. 02995 */ 02996 void arm_copy_q15( 02997 q15_t * pSrc, 02998 q15_t * pDst, 02999 uint32_t blockSize); 03000 03001 /** 03002 * @brief Copies the elements of a Q31 vector. 03003 * @param[in] *pSrc input pointer 03004 * @param[out] *pDst output pointer 03005 * @param[in] blockSize number of samples to process 03006 * @return none. 03007 */ 03008 void arm_copy_q31( 03009 q31_t * pSrc, 03010 q31_t * pDst, 03011 uint32_t blockSize); 03012 /** 03013 * @brief Fills a constant value into a floating-point vector. 03014 * @param[in] value input value to be filled 03015 * @param[out] *pDst output pointer 03016 * @param[in] blockSize number of samples to process 03017 * @return none. 03018 */ 03019 void arm_fill_f32( 03020 float32_t value, 03021 float32_t * pDst, 03022 uint32_t blockSize); 03023 03024 /** 03025 * @brief Fills a constant value into a Q7 vector. 03026 * @param[in] value input value to be filled 03027 * @param[out] *pDst output pointer 03028 * @param[in] blockSize number of samples to process 03029 * @return none. 03030 */ 03031 void arm_fill_q7( 03032 q7_t value, 03033 q7_t * pDst, 03034 uint32_t blockSize); 03035 03036 /** 03037 * @brief Fills a constant value into a Q15 vector. 03038 * @param[in] value input value to be filled 03039 * @param[out] *pDst output pointer 03040 * @param[in] blockSize number of samples to process 03041 * @return none. 03042 */ 03043 void arm_fill_q15( 03044 q15_t value, 03045 q15_t * pDst, 03046 uint32_t blockSize); 03047 03048 /** 03049 * @brief Fills a constant value into a Q31 vector. 03050 * @param[in] value input value to be filled 03051 * @param[out] *pDst output pointer 03052 * @param[in] blockSize number of samples to process 03053 * @return none. 03054 */ 03055 void arm_fill_q31( 03056 q31_t value, 03057 q31_t * pDst, 03058 uint32_t blockSize); 03059 03060 /** 03061 * @brief Convolution of floating-point sequences. 03062 * @param[in] *pSrcA points to the first input sequence. 03063 * @param[in] srcALen length of the first input sequence. 03064 * @param[in] *pSrcB points to the second input sequence. 03065 * @param[in] srcBLen length of the second input sequence. 03066 * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. 03067 * @return none. 03068 */ 03069 03070 void arm_conv_f32( 03071 float32_t * pSrcA, 03072 uint32_t srcALen, 03073 float32_t * pSrcB, 03074 uint32_t srcBLen, 03075 float32_t * pDst); 03076 03077 03078 /** 03079 * @brief Convolution of Q15 sequences. 03080 * @param[in] *pSrcA points to the first input sequence. 03081 * @param[in] srcALen length of the first input sequence. 03082 * @param[in] *pSrcB points to the second input sequence. 03083 * @param[in] srcBLen length of the second input sequence. 03084 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. 03085 * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. 03086 * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). 03087 * @return none. 03088 */ 03089 03090 03091 void arm_conv_opt_q15( 03092 q15_t * pSrcA, 03093 uint32_t srcALen, 03094 q15_t * pSrcB, 03095 uint32_t srcBLen, 03096 q15_t * pDst, 03097 q15_t * pScratch1, 03098 q15_t * pScratch2); 03099 03100 03101 /** 03102 * @brief Convolution of Q15 sequences. 03103 * @param[in] *pSrcA points to the first input sequence. 03104 * @param[in] srcALen length of the first input sequence. 03105 * @param[in] *pSrcB points to the second input sequence. 03106 * @param[in] srcBLen length of the second input sequence. 03107 * @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. 03108 * @return none. 03109 */ 03110 03111 void arm_conv_q15( 03112 q15_t * pSrcA, 03113 uint32_t srcALen, 03114 q15_t * pSrcB, 03115 uint32_t srcBLen, 03116 q15_t * pDst); 03117 03118 /** 03119 * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 03120 * @param[in] *pSrcA points to the first input sequence. 03121 * @param[in] srcALen length of the first input sequence. 03122 * @param[in] *pSrcB points to the second input sequence. 03123 * @param[in] srcBLen length of the second input sequence. 03124 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. 03125 * @return none. 03126 */ 03127 03128 void arm_conv_fast_q15( 03129 q15_t * pSrcA, 03130 uint32_t srcALen, 03131 q15_t * pSrcB, 03132 uint32_t srcBLen, 03133 q15_t * pDst); 03134 03135 /** 03136 * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 03137 * @param[in] *pSrcA points to the first input sequence. 03138 * @param[in] srcALen length of the first input sequence. 03139 * @param[in] *pSrcB points to the second input sequence. 03140 * @param[in] srcBLen length of the second input sequence. 03141 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. 03142 * @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. 03143 * @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen). 03144 * @return none. 03145 */ 03146 03147 void arm_conv_fast_opt_q15( 03148 q15_t * pSrcA, 03149 uint32_t srcALen, 03150 q15_t * pSrcB, 03151 uint32_t srcBLen, 03152 q15_t * pDst, 03153 q15_t * pScratch1, 03154 q15_t * pScratch2); 03155 03156 03157 03158 /** 03159 * @brief Convolution of Q31 sequences. 03160 * @param[in] *pSrcA points to the first input sequence. 03161 * @param[in] srcALen length of the first input sequence. 03162 * @param[in] *pSrcB points to the second input sequence. 03163 * @param[in] srcBLen length of the second input sequence. 03164 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. 03165 * @return none. 03166 */ 03167 03168 void arm_conv_q31( 03169 q31_t * pSrcA, 03170 uint32_t srcALen, 03171 q31_t * pSrcB, 03172 uint32_t srcBLen, 03173 q31_t * pDst); 03174 03175 /** 03176 * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 03177 * @param[in] *pSrcA points to the first input sequence. 03178 * @param[in] srcALen length of the first input sequence. 03179 * @param[in] *pSrcB points to the second input sequence. 03180 * @param[in] srcBLen length of the second input sequence. 03181 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. 03182 * @return none. 03183 */ 03184 03185 void arm_conv_fast_q31( 03186 q31_t * pSrcA, 03187 uint32_t srcALen, 03188 q31_t * pSrcB, 03189 uint32_t srcBLen, 03190 q31_t * pDst); 03191 03192 03193 /** 03194 * @brief Convolution of Q7 sequences. 03195 * @param[in] *pSrcA points to the first input sequence. 03196 * @param[in] srcALen length of the first input sequence. 03197 * @param[in] *pSrcB points to the second input sequence. 03198 * @param[in] srcBLen length of the second input sequence. 03199 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. 03200 * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. 03201 * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). 03202 * @return none. 03203 */ 03204 03205 void arm_conv_opt_q7( 03206 q7_t * pSrcA, 03207 uint32_t srcALen, 03208 q7_t * pSrcB, 03209 uint32_t srcBLen, 03210 q7_t * pDst, 03211 q15_t * pScratch1, 03212 q15_t * pScratch2); 03213 03214 03215 03216 /** 03217 * @brief Convolution of Q7 sequences. 03218 * @param[in] *pSrcA points to the first input sequence. 03219 * @param[in] srcALen length of the first input sequence. 03220 * @param[in] *pSrcB points to the second input sequence. 03221 * @param[in] srcBLen length of the second input sequence. 03222 * @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. 03223 * @return none. 03224 */ 03225 03226 void arm_conv_q7( 03227 q7_t * pSrcA, 03228 uint32_t srcALen, 03229 q7_t * pSrcB, 03230 uint32_t srcBLen, 03231 q7_t * pDst); 03232 03233 03234 /** 03235 * @brief Partial convolution of floating-point sequences. 03236 * @param[in] *pSrcA points to the first input sequence. 03237 * @param[in] srcALen length of the first input sequence. 03238 * @param[in] *pSrcB points to the second input sequence. 03239 * @param[in] srcBLen length of the second input sequence. 03240 * @param[out] *pDst points to the block of output data 03241 * @param[in] firstIndex is the first output sample to start with. 03242 * @param[in] numPoints is the number of output points to be computed. 03243 * @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]. 03244 */ 03245 03246 arm_status arm_conv_partial_f32( 03247 float32_t * pSrcA, 03248 uint32_t srcALen, 03249 float32_t * pSrcB, 03250 uint32_t srcBLen, 03251 float32_t * pDst, 03252 uint32_t firstIndex, 03253 uint32_t numPoints); 03254 03255 /** 03256 * @brief Partial convolution of Q15 sequences. 03257 * @param[in] *pSrcA points to the first input sequence. 03258 * @param[in] srcALen length of the first input sequence. 03259 * @param[in] *pSrcB points to the second input sequence. 03260 * @param[in] srcBLen length of the second input sequence. 03261 * @param[out] *pDst points to the block of output data 03262 * @param[in] firstIndex is the first output sample to start with. 03263 * @param[in] numPoints is the number of output points to be computed. 03264 * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. 03265 * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen). 03266 * @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]. 03267 */ 03268 03269 arm_status arm_conv_partial_opt_q15( 03270 q15_t * pSrcA, 03271 uint32_t srcALen, 03272 q15_t * pSrcB, 03273 uint32_t srcBLen, 03274 q15_t * pDst, 03275 uint32_t firstIndex, 03276 uint32_t numPoints, 03277 q15_t * pScratch1, 03278 q15_t * pScratch2); 03279 03280 03281 /** 03282 * @brief Partial convolution of Q15 sequences. 03283 * @param[in] *pSrcA points to the first input sequence. 03284 * @param[in] srcALen length of the first input sequence. 03285 * @param[in] *pSrcB points to the second input sequence. 03286 * @param[in] srcBLen length of the second input sequence. 03287 * @param[out] *pDst points to the block of output data 03288 * @param[in] firstIndex is the first output sample to start with. 03289 * @param[in] numPoints is the number of output points to be computed. 03290 * @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]. 03291 */ 03292 03293 arm_status arm_conv_partial_q15( 03294 q15_t * pSrcA, 03295 uint32_t srcALen, 03296 q15_t * pSrcB, 03297 uint32_t srcBLen, 03298 q15_t * pDst, 03299 uint32_t firstIndex, 03300 uint32_t numPoints); 03301 03302 /** 03303 * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 03304 * @param[in] *pSrcA points to the first input sequence. 03305 * @param[in] srcALen length of the first input sequence. 03306 * @param[in] *pSrcB points to the second input sequence. 03307 * @param[in] srcBLen length of the second input sequence. 03308 * @param[out] *pDst points to the block of output data 03309 * @param[in] firstIndex is the first output sample to start with. 03310 * @param[in] numPoints is the number of output points to be computed. 03311 * @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]. 03312 */ 03313 03314 arm_status arm_conv_partial_fast_q15( 03315 q15_t * pSrcA, 03316 uint32_t srcALen, 03317 q15_t * pSrcB, 03318 uint32_t srcBLen, 03319 q15_t * pDst, 03320 uint32_t firstIndex, 03321 uint32_t numPoints); 03322 03323 03324 /** 03325 * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 03326 * @param[in] *pSrcA points to the first input sequence. 03327 * @param[in] srcALen length of the first input sequence. 03328 * @param[in] *pSrcB points to the second input sequence. 03329 * @param[in] srcBLen length of the second input sequence. 03330 * @param[out] *pDst points to the block of output data 03331 * @param[in] firstIndex is the first output sample to start with. 03332 * @param[in] numPoints is the number of output points to be computed. 03333 * @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. 03334 * @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen). 03335 * @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]. 03336 */ 03337 03338 arm_status arm_conv_partial_fast_opt_q15( 03339 q15_t * pSrcA, 03340 uint32_t srcALen, 03341 q15_t * pSrcB, 03342 uint32_t srcBLen, 03343 q15_t * pDst, 03344 uint32_t firstIndex, 03345 uint32_t numPoints, 03346 q15_t * pScratch1, 03347 q15_t * pScratch2); 03348 03349 03350 /** 03351 * @brief Partial convolution of Q31 sequences. 03352 * @param[in] *pSrcA points to the first input sequence. 03353 * @param[in] srcALen length of the first input sequence. 03354 * @param[in] *pSrcB points to the second input sequence. 03355 * @param[in] srcBLen length of the second input sequence. 03356 * @param[out] *pDst points to the block of output data 03357 * @param[in] firstIndex is the first output sample to start with. 03358 * @param[in] numPoints is the number of output points to be computed. 03359 * @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]. 03360 */ 03361 03362 arm_status arm_conv_partial_q31( 03363 q31_t * pSrcA, 03364 uint32_t srcALen, 03365 q31_t * pSrcB, 03366 uint32_t srcBLen, 03367 q31_t * pDst, 03368 uint32_t firstIndex, 03369 uint32_t numPoints); 03370 03371 03372 /** 03373 * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 03374 * @param[in] *pSrcA points to the first input sequence. 03375 * @param[in] srcALen length of the first input sequence. 03376 * @param[in] *pSrcB points to the second input sequence. 03377 * @param[in] srcBLen length of the second input sequence. 03378 * @param[out] *pDst points to the block of output data 03379 * @param[in] firstIndex is the first output sample to start with. 03380 * @param[in] numPoints is the number of output points to be computed. 03381 * @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]. 03382 */ 03383 03384 arm_status arm_conv_partial_fast_q31( 03385 q31_t * pSrcA, 03386 uint32_t srcALen, 03387 q31_t * pSrcB, 03388 uint32_t srcBLen, 03389 q31_t * pDst, 03390 uint32_t firstIndex, 03391 uint32_t numPoints); 03392 03393 03394 /** 03395 * @brief Partial convolution of Q7 sequences 03396 * @param[in] *pSrcA points to the first input sequence. 03397 * @param[in] srcALen length of the first input sequence. 03398 * @param[in] *pSrcB points to the second input sequence. 03399 * @param[in] srcBLen length of the second input sequence. 03400 * @param[out] *pDst points to the block of output data 03401 * @param[in] firstIndex is the first output sample to start with. 03402 * @param[in] numPoints is the number of output points to be computed. 03403 * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. 03404 * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). 03405 * @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]. 03406 */ 03407 03408 arm_status arm_conv_partial_opt_q7( 03409 q7_t * pSrcA, 03410 uint32_t srcALen, 03411 q7_t * pSrcB, 03412 uint32_t srcBLen, 03413 q7_t * pDst, 03414 uint32_t firstIndex, 03415 uint32_t numPoints, 03416 q15_t * pScratch1, 03417 q15_t * pScratch2); 03418 03419 03420 /** 03421 * @brief Partial convolution of Q7 sequences. 03422 * @param[in] *pSrcA points to the first input sequence. 03423 * @param[in] srcALen length of the first input sequence. 03424 * @param[in] *pSrcB points to the second input sequence. 03425 * @param[in] srcBLen length of the second input sequence. 03426 * @param[out] *pDst points to the block of output data 03427 * @param[in] firstIndex is the first output sample to start with. 03428 * @param[in] numPoints is the number of output points to be computed. 03429 * @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]. 03430 */ 03431 03432 arm_status arm_conv_partial_q7( 03433 q7_t * pSrcA, 03434 uint32_t srcALen, 03435 q7_t * pSrcB, 03436 uint32_t srcBLen, 03437 q7_t * pDst, 03438 uint32_t firstIndex, 03439 uint32_t numPoints); 03440 03441 03442 03443 /** 03444 * @brief Instance structure for the Q15 FIR decimator. 03445 */ 03446 03447 typedef struct 03448 { 03449 uint8_t M; /**< decimation factor. */ 03450 uint16_t numTaps; /**< number of coefficients in the filter. */ 03451 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ 03452 q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 03453 } arm_fir_decimate_instance_q15; 03454 03455 /** 03456 * @brief Instance structure for the Q31 FIR decimator. 03457 */ 03458 03459 typedef struct 03460 { 03461 uint8_t M; /**< decimation factor. */ 03462 uint16_t numTaps; /**< number of coefficients in the filter. */ 03463 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ 03464 q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 03465 03466 } arm_fir_decimate_instance_q31; 03467 03468 /** 03469 * @brief Instance structure for the floating-point FIR decimator. 03470 */ 03471 03472 typedef struct 03473 { 03474 uint8_t M; /**< decimation factor. */ 03475 uint16_t numTaps; /**< number of coefficients in the filter. */ 03476 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ 03477 float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 03478 03479 } arm_fir_decimate_instance_f32; 03480 03481 03482 03483 /** 03484 * @brief Processing function for the floating-point FIR decimator. 03485 * @param[in] *S points to an instance of the floating-point FIR decimator structure. 03486 * @param[in] *pSrc points to the block of input data. 03487 * @param[out] *pDst points to the block of output data 03488 * @param[in] blockSize number of input samples to process per call. 03489 * @return none 03490 */ 03491 03492 void arm_fir_decimate_f32( 03493 const arm_fir_decimate_instance_f32 * S, 03494 float32_t * pSrc, 03495 float32_t * pDst, 03496 uint32_t blockSize); 03497 03498 03499 /** 03500 * @brief Initialization function for the floating-point FIR decimator. 03501 * @param[in,out] *S points to an instance of the floating-point FIR decimator structure. 03502 * @param[in] numTaps number of coefficients in the filter. 03503 * @param[in] M decimation factor. 03504 * @param[in] *pCoeffs points to the filter coefficients. 03505 * @param[in] *pState points to the state buffer. 03506 * @param[in] blockSize number of input samples to process per call. 03507 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if 03508 * <code>blockSize</code> is not a multiple of <code>M</code>. 03509 */ 03510 03511 arm_status arm_fir_decimate_init_f32( 03512 arm_fir_decimate_instance_f32 * S, 03513 uint16_t numTaps, 03514 uint8_t M, 03515 float32_t * pCoeffs, 03516 float32_t * pState, 03517 uint32_t blockSize); 03518 03519 /** 03520 * @brief Processing function for the Q15 FIR decimator. 03521 * @param[in] *S points to an instance of the Q15 FIR decimator structure. 03522 * @param[in] *pSrc points to the block of input data. 03523 * @param[out] *pDst points to the block of output data 03524 * @param[in] blockSize number of input samples to process per call. 03525 * @return none 03526 */ 03527 03528 void arm_fir_decimate_q15( 03529 const arm_fir_decimate_instance_q15 * S, 03530 q15_t * pSrc, 03531 q15_t * pDst, 03532 uint32_t blockSize); 03533 03534 /** 03535 * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. 03536 * @param[in] *S points to an instance of the Q15 FIR decimator structure. 03537 * @param[in] *pSrc points to the block of input data. 03538 * @param[out] *pDst points to the block of output data 03539 * @param[in] blockSize number of input samples to process per call. 03540 * @return none 03541 */ 03542 03543 void arm_fir_decimate_fast_q15( 03544 const arm_fir_decimate_instance_q15 * S, 03545 q15_t * pSrc, 03546 q15_t * pDst, 03547 uint32_t blockSize); 03548 03549 03550 03551 /** 03552 * @brief Initialization function for the Q15 FIR decimator. 03553 * @param[in,out] *S points to an instance of the Q15 FIR decimator structure. 03554 * @param[in] numTaps number of coefficients in the filter. 03555 * @param[in] M decimation factor. 03556 * @param[in] *pCoeffs points to the filter coefficients. 03557 * @param[in] *pState points to the state buffer. 03558 * @param[in] blockSize number of input samples to process per call. 03559 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if 03560 * <code>blockSize</code> is not a multiple of <code>M</code>. 03561 */ 03562 03563 arm_status arm_fir_decimate_init_q15( 03564 arm_fir_decimate_instance_q15 * S, 03565 uint16_t numTaps, 03566 uint8_t M, 03567 q15_t * pCoeffs, 03568 q15_t * pState, 03569 uint32_t blockSize); 03570 03571 /** 03572 * @brief Processing function for the Q31 FIR decimator. 03573 * @param[in] *S points to an instance of the Q31 FIR decimator structure. 03574 * @param[in] *pSrc points to the block of input data. 03575 * @param[out] *pDst points to the block of output data 03576 * @param[in] blockSize number of input samples to process per call. 03577 * @return none 03578 */ 03579 03580 void arm_fir_decimate_q31( 03581 const arm_fir_decimate_instance_q31 * S, 03582 q31_t * pSrc, 03583 q31_t * pDst, 03584 uint32_t blockSize); 03585 03586 /** 03587 * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. 03588 * @param[in] *S points to an instance of the Q31 FIR decimator structure. 03589 * @param[in] *pSrc points to the block of input data. 03590 * @param[out] *pDst points to the block of output data 03591 * @param[in] blockSize number of input samples to process per call. 03592 * @return none 03593 */ 03594 03595 void arm_fir_decimate_fast_q31( 03596 arm_fir_decimate_instance_q31 * S, 03597 q31_t * pSrc, 03598 q31_t * pDst, 03599 uint32_t blockSize); 03600 03601 03602 /** 03603 * @brief Initialization function for the Q31 FIR decimator. 03604 * @param[in,out] *S points to an instance of the Q31 FIR decimator structure. 03605 * @param[in] numTaps number of coefficients in the filter. 03606 * @param[in] M decimation factor. 03607 * @param[in] *pCoeffs points to the filter coefficients. 03608 * @param[in] *pState points to the state buffer. 03609 * @param[in] blockSize number of input samples to process per call. 03610 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if 03611 * <code>blockSize</code> is not a multiple of <code>M</code>. 03612 */ 03613 03614 arm_status arm_fir_decimate_init_q31( 03615 arm_fir_decimate_instance_q31 * S, 03616 uint16_t numTaps, 03617 uint8_t M, 03618 q31_t * pCoeffs, 03619 q31_t * pState, 03620 uint32_t blockSize); 03621 03622 03623 03624 /** 03625 * @brief Instance structure for the Q15 FIR interpolator. 03626 */ 03627 03628 typedef struct 03629 { 03630 uint8_t L; /**< upsample factor. */ 03631 uint16_t phaseLength; /**< length of each polyphase filter component. */ 03632 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ 03633 q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ 03634 } arm_fir_interpolate_instance_q15; 03635 03636 /** 03637 * @brief Instance structure for the Q31 FIR interpolator. 03638 */ 03639 03640 typedef struct 03641 { 03642 uint8_t L; /**< upsample factor. */ 03643 uint16_t phaseLength; /**< length of each polyphase filter component. */ 03644 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ 03645 q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ 03646 } arm_fir_interpolate_instance_q31; 03647 03648 /** 03649 * @brief Instance structure for the floating-point FIR interpolator. 03650 */ 03651 03652 typedef struct 03653 { 03654 uint8_t L; /**< upsample factor. */ 03655 uint16_t phaseLength; /**< length of each polyphase filter component. */ 03656 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ 03657 float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ 03658 } arm_fir_interpolate_instance_f32; 03659 03660 03661 /** 03662 * @brief Processing function for the Q15 FIR interpolator. 03663 * @param[in] *S points to an instance of the Q15 FIR interpolator structure. 03664 * @param[in] *pSrc points to the block of input data. 03665 * @param[out] *pDst points to the block of output data. 03666 * @param[in] blockSize number of input samples to process per call. 03667 * @return none. 03668 */ 03669 03670 void arm_fir_interpolate_q15( 03671 const arm_fir_interpolate_instance_q15 * S, 03672 q15_t * pSrc, 03673 q15_t * pDst, 03674 uint32_t blockSize); 03675 03676 03677 /** 03678 * @brief Initialization function for the Q15 FIR interpolator. 03679 * @param[in,out] *S points to an instance of the Q15 FIR interpolator structure. 03680 * @param[in] L upsample factor. 03681 * @param[in] numTaps number of filter coefficients in the filter. 03682 * @param[in] *pCoeffs points to the filter coefficient buffer. 03683 * @param[in] *pState points to the state buffer. 03684 * @param[in] blockSize number of input samples to process per call. 03685 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if 03686 * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>. 03687 */ 03688 03689 arm_status arm_fir_interpolate_init_q15( 03690 arm_fir_interpolate_instance_q15 * S, 03691 uint8_t L, 03692 uint16_t numTaps, 03693 q15_t * pCoeffs, 03694 q15_t * pState, 03695 uint32_t blockSize); 03696 03697 /** 03698 * @brief Processing function for the Q31 FIR interpolator. 03699 * @param[in] *S points to an instance of the Q15 FIR interpolator structure. 03700 * @param[in] *pSrc points to the block of input data. 03701 * @param[out] *pDst points to the block of output data. 03702 * @param[in] blockSize number of input samples to process per call. 03703 * @return none. 03704 */ 03705 03706 void arm_fir_interpolate_q31( 03707 const arm_fir_interpolate_instance_q31 * S, 03708 q31_t * pSrc, 03709 q31_t * pDst, 03710 uint32_t blockSize); 03711 03712 /** 03713 * @brief Initialization function for the Q31 FIR interpolator. 03714 * @param[in,out] *S points to an instance of the Q31 FIR interpolator structure. 03715 * @param[in] L upsample factor. 03716 * @param[in] numTaps number of filter coefficients in the filter. 03717 * @param[in] *pCoeffs points to the filter coefficient buffer. 03718 * @param[in] *pState points to the state buffer. 03719 * @param[in] blockSize number of input samples to process per call. 03720 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if 03721 * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>. 03722 */ 03723 03724 arm_status arm_fir_interpolate_init_q31( 03725 arm_fir_interpolate_instance_q31 * S, 03726 uint8_t L, 03727 uint16_t numTaps, 03728 q31_t * pCoeffs, 03729 q31_t * pState, 03730 uint32_t blockSize); 03731 03732 03733 /** 03734 * @brief Processing function for the floating-point FIR interpolator. 03735 * @param[in] *S points to an instance of the floating-point FIR interpolator structure. 03736 * @param[in] *pSrc points to the block of input data. 03737 * @param[out] *pDst points to the block of output data. 03738 * @param[in] blockSize number of input samples to process per call. 03739 * @return none. 03740 */ 03741 03742 void arm_fir_interpolate_f32( 03743 const arm_fir_interpolate_instance_f32 * S, 03744 float32_t * pSrc, 03745 float32_t * pDst, 03746 uint32_t blockSize); 03747 03748 /** 03749 * @brief Initialization function for the floating-point FIR interpolator. 03750 * @param[in,out] *S points to an instance of the floating-point FIR interpolator structure. 03751 * @param[in] L upsample factor. 03752 * @param[in] numTaps number of filter coefficients in the filter. 03753 * @param[in] *pCoeffs points to the filter coefficient buffer. 03754 * @param[in] *pState points to the state buffer. 03755 * @param[in] blockSize number of input samples to process per call. 03756 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if 03757 * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>. 03758 */ 03759 03760 arm_status arm_fir_interpolate_init_f32( 03761 arm_fir_interpolate_instance_f32 * S, 03762 uint8_t L, 03763 uint16_t numTaps, 03764 float32_t * pCoeffs, 03765 float32_t * pState, 03766 uint32_t blockSize); 03767 03768 /** 03769 * @brief Instance structure for the high precision Q31 Biquad cascade filter. 03770 */ 03771 03772 typedef struct 03773 { 03774 uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ 03775 q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ 03776 q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ 03777 uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ 03778 03779 } arm_biquad_cas_df1_32x64_ins_q31; 03780 03781 03782 /** 03783 * @param[in] *S points to an instance of the high precision Q31 Biquad cascade filter structure. 03784 * @param[in] *pSrc points to the block of input data. 03785 * @param[out] *pDst points to the block of output data 03786 * @param[in] blockSize number of samples to process. 03787 * @return none. 03788 */ 03789 03790 void arm_biquad_cas_df1_32x64_q31( 03791 const arm_biquad_cas_df1_32x64_ins_q31 * S, 03792 q31_t * pSrc, 03793 q31_t * pDst, 03794 uint32_t blockSize); 03795 03796 03797 /** 03798 * @param[in,out] *S points to an instance of the high precision Q31 Biquad cascade filter structure. 03799 * @param[in] numStages number of 2nd order stages in the filter. 03800 * @param[in] *pCoeffs points to the filter coefficients. 03801 * @param[in] *pState points to the state buffer. 03802 * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format 03803 * @return none 03804 */ 03805 03806 void arm_biquad_cas_df1_32x64_init_q31( 03807 arm_biquad_cas_df1_32x64_ins_q31 * S, 03808 uint8_t numStages, 03809 q31_t * pCoeffs, 03810 q63_t * pState, 03811 uint8_t postShift); 03812 03813 03814 03815 /** 03816 * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. 03817 */ 03818 03819 typedef struct 03820 { 03821 uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ 03822 float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ 03823 float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ 03824 } arm_biquad_cascade_df2T_instance_f32; 03825 03826 03827 03828 /** 03829 * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. 03830 */ 03831 03832 typedef struct 03833 { 03834 uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ 03835 float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ 03836 float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ 03837 } arm_biquad_cascade_stereo_df2T_instance_f32; 03838 03839 03840 03841 /** 03842 * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. 03843 */ 03844 03845 typedef struct 03846 { 03847 uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ 03848 float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ 03849 float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ 03850 } arm_biquad_cascade_df2T_instance_f64; 03851 03852 03853 /** 03854 * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 03855 * @param[in] *S points to an instance of the filter data structure. 03856 * @param[in] *pSrc points to the block of input data. 03857 * @param[out] *pDst points to the block of output data 03858 * @param[in] blockSize number of samples to process. 03859 * @return none. 03860 */ 03861 03862 void arm_biquad_cascade_df2T_f32( 03863 const arm_biquad_cascade_df2T_instance_f32 * S, 03864 float32_t * pSrc, 03865 float32_t * pDst, 03866 uint32_t blockSize); 03867 03868 03869 /** 03870 * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels 03871 * @param[in] *S points to an instance of the filter data structure. 03872 * @param[in] *pSrc points to the block of input data. 03873 * @param[out] *pDst points to the block of output data 03874 * @param[in] blockSize number of samples to process. 03875 * @return none. 03876 */ 03877 03878 void arm_biquad_cascade_stereo_df2T_f32( 03879 const arm_biquad_cascade_stereo_df2T_instance_f32 * S, 03880 float32_t * pSrc, 03881 float32_t * pDst, 03882 uint32_t blockSize); 03883 03884 /** 03885 * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 03886 * @param[in] *S points to an instance of the filter data structure. 03887 * @param[in] *pSrc points to the block of input data. 03888 * @param[out] *pDst points to the block of output data 03889 * @param[in] blockSize number of samples to process. 03890 * @return none. 03891 */ 03892 03893 void arm_biquad_cascade_df2T_f64( 03894 const arm_biquad_cascade_df2T_instance_f64 * S, 03895 float64_t * pSrc, 03896 float64_t * pDst, 03897 uint32_t blockSize); 03898 03899 03900 /** 03901 * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. 03902 * @param[in,out] *S points to an instance of the filter data structure. 03903 * @param[in] numStages number of 2nd order stages in the filter. 03904 * @param[in] *pCoeffs points to the filter coefficients. 03905 * @param[in] *pState points to the state buffer. 03906 * @return none 03907 */ 03908 03909 void arm_biquad_cascade_df2T_init_f32( 03910 arm_biquad_cascade_df2T_instance_f32 * S, 03911 uint8_t numStages, 03912 float32_t * pCoeffs, 03913 float32_t * pState); 03914 03915 03916 /** 03917 * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. 03918 * @param[in,out] *S points to an instance of the filter data structure. 03919 * @param[in] numStages number of 2nd order stages in the filter. 03920 * @param[in] *pCoeffs points to the filter coefficients. 03921 * @param[in] *pState points to the state buffer. 03922 * @return none 03923 */ 03924 03925 void arm_biquad_cascade_stereo_df2T_init_f32( 03926 arm_biquad_cascade_stereo_df2T_instance_f32 * S, 03927 uint8_t numStages, 03928 float32_t * pCoeffs, 03929 float32_t * pState); 03930 03931 03932 /** 03933 * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. 03934 * @param[in,out] *S points to an instance of the filter data structure. 03935 * @param[in] numStages number of 2nd order stages in the filter. 03936 * @param[in] *pCoeffs points to the filter coefficients. 03937 * @param[in] *pState points to the state buffer. 03938 * @return none 03939 */ 03940 03941 void arm_biquad_cascade_df2T_init_f64( 03942 arm_biquad_cascade_df2T_instance_f64 * S, 03943 uint8_t numStages, 03944 float64_t * pCoeffs, 03945 float64_t * pState); 03946 03947 03948 03949 /** 03950 * @brief Instance structure for the Q15 FIR lattice filter. 03951 */ 03952 03953 typedef struct 03954 { 03955 uint16_t numStages; /**< number of filter stages. */ 03956 q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ 03957 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ 03958 } arm_fir_lattice_instance_q15; 03959 03960 /** 03961 * @brief Instance structure for the Q31 FIR lattice filter. 03962 */ 03963 03964 typedef struct 03965 { 03966 uint16_t numStages; /**< number of filter stages. */ 03967 q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ 03968 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ 03969 } arm_fir_lattice_instance_q31; 03970 03971 /** 03972 * @brief Instance structure for the floating-point FIR lattice filter. 03973 */ 03974 03975 typedef struct 03976 { 03977 uint16_t numStages; /**< number of filter stages. */ 03978 float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ 03979 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ 03980 } arm_fir_lattice_instance_f32; 03981 03982 /** 03983 * @brief Initialization function for the Q15 FIR lattice filter. 03984 * @param[in] *S points to an instance of the Q15 FIR lattice structure. 03985 * @param[in] numStages number of filter stages. 03986 * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. 03987 * @param[in] *pState points to the state buffer. The array is of length numStages. 03988 * @return none. 03989 */ 03990 03991 void arm_fir_lattice_init_q15( 03992 arm_fir_lattice_instance_q15 * S, 03993 uint16_t numStages, 03994 q15_t * pCoeffs, 03995 q15_t * pState); 03996 03997 03998 /** 03999 * @brief Processing function for the Q15 FIR lattice filter. 04000 * @param[in] *S points to an instance of the Q15 FIR lattice structure. 04001 * @param[in] *pSrc points to the block of input data. 04002 * @param[out] *pDst points to the block of output data. 04003 * @param[in] blockSize number of samples to process. 04004 * @return none. 04005 */ 04006 void arm_fir_lattice_q15( 04007 const arm_fir_lattice_instance_q15 * S, 04008 q15_t * pSrc, 04009 q15_t * pDst, 04010 uint32_t blockSize); 04011 04012 /** 04013 * @brief Initialization function for the Q31 FIR lattice filter. 04014 * @param[in] *S points to an instance of the Q31 FIR lattice structure. 04015 * @param[in] numStages number of filter stages. 04016 * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. 04017 * @param[in] *pState points to the state buffer. The array is of length numStages. 04018 * @return none. 04019 */ 04020 04021 void arm_fir_lattice_init_q31( 04022 arm_fir_lattice_instance_q31 * S, 04023 uint16_t numStages, 04024 q31_t * pCoeffs, 04025 q31_t * pState); 04026 04027 04028 /** 04029 * @brief Processing function for the Q31 FIR lattice filter. 04030 * @param[in] *S points to an instance of the Q31 FIR lattice structure. 04031 * @param[in] *pSrc points to the block of input data. 04032 * @param[out] *pDst points to the block of output data 04033 * @param[in] blockSize number of samples to process. 04034 * @return none. 04035 */ 04036 04037 void arm_fir_lattice_q31( 04038 const arm_fir_lattice_instance_q31 * S, 04039 q31_t * pSrc, 04040 q31_t * pDst, 04041 uint32_t blockSize); 04042 04043 /** 04044 * @brief Initialization function for the floating-point FIR lattice filter. 04045 * @param[in] *S points to an instance of the floating-point FIR lattice structure. 04046 * @param[in] numStages number of filter stages. 04047 * @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages. 04048 * @param[in] *pState points to the state buffer. The array is of length numStages. 04049 * @return none. 04050 */ 04051 04052 void arm_fir_lattice_init_f32( 04053 arm_fir_lattice_instance_f32 * S, 04054 uint16_t numStages, 04055 float32_t * pCoeffs, 04056 float32_t * pState); 04057 04058 /** 04059 * @brief Processing function for the floating-point FIR lattice filter. 04060 * @param[in] *S points to an instance of the floating-point FIR lattice structure. 04061 * @param[in] *pSrc points to the block of input data. 04062 * @param[out] *pDst points to the block of output data 04063 * @param[in] blockSize number of samples to process. 04064 * @return none. 04065 */ 04066 04067 void arm_fir_lattice_f32( 04068 const arm_fir_lattice_instance_f32 * S, 04069 float32_t * pSrc, 04070 float32_t * pDst, 04071 uint32_t blockSize); 04072 04073 /** 04074 * @brief Instance structure for the Q15 IIR lattice filter. 04075 */ 04076 typedef struct 04077 { 04078 uint16_t numStages; /**< number of stages in the filter. */ 04079 q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ 04080 q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ 04081 q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ 04082 } arm_iir_lattice_instance_q15; 04083 04084 /** 04085 * @brief Instance structure for the Q31 IIR lattice filter. 04086 */ 04087 typedef struct 04088 { 04089 uint16_t numStages; /**< number of stages in the filter. */ 04090 q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ 04091 q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ 04092 q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ 04093 } arm_iir_lattice_instance_q31; 04094 04095 /** 04096 * @brief Instance structure for the floating-point IIR lattice filter. 04097 */ 04098 typedef struct 04099 { 04100 uint16_t numStages; /**< number of stages in the filter. */ 04101 float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ 04102 float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ 04103 float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ 04104 } arm_iir_lattice_instance_f32; 04105 04106 /** 04107 * @brief Processing function for the floating-point IIR lattice filter. 04108 * @param[in] *S points to an instance of the floating-point IIR lattice structure. 04109 * @param[in] *pSrc points to the block of input data. 04110 * @param[out] *pDst points to the block of output data. 04111 * @param[in] blockSize number of samples to process. 04112 * @return none. 04113 */ 04114 04115 void arm_iir_lattice_f32( 04116 const arm_iir_lattice_instance_f32 * S, 04117 float32_t * pSrc, 04118 float32_t * pDst, 04119 uint32_t blockSize); 04120 04121 /** 04122 * @brief Initialization function for the floating-point IIR lattice filter. 04123 * @param[in] *S points to an instance of the floating-point IIR lattice structure. 04124 * @param[in] numStages number of stages in the filter. 04125 * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. 04126 * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. 04127 * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize-1. 04128 * @param[in] blockSize number of samples to process. 04129 * @return none. 04130 */ 04131 04132 void arm_iir_lattice_init_f32( 04133 arm_iir_lattice_instance_f32 * S, 04134 uint16_t numStages, 04135 float32_t * pkCoeffs, 04136 float32_t * pvCoeffs, 04137 float32_t * pState, 04138 uint32_t blockSize); 04139 04140 04141 /** 04142 * @brief Processing function for the Q31 IIR lattice filter. 04143 * @param[in] *S points to an instance of the Q31 IIR lattice structure. 04144 * @param[in] *pSrc points to the block of input data. 04145 * @param[out] *pDst points to the block of output data. 04146 * @param[in] blockSize number of samples to process. 04147 * @return none. 04148 */ 04149 04150 void arm_iir_lattice_q31( 04151 const arm_iir_lattice_instance_q31 * S, 04152 q31_t * pSrc, 04153 q31_t * pDst, 04154 uint32_t blockSize); 04155 04156 04157 /** 04158 * @brief Initialization function for the Q31 IIR lattice filter. 04159 * @param[in] *S points to an instance of the Q31 IIR lattice structure. 04160 * @param[in] numStages number of stages in the filter. 04161 * @param[in] *pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. 04162 * @param[in] *pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. 04163 * @param[in] *pState points to the state buffer. The array is of length numStages+blockSize. 04164 * @param[in] blockSize number of samples to process. 04165 * @return none. 04166 */ 04167 04168 void arm_iir_lattice_init_q31( 04169 arm_iir_lattice_instance_q31 * S, 04170 uint16_t numStages, 04171 q31_t * pkCoeffs, 04172 q31_t * pvCoeffs, 04173 q31_t * pState, 04174 uint32_t blockSize); 04175 04176 04177 /** 04178 * @brief Processing function for the Q15 IIR lattice filter. 04179 * @param[in] *S points to an instance of the Q15 IIR lattice structure. 04180 * @param[in] *pSrc points to the block of input data. 04181 * @param[out] *pDst points to the block of output data. 04182 * @param[in] blockSize number of samples to process. 04183 * @return none. 04184 */ 04185 04186 void arm_iir_lattice_q15( 04187 const arm_iir_lattice_instance_q15 * S, 04188 q15_t * pSrc, 04189 q15_t * pDst, 04190 uint32_t blockSize); 04191 04192 04193 /** 04194 * @brief Initialization function for the Q15 IIR lattice filter. 04195 * @param[in] *S points to an instance of the fixed-point Q15 IIR lattice structure. 04196 * @param[in] numStages number of stages in the filter. 04197 * @param[in] *pkCoeffs points to reflection coefficient buffer. The array is of length numStages. 04198 * @param[in] *pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. 04199 * @param[in] *pState points to state buffer. The array is of length numStages+blockSize. 04200 * @param[in] blockSize number of samples to process per call. 04201 * @return none. 04202 */ 04203 04204 void arm_iir_lattice_init_q15( 04205 arm_iir_lattice_instance_q15 * S, 04206 uint16_t numStages, 04207 q15_t * pkCoeffs, 04208 q15_t * pvCoeffs, 04209 q15_t * pState, 04210 uint32_t blockSize); 04211 04212 /** 04213 * @brief Instance structure for the floating-point LMS filter. 04214 */ 04215 04216 typedef struct 04217 { 04218 uint16_t numTaps; /**< number of coefficients in the filter. */ 04219 float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 04220 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ 04221 float32_t mu; /**< step size that controls filter coefficient updates. */ 04222 } arm_lms_instance_f32; 04223 04224 /** 04225 * @brief Processing function for floating-point LMS filter. 04226 * @param[in] *S points to an instance of the floating-point LMS filter structure. 04227 * @param[in] *pSrc points to the block of input data. 04228 * @param[in] *pRef points to the block of reference data. 04229 * @param[out] *pOut points to the block of output data. 04230 * @param[out] *pErr points to the block of error data. 04231 * @param[in] blockSize number of samples to process. 04232 * @return none. 04233 */ 04234 04235 void arm_lms_f32( 04236 const arm_lms_instance_f32 * S, 04237 float32_t * pSrc, 04238 float32_t * pRef, 04239 float32_t * pOut, 04240 float32_t * pErr, 04241 uint32_t blockSize); 04242 04243 /** 04244 * @brief Initialization function for floating-point LMS filter. 04245 * @param[in] *S points to an instance of the floating-point LMS filter structure. 04246 * @param[in] numTaps number of filter coefficients. 04247 * @param[in] *pCoeffs points to the coefficient buffer. 04248 * @param[in] *pState points to state buffer. 04249 * @param[in] mu step size that controls filter coefficient updates. 04250 * @param[in] blockSize number of samples to process. 04251 * @return none. 04252 */ 04253 04254 void arm_lms_init_f32( 04255 arm_lms_instance_f32 * S, 04256 uint16_t numTaps, 04257 float32_t * pCoeffs, 04258 float32_t * pState, 04259 float32_t mu, 04260 uint32_t blockSize); 04261 04262 /** 04263 * @brief Instance structure for the Q15 LMS filter. 04264 */ 04265 04266 typedef struct 04267 { 04268 uint16_t numTaps; /**< number of coefficients in the filter. */ 04269 q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 04270 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ 04271 q15_t mu; /**< step size that controls filter coefficient updates. */ 04272 uint32_t postShift; /**< bit shift applied to coefficients. */ 04273 } arm_lms_instance_q15; 04274 04275 04276 /** 04277 * @brief Initialization function for the Q15 LMS filter. 04278 * @param[in] *S points to an instance of the Q15 LMS filter structure. 04279 * @param[in] numTaps number of filter coefficients. 04280 * @param[in] *pCoeffs points to the coefficient buffer. 04281 * @param[in] *pState points to the state buffer. 04282 * @param[in] mu step size that controls filter coefficient updates. 04283 * @param[in] blockSize number of samples to process. 04284 * @param[in] postShift bit shift applied to coefficients. 04285 * @return none. 04286 */ 04287 04288 void arm_lms_init_q15( 04289 arm_lms_instance_q15 * S, 04290 uint16_t numTaps, 04291 q15_t * pCoeffs, 04292 q15_t * pState, 04293 q15_t mu, 04294 uint32_t blockSize, 04295 uint32_t postShift); 04296 04297 /** 04298 * @brief Processing function for Q15 LMS filter. 04299 * @param[in] *S points to an instance of the Q15 LMS filter structure. 04300 * @param[in] *pSrc points to the block of input data. 04301 * @param[in] *pRef points to the block of reference data. 04302 * @param[out] *pOut points to the block of output data. 04303 * @param[out] *pErr points to the block of error data. 04304 * @param[in] blockSize number of samples to process. 04305 * @return none. 04306 */ 04307 04308 void arm_lms_q15( 04309 const arm_lms_instance_q15 * S, 04310 q15_t * pSrc, 04311 q15_t * pRef, 04312 q15_t * pOut, 04313 q15_t * pErr, 04314 uint32_t blockSize); 04315 04316 04317 /** 04318 * @brief Instance structure for the Q31 LMS filter. 04319 */ 04320 04321 typedef struct 04322 { 04323 uint16_t numTaps; /**< number of coefficients in the filter. */ 04324 q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 04325 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ 04326 q31_t mu; /**< step size that controls filter coefficient updates. */ 04327 uint32_t postShift; /**< bit shift applied to coefficients. */ 04328 04329 } arm_lms_instance_q31; 04330 04331 /** 04332 * @brief Processing function for Q31 LMS filter. 04333 * @param[in] *S points to an instance of the Q15 LMS filter structure. 04334 * @param[in] *pSrc points to the block of input data. 04335 * @param[in] *pRef points to the block of reference data. 04336 * @param[out] *pOut points to the block of output data. 04337 * @param[out] *pErr points to the block of error data. 04338 * @param[in] blockSize number of samples to process. 04339 * @return none. 04340 */ 04341 04342 void arm_lms_q31( 04343 const arm_lms_instance_q31 * S, 04344 q31_t * pSrc, 04345 q31_t * pRef, 04346 q31_t * pOut, 04347 q31_t * pErr, 04348 uint32_t blockSize); 04349 04350 /** 04351 * @brief Initialization function for Q31 LMS filter. 04352 * @param[in] *S points to an instance of the Q31 LMS filter structure. 04353 * @param[in] numTaps number of filter coefficients. 04354 * @param[in] *pCoeffs points to coefficient buffer. 04355 * @param[in] *pState points to state buffer. 04356 * @param[in] mu step size that controls filter coefficient updates. 04357 * @param[in] blockSize number of samples to process. 04358 * @param[in] postShift bit shift applied to coefficients. 04359 * @return none. 04360 */ 04361 04362 void arm_lms_init_q31( 04363 arm_lms_instance_q31 * S, 04364 uint16_t numTaps, 04365 q31_t * pCoeffs, 04366 q31_t * pState, 04367 q31_t mu, 04368 uint32_t blockSize, 04369 uint32_t postShift); 04370 04371 /** 04372 * @brief Instance structure for the floating-point normalized LMS filter. 04373 */ 04374 04375 typedef struct 04376 { 04377 uint16_t numTaps; /**< number of coefficients in the filter. */ 04378 float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 04379 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ 04380 float32_t mu; /**< step size that control filter coefficient updates. */ 04381 float32_t energy; /**< saves previous frame energy. */ 04382 float32_t x0; /**< saves previous input sample. */ 04383 } arm_lms_norm_instance_f32; 04384 04385 /** 04386 * @brief Processing function for floating-point normalized LMS filter. 04387 * @param[in] *S points to an instance of the floating-point normalized LMS filter structure. 04388 * @param[in] *pSrc points to the block of input data. 04389 * @param[in] *pRef points to the block of reference data. 04390 * @param[out] *pOut points to the block of output data. 04391 * @param[out] *pErr points to the block of error data. 04392 * @param[in] blockSize number of samples to process. 04393 * @return none. 04394 */ 04395 04396 void arm_lms_norm_f32( 04397 arm_lms_norm_instance_f32 * S, 04398 float32_t * pSrc, 04399 float32_t * pRef, 04400 float32_t * pOut, 04401 float32_t * pErr, 04402 uint32_t blockSize); 04403 04404 /** 04405 * @brief Initialization function for floating-point normalized LMS filter. 04406 * @param[in] *S points to an instance of the floating-point LMS filter structure. 04407 * @param[in] numTaps number of filter coefficients. 04408 * @param[in] *pCoeffs points to coefficient buffer. 04409 * @param[in] *pState points to state buffer. 04410 * @param[in] mu step size that controls filter coefficient updates. 04411 * @param[in] blockSize number of samples to process. 04412 * @return none. 04413 */ 04414 04415 void arm_lms_norm_init_f32( 04416 arm_lms_norm_instance_f32 * S, 04417 uint16_t numTaps, 04418 float32_t * pCoeffs, 04419 float32_t * pState, 04420 float32_t mu, 04421 uint32_t blockSize); 04422 04423 04424 /** 04425 * @brief Instance structure for the Q31 normalized LMS filter. 04426 */ 04427 typedef struct 04428 { 04429 uint16_t numTaps; /**< number of coefficients in the filter. */ 04430 q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 04431 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ 04432 q31_t mu; /**< step size that controls filter coefficient updates. */ 04433 uint8_t postShift; /**< bit shift applied to coefficients. */ 04434 q31_t *recipTable; /**< points to the reciprocal initial value table. */ 04435 q31_t energy; /**< saves previous frame energy. */ 04436 q31_t x0; /**< saves previous input sample. */ 04437 } arm_lms_norm_instance_q31; 04438 04439 /** 04440 * @brief Processing function for Q31 normalized LMS filter. 04441 * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. 04442 * @param[in] *pSrc points to the block of input data. 04443 * @param[in] *pRef points to the block of reference data. 04444 * @param[out] *pOut points to the block of output data. 04445 * @param[out] *pErr points to the block of error data. 04446 * @param[in] blockSize number of samples to process. 04447 * @return none. 04448 */ 04449 04450 void arm_lms_norm_q31( 04451 arm_lms_norm_instance_q31 * S, 04452 q31_t * pSrc, 04453 q31_t * pRef, 04454 q31_t * pOut, 04455 q31_t * pErr, 04456 uint32_t blockSize); 04457 04458 /** 04459 * @brief Initialization function for Q31 normalized LMS filter. 04460 * @param[in] *S points to an instance of the Q31 normalized LMS filter structure. 04461 * @param[in] numTaps number of filter coefficients. 04462 * @param[in] *pCoeffs points to coefficient buffer. 04463 * @param[in] *pState points to state buffer. 04464 * @param[in] mu step size that controls filter coefficient updates. 04465 * @param[in] blockSize number of samples to process. 04466 * @param[in] postShift bit shift applied to coefficients. 04467 * @return none. 04468 */ 04469 04470 void arm_lms_norm_init_q31( 04471 arm_lms_norm_instance_q31 * S, 04472 uint16_t numTaps, 04473 q31_t * pCoeffs, 04474 q31_t * pState, 04475 q31_t mu, 04476 uint32_t blockSize, 04477 uint8_t postShift); 04478 04479 /** 04480 * @brief Instance structure for the Q15 normalized LMS filter. 04481 */ 04482 04483 typedef struct 04484 { 04485 uint16_t numTaps; /**< Number of coefficients in the filter. */ 04486 q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ 04487 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ 04488 q15_t mu; /**< step size that controls filter coefficient updates. */ 04489 uint8_t postShift; /**< bit shift applied to coefficients. */ 04490 q15_t *recipTable; /**< Points to the reciprocal initial value table. */ 04491 q15_t energy; /**< saves previous frame energy. */ 04492 q15_t x0; /**< saves previous input sample. */ 04493 } arm_lms_norm_instance_q15; 04494 04495 /** 04496 * @brief Processing function for Q15 normalized LMS filter. 04497 * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. 04498 * @param[in] *pSrc points to the block of input data. 04499 * @param[in] *pRef points to the block of reference data. 04500 * @param[out] *pOut points to the block of output data. 04501 * @param[out] *pErr points to the block of error data. 04502 * @param[in] blockSize number of samples to process. 04503 * @return none. 04504 */ 04505 04506 void arm_lms_norm_q15( 04507 arm_lms_norm_instance_q15 * S, 04508 q15_t * pSrc, 04509 q15_t * pRef, 04510 q15_t * pOut, 04511 q15_t * pErr, 04512 uint32_t blockSize); 04513 04514 04515 /** 04516 * @brief Initialization function for Q15 normalized LMS filter. 04517 * @param[in] *S points to an instance of the Q15 normalized LMS filter structure. 04518 * @param[in] numTaps number of filter coefficients. 04519 * @param[in] *pCoeffs points to coefficient buffer. 04520 * @param[in] *pState points to state buffer. 04521 * @param[in] mu step size that controls filter coefficient updates. 04522 * @param[in] blockSize number of samples to process. 04523 * @param[in] postShift bit shift applied to coefficients. 04524 * @return none. 04525 */ 04526 04527 void arm_lms_norm_init_q15( 04528 arm_lms_norm_instance_q15 * S, 04529 uint16_t numTaps, 04530 q15_t * pCoeffs, 04531 q15_t * pState, 04532 q15_t mu, 04533 uint32_t blockSize, 04534 uint8_t postShift); 04535 04536 /** 04537 * @brief Correlation of floating-point sequences. 04538 * @param[in] *pSrcA points to the first input sequence. 04539 * @param[in] srcALen length of the first input sequence. 04540 * @param[in] *pSrcB points to the second input sequence. 04541 * @param[in] srcBLen length of the second input sequence. 04542 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. 04543 * @return none. 04544 */ 04545 04546 void arm_correlate_f32( 04547 float32_t * pSrcA, 04548 uint32_t srcALen, 04549 float32_t * pSrcB, 04550 uint32_t srcBLen, 04551 float32_t * pDst); 04552 04553 04554 /** 04555 * @brief Correlation of Q15 sequences 04556 * @param[in] *pSrcA points to the first input sequence. 04557 * @param[in] srcALen length of the first input sequence. 04558 * @param[in] *pSrcB points to the second input sequence. 04559 * @param[in] srcBLen length of the second input sequence. 04560 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. 04561 * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. 04562 * @return none. 04563 */ 04564 void arm_correlate_opt_q15( 04565 q15_t * pSrcA, 04566 uint32_t srcALen, 04567 q15_t * pSrcB, 04568 uint32_t srcBLen, 04569 q15_t * pDst, 04570 q15_t * pScratch); 04571 04572 04573 /** 04574 * @brief Correlation of Q15 sequences. 04575 * @param[in] *pSrcA points to the first input sequence. 04576 * @param[in] srcALen length of the first input sequence. 04577 * @param[in] *pSrcB points to the second input sequence. 04578 * @param[in] srcBLen length of the second input sequence. 04579 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. 04580 * @return none. 04581 */ 04582 04583 void arm_correlate_q15( 04584 q15_t * pSrcA, 04585 uint32_t srcALen, 04586 q15_t * pSrcB, 04587 uint32_t srcBLen, 04588 q15_t * pDst); 04589 04590 /** 04591 * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. 04592 * @param[in] *pSrcA points to the first input sequence. 04593 * @param[in] srcALen length of the first input sequence. 04594 * @param[in] *pSrcB points to the second input sequence. 04595 * @param[in] srcBLen length of the second input sequence. 04596 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. 04597 * @return none. 04598 */ 04599 04600 void arm_correlate_fast_q15( 04601 q15_t * pSrcA, 04602 uint32_t srcALen, 04603 q15_t * pSrcB, 04604 uint32_t srcBLen, 04605 q15_t * pDst); 04606 04607 04608 04609 /** 04610 * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4. 04611 * @param[in] *pSrcA points to the first input sequence. 04612 * @param[in] srcALen length of the first input sequence. 04613 * @param[in] *pSrcB points to the second input sequence. 04614 * @param[in] srcBLen length of the second input sequence. 04615 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. 04616 * @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. 04617 * @return none. 04618 */ 04619 04620 void arm_correlate_fast_opt_q15( 04621 q15_t * pSrcA, 04622 uint32_t srcALen, 04623 q15_t * pSrcB, 04624 uint32_t srcBLen, 04625 q15_t * pDst, 04626 q15_t * pScratch); 04627 04628 /** 04629 * @brief Correlation of Q31 sequences. 04630 * @param[in] *pSrcA points to the first input sequence. 04631 * @param[in] srcALen length of the first input sequence. 04632 * @param[in] *pSrcB points to the second input sequence. 04633 * @param[in] srcBLen length of the second input sequence. 04634 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. 04635 * @return none. 04636 */ 04637 04638 void arm_correlate_q31( 04639 q31_t * pSrcA, 04640 uint32_t srcALen, 04641 q31_t * pSrcB, 04642 uint32_t srcBLen, 04643 q31_t * pDst); 04644 04645 /** 04646 * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 04647 * @param[in] *pSrcA points to the first input sequence. 04648 * @param[in] srcALen length of the first input sequence. 04649 * @param[in] *pSrcB points to the second input sequence. 04650 * @param[in] srcBLen length of the second input sequence. 04651 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. 04652 * @return none. 04653 */ 04654 04655 void arm_correlate_fast_q31( 04656 q31_t * pSrcA, 04657 uint32_t srcALen, 04658 q31_t * pSrcB, 04659 uint32_t srcBLen, 04660 q31_t * pDst); 04661 04662 04663 04664 /** 04665 * @brief Correlation of Q7 sequences. 04666 * @param[in] *pSrcA points to the first input sequence. 04667 * @param[in] srcALen length of the first input sequence. 04668 * @param[in] *pSrcB points to the second input sequence. 04669 * @param[in] srcBLen length of the second input sequence. 04670 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. 04671 * @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. 04672 * @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). 04673 * @return none. 04674 */ 04675 04676 void arm_correlate_opt_q7( 04677 q7_t * pSrcA, 04678 uint32_t srcALen, 04679 q7_t * pSrcB, 04680 uint32_t srcBLen, 04681 q7_t * pDst, 04682 q15_t * pScratch1, 04683 q15_t * pScratch2); 04684 04685 04686 /** 04687 * @brief Correlation of Q7 sequences. 04688 * @param[in] *pSrcA points to the first input sequence. 04689 * @param[in] srcALen length of the first input sequence. 04690 * @param[in] *pSrcB points to the second input sequence. 04691 * @param[in] srcBLen length of the second input sequence. 04692 * @param[out] *pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. 04693 * @return none. 04694 */ 04695 04696 void arm_correlate_q7( 04697 q7_t * pSrcA, 04698 uint32_t srcALen, 04699 q7_t * pSrcB, 04700 uint32_t srcBLen, 04701 q7_t * pDst); 04702 04703 04704 /** 04705 * @brief Instance structure for the floating-point sparse FIR filter. 04706 */ 04707 typedef struct 04708 { 04709 uint16_t numTaps; /**< number of coefficients in the filter. */ 04710 uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ 04711 float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ 04712 float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ 04713 uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ 04714 int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ 04715 } arm_fir_sparse_instance_f32; 04716 04717 /** 04718 * @brief Instance structure for the Q31 sparse FIR filter. 04719 */ 04720 04721 typedef struct 04722 { 04723 uint16_t numTaps; /**< number of coefficients in the filter. */ 04724 uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ 04725 q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ 04726 q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ 04727 uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ 04728 int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ 04729 } arm_fir_sparse_instance_q31; 04730 04731 /** 04732 * @brief Instance structure for the Q15 sparse FIR filter. 04733 */ 04734 04735 typedef struct 04736 { 04737 uint16_t numTaps; /**< number of coefficients in the filter. */ 04738 uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ 04739 q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ 04740 q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ 04741 uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ 04742 int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ 04743 } arm_fir_sparse_instance_q15; 04744 04745 /** 04746 * @brief Instance structure for the Q7 sparse FIR filter. 04747 */ 04748 04749 typedef struct 04750 { 04751 uint16_t numTaps; /**< number of coefficients in the filter. */ 04752 uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ 04753 q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ 04754 q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ 04755 uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ 04756 int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ 04757 } arm_fir_sparse_instance_q7; 04758 04759 /** 04760 * @brief Processing function for the floating-point sparse FIR filter. 04761 * @param[in] *S points to an instance of the floating-point sparse FIR structure. 04762 * @param[in] *pSrc points to the block of input data. 04763 * @param[out] *pDst points to the block of output data 04764 * @param[in] *pScratchIn points to a temporary buffer of size blockSize. 04765 * @param[in] blockSize number of input samples to process per call. 04766 * @return none. 04767 */ 04768 04769 void arm_fir_sparse_f32( 04770 arm_fir_sparse_instance_f32 * S, 04771 float32_t * pSrc, 04772 float32_t * pDst, 04773 float32_t * pScratchIn, 04774 uint32_t blockSize); 04775 04776 /** 04777 * @brief Initialization function for the floating-point sparse FIR filter. 04778 * @param[in,out] *S points to an instance of the floating-point sparse FIR structure. 04779 * @param[in] numTaps number of nonzero coefficients in the filter. 04780 * @param[in] *pCoeffs points to the array of filter coefficients. 04781 * @param[in] *pState points to the state buffer. 04782 * @param[in] *pTapDelay points to the array of offset times. 04783 * @param[in] maxDelay maximum offset time supported. 04784 * @param[in] blockSize number of samples that will be processed per block. 04785 * @return none 04786 */ 04787 04788 void arm_fir_sparse_init_f32( 04789 arm_fir_sparse_instance_f32 * S, 04790 uint16_t numTaps, 04791 float32_t * pCoeffs, 04792 float32_t * pState, 04793 int32_t * pTapDelay, 04794 uint16_t maxDelay, 04795 uint32_t blockSize); 04796 04797 /** 04798 * @brief Processing function for the Q31 sparse FIR filter. 04799 * @param[in] *S points to an instance of the Q31 sparse FIR structure. 04800 * @param[in] *pSrc points to the block of input data. 04801 * @param[out] *pDst points to the block of output data 04802 * @param[in] *pScratchIn points to a temporary buffer of size blockSize. 04803 * @param[in] blockSize number of input samples to process per call. 04804 * @return none. 04805 */ 04806 04807 void arm_fir_sparse_q31( 04808 arm_fir_sparse_instance_q31 * S, 04809 q31_t * pSrc, 04810 q31_t * pDst, 04811 q31_t * pScratchIn, 04812 uint32_t blockSize); 04813 04814 /** 04815 * @brief Initialization function for the Q31 sparse FIR filter. 04816 * @param[in,out] *S points to an instance of the Q31 sparse FIR structure. 04817 * @param[in] numTaps number of nonzero coefficients in the filter. 04818 * @param[in] *pCoeffs points to the array of filter coefficients. 04819 * @param[in] *pState points to the state buffer. 04820 * @param[in] *pTapDelay points to the array of offset times. 04821 * @param[in] maxDelay maximum offset time supported. 04822 * @param[in] blockSize number of samples that will be processed per block. 04823 * @return none 04824 */ 04825 04826 void arm_fir_sparse_init_q31( 04827 arm_fir_sparse_instance_q31 * S, 04828 uint16_t numTaps, 04829 q31_t * pCoeffs, 04830 q31_t * pState, 04831 int32_t * pTapDelay, 04832 uint16_t maxDelay, 04833 uint32_t blockSize); 04834 04835 /** 04836 * @brief Processing function for the Q15 sparse FIR filter. 04837 * @param[in] *S points to an instance of the Q15 sparse FIR structure. 04838 * @param[in] *pSrc points to the block of input data. 04839 * @param[out] *pDst points to the block of output data 04840 * @param[in] *pScratchIn points to a temporary buffer of size blockSize. 04841 * @param[in] *pScratchOut points to a temporary buffer of size blockSize. 04842 * @param[in] blockSize number of input samples to process per call. 04843 * @return none. 04844 */ 04845 04846 void arm_fir_sparse_q15( 04847 arm_fir_sparse_instance_q15 * S, 04848 q15_t * pSrc, 04849 q15_t * pDst, 04850 q15_t * pScratchIn, 04851 q31_t * pScratchOut, 04852 uint32_t blockSize); 04853 04854 04855 /** 04856 * @brief Initialization function for the Q15 sparse FIR filter. 04857 * @param[in,out] *S points to an instance of the Q15 sparse FIR structure. 04858 * @param[in] numTaps number of nonzero coefficients in the filter. 04859 * @param[in] *pCoeffs points to the array of filter coefficients. 04860 * @param[in] *pState points to the state buffer. 04861 * @param[in] *pTapDelay points to the array of offset times. 04862 * @param[in] maxDelay maximum offset time supported. 04863 * @param[in] blockSize number of samples that will be processed per block. 04864 * @return none 04865 */ 04866 04867 void arm_fir_sparse_init_q15( 04868 arm_fir_sparse_instance_q15 * S, 04869 uint16_t numTaps, 04870 q15_t * pCoeffs, 04871 q15_t * pState, 04872 int32_t * pTapDelay, 04873 uint16_t maxDelay, 04874 uint32_t blockSize); 04875 04876 /** 04877 * @brief Processing function for the Q7 sparse FIR filter. 04878 * @param[in] *S points to an instance of the Q7 sparse FIR structure. 04879 * @param[in] *pSrc points to the block of input data. 04880 * @param[out] *pDst points to the block of output data 04881 * @param[in] *pScratchIn points to a temporary buffer of size blockSize. 04882 * @param[in] *pScratchOut points to a temporary buffer of size blockSize. 04883 * @param[in] blockSize number of input samples to process per call. 04884 * @return none. 04885 */ 04886 04887 void arm_fir_sparse_q7( 04888 arm_fir_sparse_instance_q7 * S, 04889 q7_t * pSrc, 04890 q7_t * pDst, 04891 q7_t * pScratchIn, 04892 q31_t * pScratchOut, 04893 uint32_t blockSize); 04894 04895 /** 04896 * @brief Initialization function for the Q7 sparse FIR filter. 04897 * @param[in,out] *S points to an instance of the Q7 sparse FIR structure. 04898 * @param[in] numTaps number of nonzero coefficients in the filter. 04899 * @param[in] *pCoeffs points to the array of filter coefficients. 04900 * @param[in] *pState points to the state buffer. 04901 * @param[in] *pTapDelay points to the array of offset times. 04902 * @param[in] maxDelay maximum offset time supported. 04903 * @param[in] blockSize number of samples that will be processed per block. 04904 * @return none 04905 */ 04906 04907 void arm_fir_sparse_init_q7( 04908 arm_fir_sparse_instance_q7 * S, 04909 uint16_t numTaps, 04910 q7_t * pCoeffs, 04911 q7_t * pState, 04912 int32_t * pTapDelay, 04913 uint16_t maxDelay, 04914 uint32_t blockSize); 04915 04916 04917 /* 04918 * @brief Floating-point sin_cos function. 04919 * @param[in] theta input value in degrees 04920 * @param[out] *pSinVal points to the processed sine output. 04921 * @param[out] *pCosVal points to the processed cos output. 04922 * @return none. 04923 */ 04924 04925 void arm_sin_cos_f32( 04926 float32_t theta, 04927 float32_t * pSinVal, 04928 float32_t * pCcosVal); 04929 04930 /* 04931 * @brief Q31 sin_cos function. 04932 * @param[in] theta scaled input value in degrees 04933 * @param[out] *pSinVal points to the processed sine output. 04934 * @param[out] *pCosVal points to the processed cosine output. 04935 * @return none. 04936 */ 04937 04938 void arm_sin_cos_q31( 04939 q31_t theta, 04940 q31_t * pSinVal, 04941 q31_t * pCosVal); 04942 04943 04944 /** 04945 * @brief Floating-point complex conjugate. 04946 * @param[in] *pSrc points to the input vector 04947 * @param[out] *pDst points to the output vector 04948 * @param[in] numSamples number of complex samples in each vector 04949 * @return none. 04950 */ 04951 04952 void arm_cmplx_conj_f32( 04953 float32_t * pSrc, 04954 float32_t * pDst, 04955 uint32_t numSamples); 04956 04957 /** 04958 * @brief Q31 complex conjugate. 04959 * @param[in] *pSrc points to the input vector 04960 * @param[out] *pDst points to the output vector 04961 * @param[in] numSamples number of complex samples in each vector 04962 * @return none. 04963 */ 04964 04965 void arm_cmplx_conj_q31( 04966 q31_t * pSrc, 04967 q31_t * pDst, 04968 uint32_t numSamples); 04969 04970 /** 04971 * @brief Q15 complex conjugate. 04972 * @param[in] *pSrc points to the input vector 04973 * @param[out] *pDst points to the output vector 04974 * @param[in] numSamples number of complex samples in each vector 04975 * @return none. 04976 */ 04977 04978 void arm_cmplx_conj_q15( 04979 q15_t * pSrc, 04980 q15_t * pDst, 04981 uint32_t numSamples); 04982 04983 04984 04985 /** 04986 * @brief Floating-point complex magnitude squared 04987 * @param[in] *pSrc points to the complex input vector 04988 * @param[out] *pDst points to the real output vector 04989 * @param[in] numSamples number of complex samples in the input vector 04990 * @return none. 04991 */ 04992 04993 void arm_cmplx_mag_squared_f32( 04994 float32_t * pSrc, 04995 float32_t * pDst, 04996 uint32_t numSamples); 04997 04998 /** 04999 * @brief Q31 complex magnitude squared 05000 * @param[in] *pSrc points to the complex input vector 05001 * @param[out] *pDst points to the real output vector 05002 * @param[in] numSamples number of complex samples in the input vector 05003 * @return none. 05004 */ 05005 05006 void arm_cmplx_mag_squared_q31( 05007 q31_t * pSrc, 05008 q31_t * pDst, 05009 uint32_t numSamples); 05010 05011 /** 05012 * @brief Q15 complex magnitude squared 05013 * @param[in] *pSrc points to the complex input vector 05014 * @param[out] *pDst points to the real output vector 05015 * @param[in] numSamples number of complex samples in the input vector 05016 * @return none. 05017 */ 05018 05019 void arm_cmplx_mag_squared_q15( 05020 q15_t * pSrc, 05021 q15_t * pDst, 05022 uint32_t numSamples); 05023 05024 05025 /** 05026 * @ingroup groupController 05027 */ 05028 05029 /** 05030 * @defgroup PID PID Motor Control 05031 * 05032 * A Proportional Integral Derivative (PID) controller is a generic feedback control 05033 * loop mechanism widely used in industrial control systems. 05034 * A PID controller is the most commonly used type of feedback controller. 05035 * 05036 * This set of functions implements (PID) controllers 05037 * for Q15, Q31, and floating-point data types. The functions operate on a single sample 05038 * of data and each call to the function returns a single processed value. 05039 * <code>S</code> points to an instance of the PID control data structure. <code>in</code> 05040 * is the input sample value. The functions return the output value. 05041 * 05042 * \par Algorithm: 05043 * <pre> 05044 * y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] 05045 * A0 = Kp + Ki + Kd 05046 * A1 = (-Kp ) - (2 * Kd ) 05047 * A2 = Kd </pre> 05048 * 05049 * \par 05050 * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant 05051 * 05052 * \par 05053 * \image html PID.gif "Proportional Integral Derivative Controller" 05054 * 05055 * \par 05056 * The PID controller calculates an "error" value as the difference between 05057 * the measured output and the reference input. 05058 * The controller attempts to minimize the error by adjusting the process control inputs. 05059 * The proportional value determines the reaction to the current error, 05060 * the integral value determines the reaction based on the sum of recent errors, 05061 * and the derivative value determines the reaction based on the rate at which the error has been changing. 05062 * 05063 * \par Instance Structure 05064 * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. 05065 * A separate instance structure must be defined for each PID Controller. 05066 * There are separate instance structure declarations for each of the 3 supported data types. 05067 * 05068 * \par Reset Functions 05069 * There is also an associated reset function for each data type which clears the state array. 05070 * 05071 * \par Initialization Functions 05072 * There is also an associated initialization function for each data type. 05073 * The initialization function performs the following operations: 05074 * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. 05075 * - Zeros out the values in the state buffer. 05076 * 05077 * \par 05078 * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. 05079 * 05080 * \par Fixed-Point Behavior 05081 * Care must be taken when using the fixed-point versions of the PID Controller functions. 05082 * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. 05083 * Refer to the function specific documentation below for usage guidelines. 05084 */ 05085 05086 /** 05087 * @addtogroup PID 05088 * @{ 05089 */ 05090 05091 /** 05092 * @brief Process function for the floating-point PID Control. 05093 * @param[in,out] *S is an instance of the floating-point PID Control structure 05094 * @param[in] in input sample to process 05095 * @return out processed output sample. 05096 */ 05097 05098 05099 static __INLINE float32_t arm_pid_f32( 05100 arm_pid_instance_f32 * S, 05101 float32_t in) 05102 { 05103 float32_t out; 05104 05105 /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ 05106 out = (S->A0 * in) + 05107 (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); 05108 05109 /* Update state */ 05110 S->state[1] = S->state[0]; 05111 S->state[0] = in; 05112 S->state[2] = out; 05113 05114 /* return to application */ 05115 return (out); 05116 05117 } 05118 05119 /** 05120 * @brief Process function for the Q31 PID Control. 05121 * @param[in,out] *S points to an instance of the Q31 PID Control structure 05122 * @param[in] in input sample to process 05123 * @return out processed output sample. 05124 * 05125 * <b>Scaling and Overflow Behavior:</b> 05126 * \par 05127 * The function is implemented using an internal 64-bit accumulator. 05128 * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. 05129 * Thus, if the accumulator result overflows it wraps around rather than clip. 05130 * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. 05131 * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. 05132 */ 05133 05134 static __INLINE q31_t arm_pid_q31( 05135 arm_pid_instance_q31 * S, 05136 q31_t in) 05137 { 05138 q63_t acc; 05139 q31_t out; 05140 05141 /* acc = A0 * x[n] */ 05142 acc = (q63_t) S->A0 * in; 05143 05144 /* acc += A1 * x[n-1] */ 05145 acc += (q63_t) S->A1 * S->state[0]; 05146 05147 /* acc += A2 * x[n-2] */ 05148 acc += (q63_t) S->A2 * S->state[1]; 05149 05150 /* convert output to 1.31 format to add y[n-1] */ 05151 out = (q31_t) (acc >> 31u); 05152 05153 /* out += y[n-1] */ 05154 out += S->state[2]; 05155 05156 /* Update state */ 05157 S->state[1] = S->state[0]; 05158 S->state[0] = in; 05159 S->state[2] = out; 05160 05161 /* return to application */ 05162 return (out); 05163 05164 } 05165 05166 /** 05167 * @brief Process function for the Q15 PID Control. 05168 * @param[in,out] *S points to an instance of the Q15 PID Control structure 05169 * @param[in] in input sample to process 05170 * @return out processed output sample. 05171 * 05172 * <b>Scaling and Overflow Behavior:</b> 05173 * \par 05174 * The function is implemented using a 64-bit internal accumulator. 05175 * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. 05176 * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. 05177 * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. 05178 * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. 05179 * Lastly, the accumulator is saturated to yield a result in 1.15 format. 05180 */ 05181 05182 static __INLINE q15_t arm_pid_q15( 05183 arm_pid_instance_q15 * S, 05184 q15_t in) 05185 { 05186 q63_t acc; 05187 q15_t out; 05188 05189 #ifndef ARM_MATH_CM0_FAMILY 05190 __SIMD32_TYPE *vstate; 05191 05192 /* Implementation of PID controller */ 05193 05194 /* acc = A0 * x[n] */ 05195 acc = (q31_t) __SMUAD(S->A0, in); 05196 05197 /* acc += A1 * x[n-1] + A2 * x[n-2] */ 05198 vstate = __SIMD32_CONST(S->state); 05199 acc = __SMLALD(S->A1, (q31_t) *vstate, acc); 05200 05201 #else 05202 /* acc = A0 * x[n] */ 05203 acc = ((q31_t) S->A0) * in; 05204 05205 /* acc += A1 * x[n-1] + A2 * x[n-2] */ 05206 acc += (q31_t) S->A1 * S->state[0]; 05207 acc += (q31_t) S->A2 * S->state[1]; 05208 05209 #endif 05210 05211 /* acc += y[n-1] */ 05212 acc += (q31_t) S->state[2] << 15; 05213 05214 /* saturate the output */ 05215 out = (q15_t) (__SSAT((acc >> 15), 16)); 05216 05217 /* Update state */ 05218 S->state[1] = S->state[0]; 05219 S->state[0] = in; 05220 S->state[2] = out; 05221 05222 /* return to application */ 05223 return (out); 05224 05225 } 05226 05227 /** 05228 * @} end of PID group 05229 */ 05230 05231 05232 /** 05233 * @brief Floating-point matrix inverse. 05234 * @param[in] *src points to the instance of the input floating-point matrix structure. 05235 * @param[out] *dst points to the instance of the output floating-point matrix structure. 05236 * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. 05237 * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. 05238 */ 05239 05240 arm_status arm_mat_inverse_f32( 05241 const arm_matrix_instance_f32 * src, 05242 arm_matrix_instance_f32 * dst); 05243 05244 05245 /** 05246 * @brief Floating-point matrix inverse. 05247 * @param[in] *src points to the instance of the input floating-point matrix structure. 05248 * @param[out] *dst points to the instance of the output floating-point matrix structure. 05249 * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. 05250 * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. 05251 */ 05252 05253 arm_status arm_mat_inverse_f64( 05254 const arm_matrix_instance_f64 * src, 05255 arm_matrix_instance_f64 * dst); 05256 05257 05258 05259 /** 05260 * @ingroup groupController 05261 */ 05262 05263 05264 /** 05265 * @defgroup clarke Vector Clarke Transform 05266 * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. 05267 * Generally the Clarke transform uses three-phase currents <code>Ia, Ib and Ic</code> to calculate currents 05268 * in the two-phase orthogonal stator axis <code>Ialpha</code> and <code>Ibeta</code>. 05269 * When <code>Ialpha</code> is superposed with <code>Ia</code> as shown in the figure below 05270 * \image html clarke.gif Stator current space vector and its components in (a,b). 05271 * and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code> 05272 * can be calculated using only <code>Ia</code> and <code>Ib</code>. 05273 * 05274 * The function operates on a single sample of data and each call to the function returns the processed output. 05275 * The library provides separate functions for Q31 and floating-point data types. 05276 * \par Algorithm 05277 * \image html clarkeFormula.gif 05278 * where <code>Ia</code> and <code>Ib</code> are the instantaneous stator phases and 05279 * <code>pIalpha</code> and <code>pIbeta</code> are the two coordinates of time invariant vector. 05280 * \par Fixed-Point Behavior 05281 * Care must be taken when using the Q31 version of the Clarke transform. 05282 * In particular, the overflow and saturation behavior of the accumulator used must be considered. 05283 * Refer to the function specific documentation below for usage guidelines. 05284 */ 05285 05286 /** 05287 * @addtogroup clarke 05288 * @{ 05289 */ 05290 05291 /** 05292 * 05293 * @brief Floating-point Clarke transform 05294 * @param[in] Ia input three-phase coordinate <code>a</code> 05295 * @param[in] Ib input three-phase coordinate <code>b</code> 05296 * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha 05297 * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta 05298 * @return none. 05299 */ 05300 05301 static __INLINE void arm_clarke_f32( 05302 float32_t Ia, 05303 float32_t Ib, 05304 float32_t * pIalpha, 05305 float32_t * pIbeta) 05306 { 05307 /* Calculate pIalpha using the equation, pIalpha = Ia */ 05308 *pIalpha = Ia; 05309 05310 /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ 05311 *pIbeta = 05312 ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib); 05313 05314 } 05315 05316 /** 05317 * @brief Clarke transform for Q31 version 05318 * @param[in] Ia input three-phase coordinate <code>a</code> 05319 * @param[in] Ib input three-phase coordinate <code>b</code> 05320 * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha 05321 * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta 05322 * @return none. 05323 * 05324 * <b>Scaling and Overflow Behavior:</b> 05325 * \par 05326 * The function is implemented using an internal 32-bit accumulator. 05327 * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. 05328 * There is saturation on the addition, hence there is no risk of overflow. 05329 */ 05330 05331 static __INLINE void arm_clarke_q31( 05332 q31_t Ia, 05333 q31_t Ib, 05334 q31_t * pIalpha, 05335 q31_t * pIbeta) 05336 { 05337 q31_t product1, product2; /* Temporary variables used to store intermediate results */ 05338 05339 /* Calculating pIalpha from Ia by equation pIalpha = Ia */ 05340 *pIalpha = Ia; 05341 05342 /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ 05343 product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); 05344 05345 /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ 05346 product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); 05347 05348 /* pIbeta is calculated by adding the intermediate products */ 05349 *pIbeta = __QADD(product1, product2); 05350 } 05351 05352 /** 05353 * @} end of clarke group 05354 */ 05355 05356 /** 05357 * @brief Converts the elements of the Q7 vector to Q31 vector. 05358 * @param[in] *pSrc input pointer 05359 * @param[out] *pDst output pointer 05360 * @param[in] blockSize number of samples to process 05361 * @return none. 05362 */ 05363 void arm_q7_to_q31( 05364 q7_t * pSrc, 05365 q31_t * pDst, 05366 uint32_t blockSize); 05367 05368 05369 05370 05371 /** 05372 * @ingroup groupController 05373 */ 05374 05375 /** 05376 * @defgroup inv_clarke Vector Inverse Clarke Transform 05377 * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. 05378 * 05379 * The function operates on a single sample of data and each call to the function returns the processed output. 05380 * The library provides separate functions for Q31 and floating-point data types. 05381 * \par Algorithm 05382 * \image html clarkeInvFormula.gif 05383 * where <code>pIa</code> and <code>pIb</code> are the instantaneous stator phases and 05384 * <code>Ialpha</code> and <code>Ibeta</code> are the two coordinates of time invariant vector. 05385 * \par Fixed-Point Behavior 05386 * Care must be taken when using the Q31 version of the Clarke transform. 05387 * In particular, the overflow and saturation behavior of the accumulator used must be considered. 05388 * Refer to the function specific documentation below for usage guidelines. 05389 */ 05390 05391 /** 05392 * @addtogroup inv_clarke 05393 * @{ 05394 */ 05395 05396 /** 05397 * @brief Floating-point Inverse Clarke transform 05398 * @param[in] Ialpha input two-phase orthogonal vector axis alpha 05399 * @param[in] Ibeta input two-phase orthogonal vector axis beta 05400 * @param[out] *pIa points to output three-phase coordinate <code>a</code> 05401 * @param[out] *pIb points to output three-phase coordinate <code>b</code> 05402 * @return none. 05403 */ 05404 05405 05406 static __INLINE void arm_inv_clarke_f32( 05407 float32_t Ialpha, 05408 float32_t Ibeta, 05409 float32_t * pIa, 05410 float32_t * pIb) 05411 { 05412 /* Calculating pIa from Ialpha by equation pIa = Ialpha */ 05413 *pIa = Ialpha; 05414 05415 /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ 05416 *pIb = -0.5 * Ialpha + (float32_t) 0.8660254039 *Ibeta; 05417 05418 } 05419 05420 /** 05421 * @brief Inverse Clarke transform for Q31 version 05422 * @param[in] Ialpha input two-phase orthogonal vector axis alpha 05423 * @param[in] Ibeta input two-phase orthogonal vector axis beta 05424 * @param[out] *pIa points to output three-phase coordinate <code>a</code> 05425 * @param[out] *pIb points to output three-phase coordinate <code>b</code> 05426 * @return none. 05427 * 05428 * <b>Scaling and Overflow Behavior:</b> 05429 * \par 05430 * The function is implemented using an internal 32-bit accumulator. 05431 * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. 05432 * There is saturation on the subtraction, hence there is no risk of overflow. 05433 */ 05434 05435 static __INLINE void arm_inv_clarke_q31( 05436 q31_t Ialpha, 05437 q31_t Ibeta, 05438 q31_t * pIa, 05439 q31_t * pIb) 05440 { 05441 q31_t product1, product2; /* Temporary variables used to store intermediate results */ 05442 05443 /* Calculating pIa from Ialpha by equation pIa = Ialpha */ 05444 *pIa = Ialpha; 05445 05446 /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ 05447 product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); 05448 05449 /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ 05450 product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); 05451 05452 /* pIb is calculated by subtracting the products */ 05453 *pIb = __QSUB(product2, product1); 05454 05455 } 05456 05457 /** 05458 * @} end of inv_clarke group 05459 */ 05460 05461 /** 05462 * @brief Converts the elements of the Q7 vector to Q15 vector. 05463 * @param[in] *pSrc input pointer 05464 * @param[out] *pDst output pointer 05465 * @param[in] blockSize number of samples to process 05466 * @return none. 05467 */ 05468 void arm_q7_to_q15( 05469 q7_t * pSrc, 05470 q15_t * pDst, 05471 uint32_t blockSize); 05472 05473 05474 05475 /** 05476 * @ingroup groupController 05477 */ 05478 05479 /** 05480 * @defgroup park Vector Park Transform 05481 * 05482 * Forward Park transform converts the input two-coordinate vector to flux and torque components. 05483 * The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents 05484 * from the stationary to the moving reference frame and control the spatial relationship between 05485 * the stator vector current and rotor flux vector. 05486 * If we consider the d axis aligned with the rotor flux, the diagram below shows the 05487 * current vector and the relationship from the two reference frames: 05488 * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" 05489 * 05490 * The function operates on a single sample of data and each call to the function returns the processed output. 05491 * The library provides separate functions for Q31 and floating-point data types. 05492 * \par Algorithm 05493 * \image html parkFormula.gif 05494 * where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components, 05495 * <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the 05496 * cosine and sine values of theta (rotor flux position). 05497 * \par Fixed-Point Behavior 05498 * Care must be taken when using the Q31 version of the Park transform. 05499 * In particular, the overflow and saturation behavior of the accumulator used must be considered. 05500 * Refer to the function specific documentation below for usage guidelines. 05501 */ 05502 05503 /** 05504 * @addtogroup park 05505 * @{ 05506 */ 05507 05508 /** 05509 * @brief Floating-point Park transform 05510 * @param[in] Ialpha input two-phase vector coordinate alpha 05511 * @param[in] Ibeta input two-phase vector coordinate beta 05512 * @param[out] *pId points to output rotor reference frame d 05513 * @param[out] *pIq points to output rotor reference frame q 05514 * @param[in] sinVal sine value of rotation angle theta 05515 * @param[in] cosVal cosine value of rotation angle theta 05516 * @return none. 05517 * 05518 * The function implements the forward Park transform. 05519 * 05520 */ 05521 05522 static __INLINE void arm_park_f32( 05523 float32_t Ialpha, 05524 float32_t Ibeta, 05525 float32_t * pId, 05526 float32_t * pIq, 05527 float32_t sinVal, 05528 float32_t cosVal) 05529 { 05530 /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ 05531 *pId = Ialpha * cosVal + Ibeta * sinVal; 05532 05533 /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ 05534 *pIq = -Ialpha * sinVal + Ibeta * cosVal; 05535 05536 } 05537 05538 /** 05539 * @brief Park transform for Q31 version 05540 * @param[in] Ialpha input two-phase vector coordinate alpha 05541 * @param[in] Ibeta input two-phase vector coordinate beta 05542 * @param[out] *pId points to output rotor reference frame d 05543 * @param[out] *pIq points to output rotor reference frame q 05544 * @param[in] sinVal sine value of rotation angle theta 05545 * @param[in] cosVal cosine value of rotation angle theta 05546 * @return none. 05547 * 05548 * <b>Scaling and Overflow Behavior:</b> 05549 * \par 05550 * The function is implemented using an internal 32-bit accumulator. 05551 * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. 05552 * There is saturation on the addition and subtraction, hence there is no risk of overflow. 05553 */ 05554 05555 05556 static __INLINE void arm_park_q31( 05557 q31_t Ialpha, 05558 q31_t Ibeta, 05559 q31_t * pId, 05560 q31_t * pIq, 05561 q31_t sinVal, 05562 q31_t cosVal) 05563 { 05564 q31_t product1, product2; /* Temporary variables used to store intermediate results */ 05565 q31_t product3, product4; /* Temporary variables used to store intermediate results */ 05566 05567 /* Intermediate product is calculated by (Ialpha * cosVal) */ 05568 product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); 05569 05570 /* Intermediate product is calculated by (Ibeta * sinVal) */ 05571 product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); 05572 05573 05574 /* Intermediate product is calculated by (Ialpha * sinVal) */ 05575 product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); 05576 05577 /* Intermediate product is calculated by (Ibeta * cosVal) */ 05578 product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); 05579 05580 /* Calculate pId by adding the two intermediate products 1 and 2 */ 05581 *pId = __QADD(product1, product2); 05582 05583 /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ 05584 *pIq = __QSUB(product4, product3); 05585 } 05586 05587 /** 05588 * @} end of park group 05589 */ 05590 05591 /** 05592 * @brief Converts the elements of the Q7 vector to floating-point vector. 05593 * @param[in] *pSrc is input pointer 05594 * @param[out] *pDst is output pointer 05595 * @param[in] blockSize is the number of samples to process 05596 * @return none. 05597 */ 05598 void arm_q7_to_float( 05599 q7_t * pSrc, 05600 float32_t * pDst, 05601 uint32_t blockSize); 05602 05603 05604 /** 05605 * @ingroup groupController 05606 */ 05607 05608 /** 05609 * @defgroup inv_park Vector Inverse Park transform 05610 * Inverse Park transform converts the input flux and torque components to two-coordinate vector. 05611 * 05612 * The function operates on a single sample of data and each call to the function returns the processed output. 05613 * The library provides separate functions for Q31 and floating-point data types. 05614 * \par Algorithm 05615 * \image html parkInvFormula.gif 05616 * where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components, 05617 * <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the 05618 * cosine and sine values of theta (rotor flux position). 05619 * \par Fixed-Point Behavior 05620 * Care must be taken when using the Q31 version of the Park transform. 05621 * In particular, the overflow and saturation behavior of the accumulator used must be considered. 05622 * Refer to the function specific documentation below for usage guidelines. 05623 */ 05624 05625 /** 05626 * @addtogroup inv_park 05627 * @{ 05628 */ 05629 05630 /** 05631 * @brief Floating-point Inverse Park transform 05632 * @param[in] Id input coordinate of rotor reference frame d 05633 * @param[in] Iq input coordinate of rotor reference frame q 05634 * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha 05635 * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta 05636 * @param[in] sinVal sine value of rotation angle theta 05637 * @param[in] cosVal cosine value of rotation angle theta 05638 * @return none. 05639 */ 05640 05641 static __INLINE void arm_inv_park_f32( 05642 float32_t Id, 05643 float32_t Iq, 05644 float32_t * pIalpha, 05645 float32_t * pIbeta, 05646 float32_t sinVal, 05647 float32_t cosVal) 05648 { 05649 /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ 05650 *pIalpha = Id * cosVal - Iq * sinVal; 05651 05652 /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ 05653 *pIbeta = Id * sinVal + Iq * cosVal; 05654 05655 } 05656 05657 05658 /** 05659 * @brief Inverse Park transform for Q31 version 05660 * @param[in] Id input coordinate of rotor reference frame d 05661 * @param[in] Iq input coordinate of rotor reference frame q 05662 * @param[out] *pIalpha points to output two-phase orthogonal vector axis alpha 05663 * @param[out] *pIbeta points to output two-phase orthogonal vector axis beta 05664 * @param[in] sinVal sine value of rotation angle theta 05665 * @param[in] cosVal cosine value of rotation angle theta 05666 * @return none. 05667 * 05668 * <b>Scaling and Overflow Behavior:</b> 05669 * \par 05670 * The function is implemented using an internal 32-bit accumulator. 05671 * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. 05672 * There is saturation on the addition, hence there is no risk of overflow. 05673 */ 05674 05675 05676 static __INLINE void arm_inv_park_q31( 05677 q31_t Id, 05678 q31_t Iq, 05679 q31_t * pIalpha, 05680 q31_t * pIbeta, 05681 q31_t sinVal, 05682 q31_t cosVal) 05683 { 05684 q31_t product1, product2; /* Temporary variables used to store intermediate results */ 05685 q31_t product3, product4; /* Temporary variables used to store intermediate results */ 05686 05687 /* Intermediate product is calculated by (Id * cosVal) */ 05688 product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); 05689 05690 /* Intermediate product is calculated by (Iq * sinVal) */ 05691 product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); 05692 05693 05694 /* Intermediate product is calculated by (Id * sinVal) */ 05695 product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); 05696 05697 /* Intermediate product is calculated by (Iq * cosVal) */ 05698 product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); 05699 05700 /* Calculate pIalpha by using the two intermediate products 1 and 2 */ 05701 *pIalpha = __QSUB(product1, product2); 05702 05703 /* Calculate pIbeta by using the two intermediate products 3 and 4 */ 05704 *pIbeta = __QADD(product4, product3); 05705 05706 } 05707 05708 /** 05709 * @} end of Inverse park group 05710 */ 05711 05712 05713 /** 05714 * @brief Converts the elements of the Q31 vector to floating-point vector. 05715 * @param[in] *pSrc is input pointer 05716 * @param[out] *pDst is output pointer 05717 * @param[in] blockSize is the number of samples to process 05718 * @return none. 05719 */ 05720 void arm_q31_to_float( 05721 q31_t * pSrc, 05722 float32_t * pDst, 05723 uint32_t blockSize); 05724 05725 /** 05726 * @ingroup groupInterpolation 05727 */ 05728 05729 /** 05730 * @defgroup LinearInterpolate Linear Interpolation 05731 * 05732 * Linear interpolation is a method of curve fitting using linear polynomials. 05733 * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line 05734 * 05735 * \par 05736 * \image html LinearInterp.gif "Linear interpolation" 05737 * 05738 * \par 05739 * A Linear Interpolate function calculates an output value(y), for the input(x) 05740 * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) 05741 * 05742 * \par Algorithm: 05743 * <pre> 05744 * y = y0 + (x - x0) * ((y1 - y0)/(x1-x0)) 05745 * where x0, x1 are nearest values of input x 05746 * y0, y1 are nearest values to output y 05747 * </pre> 05748 * 05749 * \par 05750 * This set of functions implements Linear interpolation process 05751 * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single 05752 * sample of data and each call to the function returns a single processed value. 05753 * <code>S</code> points to an instance of the Linear Interpolate function data structure. 05754 * <code>x</code> is the input sample value. The functions returns the output value. 05755 * 05756 * \par 05757 * if x is outside of the table boundary, Linear interpolation returns first value of the table 05758 * if x is below input range and returns last value of table if x is above range. 05759 */ 05760 05761 /** 05762 * @addtogroup LinearInterpolate 05763 * @{ 05764 */ 05765 05766 /** 05767 * @brief Process function for the floating-point Linear Interpolation Function. 05768 * @param[in,out] *S is an instance of the floating-point Linear Interpolation structure 05769 * @param[in] x input sample to process 05770 * @return y processed output sample. 05771 * 05772 */ 05773 05774 static __INLINE float32_t arm_linear_interp_f32( 05775 arm_linear_interp_instance_f32 * S, 05776 float32_t x) 05777 { 05778 05779 float32_t y; 05780 float32_t x0, x1; /* Nearest input values */ 05781 float32_t y0, y1; /* Nearest output values */ 05782 float32_t xSpacing = S->xSpacing; /* spacing between input values */ 05783 int32_t i; /* Index variable */ 05784 float32_t *pYData = S->pYData; /* pointer to output table */ 05785 05786 /* Calculation of index */ 05787 i = (int32_t) ((x - S->x1) / xSpacing); 05788 05789 if(i < 0) 05790 { 05791 /* Iniatilize output for below specified range as least output value of table */ 05792 y = pYData[0]; 05793 } 05794 else if((uint32_t)i >= S->nValues) 05795 { 05796 /* Iniatilize output for above specified range as last output value of table */ 05797 y = pYData[S->nValues - 1]; 05798 } 05799 else 05800 { 05801 /* Calculation of nearest input values */ 05802 x0 = S->x1 + i * xSpacing; 05803 x1 = S->x1 + (i + 1) * xSpacing; 05804 05805 /* Read of nearest output values */ 05806 y0 = pYData[i]; 05807 y1 = pYData[i + 1]; 05808 05809 /* Calculation of output */ 05810 y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); 05811 05812 } 05813 05814 /* returns output value */ 05815 return (y); 05816 } 05817 05818 /** 05819 * 05820 * @brief Process function for the Q31 Linear Interpolation Function. 05821 * @param[in] *pYData pointer to Q31 Linear Interpolation table 05822 * @param[in] x input sample to process 05823 * @param[in] nValues number of table values 05824 * @return y processed output sample. 05825 * 05826 * \par 05827 * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. 05828 * This function can support maximum of table size 2^12. 05829 * 05830 */ 05831 05832 05833 static __INLINE q31_t arm_linear_interp_q31( 05834 q31_t * pYData, 05835 q31_t x, 05836 uint32_t nValues) 05837 { 05838 q31_t y; /* output */ 05839 q31_t y0, y1; /* Nearest output values */ 05840 q31_t fract; /* fractional part */ 05841 int32_t index; /* Index to read nearest output values */ 05842 05843 /* Input is in 12.20 format */ 05844 /* 12 bits for the table index */ 05845 /* Index value calculation */ 05846 index = ((x & 0xFFF00000) >> 20); 05847 05848 if(index >= (int32_t)(nValues - 1)) 05849 { 05850 return (pYData[nValues - 1]); 05851 } 05852 else if(index < 0) 05853 { 05854 return (pYData[0]); 05855 } 05856 else 05857 { 05858 05859 /* 20 bits for the fractional part */ 05860 /* shift left by 11 to keep fract in 1.31 format */ 05861 fract = (x & 0x000FFFFF) << 11; 05862 05863 /* Read two nearest output values from the index in 1.31(q31) format */ 05864 y0 = pYData[index]; 05865 y1 = pYData[index + 1u]; 05866 05867 /* Calculation of y0 * (1-fract) and y is in 2.30 format */ 05868 y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); 05869 05870 /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ 05871 y += ((q31_t) (((q63_t) y1 * fract) >> 32)); 05872 05873 /* Convert y to 1.31 format */ 05874 return (y << 1u); 05875 05876 } 05877 05878 } 05879 05880 /** 05881 * 05882 * @brief Process function for the Q15 Linear Interpolation Function. 05883 * @param[in] *pYData pointer to Q15 Linear Interpolation table 05884 * @param[in] x input sample to process 05885 * @param[in] nValues number of table values 05886 * @return y processed output sample. 05887 * 05888 * \par 05889 * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. 05890 * This function can support maximum of table size 2^12. 05891 * 05892 */ 05893 05894 05895 static __INLINE q15_t arm_linear_interp_q15( 05896 q15_t * pYData, 05897 q31_t x, 05898 uint32_t nValues) 05899 { 05900 q63_t y; /* output */ 05901 q15_t y0, y1; /* Nearest output values */ 05902 q31_t fract; /* fractional part */ 05903 int32_t index; /* Index to read nearest output values */ 05904 05905 /* Input is in 12.20 format */ 05906 /* 12 bits for the table index */ 05907 /* Index value calculation */ 05908 index = ((x & 0xFFF00000) >> 20u); 05909 05910 if(index >= (int32_t)(nValues - 1)) 05911 { 05912 return (pYData[nValues - 1]); 05913 } 05914 else if(index < 0) 05915 { 05916 return (pYData[0]); 05917 } 05918 else 05919 { 05920 /* 20 bits for the fractional part */ 05921 /* fract is in 12.20 format */ 05922 fract = (x & 0x000FFFFF); 05923 05924 /* Read two nearest output values from the index */ 05925 y0 = pYData[index]; 05926 y1 = pYData[index + 1u]; 05927 05928 /* Calculation of y0 * (1-fract) and y is in 13.35 format */ 05929 y = ((q63_t) y0 * (0xFFFFF - fract)); 05930 05931 /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ 05932 y += ((q63_t) y1 * (fract)); 05933 05934 /* convert y to 1.15 format */ 05935 return (y >> 20); 05936 } 05937 05938 05939 } 05940 05941 /** 05942 * 05943 * @brief Process function for the Q7 Linear Interpolation Function. 05944 * @param[in] *pYData pointer to Q7 Linear Interpolation table 05945 * @param[in] x input sample to process 05946 * @param[in] nValues number of table values 05947 * @return y processed output sample. 05948 * 05949 * \par 05950 * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. 05951 * This function can support maximum of table size 2^12. 05952 */ 05953 05954 05955 static __INLINE q7_t arm_linear_interp_q7( 05956 q7_t * pYData, 05957 q31_t x, 05958 uint32_t nValues) 05959 { 05960 q31_t y; /* output */ 05961 q7_t y0, y1; /* Nearest output values */ 05962 q31_t fract; /* fractional part */ 05963 uint32_t index; /* Index to read nearest output values */ 05964 05965 /* Input is in 12.20 format */ 05966 /* 12 bits for the table index */ 05967 /* Index value calculation */ 05968 if (x < 0) 05969 { 05970 return (pYData[0]); 05971 } 05972 index = (x >> 20) & 0xfff; 05973 05974 05975 if(index >= (nValues - 1)) 05976 { 05977 return (pYData[nValues - 1]); 05978 } 05979 else 05980 { 05981 05982 /* 20 bits for the fractional part */ 05983 /* fract is in 12.20 format */ 05984 fract = (x & 0x000FFFFF); 05985 05986 /* Read two nearest output values from the index and are in 1.7(q7) format */ 05987 y0 = pYData[index]; 05988 y1 = pYData[index + 1u]; 05989 05990 /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ 05991 y = ((y0 * (0xFFFFF - fract))); 05992 05993 /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ 05994 y += (y1 * fract); 05995 05996 /* convert y to 1.7(q7) format */ 05997 return (y >> 20u); 05998 05999 } 06000 06001 } 06002 /** 06003 * @} end of LinearInterpolate group 06004 */ 06005 06006 /** 06007 * @brief Fast approximation to the trigonometric sine function for floating-point data. 06008 * @param[in] x input value in radians. 06009 * @return sin(x). 06010 */ 06011 06012 float32_t arm_sin_f32( 06013 float32_t x); 06014 06015 /** 06016 * @brief Fast approximation to the trigonometric sine function for Q31 data. 06017 * @param[in] x Scaled input value in radians. 06018 * @return sin(x). 06019 */ 06020 06021 q31_t arm_sin_q31( 06022 q31_t x); 06023 06024 /** 06025 * @brief Fast approximation to the trigonometric sine function for Q15 data. 06026 * @param[in] x Scaled input value in radians. 06027 * @return sin(x). 06028 */ 06029 06030 q15_t arm_sin_q15( 06031 q15_t x); 06032 06033 /** 06034 * @brief Fast approximation to the trigonometric cosine function for floating-point data. 06035 * @param[in] x input value in radians. 06036 * @return cos(x). 06037 */ 06038 06039 float32_t arm_cos_f32( 06040 float32_t x); 06041 06042 /** 06043 * @brief Fast approximation to the trigonometric cosine function for Q31 data. 06044 * @param[in] x Scaled input value in radians. 06045 * @return cos(x). 06046 */ 06047 06048 q31_t arm_cos_q31( 06049 q31_t x); 06050 06051 /** 06052 * @brief Fast approximation to the trigonometric cosine function for Q15 data. 06053 * @param[in] x Scaled input value in radians. 06054 * @return cos(x). 06055 */ 06056 06057 q15_t arm_cos_q15( 06058 q15_t x); 06059 06060 06061 /** 06062 * @ingroup groupFastMath 06063 */ 06064 06065 06066 /** 06067 * @defgroup SQRT Square Root 06068 * 06069 * Computes the square root of a number. 06070 * There are separate functions for Q15, Q31, and floating-point data types. 06071 * The square root function is computed using the Newton-Raphson algorithm. 06072 * This is an iterative algorithm of the form: 06073 * <pre> 06074 * x1 = x0 - f(x0)/f'(x0) 06075 * </pre> 06076 * where <code>x1</code> is the current estimate, 06077 * <code>x0</code> is the previous estimate, and 06078 * <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>. 06079 * For the square root function, the algorithm reduces to: 06080 * <pre> 06081 * x0 = in/2 [initial guess] 06082 * x1 = 1/2 * ( x0 + in / x0) [each iteration] 06083 * </pre> 06084 */ 06085 06086 06087 /** 06088 * @addtogroup SQRT 06089 * @{ 06090 */ 06091 06092 /** 06093 * @brief Floating-point square root function. 06094 * @param[in] in input value. 06095 * @param[out] *pOut square root of input value. 06096 * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if 06097 * <code>in</code> is negative value and returns zero output for negative values. 06098 */ 06099 06100 static __INLINE arm_status arm_sqrt_f32( 06101 float32_t in, 06102 float32_t * pOut) 06103 { 06104 if(in >= 0.0f) 06105 { 06106 06107 // #if __FPU_USED 06108 #if (__FPU_USED == 1) && defined ( __CC_ARM ) 06109 *pOut = __sqrtf(in); 06110 #else 06111 *pOut = sqrtf(in); 06112 #endif 06113 06114 return (ARM_MATH_SUCCESS); 06115 } 06116 else 06117 { 06118 *pOut = 0.0f; 06119 return (ARM_MATH_ARGUMENT_ERROR); 06120 } 06121 06122 } 06123 06124 06125 /** 06126 * @brief Q31 square root function. 06127 * @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF. 06128 * @param[out] *pOut square root of input value. 06129 * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if 06130 * <code>in</code> is negative value and returns zero output for negative values. 06131 */ 06132 arm_status arm_sqrt_q31( 06133 q31_t in, 06134 q31_t * pOut); 06135 06136 /** 06137 * @brief Q15 square root function. 06138 * @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF. 06139 * @param[out] *pOut square root of input value. 06140 * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if 06141 * <code>in</code> is negative value and returns zero output for negative values. 06142 */ 06143 arm_status arm_sqrt_q15( 06144 q15_t in, 06145 q15_t * pOut); 06146 06147 /** 06148 * @} end of SQRT group 06149 */ 06150 06151 06152 06153 06154 06155 06156 /** 06157 * @brief floating-point Circular write function. 06158 */ 06159 06160 static __INLINE void arm_circularWrite_f32( 06161 int32_t * circBuffer, 06162 int32_t L, 06163 uint16_t * writeOffset, 06164 int32_t bufferInc, 06165 const int32_t * src, 06166 int32_t srcInc, 06167 uint32_t blockSize) 06168 { 06169 uint32_t i = 0u; 06170 int32_t wOffset; 06171 06172 /* Copy the value of Index pointer that points 06173 * to the current location where the input samples to be copied */ 06174 wOffset = *writeOffset; 06175 06176 /* Loop over the blockSize */ 06177 i = blockSize; 06178 06179 while(i > 0u) 06180 { 06181 /* copy the input sample to the circular buffer */ 06182 circBuffer[wOffset] = *src; 06183 06184 /* Update the input pointer */ 06185 src += srcInc; 06186 06187 /* Circularly update wOffset. Watch out for positive and negative value */ 06188 wOffset += bufferInc; 06189 if(wOffset >= L) 06190 wOffset -= L; 06191 06192 /* Decrement the loop counter */ 06193 i--; 06194 } 06195 06196 /* Update the index pointer */ 06197 *writeOffset = wOffset; 06198 } 06199 06200 06201 06202 /** 06203 * @brief floating-point Circular Read function. 06204 */ 06205 static __INLINE void arm_circularRead_f32( 06206 int32_t * circBuffer, 06207 int32_t L, 06208 int32_t * readOffset, 06209 int32_t bufferInc, 06210 int32_t * dst, 06211 int32_t * dst_base, 06212 int32_t dst_length, 06213 int32_t dstInc, 06214 uint32_t blockSize) 06215 { 06216 uint32_t i = 0u; 06217 int32_t rOffset, dst_end; 06218 06219 /* Copy the value of Index pointer that points 06220 * to the current location from where the input samples to be read */ 06221 rOffset = *readOffset; 06222 dst_end = (int32_t) (dst_base + dst_length); 06223 06224 /* Loop over the blockSize */ 06225 i = blockSize; 06226 06227 while(i > 0u) 06228 { 06229 /* copy the sample from the circular buffer to the destination buffer */ 06230 *dst = circBuffer[rOffset]; 06231 06232 /* Update the input pointer */ 06233 dst += dstInc; 06234 06235 if(dst == (int32_t *) dst_end) 06236 { 06237 dst = dst_base; 06238 } 06239 06240 /* Circularly update rOffset. Watch out for positive and negative value */ 06241 rOffset += bufferInc; 06242 06243 if(rOffset >= L) 06244 { 06245 rOffset -= L; 06246 } 06247 06248 /* Decrement the loop counter */ 06249 i--; 06250 } 06251 06252 /* Update the index pointer */ 06253 *readOffset = rOffset; 06254 } 06255 06256 /** 06257 * @brief Q15 Circular write function. 06258 */ 06259 06260 static __INLINE void arm_circularWrite_q15( 06261 q15_t * circBuffer, 06262 int32_t L, 06263 uint16_t * writeOffset, 06264 int32_t bufferInc, 06265 const q15_t * src, 06266 int32_t srcInc, 06267 uint32_t blockSize) 06268 { 06269 uint32_t i = 0u; 06270 int32_t wOffset; 06271 06272 /* Copy the value of Index pointer that points 06273 * to the current location where the input samples to be copied */ 06274 wOffset = *writeOffset; 06275 06276 /* Loop over the blockSize */ 06277 i = blockSize; 06278 06279 while(i > 0u) 06280 { 06281 /* copy the input sample to the circular buffer */ 06282 circBuffer[wOffset] = *src; 06283 06284 /* Update the input pointer */ 06285 src += srcInc; 06286 06287 /* Circularly update wOffset. Watch out for positive and negative value */ 06288 wOffset += bufferInc; 06289 if(wOffset >= L) 06290 wOffset -= L; 06291 06292 /* Decrement the loop counter */ 06293 i--; 06294 } 06295 06296 /* Update the index pointer */ 06297 *writeOffset = wOffset; 06298 } 06299 06300 06301 06302 /** 06303 * @brief Q15 Circular Read function. 06304 */ 06305 static __INLINE void arm_circularRead_q15( 06306 q15_t * circBuffer, 06307 int32_t L, 06308 int32_t * readOffset, 06309 int32_t bufferInc, 06310 q15_t * dst, 06311 q15_t * dst_base, 06312 int32_t dst_length, 06313 int32_t dstInc, 06314 uint32_t blockSize) 06315 { 06316 uint32_t i = 0; 06317 int32_t rOffset, dst_end; 06318 06319 /* Copy the value of Index pointer that points 06320 * to the current location from where the input samples to be read */ 06321 rOffset = *readOffset; 06322 06323 dst_end = (int32_t) (dst_base + dst_length); 06324 06325 /* Loop over the blockSize */ 06326 i = blockSize; 06327 06328 while(i > 0u) 06329 { 06330 /* copy the sample from the circular buffer to the destination buffer */ 06331 *dst = circBuffer[rOffset]; 06332 06333 /* Update the input pointer */ 06334 dst += dstInc; 06335 06336 if(dst == (q15_t *) dst_end) 06337 { 06338 dst = dst_base; 06339 } 06340 06341 /* Circularly update wOffset. Watch out for positive and negative value */ 06342 rOffset += bufferInc; 06343 06344 if(rOffset >= L) 06345 { 06346 rOffset -= L; 06347 } 06348 06349 /* Decrement the loop counter */ 06350 i--; 06351 } 06352 06353 /* Update the index pointer */ 06354 *readOffset = rOffset; 06355 } 06356 06357 06358 /** 06359 * @brief Q7 Circular write function. 06360 */ 06361 06362 static __INLINE void arm_circularWrite_q7( 06363 q7_t * circBuffer, 06364 int32_t L, 06365 uint16_t * writeOffset, 06366 int32_t bufferInc, 06367 const q7_t * src, 06368 int32_t srcInc, 06369 uint32_t blockSize) 06370 { 06371 uint32_t i = 0u; 06372 int32_t wOffset; 06373 06374 /* Copy the value of Index pointer that points 06375 * to the current location where the input samples to be copied */ 06376 wOffset = *writeOffset; 06377 06378 /* Loop over the blockSize */ 06379 i = blockSize; 06380 06381 while(i > 0u) 06382 { 06383 /* copy the input sample to the circular buffer */ 06384 circBuffer[wOffset] = *src; 06385 06386 /* Update the input pointer */ 06387 src += srcInc; 06388 06389 /* Circularly update wOffset. Watch out for positive and negative value */ 06390 wOffset += bufferInc; 06391 if(wOffset >= L) 06392 wOffset -= L; 06393 06394 /* Decrement the loop counter */ 06395 i--; 06396 } 06397 06398 /* Update the index pointer */ 06399 *writeOffset = wOffset; 06400 } 06401 06402 06403 06404 /** 06405 * @brief Q7 Circular Read function. 06406 */ 06407 static __INLINE void arm_circularRead_q7( 06408 q7_t * circBuffer, 06409 int32_t L, 06410 int32_t * readOffset, 06411 int32_t bufferInc, 06412 q7_t * dst, 06413 q7_t * dst_base, 06414 int32_t dst_length, 06415 int32_t dstInc, 06416 uint32_t blockSize) 06417 { 06418 uint32_t i = 0; 06419 int32_t rOffset, dst_end; 06420 06421 /* Copy the value of Index pointer that points 06422 * to the current location from where the input samples to be read */ 06423 rOffset = *readOffset; 06424 06425 dst_end = (int32_t) (dst_base + dst_length); 06426 06427 /* Loop over the blockSize */ 06428 i = blockSize; 06429 06430 while(i > 0u) 06431 { 06432 /* copy the sample from the circular buffer to the destination buffer */ 06433 *dst = circBuffer[rOffset]; 06434 06435 /* Update the input pointer */ 06436 dst += dstInc; 06437 06438 if(dst == (q7_t *) dst_end) 06439 { 06440 dst = dst_base; 06441 } 06442 06443 /* Circularly update rOffset. Watch out for positive and negative value */ 06444 rOffset += bufferInc; 06445 06446 if(rOffset >= L) 06447 { 06448 rOffset -= L; 06449 } 06450 06451 /* Decrement the loop counter */ 06452 i--; 06453 } 06454 06455 /* Update the index pointer */ 06456 *readOffset = rOffset; 06457 } 06458 06459 06460 /** 06461 * @brief Sum of the squares of the elements of a Q31 vector. 06462 * @param[in] *pSrc is input pointer 06463 * @param[in] blockSize is the number of samples to process 06464 * @param[out] *pResult is output value. 06465 * @return none. 06466 */ 06467 06468 void arm_power_q31( 06469 q31_t * pSrc, 06470 uint32_t blockSize, 06471 q63_t * pResult); 06472 06473 /** 06474 * @brief Sum of the squares of the elements of a floating-point vector. 06475 * @param[in] *pSrc is input pointer 06476 * @param[in] blockSize is the number of samples to process 06477 * @param[out] *pResult is output value. 06478 * @return none. 06479 */ 06480 06481 void arm_power_f32( 06482 float32_t * pSrc, 06483 uint32_t blockSize, 06484 float32_t * pResult); 06485 06486 /** 06487 * @brief Sum of the squares of the elements of a Q15 vector. 06488 * @param[in] *pSrc is input pointer 06489 * @param[in] blockSize is the number of samples to process 06490 * @param[out] *pResult is output value. 06491 * @return none. 06492 */ 06493 06494 void arm_power_q15( 06495 q15_t * pSrc, 06496 uint32_t blockSize, 06497 q63_t * pResult); 06498 06499 /** 06500 * @brief Sum of the squares of the elements of a Q7 vector. 06501 * @param[in] *pSrc is input pointer 06502 * @param[in] blockSize is the number of samples to process 06503 * @param[out] *pResult is output value. 06504 * @return none. 06505 */ 06506 06507 void arm_power_q7( 06508 q7_t * pSrc, 06509 uint32_t blockSize, 06510 q31_t * pResult); 06511 06512 /** 06513 * @brief Mean value of a Q7 vector. 06514 * @param[in] *pSrc is input pointer 06515 * @param[in] blockSize is the number of samples to process 06516 * @param[out] *pResult is output value. 06517 * @return none. 06518 */ 06519 06520 void arm_mean_q7( 06521 q7_t * pSrc, 06522 uint32_t blockSize, 06523 q7_t * pResult); 06524 06525 /** 06526 * @brief Mean value of a Q15 vector. 06527 * @param[in] *pSrc is input pointer 06528 * @param[in] blockSize is the number of samples to process 06529 * @param[out] *pResult is output value. 06530 * @return none. 06531 */ 06532 void arm_mean_q15( 06533 q15_t * pSrc, 06534 uint32_t blockSize, 06535 q15_t * pResult); 06536 06537 /** 06538 * @brief Mean value of a Q31 vector. 06539 * @param[in] *pSrc is input pointer 06540 * @param[in] blockSize is the number of samples to process 06541 * @param[out] *pResult is output value. 06542 * @return none. 06543 */ 06544 void arm_mean_q31( 06545 q31_t * pSrc, 06546 uint32_t blockSize, 06547 q31_t * pResult); 06548 06549 /** 06550 * @brief Mean value of a floating-point vector. 06551 * @param[in] *pSrc is input pointer 06552 * @param[in] blockSize is the number of samples to process 06553 * @param[out] *pResult is output value. 06554 * @return none. 06555 */ 06556 void arm_mean_f32( 06557 float32_t * pSrc, 06558 uint32_t blockSize, 06559 float32_t * pResult); 06560 06561 /** 06562 * @brief Variance of the elements of a floating-point vector. 06563 * @param[in] *pSrc is input pointer 06564 * @param[in] blockSize is the number of samples to process 06565 * @param[out] *pResult is output value. 06566 * @return none. 06567 */ 06568 06569 void arm_var_f32( 06570 float32_t * pSrc, 06571 uint32_t blockSize, 06572 float32_t * pResult); 06573 06574 /** 06575 * @brief Variance of the elements of a Q31 vector. 06576 * @param[in] *pSrc is input pointer 06577 * @param[in] blockSize is the number of samples to process 06578 * @param[out] *pResult is output value. 06579 * @return none. 06580 */ 06581 06582 void arm_var_q31( 06583 q31_t * pSrc, 06584 uint32_t blockSize, 06585 q31_t * pResult); 06586 06587 /** 06588 * @brief Variance of the elements of a Q15 vector. 06589 * @param[in] *pSrc is input pointer 06590 * @param[in] blockSize is the number of samples to process 06591 * @param[out] *pResult is output value. 06592 * @return none. 06593 */ 06594 06595 void arm_var_q15( 06596 q15_t * pSrc, 06597 uint32_t blockSize, 06598 q15_t * pResult); 06599 06600 /** 06601 * @brief Root Mean Square of the elements of a floating-point vector. 06602 * @param[in] *pSrc is input pointer 06603 * @param[in] blockSize is the number of samples to process 06604 * @param[out] *pResult is output value. 06605 * @return none. 06606 */ 06607 06608 void arm_rms_f32( 06609 float32_t * pSrc, 06610 uint32_t blockSize, 06611 float32_t * pResult); 06612 06613 /** 06614 * @brief Root Mean Square of the elements of a Q31 vector. 06615 * @param[in] *pSrc is input pointer 06616 * @param[in] blockSize is the number of samples to process 06617 * @param[out] *pResult is output value. 06618 * @return none. 06619 */ 06620 06621 void arm_rms_q31( 06622 q31_t * pSrc, 06623 uint32_t blockSize, 06624 q31_t * pResult); 06625 06626 /** 06627 * @brief Root Mean Square of the elements of a Q15 vector. 06628 * @param[in] *pSrc is input pointer 06629 * @param[in] blockSize is the number of samples to process 06630 * @param[out] *pResult is output value. 06631 * @return none. 06632 */ 06633 06634 void arm_rms_q15( 06635 q15_t * pSrc, 06636 uint32_t blockSize, 06637 q15_t * pResult); 06638 06639 /** 06640 * @brief Standard deviation of the elements of a floating-point vector. 06641 * @param[in] *pSrc is input pointer 06642 * @param[in] blockSize is the number of samples to process 06643 * @param[out] *pResult is output value. 06644 * @return none. 06645 */ 06646 06647 void arm_std_f32( 06648 float32_t * pSrc, 06649 uint32_t blockSize, 06650 float32_t * pResult); 06651 06652 /** 06653 * @brief Standard deviation of the elements of a Q31 vector. 06654 * @param[in] *pSrc is input pointer 06655 * @param[in] blockSize is the number of samples to process 06656 * @param[out] *pResult is output value. 06657 * @return none. 06658 */ 06659 06660 void arm_std_q31( 06661 q31_t * pSrc, 06662 uint32_t blockSize, 06663 q31_t * pResult); 06664 06665 /** 06666 * @brief Standard deviation of the elements of a Q15 vector. 06667 * @param[in] *pSrc is input pointer 06668 * @param[in] blockSize is the number of samples to process 06669 * @param[out] *pResult is output value. 06670 * @return none. 06671 */ 06672 06673 void arm_std_q15( 06674 q15_t * pSrc, 06675 uint32_t blockSize, 06676 q15_t * pResult); 06677 06678 /** 06679 * @brief Floating-point complex magnitude 06680 * @param[in] *pSrc points to the complex input vector 06681 * @param[out] *pDst points to the real output vector 06682 * @param[in] numSamples number of complex samples in the input vector 06683 * @return none. 06684 */ 06685 06686 void arm_cmplx_mag_f32( 06687 float32_t * pSrc, 06688 float32_t * pDst, 06689 uint32_t numSamples); 06690 06691 /** 06692 * @brief Q31 complex magnitude 06693 * @param[in] *pSrc points to the complex input vector 06694 * @param[out] *pDst points to the real output vector 06695 * @param[in] numSamples number of complex samples in the input vector 06696 * @return none. 06697 */ 06698 06699 void arm_cmplx_mag_q31( 06700 q31_t * pSrc, 06701 q31_t * pDst, 06702 uint32_t numSamples); 06703 06704 /** 06705 * @brief Q15 complex magnitude 06706 * @param[in] *pSrc points to the complex input vector 06707 * @param[out] *pDst points to the real output vector 06708 * @param[in] numSamples number of complex samples in the input vector 06709 * @return none. 06710 */ 06711 06712 void arm_cmplx_mag_q15( 06713 q15_t * pSrc, 06714 q15_t * pDst, 06715 uint32_t numSamples); 06716 06717 /** 06718 * @brief Q15 complex dot product 06719 * @param[in] *pSrcA points to the first input vector 06720 * @param[in] *pSrcB points to the second input vector 06721 * @param[in] numSamples number of complex samples in each vector 06722 * @param[out] *realResult real part of the result returned here 06723 * @param[out] *imagResult imaginary part of the result returned here 06724 * @return none. 06725 */ 06726 06727 void arm_cmplx_dot_prod_q15( 06728 q15_t * pSrcA, 06729 q15_t * pSrcB, 06730 uint32_t numSamples, 06731 q31_t * realResult, 06732 q31_t * imagResult); 06733 06734 /** 06735 * @brief Q31 complex dot product 06736 * @param[in] *pSrcA points to the first input vector 06737 * @param[in] *pSrcB points to the second input vector 06738 * @param[in] numSamples number of complex samples in each vector 06739 * @param[out] *realResult real part of the result returned here 06740 * @param[out] *imagResult imaginary part of the result returned here 06741 * @return none. 06742 */ 06743 06744 void arm_cmplx_dot_prod_q31( 06745 q31_t * pSrcA, 06746 q31_t * pSrcB, 06747 uint32_t numSamples, 06748 q63_t * realResult, 06749 q63_t * imagResult); 06750 06751 /** 06752 * @brief Floating-point complex dot product 06753 * @param[in] *pSrcA points to the first input vector 06754 * @param[in] *pSrcB points to the second input vector 06755 * @param[in] numSamples number of complex samples in each vector 06756 * @param[out] *realResult real part of the result returned here 06757 * @param[out] *imagResult imaginary part of the result returned here 06758 * @return none. 06759 */ 06760 06761 void arm_cmplx_dot_prod_f32( 06762 float32_t * pSrcA, 06763 float32_t * pSrcB, 06764 uint32_t numSamples, 06765 float32_t * realResult, 06766 float32_t * imagResult); 06767 06768 /** 06769 * @brief Q15 complex-by-real multiplication 06770 * @param[in] *pSrcCmplx points to the complex input vector 06771 * @param[in] *pSrcReal points to the real input vector 06772 * @param[out] *pCmplxDst points to the complex output vector 06773 * @param[in] numSamples number of samples in each vector 06774 * @return none. 06775 */ 06776 06777 void arm_cmplx_mult_real_q15( 06778 q15_t * pSrcCmplx, 06779 q15_t * pSrcReal, 06780 q15_t * pCmplxDst, 06781 uint32_t numSamples); 06782 06783 /** 06784 * @brief Q31 complex-by-real multiplication 06785 * @param[in] *pSrcCmplx points to the complex input vector 06786 * @param[in] *pSrcReal points to the real input vector 06787 * @param[out] *pCmplxDst points to the complex output vector 06788 * @param[in] numSamples number of samples in each vector 06789 * @return none. 06790 */ 06791 06792 void arm_cmplx_mult_real_q31( 06793 q31_t * pSrcCmplx, 06794 q31_t * pSrcReal, 06795 q31_t * pCmplxDst, 06796 uint32_t numSamples); 06797 06798 /** 06799 * @brief Floating-point complex-by-real multiplication 06800 * @param[in] *pSrcCmplx points to the complex input vector 06801 * @param[in] *pSrcReal points to the real input vector 06802 * @param[out] *pCmplxDst points to the complex output vector 06803 * @param[in] numSamples number of samples in each vector 06804 * @return none. 06805 */ 06806 06807 void arm_cmplx_mult_real_f32( 06808 float32_t * pSrcCmplx, 06809 float32_t * pSrcReal, 06810 float32_t * pCmplxDst, 06811 uint32_t numSamples); 06812 06813 /** 06814 * @brief Minimum value of a Q7 vector. 06815 * @param[in] *pSrc is input pointer 06816 * @param[in] blockSize is the number of samples to process 06817 * @param[out] *result is output pointer 06818 * @param[in] index is the array index of the minimum value in the input buffer. 06819 * @return none. 06820 */ 06821 06822 void arm_min_q7( 06823 q7_t * pSrc, 06824 uint32_t blockSize, 06825 q7_t * result, 06826 uint32_t * index); 06827 06828 /** 06829 * @brief Minimum value of a Q15 vector. 06830 * @param[in] *pSrc is input pointer 06831 * @param[in] blockSize is the number of samples to process 06832 * @param[out] *pResult is output pointer 06833 * @param[in] *pIndex is the array index of the minimum value in the input buffer. 06834 * @return none. 06835 */ 06836 06837 void arm_min_q15( 06838 q15_t * pSrc, 06839 uint32_t blockSize, 06840 q15_t * pResult, 06841 uint32_t * pIndex); 06842 06843 /** 06844 * @brief Minimum value of a Q31 vector. 06845 * @param[in] *pSrc is input pointer 06846 * @param[in] blockSize is the number of samples to process 06847 * @param[out] *pResult is output pointer 06848 * @param[out] *pIndex is the array index of the minimum value in the input buffer. 06849 * @return none. 06850 */ 06851 void arm_min_q31( 06852 q31_t * pSrc, 06853 uint32_t blockSize, 06854 q31_t * pResult, 06855 uint32_t * pIndex); 06856 06857 /** 06858 * @brief Minimum value of a floating-point vector. 06859 * @param[in] *pSrc is input pointer 06860 * @param[in] blockSize is the number of samples to process 06861 * @param[out] *pResult is output pointer 06862 * @param[out] *pIndex is the array index of the minimum value in the input buffer. 06863 * @return none. 06864 */ 06865 06866 void arm_min_f32( 06867 float32_t * pSrc, 06868 uint32_t blockSize, 06869 float32_t * pResult, 06870 uint32_t * pIndex); 06871 06872 /** 06873 * @brief Maximum value of a Q7 vector. 06874 * @param[in] *pSrc points to the input buffer 06875 * @param[in] blockSize length of the input vector 06876 * @param[out] *pResult maximum value returned here 06877 * @param[out] *pIndex index of maximum value returned here 06878 * @return none. 06879 */ 06880 06881 void arm_max_q7( 06882 q7_t * pSrc, 06883 uint32_t blockSize, 06884 q7_t * pResult, 06885 uint32_t * pIndex); 06886 06887 /** 06888 * @brief Maximum value of a Q15 vector. 06889 * @param[in] *pSrc points to the input buffer 06890 * @param[in] blockSize length of the input vector 06891 * @param[out] *pResult maximum value returned here 06892 * @param[out] *pIndex index of maximum value returned here 06893 * @return none. 06894 */ 06895 06896 void arm_max_q15( 06897 q15_t * pSrc, 06898 uint32_t blockSize, 06899 q15_t * pResult, 06900 uint32_t * pIndex); 06901 06902 /** 06903 * @brief Maximum value of a Q31 vector. 06904 * @param[in] *pSrc points to the input buffer 06905 * @param[in] blockSize length of the input vector 06906 * @param[out] *pResult maximum value returned here 06907 * @param[out] *pIndex index of maximum value returned here 06908 * @return none. 06909 */ 06910 06911 void arm_max_q31( 06912 q31_t * pSrc, 06913 uint32_t blockSize, 06914 q31_t * pResult, 06915 uint32_t * pIndex); 06916 06917 /** 06918 * @brief Maximum value of a floating-point vector. 06919 * @param[in] *pSrc points to the input buffer 06920 * @param[in] blockSize length of the input vector 06921 * @param[out] *pResult maximum value returned here 06922 * @param[out] *pIndex index of maximum value returned here 06923 * @return none. 06924 */ 06925 06926 void arm_max_f32( 06927 float32_t * pSrc, 06928 uint32_t blockSize, 06929 float32_t * pResult, 06930 uint32_t * pIndex); 06931 06932 /** 06933 * @brief Q15 complex-by-complex multiplication 06934 * @param[in] *pSrcA points to the first input vector 06935 * @param[in] *pSrcB points to the second input vector 06936 * @param[out] *pDst points to the output vector 06937 * @param[in] numSamples number of complex samples in each vector 06938 * @return none. 06939 */ 06940 06941 void arm_cmplx_mult_cmplx_q15( 06942 q15_t * pSrcA, 06943 q15_t * pSrcB, 06944 q15_t * pDst, 06945 uint32_t numSamples); 06946 06947 /** 06948 * @brief Q31 complex-by-complex multiplication 06949 * @param[in] *pSrcA points to the first input vector 06950 * @param[in] *pSrcB points to the second input vector 06951 * @param[out] *pDst points to the output vector 06952 * @param[in] numSamples number of complex samples in each vector 06953 * @return none. 06954 */ 06955 06956 void arm_cmplx_mult_cmplx_q31( 06957 q31_t * pSrcA, 06958 q31_t * pSrcB, 06959 q31_t * pDst, 06960 uint32_t numSamples); 06961 06962 /** 06963 * @brief Floating-point complex-by-complex multiplication 06964 * @param[in] *pSrcA points to the first input vector 06965 * @param[in] *pSrcB points to the second input vector 06966 * @param[out] *pDst points to the output vector 06967 * @param[in] numSamples number of complex samples in each vector 06968 * @return none. 06969 */ 06970 06971 void arm_cmplx_mult_cmplx_f32( 06972 float32_t * pSrcA, 06973 float32_t * pSrcB, 06974 float32_t * pDst, 06975 uint32_t numSamples); 06976 06977 /** 06978 * @brief Converts the elements of the floating-point vector to Q31 vector. 06979 * @param[in] *pSrc points to the floating-point input vector 06980 * @param[out] *pDst points to the Q31 output vector 06981 * @param[in] blockSize length of the input vector 06982 * @return none. 06983 */ 06984 void arm_float_to_q31( 06985 float32_t * pSrc, 06986 q31_t * pDst, 06987 uint32_t blockSize); 06988 06989 /** 06990 * @brief Converts the elements of the floating-point vector to Q15 vector. 06991 * @param[in] *pSrc points to the floating-point input vector 06992 * @param[out] *pDst points to the Q15 output vector 06993 * @param[in] blockSize length of the input vector 06994 * @return none 06995 */ 06996 void arm_float_to_q15( 06997 float32_t * pSrc, 06998 q15_t * pDst, 06999 uint32_t blockSize); 07000 07001 /** 07002 * @brief Converts the elements of the floating-point vector to Q7 vector. 07003 * @param[in] *pSrc points to the floating-point input vector 07004 * @param[out] *pDst points to the Q7 output vector 07005 * @param[in] blockSize length of the input vector 07006 * @return none 07007 */ 07008 void arm_float_to_q7( 07009 float32_t * pSrc, 07010 q7_t * pDst, 07011 uint32_t blockSize); 07012 07013 07014 /** 07015 * @brief Converts the elements of the Q31 vector to Q15 vector. 07016 * @param[in] *pSrc is input pointer 07017 * @param[out] *pDst is output pointer 07018 * @param[in] blockSize is the number of samples to process 07019 * @return none. 07020 */ 07021 void arm_q31_to_q15( 07022 q31_t * pSrc, 07023 q15_t * pDst, 07024 uint32_t blockSize); 07025 07026 /** 07027 * @brief Converts the elements of the Q31 vector to Q7 vector. 07028 * @param[in] *pSrc is input pointer 07029 * @param[out] *pDst is output pointer 07030 * @param[in] blockSize is the number of samples to process 07031 * @return none. 07032 */ 07033 void arm_q31_to_q7( 07034 q31_t * pSrc, 07035 q7_t * pDst, 07036 uint32_t blockSize); 07037 07038 /** 07039 * @brief Converts the elements of the Q15 vector to floating-point vector. 07040 * @param[in] *pSrc is input pointer 07041 * @param[out] *pDst is output pointer 07042 * @param[in] blockSize is the number of samples to process 07043 * @return none. 07044 */ 07045 void arm_q15_to_float( 07046 q15_t * pSrc, 07047 float32_t * pDst, 07048 uint32_t blockSize); 07049 07050 07051 /** 07052 * @brief Converts the elements of the Q15 vector to Q31 vector. 07053 * @param[in] *pSrc is input pointer 07054 * @param[out] *pDst is output pointer 07055 * @param[in] blockSize is the number of samples to process 07056 * @return none. 07057 */ 07058 void arm_q15_to_q31( 07059 q15_t * pSrc, 07060 q31_t * pDst, 07061 uint32_t blockSize); 07062 07063 07064 /** 07065 * @brief Converts the elements of the Q15 vector to Q7 vector. 07066 * @param[in] *pSrc is input pointer 07067 * @param[out] *pDst is output pointer 07068 * @param[in] blockSize is the number of samples to process 07069 * @return none. 07070 */ 07071 void arm_q15_to_q7( 07072 q15_t * pSrc, 07073 q7_t * pDst, 07074 uint32_t blockSize); 07075 07076 07077 /** 07078 * @ingroup groupInterpolation 07079 */ 07080 07081 /** 07082 * @defgroup BilinearInterpolate Bilinear Interpolation 07083 * 07084 * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. 07085 * The underlying function <code>f(x, y)</code> is sampled on a regular grid and the interpolation process 07086 * determines values between the grid points. 07087 * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. 07088 * Bilinear interpolation is often used in image processing to rescale images. 07089 * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. 07090 * 07091 * <b>Algorithm</b> 07092 * \par 07093 * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. 07094 * For floating-point, the instance structure is defined as: 07095 * <pre> 07096 * typedef struct 07097 * { 07098 * uint16_t numRows; 07099 * uint16_t numCols; 07100 * float32_t *pData; 07101 * } arm_bilinear_interp_instance_f32; 07102 * </pre> 07103 * 07104 * \par 07105 * where <code>numRows</code> specifies the number of rows in the table; 07106 * <code>numCols</code> specifies the number of columns in the table; 07107 * and <code>pData</code> points to an array of size <code>numRows*numCols</code> values. 07108 * The data table <code>pTable</code> is organized in row order and the supplied data values fall on integer indexes. 07109 * That is, table element (x,y) is located at <code>pTable[x + y*numCols]</code> where x and y are integers. 07110 * 07111 * \par 07112 * Let <code>(x, y)</code> specify the desired interpolation point. Then define: 07113 * <pre> 07114 * XF = floor(x) 07115 * YF = floor(y) 07116 * </pre> 07117 * \par 07118 * The interpolated output point is computed as: 07119 * <pre> 07120 * f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF)) 07121 * + f(XF+1, YF) * (x-XF)*(1-(y-YF)) 07122 * + f(XF, YF+1) * (1-(x-XF))*(y-YF) 07123 * + f(XF+1, YF+1) * (x-XF)*(y-YF) 07124 * </pre> 07125 * Note that the coordinates (x, y) contain integer and fractional components. 07126 * The integer components specify which portion of the table to use while the 07127 * fractional components control the interpolation processor. 07128 * 07129 * \par 07130 * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. 07131 */ 07132 07133 /** 07134 * @addtogroup BilinearInterpolate 07135 * @{ 07136 */ 07137 07138 /** 07139 * 07140 * @brief Floating-point bilinear interpolation. 07141 * @param[in,out] *S points to an instance of the interpolation structure. 07142 * @param[in] X interpolation coordinate. 07143 * @param[in] Y interpolation coordinate. 07144 * @return out interpolated value. 07145 */ 07146 07147 07148 static __INLINE float32_t arm_bilinear_interp_f32( 07149 const arm_bilinear_interp_instance_f32 * S, 07150 float32_t X, 07151 float32_t Y) 07152 { 07153 float32_t out; 07154 float32_t f00, f01, f10, f11; 07155 float32_t *pData = S->pData; 07156 int32_t xIndex, yIndex, index; 07157 float32_t xdiff, ydiff; 07158 float32_t b1, b2, b3, b4; 07159 07160 xIndex = (int32_t) X; 07161 yIndex = (int32_t) Y; 07162 07163 /* Care taken for table outside boundary */ 07164 /* Returns zero output when values are outside table boundary */ 07165 if(xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 07166 || yIndex > (S->numCols - 1)) 07167 { 07168 return (0); 07169 } 07170 07171 /* Calculation of index for two nearest points in X-direction */ 07172 index = (xIndex - 1) + (yIndex - 1) * S->numCols; 07173 07174 07175 /* Read two nearest points in X-direction */ 07176 f00 = pData[index]; 07177 f01 = pData[index + 1]; 07178 07179 /* Calculation of index for two nearest points in Y-direction */ 07180 index = (xIndex - 1) + (yIndex) * S->numCols; 07181 07182 07183 /* Read two nearest points in Y-direction */ 07184 f10 = pData[index]; 07185 f11 = pData[index + 1]; 07186 07187 /* Calculation of intermediate values */ 07188 b1 = f00; 07189 b2 = f01 - f00; 07190 b3 = f10 - f00; 07191 b4 = f00 - f01 - f10 + f11; 07192 07193 /* Calculation of fractional part in X */ 07194 xdiff = X - xIndex; 07195 07196 /* Calculation of fractional part in Y */ 07197 ydiff = Y - yIndex; 07198 07199 /* Calculation of bi-linear interpolated output */ 07200 out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; 07201 07202 /* return to application */ 07203 return (out); 07204 07205 } 07206 07207 /** 07208 * 07209 * @brief Q31 bilinear interpolation. 07210 * @param[in,out] *S points to an instance of the interpolation structure. 07211 * @param[in] X interpolation coordinate in 12.20 format. 07212 * @param[in] Y interpolation coordinate in 12.20 format. 07213 * @return out interpolated value. 07214 */ 07215 07216 static __INLINE q31_t arm_bilinear_interp_q31( 07217 arm_bilinear_interp_instance_q31 * S, 07218 q31_t X, 07219 q31_t Y) 07220 { 07221 q31_t out; /* Temporary output */ 07222 q31_t acc = 0; /* output */ 07223 q31_t xfract, yfract; /* X, Y fractional parts */ 07224 q31_t x1, x2, y1, y2; /* Nearest output values */ 07225 int32_t rI, cI; /* Row and column indices */ 07226 q31_t *pYData = S->pData; /* pointer to output table values */ 07227 uint32_t nCols = S->numCols; /* num of rows */ 07228 07229 07230 /* Input is in 12.20 format */ 07231 /* 12 bits for the table index */ 07232 /* Index value calculation */ 07233 rI = ((X & 0xFFF00000) >> 20u); 07234 07235 /* Input is in 12.20 format */ 07236 /* 12 bits for the table index */ 07237 /* Index value calculation */ 07238 cI = ((Y & 0xFFF00000) >> 20u); 07239 07240 /* Care taken for table outside boundary */ 07241 /* Returns zero output when values are outside table boundary */ 07242 if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) 07243 { 07244 return (0); 07245 } 07246 07247 /* 20 bits for the fractional part */ 07248 /* shift left xfract by 11 to keep 1.31 format */ 07249 xfract = (X & 0x000FFFFF) << 11u; 07250 07251 /* Read two nearest output values from the index */ 07252 x1 = pYData[(rI) + nCols * (cI)]; 07253 x2 = pYData[(rI) + nCols * (cI) + 1u]; 07254 07255 /* 20 bits for the fractional part */ 07256 /* shift left yfract by 11 to keep 1.31 format */ 07257 yfract = (Y & 0x000FFFFF) << 11u; 07258 07259 /* Read two nearest output values from the index */ 07260 y1 = pYData[(rI) + nCols * (cI + 1)]; 07261 y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; 07262 07263 /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ 07264 out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); 07265 acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); 07266 07267 /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ 07268 out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); 07269 acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); 07270 07271 /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ 07272 out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); 07273 acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); 07274 07275 /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ 07276 out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); 07277 acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); 07278 07279 /* Convert acc to 1.31(q31) format */ 07280 return (acc << 2u); 07281 07282 } 07283 07284 /** 07285 * @brief Q15 bilinear interpolation. 07286 * @param[in,out] *S points to an instance of the interpolation structure. 07287 * @param[in] X interpolation coordinate in 12.20 format. 07288 * @param[in] Y interpolation coordinate in 12.20 format. 07289 * @return out interpolated value. 07290 */ 07291 07292 static __INLINE q15_t arm_bilinear_interp_q15( 07293 arm_bilinear_interp_instance_q15 * S, 07294 q31_t X, 07295 q31_t Y) 07296 { 07297 q63_t acc = 0; /* output */ 07298 q31_t out; /* Temporary output */ 07299 q15_t x1, x2, y1, y2; /* Nearest output values */ 07300 q31_t xfract, yfract; /* X, Y fractional parts */ 07301 int32_t rI, cI; /* Row and column indices */ 07302 q15_t *pYData = S->pData; /* pointer to output table values */ 07303 uint32_t nCols = S->numCols; /* num of rows */ 07304 07305 /* Input is in 12.20 format */ 07306 /* 12 bits for the table index */ 07307 /* Index value calculation */ 07308 rI = ((X & 0xFFF00000) >> 20); 07309 07310 /* Input is in 12.20 format */ 07311 /* 12 bits for the table index */ 07312 /* Index value calculation */ 07313 cI = ((Y & 0xFFF00000) >> 20); 07314 07315 /* Care taken for table outside boundary */ 07316 /* Returns zero output when values are outside table boundary */ 07317 if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) 07318 { 07319 return (0); 07320 } 07321 07322 /* 20 bits for the fractional part */ 07323 /* xfract should be in 12.20 format */ 07324 xfract = (X & 0x000FFFFF); 07325 07326 /* Read two nearest output values from the index */ 07327 x1 = pYData[(rI) + nCols * (cI)]; 07328 x2 = pYData[(rI) + nCols * (cI) + 1u]; 07329 07330 07331 /* 20 bits for the fractional part */ 07332 /* yfract should be in 12.20 format */ 07333 yfract = (Y & 0x000FFFFF); 07334 07335 /* Read two nearest output values from the index */ 07336 y1 = pYData[(rI) + nCols * (cI + 1)]; 07337 y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; 07338 07339 /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ 07340 07341 /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ 07342 /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ 07343 out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u); 07344 acc = ((q63_t) out * (0xFFFFF - yfract)); 07345 07346 /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ 07347 out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u); 07348 acc += ((q63_t) out * (xfract)); 07349 07350 /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ 07351 out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u); 07352 acc += ((q63_t) out * (yfract)); 07353 07354 /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ 07355 out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u); 07356 acc += ((q63_t) out * (yfract)); 07357 07358 /* acc is in 13.51 format and down shift acc by 36 times */ 07359 /* Convert out to 1.15 format */ 07360 return (acc >> 36); 07361 07362 } 07363 07364 /** 07365 * @brief Q7 bilinear interpolation. 07366 * @param[in,out] *S points to an instance of the interpolation structure. 07367 * @param[in] X interpolation coordinate in 12.20 format. 07368 * @param[in] Y interpolation coordinate in 12.20 format. 07369 * @return out interpolated value. 07370 */ 07371 07372 static __INLINE q7_t arm_bilinear_interp_q7( 07373 arm_bilinear_interp_instance_q7 * S, 07374 q31_t X, 07375 q31_t Y) 07376 { 07377 q63_t acc = 0; /* output */ 07378 q31_t out; /* Temporary output */ 07379 q31_t xfract, yfract; /* X, Y fractional parts */ 07380 q7_t x1, x2, y1, y2; /* Nearest output values */ 07381 int32_t rI, cI; /* Row and column indices */ 07382 q7_t *pYData = S->pData; /* pointer to output table values */ 07383 uint32_t nCols = S->numCols; /* num of rows */ 07384 07385 /* Input is in 12.20 format */ 07386 /* 12 bits for the table index */ 07387 /* Index value calculation */ 07388 rI = ((X & 0xFFF00000) >> 20); 07389 07390 /* Input is in 12.20 format */ 07391 /* 12 bits for the table index */ 07392 /* Index value calculation */ 07393 cI = ((Y & 0xFFF00000) >> 20); 07394 07395 /* Care taken for table outside boundary */ 07396 /* Returns zero output when values are outside table boundary */ 07397 if(rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1)) 07398 { 07399 return (0); 07400 } 07401 07402 /* 20 bits for the fractional part */ 07403 /* xfract should be in 12.20 format */ 07404 xfract = (X & 0x000FFFFF); 07405 07406 /* Read two nearest output values from the index */ 07407 x1 = pYData[(rI) + nCols * (cI)]; 07408 x2 = pYData[(rI) + nCols * (cI) + 1u]; 07409 07410 07411 /* 20 bits for the fractional part */ 07412 /* yfract should be in 12.20 format */ 07413 yfract = (Y & 0x000FFFFF); 07414 07415 /* Read two nearest output values from the index */ 07416 y1 = pYData[(rI) + nCols * (cI + 1)]; 07417 y2 = pYData[(rI) + nCols * (cI + 1) + 1u]; 07418 07419 /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ 07420 out = ((x1 * (0xFFFFF - xfract))); 07421 acc = (((q63_t) out * (0xFFFFF - yfract))); 07422 07423 /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ 07424 out = ((x2 * (0xFFFFF - yfract))); 07425 acc += (((q63_t) out * (xfract))); 07426 07427 /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ 07428 out = ((y1 * (0xFFFFF - xfract))); 07429 acc += (((q63_t) out * (yfract))); 07430 07431 /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ 07432 out = ((y2 * (yfract))); 07433 acc += (((q63_t) out * (xfract))); 07434 07435 /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ 07436 return (acc >> 40); 07437 07438 } 07439 07440 /** 07441 * @} end of BilinearInterpolate group 07442 */ 07443 07444 07445 //SMMLAR 07446 #define multAcc_32x32_keep32_R(a, x, y) \ 07447 a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) 07448 07449 //SMMLSR 07450 #define multSub_32x32_keep32_R(a, x, y) \ 07451 a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) 07452 07453 //SMMULR 07454 #define mult_32x32_keep32_R(a, x, y) \ 07455 a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) 07456 07457 //SMMLA 07458 #define multAcc_32x32_keep32(a, x, y) \ 07459 a += (q31_t) (((q63_t) x * y) >> 32) 07460 07461 //SMMLS 07462 #define multSub_32x32_keep32(a, x, y) \ 07463 a -= (q31_t) (((q63_t) x * y) >> 32) 07464 07465 //SMMUL 07466 #define mult_32x32_keep32(a, x, y) \ 07467 a = (q31_t) (((q63_t) x * y ) >> 32) 07468 07469 07470 #if defined ( __CC_ARM ) //Keil 07471 07472 //Enter low optimization region - place directly above function definition 07473 #ifdef ARM_MATH_CM4 07474 #define LOW_OPTIMIZATION_ENTER \ 07475 _Pragma ("push") \ 07476 _Pragma ("O1") 07477 #else 07478 #define LOW_OPTIMIZATION_ENTER 07479 #endif 07480 07481 //Exit low optimization region - place directly after end of function definition 07482 #ifdef ARM_MATH_CM4 07483 #define LOW_OPTIMIZATION_EXIT \ 07484 _Pragma ("pop") 07485 #else 07486 #define LOW_OPTIMIZATION_EXIT 07487 #endif 07488 07489 //Enter low optimization region - place directly above function definition 07490 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 07491 07492 //Exit low optimization region - place directly after end of function definition 07493 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 07494 07495 #elif defined(__ICCARM__) //IAR 07496 07497 //Enter low optimization region - place directly above function definition 07498 #ifdef ARM_MATH_CM4 07499 #define LOW_OPTIMIZATION_ENTER \ 07500 _Pragma ("optimize=low") 07501 #else 07502 #define LOW_OPTIMIZATION_ENTER 07503 #endif 07504 07505 //Exit low optimization region - place directly after end of function definition 07506 #define LOW_OPTIMIZATION_EXIT 07507 07508 //Enter low optimization region - place directly above function definition 07509 #ifdef ARM_MATH_CM4 07510 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ 07511 _Pragma ("optimize=low") 07512 #else 07513 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 07514 #endif 07515 07516 //Exit low optimization region - place directly after end of function definition 07517 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 07518 07519 #elif defined(__GNUC__) 07520 07521 #define LOW_OPTIMIZATION_ENTER __attribute__(( optimize("-O1") )) 07522 07523 #define LOW_OPTIMIZATION_EXIT 07524 07525 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 07526 07527 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 07528 07529 #elif defined(__CSMC__) // Cosmic 07530 07531 #define LOW_OPTIMIZATION_ENTER 07532 #define LOW_OPTIMIZATION_EXIT 07533 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 07534 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 07535 07536 #elif defined(__TASKING__) // TASKING 07537 07538 #define LOW_OPTIMIZATION_ENTER 07539 #define LOW_OPTIMIZATION_EXIT 07540 #define IAR_ONLY_LOW_OPTIMIZATION_ENTER 07541 #define IAR_ONLY_LOW_OPTIMIZATION_EXIT 07542 07543 #endif 07544 07545 07546 #ifdef __cplusplus 07547 } 07548 #endif 07549 07550 07551 #endif /* _ARM_MATH_H */ 07552 07553 /** 07554 * 07555 * End of file. 07556 */
Generated on Tue Jul 12 2022 17:38:47 by
