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