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