/* ---------------------------------------------------------------------- | |
* Copyright (C) 2010-2011 ARM Limited. All rights reserved. | |
* | |
* $Date: 15. July 2011 | |
* $Revision: V1.0.10 | |
* | |
* Project: CMSIS DSP Library | |
* Title: arm_math.h | |
* | |
* Description: Public header file for CMSIS DSP Library | |
* | |
* Target Processor: Cortex-M4/Cortex-M3/Cortex-M0 | |
* | |
* Version 1.0.10 2011/7/15 | |
* Big Endian support added and Merged M0 and M3/M4 Source code. | |
* | |
* Version 1.0.3 2010/11/29 | |
* Re-organized the CMSIS folders and updated documentation. | |
* | |
* Version 1.0.2 2010/11/11 | |
* Documentation updated. | |
* | |
* Version 1.0.1 2010/10/05 | |
* Production release and review comments incorporated. | |
* | |
* Version 1.0.0 2010/09/20 | |
* Production release and review comments incorporated. | |
* -------------------------------------------------------------------- */ | |
/** | |
\mainpage CMSIS DSP Software Library | |
* | |
* <b>Introduction</b> | |
* | |
* This user manual describes the CMSIS DSP software library, | |
* a suite of common signal processing functions for use on Cortex-M processor based devices. | |
* | |
* The library is divided into a number of modules each covering a specific category: | |
* - Basic math functions | |
* - Fast math functions | |
* - Complex math functions | |
* - Filters | |
* - Matrix functions | |
* - Transforms | |
* - Motor control functions | |
* - Statistical functions | |
* - Support functions | |
* - Interpolation functions | |
* | |
* The library has separate functions for operating on 8-bit integers, 16-bit integers, | |
* 32-bit integer and 32-bit floating-point values. | |
* | |
* <b>Processor Support</b> | |
* | |
* The library is completely written in C and is fully CMSIS compliant. | |
* High performance is achieved through maximum use of Cortex-M4 intrinsics. | |
* | |
* The supplied library source code also builds and runs on the Cortex-M3 and Cortex-M0 processor, | |
* with the DSP intrinsics being emulated through software. | |
* | |
* | |
* <b>Toolchain Support</b> | |
* | |
* The library has been developed and tested with MDK-ARM version 4.21. | |
* The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly. | |
* | |
* <b>Using the Library</b> | |
* | |
* The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder. | |
* - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4) | |
* - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4) | |
* - arm_cortexM4l_math.lib (Little endian on Cortex-M4) | |
* - arm_cortexM4b_math.lib (Big endian on Cortex-M4) | |
* - arm_cortexM3l_math.lib (Little endian on Cortex-M3) | |
* - arm_cortexM3b_math.lib (Big endian on Cortex-M3) | |
* - arm_cortexM0l_math.lib (Little endian on Cortex-M0) | |
* - arm_cortexM0b_math.lib (Big endian on Cortex-M3) | |
* | |
* The library functions are declared in the public file <code>arm_math.h</code> which is placed in the <code>Include</code> folder. | |
* Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single | |
* public header file <code>arm_math.h</code> for Cortex-M4/M3/M0 with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. | |
* Define the appropriate pre processor MACRO ARM_MATH_CM4 or ARM_MATH_CM3 or | |
* ARM_MATH_CM0 depending on the target processor in the application. | |
* | |
* <b>Examples</b> | |
* | |
* The library ships with a number of examples which demonstrate how to use the library functions. | |
* | |
* <b>Building the Library</b> | |
* | |
* The library installer contains project files to re build libraries on MDK Tool chain in the <code>CMSIS\\DSP_Lib\\Source\\ARM</code> folder. | |
* - arm_cortexM0b_math.uvproj | |
* - arm_cortexM0l_math.uvproj | |
* - arm_cortexM3b_math.uvproj | |
* - arm_cortexM3l_math.uvproj | |
* - arm_cortexM4b_math.uvproj | |
* - arm_cortexM4l_math.uvproj | |
* - arm_cortexM4bf_math.uvproj | |
* - arm_cortexM4lf_math.uvproj | |
* | |
* Each library project have differant pre-processor macros. | |
* | |
* <b>ARM_MATH_CMx:</b> | |
* Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target | |
* and ARM_MATH_CM0 for building library on cortex-M0 target. | |
* | |
* <b>ARM_MATH_BIG_ENDIAN:</b> | |
* Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. | |
* | |
* <b>ARM_MATH_MATRIX_CHECK:</b> | |
* Define macro for checking on the input and output sizes of matrices | |
* | |
* <b>ARM_MATH_ROUNDING:</b> | |
* Define macro for rounding on support functions | |
* | |
* <b>__FPU_PRESENT:</b> | |
* Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries | |
* | |
* | |
* The project can be built by opening the appropriate project in MDK-ARM 4.21 chain and defining the optional pre processor MACROs detailed above. | |
* | |
* <b>Copyright Notice</b> | |
* | |
* Copyright (C) 2010 ARM Limited. All rights reserved. | |
*/ | |
/** | |
* @defgroup groupMath Basic Math Functions | |
*/ | |
/** | |
* @defgroup groupFastMath Fast Math Functions | |
* This set of functions provides a fast approximation to sine, cosine, and square root. | |
* As compared to most of the other functions in the CMSIS math library, the fast math functions | |
* operate on individual values and not arrays. | |
* There are separate functions for Q15, Q31, and floating-point data. | |
* | |
*/ | |
/** | |
* @defgroup groupCmplxMath Complex Math Functions | |
* This set of functions operates on complex data vectors. | |
* The data in the complex arrays is stored in an interleaved fashion | |
* (real, imag, real, imag, ...). | |
* In the API functions, the number of samples in a complex array refers | |
* to the number of complex values; the array contains twice this number of | |
* real values. | |
*/ | |
/** | |
* @defgroup groupFilters Filtering Functions | |
*/ | |
/** | |
* @defgroup groupMatrix Matrix Functions | |
* | |
* This set of functions provides basic matrix math operations. | |
* The functions operate on matrix data structures. For example, | |
* the type | |
* definition for the floating-point matrix structure is shown | |
* below: | |
* <pre> | |
* typedef struct | |
* { | |
* uint16_t numRows; // number of rows of the matrix. | |
* uint16_t numCols; // number of columns of the matrix. | |
* float32_t *pData; // points to the data of the matrix. | |
* } arm_matrix_instance_f32; | |
* </pre> | |
* There are similar definitions for Q15 and Q31 data types. | |
* | |
* The structure specifies the size of the matrix and then points to | |
* an array of data. The array is of size <code>numRows X numCols</code> | |
* and the values are arranged in row order. That is, the | |
* matrix element (i, j) is stored at: | |
* <pre> | |
* pData[i*numCols + j] | |
* </pre> | |
* | |
* \par Init Functions | |
* There is an associated initialization function for each type of matrix | |
* data structure. | |
* The initialization function sets the values of the internal structure fields. | |
* Refer to the function <code>arm_mat_init_f32()</code>, <code>arm_mat_init_q31()</code> | |
* and <code>arm_mat_init_q15()</code> for floating-point, Q31 and Q15 types, respectively. | |
* | |
* \par | |
* Use of the initialization function is optional. However, if initialization function is used | |
* then the instance structure cannot be placed into a const data section. | |
* To place the instance structure in a const data | |
* section, manually initialize the data structure. For example: | |
* <pre> | |
* <code>arm_matrix_instance_f32 S = {nRows, nColumns, pData};</code> | |
* <code>arm_matrix_instance_q31 S = {nRows, nColumns, pData};</code> | |
* <code>arm_matrix_instance_q15 S = {nRows, nColumns, pData};</code> | |
* </pre> | |
* where <code>nRows</code> specifies the number of rows, <code>nColumns</code> | |
* specifies the number of columns, and <code>pData</code> points to the | |
* data array. | |
* | |
* \par Size Checking | |
* By default all of the matrix functions perform size checking on the input and | |
* output matrices. For example, the matrix addition function verifies that the | |
* two input matrices and the output matrix all have the same number of rows and | |
* columns. If the size check fails the functions return: | |
* <pre> | |
* ARM_MATH_SIZE_MISMATCH | |
* </pre> | |
* Otherwise the functions return | |
* <pre> | |
* ARM_MATH_SUCCESS | |
* </pre> | |
* There is some overhead associated with this matrix size checking. | |
* The matrix size checking is enabled via the \#define | |
* <pre> | |
* ARM_MATH_MATRIX_CHECK | |
* </pre> | |
* within the library project settings. By default this macro is defined | |
* and size checking is enabled. By changing the project settings and | |
* undefining this macro size checking is eliminated and the functions | |
* run a bit faster. With size checking disabled the functions always | |
* return <code>ARM_MATH_SUCCESS</code>. | |
*/ | |
/** | |
* @defgroup groupTransforms Transform Functions | |
*/ | |
/** | |
* @defgroup groupController Controller Functions | |
*/ | |
/** | |
* @defgroup groupStats Statistics Functions | |
*/ | |
/** | |
* @defgroup groupSupport Support Functions | |
*/ | |
/** | |
* @defgroup groupInterpolation Interpolation Functions | |
* These functions perform 1- and 2-dimensional interpolation of data. | |
* Linear interpolation is used for 1-dimensional data and | |
* bilinear interpolation is used for 2-dimensional data. | |
*/ | |
/** | |
* @defgroup groupExamples Examples | |
*/ | |
#ifndef _ARM_MATH_H | |
#define _ARM_MATH_H | |
#define __CMSIS_GENERIC /* disable NVIC and Systick functions */ | |
#if defined (ARM_MATH_CM4) | |
#include "core_cm4.h" | |
#elif defined (ARM_MATH_CM3) | |
#include "core_cm3.h" | |
#elif defined (ARM_MATH_CM0) | |
#include "core_cm0.h" | |
#else | |
#include "ARMCM4.h" | |
#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....." | |
#endif | |
#undef __CMSIS_GENERIC /* enable NVIC and Systick functions */ | |
#include "string.h" | |
#include "math.h" | |
#ifdef __cplusplus | |
extern "C" | |
{ | |
#endif | |
/** | |
* @brief Macros required for reciprocal calculation in Normalized LMS | |
*/ | |
#define DELTA_Q31 (0x100) | |
#define DELTA_Q15 0x5 | |
#define INDEX_MASK 0x0000003F | |
#define PI 3.14159265358979f | |
/** | |
* @brief Macros required for SINE and COSINE Fast math approximations | |
*/ | |
#define TABLE_SIZE 256 | |
#define TABLE_SPACING_Q31 0x800000 | |
#define TABLE_SPACING_Q15 0x80 | |
/** | |
* @brief Macros required for SINE and COSINE Controller functions | |
*/ | |
/* 1.31(q31) Fixed value of 2/360 */ | |
/* -1 to +1 is divided into 360 values so total spacing is (2/360) */ | |
#define INPUT_SPACING 0xB60B61 | |
/** | |
* @brief Error status returned by some functions in the library. | |
*/ | |
typedef enum | |
{ | |
ARM_MATH_SUCCESS = 0, /**< No error */ | |
ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ | |
ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ | |
ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation. */ | |
ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ | |
ARM_MATH_SINGULAR = -5, /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */ | |
ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ | |
} arm_status; | |
/** | |
* @brief 8-bit fractional data type in 1.7 format. | |
*/ | |
typedef int8_t q7_t; | |
/** | |
* @brief 16-bit fractional data type in 1.15 format. | |
*/ | |
typedef int16_t q15_t; | |
/** | |
* @brief 32-bit fractional data type in 1.31 format. | |
*/ | |
typedef int32_t q31_t; | |
/** | |
* @brief 64-bit fractional data type in 1.63 format. | |
*/ | |
typedef int64_t q63_t; | |
/** | |
* @brief 32-bit floating-point type definition. | |
*/ | |
typedef float float32_t; | |
/** | |
* @brief 64-bit floating-point type definition. | |
*/ | |
typedef double float64_t; | |
/** | |
* @brief definition to read/write two 16 bit values. | |
*/ | |
#define __SIMD32(addr) (*(int32_t **) & (addr)) | |
#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) | |
/** | |
* @brief definition to pack two 16 bit values. | |
*/ | |
#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ | |
(((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) | |
#endif | |
/** | |
* @brief definition to pack four 8 bit values. | |
*/ | |
#ifndef ARM_MATH_BIG_ENDIAN | |
#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ | |
(((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ | |
(((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ | |
(((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) | |
#else | |
#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ | |
(((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ | |
(((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ | |
(((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) | |
#endif | |
/** | |
* @brief Clips Q63 to Q31 values. | |
*/ | |
__STATIC_INLINE q31_t clip_q63_to_q31( | |
q63_t x) | |
{ | |
return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? | |
((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; | |
} | |
/** | |
* @brief Clips Q63 to Q15 values. | |
*/ | |
__STATIC_INLINE q15_t clip_q63_to_q15( | |
q63_t x) | |
{ | |
return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? | |
((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); | |
} | |
/** | |
* @brief Clips Q31 to Q7 values. | |
*/ | |
__STATIC_INLINE q7_t clip_q31_to_q7( | |
q31_t x) | |
{ | |
return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? | |
((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; | |
} | |
/** | |
* @brief Clips Q31 to Q15 values. | |
*/ | |
__STATIC_INLINE q15_t clip_q31_to_q15( | |
q31_t x) | |
{ | |
return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? | |
((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; | |
} | |
/** | |
* @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. | |
*/ | |
__STATIC_INLINE q63_t mult32x64( | |
q63_t x, | |
q31_t y) | |
{ | |
return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + | |
(((q63_t) (x >> 32) * y))); | |
} | |
#if defined (ARM_MATH_CM0) && defined ( __CC_ARM ) | |
#define __CLZ __clz | |
#endif | |
#if defined (ARM_MATH_CM0) && defined ( __TASKING__ ) | |
/* No need to redefine __CLZ */ | |
#endif | |
#if defined (ARM_MATH_CM0) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) ) | |
__STATIC_INLINE uint32_t __CLZ(q31_t data); | |
__STATIC_INLINE uint32_t __CLZ(q31_t data) | |
{ | |
uint32_t count = 0; | |
uint32_t mask = 0x80000000; | |
while((data & mask) == 0) | |
{ | |
count += 1u; | |
mask = mask >> 1u; | |
} | |
return(count); | |
} | |
#endif | |
/** | |
* @brief Function to Calculates 1/in(reciprocal) value of Q31 Data type. | |
*/ | |
__STATIC_INLINE uint32_t arm_recip_q31( | |
q31_t in, | |
q31_t * dst, | |
q31_t * pRecipTable) | |
{ | |
uint32_t out, tempVal; | |
uint32_t index, i; | |
uint32_t signBits; | |
if(in > 0) | |
{ | |
signBits = __CLZ(in) - 1; | |
} | |
else | |
{ | |
signBits = __CLZ(-in) - 1; | |
} | |
/* Convert input sample to 1.31 format */ | |
in = in << signBits; | |
/* calculation of index for initial approximated Val */ | |
index = (uint32_t) (in >> 24u); | |
index = (index & INDEX_MASK); | |
/* 1.31 with exp 1 */ | |
out = pRecipTable[index]; | |
/* calculation of reciprocal value */ | |
/* running approximation for two iterations */ | |
for (i = 0u; i < 2u; i++) | |
{ | |
tempVal = (q31_t) (((q63_t) in * out) >> 31u); | |
tempVal = 0x7FFFFFFF - tempVal; | |
/* 1.31 with exp 1 */ | |
//out = (q31_t) (((q63_t) out * tempVal) >> 30u); | |
out = (q31_t) clip_q63_to_q31(((q63_t) out * tempVal) >> 30u); | |
} | |
/* write output */ | |
*dst = out; | |
/* return num of signbits of out = 1/in value */ | |
return (signBits + 1u); | |
} | |
/** | |
* @brief Function to Calculates 1/in(reciprocal) value of Q15 Data type. | |
*/ | |
__STATIC_INLINE uint32_t arm_recip_q15( | |
q15_t in, | |
q15_t * dst, | |
q15_t * pRecipTable) | |
{ | |
uint32_t out = 0, tempVal = 0; | |
uint32_t index = 0, i = 0; | |
uint32_t signBits = 0; | |
if(in > 0) | |
{ | |
signBits = __CLZ(in) - 17; | |
} | |
else | |
{ | |
signBits = __CLZ(-in) - 17; | |
} | |
/* Convert input sample to 1.15 format */ | |
in = in << signBits; | |
/* calculation of index for initial approximated Val */ | |
index = in >> 8; | |
index = (index & INDEX_MASK); | |
/* 1.15 with exp 1 */ | |
out = pRecipTable[index]; | |
/* calculation of reciprocal value */ | |
/* running approximation for two iterations */ | |
for (i = 0; i < 2; i++) | |
{ | |
tempVal = (q15_t) (((q31_t) in * out) >> 15); | |
tempVal = 0x7FFF - tempVal; | |
/* 1.15 with exp 1 */ | |
out = (q15_t) (((q31_t) out * tempVal) >> 14); | |
} | |
/* write output */ | |
*dst = out; | |
/* return num of signbits of out = 1/in value */ | |
return (signBits + 1); | |
} | |
/* | |
* @brief C custom defined intrinisic function for only M0 processors | |
*/ | |
#if defined(ARM_MATH_CM0) | |
__STATIC_INLINE q31_t __SSAT( | |
q31_t x, | |
uint32_t y) | |
{ | |
int32_t posMax, negMin; | |
uint32_t i; | |
posMax = 1; | |
for (i = 0; i < (y - 1); i++) | |
{ | |
posMax = posMax * 2; | |
} | |
if(x > 0) | |
{ | |
posMax = (posMax - 1); | |
if(x > posMax) | |
{ | |
x = posMax; | |
} | |
} | |
else | |
{ | |
negMin = -posMax; | |
if(x < negMin) | |
{ | |
x = negMin; | |
} | |
} | |
return (x); | |
} | |
#endif /* end of ARM_MATH_CM0 */ | |
/* | |
* @brief C custom defined intrinsic function for M3 and M0 processors | |
*/ | |
#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) | |
/* | |
* @brief C custom defined QADD8 for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __QADD8( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t sum; | |
q7_t r, s, t, u; | |
r = (char) x; | |
s = (char) y; | |
r = __SSAT((q31_t) (r + s), 8); | |
s = __SSAT(((q31_t) (((x << 16) >> 24) + ((y << 16) >> 24))), 8); | |
t = __SSAT(((q31_t) (((x << 8) >> 24) + ((y << 8) >> 24))), 8); | |
u = __SSAT(((q31_t) ((x >> 24) + (y >> 24))), 8); | |
sum = (((q31_t) u << 24) & 0xFF000000) | (((q31_t) t << 16) & 0x00FF0000) | | |
(((q31_t) s << 8) & 0x0000FF00) | (r & 0x000000FF); | |
return sum; | |
} | |
/* | |
* @brief C custom defined QSUB8 for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __QSUB8( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t sum; | |
q31_t r, s, t, u; | |
r = (char) x; | |
s = (char) y; | |
r = __SSAT((r - s), 8); | |
s = __SSAT(((q31_t) (((x << 16) >> 24) - ((y << 16) >> 24))), 8) << 8; | |
t = __SSAT(((q31_t) (((x << 8) >> 24) - ((y << 8) >> 24))), 8) << 16; | |
u = __SSAT(((q31_t) ((x >> 24) - (y >> 24))), 8) << 24; | |
sum = | |
(u & 0xFF000000) | (t & 0x00FF0000) | (s & 0x0000FF00) | (r & 0x000000FF); | |
return sum; | |
} | |
/* | |
* @brief C custom defined QADD16 for M3 and M0 processors | |
*/ | |
/* | |
* @brief C custom defined QADD16 for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __QADD16( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t sum; | |
q31_t r, s; | |
r = (short) x; | |
s = (short) y; | |
r = __SSAT(r + s, 16); | |
s = __SSAT(((q31_t) ((x >> 16) + (y >> 16))), 16) << 16; | |
sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); | |
return sum; | |
} | |
/* | |
* @brief C custom defined SHADD16 for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SHADD16( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t sum; | |
q31_t r, s; | |
r = (short) x; | |
s = (short) y; | |
r = ((r >> 1) + (s >> 1)); | |
s = ((q31_t) ((x >> 17) + (y >> 17))) << 16; | |
sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); | |
return sum; | |
} | |
/* | |
* @brief C custom defined QSUB16 for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __QSUB16( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t sum; | |
q31_t r, s; | |
r = (short) x; | |
s = (short) y; | |
r = __SSAT(r - s, 16); | |
s = __SSAT(((q31_t) ((x >> 16) - (y >> 16))), 16) << 16; | |
sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); | |
return sum; | |
} | |
/* | |
* @brief C custom defined SHSUB16 for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SHSUB16( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t diff; | |
q31_t r, s; | |
r = (short) x; | |
s = (short) y; | |
r = ((r >> 1) - (s >> 1)); | |
s = (((x >> 17) - (y >> 17)) << 16); | |
diff = (s & 0xFFFF0000) | (r & 0x0000FFFF); | |
return diff; | |
} | |
/* | |
* @brief C custom defined QASX for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __QASX( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t sum = 0; | |
sum = ((sum + clip_q31_to_q15((q31_t) ((short) (x >> 16) + (short) y))) << 16) + | |
clip_q31_to_q15((q31_t) ((short) x - (short) (y >> 16))); | |
return sum; | |
} | |
/* | |
* @brief C custom defined SHASX for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SHASX( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t sum; | |
q31_t r, s; | |
r = (short) x; | |
s = (short) y; | |
r = ((r >> 1) - (y >> 17)); | |
s = (((x >> 17) + (s >> 1)) << 16); | |
sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); | |
return sum; | |
} | |
/* | |
* @brief C custom defined QSAX for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __QSAX( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t sum = 0; | |
sum = ((sum + clip_q31_to_q15((q31_t) ((short) (x >> 16) - (short) y))) << 16) + | |
clip_q31_to_q15((q31_t) ((short) x + (short) (y >> 16))); | |
return sum; | |
} | |
/* | |
* @brief C custom defined SHSAX for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SHSAX( | |
q31_t x, | |
q31_t y) | |
{ | |
q31_t sum; | |
q31_t r, s; | |
r = (short) x; | |
s = (short) y; | |
r = ((r >> 1) + (y >> 17)); | |
s = (((x >> 17) - (s >> 1)) << 16); | |
sum = (s & 0xFFFF0000) | (r & 0x0000FFFF); | |
return sum; | |
} | |
/* | |
* @brief C custom defined SMUSDX for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SMUSDX( | |
q31_t x, | |
q31_t y) | |
{ | |
return ((q31_t)(((short) x * (short) (y >> 16)) - | |
((short) (x >> 16) * (short) y))); | |
} | |
/* | |
* @brief C custom defined SMUADX for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SMUADX( | |
q31_t x, | |
q31_t y) | |
{ | |
return ((q31_t)(((short) x * (short) (y >> 16)) + | |
((short) (x >> 16) * (short) y))); | |
} | |
/* | |
* @brief C custom defined QADD for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __QADD( | |
q31_t x, | |
q31_t y) | |
{ | |
return clip_q63_to_q31((q63_t) x + y); | |
} | |
/* | |
* @brief C custom defined QSUB for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __QSUB( | |
q31_t x, | |
q31_t y) | |
{ | |
return clip_q63_to_q31((q63_t) x - y); | |
} | |
/* | |
* @brief C custom defined SMLAD for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SMLAD( | |
q31_t x, | |
q31_t y, | |
q31_t sum) | |
{ | |
return (sum + ((short) (x >> 16) * (short) (y >> 16)) + | |
((short) x * (short) y)); | |
} | |
/* | |
* @brief C custom defined SMLADX for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SMLADX( | |
q31_t x, | |
q31_t y, | |
q31_t sum) | |
{ | |
return (sum + ((short) (x >> 16) * (short) (y)) + | |
((short) x * (short) (y >> 16))); | |
} | |
/* | |
* @brief C custom defined SMLSDX for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SMLSDX( | |
q31_t x, | |
q31_t y, | |
q31_t sum) | |
{ | |
return (sum - ((short) (x >> 16) * (short) (y)) + | |
((short) x * (short) (y >> 16))); | |
} | |
/* | |
* @brief C custom defined SMLALD for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q63_t __SMLALD( | |
q31_t x, | |
q31_t y, | |
q63_t sum) | |
{ | |
return (sum + ((short) (x >> 16) * (short) (y >> 16)) + | |
((short) x * (short) y)); | |
} | |
/* | |
* @brief C custom defined SMLALDX for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q63_t __SMLALDX( | |
q31_t x, | |
q31_t y, | |
q63_t sum) | |
{ | |
return (sum + ((short) (x >> 16) * (short) y)) + | |
((short) x * (short) (y >> 16)); | |
} | |
/* | |
* @brief C custom defined SMUAD for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SMUAD( | |
q31_t x, | |
q31_t y) | |
{ | |
return (((x >> 16) * (y >> 16)) + | |
(((x << 16) >> 16) * ((y << 16) >> 16))); | |
} | |
/* | |
* @brief C custom defined SMUSD for M3 and M0 processors | |
*/ | |
__STATIC_INLINE q31_t __SMUSD( | |
q31_t x, | |
q31_t y) | |
{ | |
return (-((x >> 16) * (y >> 16)) + | |
(((x << 16) >> 16) * ((y << 16) >> 16))); | |
} | |
#endif /* (ARM_MATH_CM3) || defined (ARM_MATH_CM0) */ | |
/** | |
* @brief Instance structure for the Q7 FIR filter. | |
*/ | |
typedef struct | |
{ | |
uint16_t numTaps; /**< number of filter coefficients in the filter. */ | |
q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ | |
q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ | |
} arm_fir_instance_q7; | |
/** | |
* @brief Instance structure for the Q15 FIR filter. | |
*/ | |
typedef struct | |
{ | |
uint16_t numTaps; /**< number of filter coefficients in the filter. */ | |
q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ | |
q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ | |
} arm_fir_instance_q15; | |
/** | |
* @brief Instance structure for the Q31 FIR filter. | |
*/ | |
typedef struct | |
{ | |
uint16_t numTaps; /**< number of filter coefficients in the filter. */ | |
q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ | |
q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ | |
} arm_fir_instance_q31; | |
/** | |
* @brief Instance structure for the floating-point FIR filter. | |
*/ | |
typedef struct | |
{ | |
uint16_t numTaps; /**< number of filter coefficients in the filter. */ | |
float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ | |
float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ | |
} arm_fir_instance_f32; | |
/** | |
* @brief Processing function for the Q7 FIR filter. | |
* @param[in] *S points to an instance of the Q7 FIR filter structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_fir_q7( | |
const arm_fir_instance_q7 * S, | |
q7_t * pSrc, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the Q7 FIR filter. | |
* @param[in,out] *S points to an instance of the Q7 FIR structure. | |
* @param[in] numTaps Number of filter coefficients in the filter. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @param[in] blockSize number of samples that are processed. | |
* @return none | |
*/ | |
void arm_fir_init_q7( | |
arm_fir_instance_q7 * S, | |
uint16_t numTaps, | |
q7_t * pCoeffs, | |
q7_t * pState, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the Q15 FIR filter. | |
* @param[in] *S points to an instance of the Q15 FIR structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_fir_q15( | |
const arm_fir_instance_q15 * S, | |
q15_t * pSrc, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4. | |
* @param[in] *S points to an instance of the Q15 FIR filter structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_fir_fast_q15( | |
const arm_fir_instance_q15 * S, | |
q15_t * pSrc, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the Q15 FIR filter. | |
* @param[in,out] *S points to an instance of the Q15 FIR filter structure. | |
* @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @param[in] blockSize number of samples that are processed at a time. | |
* @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if | |
* <code>numTaps</code> is not a supported value. | |
*/ | |
arm_status arm_fir_init_q15( | |
arm_fir_instance_q15 * S, | |
uint16_t numTaps, | |
q15_t * pCoeffs, | |
q15_t * pState, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the Q31 FIR filter. | |
* @param[in] *S points to an instance of the Q31 FIR filter structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_fir_q31( | |
const arm_fir_instance_q31 * S, | |
q31_t * pSrc, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4. | |
* @param[in] *S points to an instance of the Q31 FIR structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_fir_fast_q31( | |
const arm_fir_instance_q31 * S, | |
q31_t * pSrc, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the Q31 FIR filter. | |
* @param[in,out] *S points to an instance of the Q31 FIR structure. | |
* @param[in] numTaps Number of filter coefficients in the filter. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @param[in] blockSize number of samples that are processed at a time. | |
* @return none. | |
*/ | |
void arm_fir_init_q31( | |
arm_fir_instance_q31 * S, | |
uint16_t numTaps, | |
q31_t * pCoeffs, | |
q31_t * pState, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the floating-point FIR filter. | |
* @param[in] *S points to an instance of the floating-point FIR structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_fir_f32( | |
const arm_fir_instance_f32 * S, | |
float32_t * pSrc, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the floating-point FIR filter. | |
* @param[in,out] *S points to an instance of the floating-point FIR filter structure. | |
* @param[in] numTaps Number of filter coefficients in the filter. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @param[in] blockSize number of samples that are processed at a time. | |
* @return none. | |
*/ | |
void arm_fir_init_f32( | |
arm_fir_instance_f32 * S, | |
uint16_t numTaps, | |
float32_t * pCoeffs, | |
float32_t * pState, | |
uint32_t blockSize); | |
/** | |
* @brief Instance structure for the Q15 Biquad cascade filter. | |
*/ | |
typedef struct | |
{ | |
int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ | |
q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ | |
q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ | |
int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ | |
} arm_biquad_casd_df1_inst_q15; | |
/** | |
* @brief Instance structure for the Q31 Biquad cascade filter. | |
*/ | |
typedef struct | |
{ | |
uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ | |
q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ | |
q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ | |
uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ | |
} arm_biquad_casd_df1_inst_q31; | |
/** | |
* @brief Instance structure for the floating-point Biquad cascade filter. | |
*/ | |
typedef struct | |
{ | |
uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ | |
float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ | |
float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ | |
} arm_biquad_casd_df1_inst_f32; | |
/** | |
* @brief Processing function for the Q15 Biquad cascade filter. | |
* @param[in] *S points to an instance of the Q15 Biquad cascade structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_biquad_cascade_df1_q15( | |
const arm_biquad_casd_df1_inst_q15 * S, | |
q15_t * pSrc, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the Q15 Biquad cascade filter. | |
* @param[in,out] *S points to an instance of the Q15 Biquad cascade structure. | |
* @param[in] numStages number of 2nd order stages in the filter. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format | |
* @return none | |
*/ | |
void arm_biquad_cascade_df1_init_q15( | |
arm_biquad_casd_df1_inst_q15 * S, | |
uint8_t numStages, | |
q15_t * pCoeffs, | |
q15_t * pState, | |
int8_t postShift); | |
/** | |
* @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. | |
* @param[in] *S points to an instance of the Q15 Biquad cascade structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_biquad_cascade_df1_fast_q15( | |
const arm_biquad_casd_df1_inst_q15 * S, | |
q15_t * pSrc, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the Q31 Biquad cascade filter | |
* @param[in] *S points to an instance of the Q31 Biquad cascade structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_biquad_cascade_df1_q31( | |
const arm_biquad_casd_df1_inst_q31 * S, | |
q31_t * pSrc, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. | |
* @param[in] *S points to an instance of the Q31 Biquad cascade structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_biquad_cascade_df1_fast_q31( | |
const arm_biquad_casd_df1_inst_q31 * S, | |
q31_t * pSrc, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the Q31 Biquad cascade filter. | |
* @param[in,out] *S points to an instance of the Q31 Biquad cascade structure. | |
* @param[in] numStages number of 2nd order stages in the filter. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format | |
* @return none | |
*/ | |
void arm_biquad_cascade_df1_init_q31( | |
arm_biquad_casd_df1_inst_q31 * S, | |
uint8_t numStages, | |
q31_t * pCoeffs, | |
q31_t * pState, | |
int8_t postShift); | |
/** | |
* @brief Processing function for the floating-point Biquad cascade filter. | |
* @param[in] *S points to an instance of the floating-point Biquad cascade structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data. | |
* @param[in] blockSize number of samples to process. | |
* @return none. | |
*/ | |
void arm_biquad_cascade_df1_f32( | |
const arm_biquad_casd_df1_inst_f32 * S, | |
float32_t * pSrc, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the floating-point Biquad cascade filter. | |
* @param[in,out] *S points to an instance of the floating-point Biquad cascade structure. | |
* @param[in] numStages number of 2nd order stages in the filter. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @return none | |
*/ | |
void arm_biquad_cascade_df1_init_f32( | |
arm_biquad_casd_df1_inst_f32 * S, | |
uint8_t numStages, | |
float32_t * pCoeffs, | |
float32_t * pState); | |
/** | |
* @brief Instance structure for the floating-point matrix structure. | |
*/ | |
typedef struct | |
{ | |
uint16_t numRows; /**< number of rows of the matrix. */ | |
uint16_t numCols; /**< number of columns of the matrix. */ | |
float32_t *pData; /**< points to the data of the matrix. */ | |
} arm_matrix_instance_f32; | |
/** | |
* @brief Instance structure for the Q15 matrix structure. | |
*/ | |
typedef struct | |
{ | |
uint16_t numRows; /**< number of rows of the matrix. */ | |
uint16_t numCols; /**< number of columns of the matrix. */ | |
q15_t *pData; /**< points to the data of the matrix. */ | |
} arm_matrix_instance_q15; | |
/** | |
* @brief Instance structure for the Q31 matrix structure. | |
*/ | |
typedef struct | |
{ | |
uint16_t numRows; /**< number of rows of the matrix. */ | |
uint16_t numCols; /**< number of columns of the matrix. */ | |
q31_t *pData; /**< points to the data of the matrix. */ | |
} arm_matrix_instance_q31; | |
/** | |
* @brief Floating-point matrix addition. | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_add_f32( | |
const arm_matrix_instance_f32 * pSrcA, | |
const arm_matrix_instance_f32 * pSrcB, | |
arm_matrix_instance_f32 * pDst); | |
/** | |
* @brief Q15 matrix addition. | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_add_q15( | |
const arm_matrix_instance_q15 * pSrcA, | |
const arm_matrix_instance_q15 * pSrcB, | |
arm_matrix_instance_q15 * pDst); | |
/** | |
* @brief Q31 matrix addition. | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_add_q31( | |
const arm_matrix_instance_q31 * pSrcA, | |
const arm_matrix_instance_q31 * pSrcB, | |
arm_matrix_instance_q31 * pDst); | |
/** | |
* @brief Floating-point matrix transpose. | |
* @param[in] *pSrc points to the input matrix | |
* @param[out] *pDst points to the output matrix | |
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> | |
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_trans_f32( | |
const arm_matrix_instance_f32 * pSrc, | |
arm_matrix_instance_f32 * pDst); | |
/** | |
* @brief Q15 matrix transpose. | |
* @param[in] *pSrc points to the input matrix | |
* @param[out] *pDst points to the output matrix | |
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> | |
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_trans_q15( | |
const arm_matrix_instance_q15 * pSrc, | |
arm_matrix_instance_q15 * pDst); | |
/** | |
* @brief Q31 matrix transpose. | |
* @param[in] *pSrc points to the input matrix | |
* @param[out] *pDst points to the output matrix | |
* @return The function returns either <code>ARM_MATH_SIZE_MISMATCH</code> | |
* or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_trans_q31( | |
const arm_matrix_instance_q31 * pSrc, | |
arm_matrix_instance_q31 * pDst); | |
/** | |
* @brief Floating-point matrix multiplication | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_mult_f32( | |
const arm_matrix_instance_f32 * pSrcA, | |
const arm_matrix_instance_f32 * pSrcB, | |
arm_matrix_instance_f32 * pDst); | |
/** | |
* @brief Q15 matrix multiplication | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_mult_q15( | |
const arm_matrix_instance_q15 * pSrcA, | |
const arm_matrix_instance_q15 * pSrcB, | |
arm_matrix_instance_q15 * pDst, | |
q15_t * pState); | |
/** | |
* @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @param[in] *pState points to the array for storing intermediate results | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_mult_fast_q15( | |
const arm_matrix_instance_q15 * pSrcA, | |
const arm_matrix_instance_q15 * pSrcB, | |
arm_matrix_instance_q15 * pDst, | |
q15_t * pState); | |
/** | |
* @brief Q31 matrix multiplication | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_mult_q31( | |
const arm_matrix_instance_q31 * pSrcA, | |
const arm_matrix_instance_q31 * pSrcB, | |
arm_matrix_instance_q31 * pDst); | |
/** | |
* @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_mult_fast_q31( | |
const arm_matrix_instance_q31 * pSrcA, | |
const arm_matrix_instance_q31 * pSrcB, | |
arm_matrix_instance_q31 * pDst); | |
/** | |
* @brief Floating-point matrix subtraction | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_sub_f32( | |
const arm_matrix_instance_f32 * pSrcA, | |
const arm_matrix_instance_f32 * pSrcB, | |
arm_matrix_instance_f32 * pDst); | |
/** | |
* @brief Q15 matrix subtraction | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_sub_q15( | |
const arm_matrix_instance_q15 * pSrcA, | |
const arm_matrix_instance_q15 * pSrcB, | |
arm_matrix_instance_q15 * pDst); | |
/** | |
* @brief Q31 matrix subtraction | |
* @param[in] *pSrcA points to the first input matrix structure | |
* @param[in] *pSrcB points to the second input matrix structure | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_sub_q31( | |
const arm_matrix_instance_q31 * pSrcA, | |
const arm_matrix_instance_q31 * pSrcB, | |
arm_matrix_instance_q31 * pDst); | |
/** | |
* @brief Floating-point matrix scaling. | |
* @param[in] *pSrc points to the input matrix | |
* @param[in] scale scale factor | |
* @param[out] *pDst points to the output matrix | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_scale_f32( | |
const arm_matrix_instance_f32 * pSrc, | |
float32_t scale, | |
arm_matrix_instance_f32 * pDst); | |
/** | |
* @brief Q15 matrix scaling. | |
* @param[in] *pSrc points to input matrix | |
* @param[in] scaleFract fractional portion of the scale factor | |
* @param[in] shift number of bits to shift the result by | |
* @param[out] *pDst points to output matrix | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_scale_q15( | |
const arm_matrix_instance_q15 * pSrc, | |
q15_t scaleFract, | |
int32_t shift, | |
arm_matrix_instance_q15 * pDst); | |
/** | |
* @brief Q31 matrix scaling. | |
* @param[in] *pSrc points to input matrix | |
* @param[in] scaleFract fractional portion of the scale factor | |
* @param[in] shift number of bits to shift the result by | |
* @param[out] *pDst points to output matrix structure | |
* @return The function returns either | |
* <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking. | |
*/ | |
arm_status arm_mat_scale_q31( | |
const arm_matrix_instance_q31 * pSrc, | |
q31_t scaleFract, | |
int32_t shift, | |
arm_matrix_instance_q31 * pDst); | |
/** | |
* @brief Q31 matrix initialization. | |
* @param[in,out] *S points to an instance of the floating-point matrix structure. | |
* @param[in] nRows number of rows in the matrix. | |
* @param[in] nColumns number of columns in the matrix. | |
* @param[in] *pData points to the matrix data array. | |
* @return none | |
*/ | |
void arm_mat_init_q31( | |
arm_matrix_instance_q31 * S, | |
uint16_t nRows, | |
uint16_t nColumns, | |
q31_t *pData); | |
/** | |
* @brief Q15 matrix initialization. | |
* @param[in,out] *S points to an instance of the floating-point matrix structure. | |
* @param[in] nRows number of rows in the matrix. | |
* @param[in] nColumns number of columns in the matrix. | |
* @param[in] *pData points to the matrix data array. | |
* @return none | |
*/ | |
void arm_mat_init_q15( | |
arm_matrix_instance_q15 * S, | |
uint16_t nRows, | |
uint16_t nColumns, | |
q15_t *pData); | |
/** | |
* @brief Floating-point matrix initialization. | |
* @param[in,out] *S points to an instance of the floating-point matrix structure. | |
* @param[in] nRows number of rows in the matrix. | |
* @param[in] nColumns number of columns in the matrix. | |
* @param[in] *pData points to the matrix data array. | |
* @return none | |
*/ | |
void arm_mat_init_f32( | |
arm_matrix_instance_f32 * S, | |
uint16_t nRows, | |
uint16_t nColumns, | |
float32_t *pData); | |
/** | |
* @brief Instance structure for the Q15 PID Control. | |
*/ | |
typedef struct | |
{ | |
q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ | |
#ifdef ARM_MATH_CM0 | |
q15_t A1; | |
q15_t A2; | |
#else | |
q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ | |
#endif | |
q15_t state[3]; /**< The state array of length 3. */ | |
q15_t Kp; /**< The proportional gain. */ | |
q15_t Ki; /**< The integral gain. */ | |
q15_t Kd; /**< The derivative gain. */ | |
} arm_pid_instance_q15; | |
/** | |
* @brief Instance structure for the Q31 PID Control. | |
*/ | |
typedef struct | |
{ | |
q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ | |
q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ | |
q31_t A2; /**< The derived gain, A2 = Kd . */ | |
q31_t state[3]; /**< The state array of length 3. */ | |
q31_t Kp; /**< The proportional gain. */ | |
q31_t Ki; /**< The integral gain. */ | |
q31_t Kd; /**< The derivative gain. */ | |
} arm_pid_instance_q31; | |
/** | |
* @brief Instance structure for the floating-point PID Control. | |
*/ | |
typedef struct | |
{ | |
float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ | |
float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ | |
float32_t A2; /**< The derived gain, A2 = Kd . */ | |
float32_t state[3]; /**< The state array of length 3. */ | |
float32_t Kp; /**< The proportional gain. */ | |
float32_t Ki; /**< The integral gain. */ | |
float32_t Kd; /**< The derivative gain. */ | |
} arm_pid_instance_f32; | |
/** | |
* @brief Initialization function for the floating-point PID Control. | |
* @param[in,out] *S points to an instance of the PID structure. | |
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. | |
* @return none. | |
*/ | |
void arm_pid_init_f32( | |
arm_pid_instance_f32 * S, | |
int32_t resetStateFlag); | |
/** | |
* @brief Reset function for the floating-point PID Control. | |
* @param[in,out] *S is an instance of the floating-point PID Control structure | |
* @return none | |
*/ | |
void arm_pid_reset_f32( | |
arm_pid_instance_f32 * S); | |
/** | |
* @brief Initialization function for the Q31 PID Control. | |
* @param[in,out] *S points to an instance of the Q15 PID structure. | |
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. | |
* @return none. | |
*/ | |
void arm_pid_init_q31( | |
arm_pid_instance_q31 * S, | |
int32_t resetStateFlag); | |
/** | |
* @brief Reset function for the Q31 PID Control. | |
* @param[in,out] *S points to an instance of the Q31 PID Control structure | |
* @return none | |
*/ | |
void arm_pid_reset_q31( | |
arm_pid_instance_q31 * S); | |
/** | |
* @brief Initialization function for the Q15 PID Control. | |
* @param[in,out] *S points to an instance of the Q15 PID structure. | |
* @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. | |
* @return none. | |
*/ | |
void arm_pid_init_q15( | |
arm_pid_instance_q15 * S, | |
int32_t resetStateFlag); | |
/** | |
* @brief Reset function for the Q15 PID Control. | |
* @param[in,out] *S points to an instance of the q15 PID Control structure | |
* @return none | |
*/ | |
void arm_pid_reset_q15( | |
arm_pid_instance_q15 * S); | |
/** | |
* @brief Instance structure for the floating-point Linear Interpolate function. | |
*/ | |
typedef struct | |
{ | |
uint32_t nValues; /**< nValues */ | |
float32_t x1; /**< x1 */ | |
float32_t xSpacing; /**< xSpacing */ | |
float32_t *pYData; /**< pointer to the table of Y values */ | |
} arm_linear_interp_instance_f32; | |
/** | |
* @brief Instance structure for the floating-point bilinear interpolation function. | |
*/ | |
typedef struct | |
{ | |
uint16_t numRows; /**< number of rows in the data table. */ | |
uint16_t numCols; /**< number of columns in the data table. */ | |
float32_t *pData; /**< points to the data table. */ | |
} arm_bilinear_interp_instance_f32; | |
/** | |
* @brief Instance structure for the Q31 bilinear interpolation function. | |
*/ | |
typedef struct | |
{ | |
uint16_t numRows; /**< number of rows in the data table. */ | |
uint16_t numCols; /**< number of columns in the data table. */ | |
q31_t *pData; /**< points to the data table. */ | |
} arm_bilinear_interp_instance_q31; | |
/** | |
* @brief Instance structure for the Q15 bilinear interpolation function. | |
*/ | |
typedef struct | |
{ | |
uint16_t numRows; /**< number of rows in the data table. */ | |
uint16_t numCols; /**< number of columns in the data table. */ | |
q15_t *pData; /**< points to the data table. */ | |
} arm_bilinear_interp_instance_q15; | |
/** | |
* @brief Instance structure for the Q15 bilinear interpolation function. | |
*/ | |
typedef struct | |
{ | |
uint16_t numRows; /**< number of rows in the data table. */ | |
uint16_t numCols; /**< number of columns in the data table. */ | |
q7_t *pData; /**< points to the data table. */ | |
} arm_bilinear_interp_instance_q7; | |
/** | |
* @brief Q7 vector multiplication. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_mult_q7( | |
q7_t * pSrcA, | |
q7_t * pSrcB, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q15 vector multiplication. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_mult_q15( | |
q15_t * pSrcA, | |
q15_t * pSrcB, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q31 vector multiplication. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_mult_q31( | |
q31_t * pSrcA, | |
q31_t * pSrcB, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Floating-point vector multiplication. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_mult_f32( | |
float32_t * pSrcA, | |
float32_t * pSrcB, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Instance structure for the Q15 CFFT/CIFFT function. | |
*/ | |
typedef struct | |
{ | |
uint16_t fftLen; /**< length of the FFT. */ | |
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ | |
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ | |
q15_t *pTwiddle; /**< points to the twiddle factor table. */ | |
uint16_t *pBitRevTable; /**< points to the bit reversal table. */ | |
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ | |
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ | |
} arm_cfft_radix4_instance_q15; | |
/** | |
* @brief Instance structure for the Q31 CFFT/CIFFT function. | |
*/ | |
typedef struct | |
{ | |
uint16_t fftLen; /**< length of the FFT. */ | |
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ | |
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ | |
q31_t *pTwiddle; /**< points to the twiddle factor table. */ | |
uint16_t *pBitRevTable; /**< points to the bit reversal table. */ | |
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ | |
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ | |
} arm_cfft_radix4_instance_q31; | |
/** | |
* @brief Instance structure for the floating-point CFFT/CIFFT function. | |
*/ | |
typedef struct | |
{ | |
uint16_t fftLen; /**< length of the FFT. */ | |
uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ | |
uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ | |
float32_t *pTwiddle; /**< points to the twiddle factor table. */ | |
uint16_t *pBitRevTable; /**< points to the bit reversal table. */ | |
uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ | |
uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ | |
float32_t onebyfftLen; /**< value of 1/fftLen. */ | |
} arm_cfft_radix4_instance_f32; | |
/** | |
* @brief Processing function for the Q15 CFFT/CIFFT. | |
* @param[in] *S points to an instance of the Q15 CFFT/CIFFT structure. | |
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. | |
* @return none. | |
*/ | |
void arm_cfft_radix4_q15( | |
const arm_cfft_radix4_instance_q15 * S, | |
q15_t * pSrc); | |
/** | |
* @brief Initialization function for the Q15 CFFT/CIFFT. | |
* @param[in,out] *S points to an instance of the Q15 CFFT/CIFFT structure. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. | |
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. | |
* @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value. | |
*/ | |
arm_status arm_cfft_radix4_init_q15( | |
arm_cfft_radix4_instance_q15 * S, | |
uint16_t fftLen, | |
uint8_t ifftFlag, | |
uint8_t bitReverseFlag); | |
/** | |
* @brief Processing function for the Q31 CFFT/CIFFT. | |
* @param[in] *S points to an instance of the Q31 CFFT/CIFFT structure. | |
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. | |
* @return none. | |
*/ | |
void arm_cfft_radix4_q31( | |
const arm_cfft_radix4_instance_q31 * S, | |
q31_t * pSrc); | |
/** | |
* @brief Initialization function for the Q31 CFFT/CIFFT. | |
* @param[in,out] *S points to an instance of the Q31 CFFT/CIFFT structure. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. | |
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. | |
* @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value. | |
*/ | |
arm_status arm_cfft_radix4_init_q31( | |
arm_cfft_radix4_instance_q31 * S, | |
uint16_t fftLen, | |
uint8_t ifftFlag, | |
uint8_t bitReverseFlag); | |
/** | |
* @brief Processing function for the floating-point CFFT/CIFFT. | |
* @param[in] *S points to an instance of the floating-point CFFT/CIFFT structure. | |
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place. | |
* @return none. | |
*/ | |
void arm_cfft_radix4_f32( | |
const arm_cfft_radix4_instance_f32 * S, | |
float32_t * pSrc); | |
/** | |
* @brief Initialization function for the floating-point CFFT/CIFFT. | |
* @param[in,out] *S points to an instance of the floating-point CFFT/CIFFT structure. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. | |
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. | |
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value. | |
*/ | |
arm_status arm_cfft_radix4_init_f32( | |
arm_cfft_radix4_instance_f32 * S, | |
uint16_t fftLen, | |
uint8_t ifftFlag, | |
uint8_t bitReverseFlag); | |
/*---------------------------------------------------------------------- | |
* Internal functions prototypes FFT function | |
----------------------------------------------------------------------*/ | |
/** | |
* @brief Core function for the floating-point CFFT butterfly process. | |
* @param[in, out] *pSrc points to the in-place buffer of floating-point data type. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] *pCoef points to the twiddle coefficient buffer. | |
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. | |
* @return none. | |
*/ | |
void arm_radix4_butterfly_f32( | |
float32_t * pSrc, | |
uint16_t fftLen, | |
float32_t * pCoef, | |
uint16_t twidCoefModifier); | |
/** | |
* @brief Core function for the floating-point CIFFT butterfly process. | |
* @param[in, out] *pSrc points to the in-place buffer of floating-point data type. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] *pCoef points to twiddle coefficient buffer. | |
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. | |
* @param[in] onebyfftLen value of 1/fftLen. | |
* @return none. | |
*/ | |
void arm_radix4_butterfly_inverse_f32( | |
float32_t * pSrc, | |
uint16_t fftLen, | |
float32_t * pCoef, | |
uint16_t twidCoefModifier, | |
float32_t onebyfftLen); | |
/** | |
* @brief In-place bit reversal function. | |
* @param[in, out] *pSrc points to the in-place buffer of floating-point data type. | |
* @param[in] fftSize length of the FFT. | |
* @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table. | |
* @param[in] *pBitRevTab points to the bit reversal table. | |
* @return none. | |
*/ | |
void arm_bitreversal_f32( | |
float32_t *pSrc, | |
uint16_t fftSize, | |
uint16_t bitRevFactor, | |
uint16_t *pBitRevTab); | |
/** | |
* @brief Core function for the Q31 CFFT butterfly process. | |
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] *pCoef points to twiddle coefficient buffer. | |
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. | |
* @return none. | |
*/ | |
void arm_radix4_butterfly_q31( | |
q31_t *pSrc, | |
uint32_t fftLen, | |
q31_t *pCoef, | |
uint32_t twidCoefModifier); | |
/** | |
* @brief Core function for the Q31 CIFFT butterfly process. | |
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] *pCoef points to twiddle coefficient buffer. | |
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. | |
* @return none. | |
*/ | |
void arm_radix4_butterfly_inverse_q31( | |
q31_t * pSrc, | |
uint32_t fftLen, | |
q31_t * pCoef, | |
uint32_t twidCoefModifier); | |
/** | |
* @brief In-place bit reversal function. | |
* @param[in, out] *pSrc points to the in-place buffer of Q31 data type. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table | |
* @param[in] *pBitRevTab points to bit reversal table. | |
* @return none. | |
*/ | |
void arm_bitreversal_q31( | |
q31_t * pSrc, | |
uint32_t fftLen, | |
uint16_t bitRevFactor, | |
uint16_t *pBitRevTab); | |
/** | |
* @brief Core function for the Q15 CFFT butterfly process. | |
* @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] *pCoef16 points to twiddle coefficient buffer. | |
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. | |
* @return none. | |
*/ | |
void arm_radix4_butterfly_q15( | |
q15_t *pSrc16, | |
uint32_t fftLen, | |
q15_t *pCoef16, | |
uint32_t twidCoefModifier); | |
/** | |
* @brief Core function for the Q15 CIFFT butterfly process. | |
* @param[in, out] *pSrc16 points to the in-place buffer of Q15 data type. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] *pCoef16 points to twiddle coefficient buffer. | |
* @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. | |
* @return none. | |
*/ | |
void arm_radix4_butterfly_inverse_q15( | |
q15_t *pSrc16, | |
uint32_t fftLen, | |
q15_t *pCoef16, | |
uint32_t twidCoefModifier); | |
/** | |
* @brief In-place bit reversal function. | |
* @param[in, out] *pSrc points to the in-place buffer of Q15 data type. | |
* @param[in] fftLen length of the FFT. | |
* @param[in] bitRevFactor bit reversal modifier that supports different size FFTs with the same bit reversal table | |
* @param[in] *pBitRevTab points to bit reversal table. | |
* @return none. | |
*/ | |
void arm_bitreversal_q15( | |
q15_t * pSrc, | |
uint32_t fftLen, | |
uint16_t bitRevFactor, | |
uint16_t *pBitRevTab); | |
/** | |
* @brief Instance structure for the Q15 RFFT/RIFFT function. | |
*/ | |
typedef struct | |
{ | |
uint32_t fftLenReal; /**< length of the real FFT. */ | |
uint32_t fftLenBy2; /**< length of the complex FFT. */ | |
uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ | |
uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ | |
uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ | |
q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ | |
q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ | |
arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ | |
} arm_rfft_instance_q15; | |
/** | |
* @brief Instance structure for the Q31 RFFT/RIFFT function. | |
*/ | |
typedef struct | |
{ | |
uint32_t fftLenReal; /**< length of the real FFT. */ | |
uint32_t fftLenBy2; /**< length of the complex FFT. */ | |
uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ | |
uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ | |
uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ | |
q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ | |
q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ | |
arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ | |
} arm_rfft_instance_q31; | |
/** | |
* @brief Instance structure for the floating-point RFFT/RIFFT function. | |
*/ | |
typedef struct | |
{ | |
uint32_t fftLenReal; /**< length of the real FFT. */ | |
uint16_t fftLenBy2; /**< length of the complex FFT. */ | |
uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ | |
uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ | |
uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ | |
float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ | |
float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ | |
arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ | |
} arm_rfft_instance_f32; | |
/** | |
* @brief Processing function for the Q15 RFFT/RIFFT. | |
* @param[in] *S points to an instance of the Q15 RFFT/RIFFT structure. | |
* @param[in] *pSrc points to the input buffer. | |
* @param[out] *pDst points to the output buffer. | |
* @return none. | |
*/ | |
void arm_rfft_q15( | |
const arm_rfft_instance_q15 * S, | |
q15_t * pSrc, | |
q15_t * pDst); | |
/** | |
* @brief Initialization function for the Q15 RFFT/RIFFT. | |
* @param[in, out] *S points to an instance of the Q15 RFFT/RIFFT structure. | |
* @param[in] *S_CFFT points to an instance of the Q15 CFFT/CIFFT structure. | |
* @param[in] fftLenReal length of the FFT. | |
* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. | |
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. | |
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported value. | |
*/ | |
arm_status arm_rfft_init_q15( | |
arm_rfft_instance_q15 * S, | |
arm_cfft_radix4_instance_q15 * S_CFFT, | |
uint32_t fftLenReal, | |
uint32_t ifftFlagR, | |
uint32_t bitReverseFlag); | |
/** | |
* @brief Processing function for the Q31 RFFT/RIFFT. | |
* @param[in] *S points to an instance of the Q31 RFFT/RIFFT structure. | |
* @param[in] *pSrc points to the input buffer. | |
* @param[out] *pDst points to the output buffer. | |
* @return none. | |
*/ | |
void arm_rfft_q31( | |
const arm_rfft_instance_q31 * S, | |
q31_t * pSrc, | |
q31_t * pDst); | |
/** | |
* @brief Initialization function for the Q31 RFFT/RIFFT. | |
* @param[in, out] *S points to an instance of the Q31 RFFT/RIFFT structure. | |
* @param[in, out] *S_CFFT points to an instance of the Q31 CFFT/CIFFT structure. | |
* @param[in] fftLenReal length of the FFT. | |
* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. | |
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. | |
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported value. | |
*/ | |
arm_status arm_rfft_init_q31( | |
arm_rfft_instance_q31 * S, | |
arm_cfft_radix4_instance_q31 * S_CFFT, | |
uint32_t fftLenReal, | |
uint32_t ifftFlagR, | |
uint32_t bitReverseFlag); | |
/** | |
* @brief Initialization function for the floating-point RFFT/RIFFT. | |
* @param[in,out] *S points to an instance of the floating-point RFFT/RIFFT structure. | |
* @param[in,out] *S_CFFT points to an instance of the floating-point CFFT/CIFFT structure. | |
* @param[in] fftLenReal length of the FFT. | |
* @param[in] ifftFlagR flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. | |
* @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. | |
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported value. | |
*/ | |
arm_status arm_rfft_init_f32( | |
arm_rfft_instance_f32 * S, | |
arm_cfft_radix4_instance_f32 * S_CFFT, | |
uint32_t fftLenReal, | |
uint32_t ifftFlagR, | |
uint32_t bitReverseFlag); | |
/** | |
* @brief Processing function for the floating-point RFFT/RIFFT. | |
* @param[in] *S points to an instance of the floating-point RFFT/RIFFT structure. | |
* @param[in] *pSrc points to the input buffer. | |
* @param[out] *pDst points to the output buffer. | |
* @return none. | |
*/ | |
void arm_rfft_f32( | |
const arm_rfft_instance_f32 * S, | |
float32_t * pSrc, | |
float32_t * pDst); | |
/** | |
* @brief Instance structure for the floating-point DCT4/IDCT4 function. | |
*/ | |
typedef struct | |
{ | |
uint16_t N; /**< length of the DCT4. */ | |
uint16_t Nby2; /**< half of the length of the DCT4. */ | |
float32_t normalize; /**< normalizing factor. */ | |
float32_t *pTwiddle; /**< points to the twiddle factor table. */ | |
float32_t *pCosFactor; /**< points to the cosFactor table. */ | |
arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ | |
arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ | |
} arm_dct4_instance_f32; | |
/** | |
* @brief Initialization function for the floating-point DCT4/IDCT4. | |
* @param[in,out] *S points to an instance of floating-point DCT4/IDCT4 structure. | |
* @param[in] *S_RFFT points to an instance of floating-point RFFT/RIFFT structure. | |
* @param[in] *S_CFFT points to an instance of floating-point CFFT/CIFFT structure. | |
* @param[in] N length of the DCT4. | |
* @param[in] Nby2 half of the length of the DCT4. | |
* @param[in] normalize normalizing factor. | |
* @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. | |
*/ | |
arm_status arm_dct4_init_f32( | |
arm_dct4_instance_f32 * S, | |
arm_rfft_instance_f32 * S_RFFT, | |
arm_cfft_radix4_instance_f32 * S_CFFT, | |
uint16_t N, | |
uint16_t Nby2, | |
float32_t normalize); | |
/** | |
* @brief Processing function for the floating-point DCT4/IDCT4. | |
* @param[in] *S points to an instance of the floating-point DCT4/IDCT4 structure. | |
* @param[in] *pState points to state buffer. | |
* @param[in,out] *pInlineBuffer points to the in-place input and output buffer. | |
* @return none. | |
*/ | |
void arm_dct4_f32( | |
const arm_dct4_instance_f32 * S, | |
float32_t * pState, | |
float32_t * pInlineBuffer); | |
/** | |
* @brief Instance structure for the Q31 DCT4/IDCT4 function. | |
*/ | |
typedef struct | |
{ | |
uint16_t N; /**< length of the DCT4. */ | |
uint16_t Nby2; /**< half of the length of the DCT4. */ | |
q31_t normalize; /**< normalizing factor. */ | |
q31_t *pTwiddle; /**< points to the twiddle factor table. */ | |
q31_t *pCosFactor; /**< points to the cosFactor table. */ | |
arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ | |
arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ | |
} arm_dct4_instance_q31; | |
/** | |
* @brief Initialization function for the Q31 DCT4/IDCT4. | |
* @param[in,out] *S points to an instance of Q31 DCT4/IDCT4 structure. | |
* @param[in] *S_RFFT points to an instance of Q31 RFFT/RIFFT structure | |
* @param[in] *S_CFFT points to an instance of Q31 CFFT/CIFFT structure | |
* @param[in] N length of the DCT4. | |
* @param[in] Nby2 half of the length of the DCT4. | |
* @param[in] normalize normalizing factor. | |
* @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. | |
*/ | |
arm_status arm_dct4_init_q31( | |
arm_dct4_instance_q31 * S, | |
arm_rfft_instance_q31 * S_RFFT, | |
arm_cfft_radix4_instance_q31 * S_CFFT, | |
uint16_t N, | |
uint16_t Nby2, | |
q31_t normalize); | |
/** | |
* @brief Processing function for the Q31 DCT4/IDCT4. | |
* @param[in] *S points to an instance of the Q31 DCT4 structure. | |
* @param[in] *pState points to state buffer. | |
* @param[in,out] *pInlineBuffer points to the in-place input and output buffer. | |
* @return none. | |
*/ | |
void arm_dct4_q31( | |
const arm_dct4_instance_q31 * S, | |
q31_t * pState, | |
q31_t * pInlineBuffer); | |
/** | |
* @brief Instance structure for the Q15 DCT4/IDCT4 function. | |
*/ | |
typedef struct | |
{ | |
uint16_t N; /**< length of the DCT4. */ | |
uint16_t Nby2; /**< half of the length of the DCT4. */ | |
q15_t normalize; /**< normalizing factor. */ | |
q15_t *pTwiddle; /**< points to the twiddle factor table. */ | |
q15_t *pCosFactor; /**< points to the cosFactor table. */ | |
arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ | |
arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ | |
} arm_dct4_instance_q15; | |
/** | |
* @brief Initialization function for the Q15 DCT4/IDCT4. | |
* @param[in,out] *S points to an instance of Q15 DCT4/IDCT4 structure. | |
* @param[in] *S_RFFT points to an instance of Q15 RFFT/RIFFT structure. | |
* @param[in] *S_CFFT points to an instance of Q15 CFFT/CIFFT structure. | |
* @param[in] N length of the DCT4. | |
* @param[in] Nby2 half of the length of the DCT4. | |
* @param[in] normalize normalizing factor. | |
* @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. | |
*/ | |
arm_status arm_dct4_init_q15( | |
arm_dct4_instance_q15 * S, | |
arm_rfft_instance_q15 * S_RFFT, | |
arm_cfft_radix4_instance_q15 * S_CFFT, | |
uint16_t N, | |
uint16_t Nby2, | |
q15_t normalize); | |
/** | |
* @brief Processing function for the Q15 DCT4/IDCT4. | |
* @param[in] *S points to an instance of the Q15 DCT4 structure. | |
* @param[in] *pState points to state buffer. | |
* @param[in,out] *pInlineBuffer points to the in-place input and output buffer. | |
* @return none. | |
*/ | |
void arm_dct4_q15( | |
const arm_dct4_instance_q15 * S, | |
q15_t * pState, | |
q15_t * pInlineBuffer); | |
/** | |
* @brief Floating-point vector addition. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_add_f32( | |
float32_t * pSrcA, | |
float32_t * pSrcB, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q7 vector addition. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_add_q7( | |
q7_t * pSrcA, | |
q7_t * pSrcB, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q15 vector addition. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_add_q15( | |
q15_t * pSrcA, | |
q15_t * pSrcB, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q31 vector addition. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_add_q31( | |
q31_t * pSrcA, | |
q31_t * pSrcB, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Floating-point vector subtraction. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_sub_f32( | |
float32_t * pSrcA, | |
float32_t * pSrcB, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q7 vector subtraction. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_sub_q7( | |
q7_t * pSrcA, | |
q7_t * pSrcB, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q15 vector subtraction. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_sub_q15( | |
q15_t * pSrcA, | |
q15_t * pSrcB, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q31 vector subtraction. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_sub_q31( | |
q31_t * pSrcA, | |
q31_t * pSrcB, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Multiplies a floating-point vector by a scalar. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] scale scale factor to be applied | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_scale_f32( | |
float32_t * pSrc, | |
float32_t scale, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Multiplies a Q7 vector by a scalar. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] scaleFract fractional portion of the scale value | |
* @param[in] shift number of bits to shift the result by | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_scale_q7( | |
q7_t * pSrc, | |
q7_t scaleFract, | |
int8_t shift, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Multiplies a Q15 vector by a scalar. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] scaleFract fractional portion of the scale value | |
* @param[in] shift number of bits to shift the result by | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_scale_q15( | |
q15_t * pSrc, | |
q15_t scaleFract, | |
int8_t shift, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Multiplies a Q31 vector by a scalar. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] scaleFract fractional portion of the scale value | |
* @param[in] shift number of bits to shift the result by | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_scale_q31( | |
q31_t * pSrc, | |
q31_t scaleFract, | |
int8_t shift, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q7 vector absolute value. | |
* @param[in] *pSrc points to the input buffer | |
* @param[out] *pDst points to the output buffer | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_abs_q7( | |
q7_t * pSrc, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Floating-point vector absolute value. | |
* @param[in] *pSrc points to the input buffer | |
* @param[out] *pDst points to the output buffer | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_abs_f32( | |
float32_t * pSrc, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q15 vector absolute value. | |
* @param[in] *pSrc points to the input buffer | |
* @param[out] *pDst points to the output buffer | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_abs_q15( | |
q15_t * pSrc, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Q31 vector absolute value. | |
* @param[in] *pSrc points to the input buffer | |
* @param[out] *pDst points to the output buffer | |
* @param[in] blockSize number of samples in each vector | |
* @return none. | |
*/ | |
void arm_abs_q31( | |
q31_t * pSrc, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Dot product of floating-point vectors. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[in] blockSize number of samples in each vector | |
* @param[out] *result output result returned here | |
* @return none. | |
*/ | |
void arm_dot_prod_f32( | |
float32_t * pSrcA, | |
float32_t * pSrcB, | |
uint32_t blockSize, | |
float32_t * result); | |
/** | |
* @brief Dot product of Q7 vectors. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[in] blockSize number of samples in each vector | |
* @param[out] *result output result returned here | |
* @return none. | |
*/ | |
void arm_dot_prod_q7( | |
q7_t * pSrcA, | |
q7_t * pSrcB, | |
uint32_t blockSize, | |
q31_t * result); | |
/** | |
* @brief Dot product of Q15 vectors. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[in] blockSize number of samples in each vector | |
* @param[out] *result output result returned here | |
* @return none. | |
*/ | |
void arm_dot_prod_q15( | |
q15_t * pSrcA, | |
q15_t * pSrcB, | |
uint32_t blockSize, | |
q63_t * result); | |
/** | |
* @brief Dot product of Q31 vectors. | |
* @param[in] *pSrcA points to the first input vector | |
* @param[in] *pSrcB points to the second input vector | |
* @param[in] blockSize number of samples in each vector | |
* @param[out] *result output result returned here | |
* @return none. | |
*/ | |
void arm_dot_prod_q31( | |
q31_t * pSrcA, | |
q31_t * pSrcB, | |
uint32_t blockSize, | |
q63_t * result); | |
/** | |
* @brief Shifts the elements of a Q7 vector a specified number of bits. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_shift_q7( | |
q7_t * pSrc, | |
int8_t shiftBits, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Shifts the elements of a Q15 vector a specified number of bits. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_shift_q15( | |
q15_t * pSrc, | |
int8_t shiftBits, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Shifts the elements of a Q31 vector a specified number of bits. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_shift_q31( | |
q31_t * pSrc, | |
int8_t shiftBits, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Adds a constant offset to a floating-point vector. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] offset is the offset to be added | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_offset_f32( | |
float32_t * pSrc, | |
float32_t offset, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Adds a constant offset to a Q7 vector. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] offset is the offset to be added | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_offset_q7( | |
q7_t * pSrc, | |
q7_t offset, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Adds a constant offset to a Q15 vector. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] offset is the offset to be added | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_offset_q15( | |
q15_t * pSrc, | |
q15_t offset, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Adds a constant offset to a Q31 vector. | |
* @param[in] *pSrc points to the input vector | |
* @param[in] offset is the offset to be added | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_offset_q31( | |
q31_t * pSrc, | |
q31_t offset, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Negates the elements of a floating-point vector. | |
* @param[in] *pSrc points to the input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_negate_f32( | |
float32_t * pSrc, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Negates the elements of a Q7 vector. | |
* @param[in] *pSrc points to the input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_negate_q7( | |
q7_t * pSrc, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Negates the elements of a Q15 vector. | |
* @param[in] *pSrc points to the input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_negate_q15( | |
q15_t * pSrc, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Negates the elements of a Q31 vector. | |
* @param[in] *pSrc points to the input vector | |
* @param[out] *pDst points to the output vector | |
* @param[in] blockSize number of samples in the vector | |
* @return none. | |
*/ | |
void arm_negate_q31( | |
q31_t * pSrc, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Copies the elements of a floating-point vector. | |
* @param[in] *pSrc input pointer | |
* @param[out] *pDst output pointer | |
* @param[in] blockSize number of samples to process | |
* @return none. | |
*/ | |
void arm_copy_f32( | |
float32_t * pSrc, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Copies the elements of a Q7 vector. | |
* @param[in] *pSrc input pointer | |
* @param[out] *pDst output pointer | |
* @param[in] blockSize number of samples to process | |
* @return none. | |
*/ | |
void arm_copy_q7( | |
q7_t * pSrc, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Copies the elements of a Q15 vector. | |
* @param[in] *pSrc input pointer | |
* @param[out] *pDst output pointer | |
* @param[in] blockSize number of samples to process | |
* @return none. | |
*/ | |
void arm_copy_q15( | |
q15_t * pSrc, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Copies the elements of a Q31 vector. | |
* @param[in] *pSrc input pointer | |
* @param[out] *pDst output pointer | |
* @param[in] blockSize number of samples to process | |
* @return none. | |
*/ | |
void arm_copy_q31( | |
q31_t * pSrc, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Fills a constant value into a floating-point vector. | |
* @param[in] value input value to be filled | |
* @param[out] *pDst output pointer | |
* @param[in] blockSize number of samples to process | |
* @return none. | |
*/ | |
void arm_fill_f32( | |
float32_t value, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Fills a constant value into a Q7 vector. | |
* @param[in] value input value to be filled | |
* @param[out] *pDst output pointer | |
* @param[in] blockSize number of samples to process | |
* @return none. | |
*/ | |
void arm_fill_q7( | |
q7_t value, | |
q7_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Fills a constant value into a Q15 vector. | |
* @param[in] value input value to be filled | |
* @param[out] *pDst output pointer | |
* @param[in] blockSize number of samples to process | |
* @return none. | |
*/ | |
void arm_fill_q15( | |
q15_t value, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Fills a constant value into a Q31 vector. | |
* @param[in] value input value to be filled | |
* @param[out] *pDst output pointer | |
* @param[in] blockSize number of samples to process | |
* @return none. | |
*/ | |
void arm_fill_q31( | |
q31_t value, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Convolution of floating-point sequences. | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. | |
* @return none. | |
*/ | |
void arm_conv_f32( | |
float32_t * pSrcA, | |
uint32_t srcALen, | |
float32_t * pSrcB, | |
uint32_t srcBLen, | |
float32_t * pDst); | |
/** | |
* @brief Convolution of Q15 sequences. | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the location where the output result is written. Length srcALen+srcBLen-1. | |
* @return none. | |
*/ | |
void arm_conv_q15( | |
q15_t * pSrcA, | |
uint32_t srcALen, | |
q15_t * pSrcB, | |
uint32_t srcBLen, | |
q15_t * pDst); | |
/** | |
* @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. | |
* @return none. | |
*/ | |
void arm_conv_fast_q15( | |
q15_t * pSrcA, | |
uint32_t srcALen, | |
q15_t * pSrcB, | |
uint32_t srcBLen, | |
q15_t * pDst); | |
/** | |
* @brief Convolution of Q31 sequences. | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. | |
* @return none. | |
*/ | |
void arm_conv_q31( | |
q31_t * pSrcA, | |
uint32_t srcALen, | |
q31_t * pSrcB, | |
uint32_t srcBLen, | |
q31_t * pDst); | |
/** | |
* @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. | |
* @return none. | |
*/ | |
void arm_conv_fast_q31( | |
q31_t * pSrcA, | |
uint32_t srcALen, | |
q31_t * pSrcB, | |
uint32_t srcBLen, | |
q31_t * pDst); | |
/** | |
* @brief Convolution of Q7 sequences. | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data Length srcALen+srcBLen-1. | |
* @return none. | |
*/ | |
void arm_conv_q7( | |
q7_t * pSrcA, | |
uint32_t srcALen, | |
q7_t * pSrcB, | |
uint32_t srcBLen, | |
q7_t * pDst); | |
/** | |
* @brief Partial convolution of floating-point sequences. | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] firstIndex is the first output sample to start with. | |
* @param[in] numPoints is the number of output points to be computed. | |
* @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]. | |
*/ | |
arm_status arm_conv_partial_f32( | |
float32_t * pSrcA, | |
uint32_t srcALen, | |
float32_t * pSrcB, | |
uint32_t srcBLen, | |
float32_t * pDst, | |
uint32_t firstIndex, | |
uint32_t numPoints); | |
/** | |
* @brief Partial convolution of Q15 sequences. | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] firstIndex is the first output sample to start with. | |
* @param[in] numPoints is the number of output points to be computed. | |
* @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]. | |
*/ | |
arm_status arm_conv_partial_q15( | |
q15_t * pSrcA, | |
uint32_t srcALen, | |
q15_t * pSrcB, | |
uint32_t srcBLen, | |
q15_t * pDst, | |
uint32_t firstIndex, | |
uint32_t numPoints); | |
/** | |
* @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] firstIndex is the first output sample to start with. | |
* @param[in] numPoints is the number of output points to be computed. | |
* @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]. | |
*/ | |
arm_status arm_conv_partial_fast_q15( | |
q15_t * pSrcA, | |
uint32_t srcALen, | |
q15_t * pSrcB, | |
uint32_t srcBLen, | |
q15_t * pDst, | |
uint32_t firstIndex, | |
uint32_t numPoints); | |
/** | |
* @brief Partial convolution of Q31 sequences. | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] firstIndex is the first output sample to start with. | |
* @param[in] numPoints is the number of output points to be computed. | |
* @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]. | |
*/ | |
arm_status arm_conv_partial_q31( | |
q31_t * pSrcA, | |
uint32_t srcALen, | |
q31_t * pSrcB, | |
uint32_t srcBLen, | |
q31_t * pDst, | |
uint32_t firstIndex, | |
uint32_t numPoints); | |
/** | |
* @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] firstIndex is the first output sample to start with. | |
* @param[in] numPoints is the number of output points to be computed. | |
* @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]. | |
*/ | |
arm_status arm_conv_partial_fast_q31( | |
q31_t * pSrcA, | |
uint32_t srcALen, | |
q31_t * pSrcB, | |
uint32_t srcBLen, | |
q31_t * pDst, | |
uint32_t firstIndex, | |
uint32_t numPoints); | |
/** | |
* @brief Partial convolution of Q7 sequences. | |
* @param[in] *pSrcA points to the first input sequence. | |
* @param[in] srcALen length of the first input sequence. | |
* @param[in] *pSrcB points to the second input sequence. | |
* @param[in] srcBLen length of the second input sequence. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] firstIndex is the first output sample to start with. | |
* @param[in] numPoints is the number of output points to be computed. | |
* @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]. | |
*/ | |
arm_status arm_conv_partial_q7( | |
q7_t * pSrcA, | |
uint32_t srcALen, | |
q7_t * pSrcB, | |
uint32_t srcBLen, | |
q7_t * pDst, | |
uint32_t firstIndex, | |
uint32_t numPoints); | |
/** | |
* @brief Instance structure for the Q15 FIR decimator. | |
*/ | |
typedef struct | |
{ | |
uint8_t M; /**< decimation factor. */ | |
uint16_t numTaps; /**< number of coefficients in the filter. */ | |
q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ | |
q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ | |
} arm_fir_decimate_instance_q15; | |
/** | |
* @brief Instance structure for the Q31 FIR decimator. | |
*/ | |
typedef struct | |
{ | |
uint8_t M; /**< decimation factor. */ | |
uint16_t numTaps; /**< number of coefficients in the filter. */ | |
q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ | |
q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ | |
} arm_fir_decimate_instance_q31; | |
/** | |
* @brief Instance structure for the floating-point FIR decimator. | |
*/ | |
typedef struct | |
{ | |
uint8_t M; /**< decimation factor. */ | |
uint16_t numTaps; /**< number of coefficients in the filter. */ | |
float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ | |
float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ | |
} arm_fir_decimate_instance_f32; | |
/** | |
* @brief Processing function for the floating-point FIR decimator. | |
* @param[in] *S points to an instance of the floating-point FIR decimator structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] blockSize number of input samples to process per call. | |
* @return none | |
*/ | |
void arm_fir_decimate_f32( | |
const arm_fir_decimate_instance_f32 * S, | |
float32_t * pSrc, | |
float32_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the floating-point FIR decimator. | |
* @param[in,out] *S points to an instance of the floating-point FIR decimator structure. | |
* @param[in] numTaps number of coefficients in the filter. | |
* @param[in] M decimation factor. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @param[in] blockSize number of input samples to process per call. | |
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if | |
* <code>blockSize</code> is not a multiple of <code>M</code>. | |
*/ | |
arm_status arm_fir_decimate_init_f32( | |
arm_fir_decimate_instance_f32 * S, | |
uint16_t numTaps, | |
uint8_t M, | |
float32_t * pCoeffs, | |
float32_t * pState, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the Q15 FIR decimator. | |
* @param[in] *S points to an instance of the Q15 FIR decimator structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] blockSize number of input samples to process per call. | |
* @return none | |
*/ | |
void arm_fir_decimate_q15( | |
const arm_fir_decimate_instance_q15 * S, | |
q15_t * pSrc, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. | |
* @param[in] *S points to an instance of the Q15 FIR decimator structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] blockSize number of input samples to process per call. | |
* @return none | |
*/ | |
void arm_fir_decimate_fast_q15( | |
const arm_fir_decimate_instance_q15 * S, | |
q15_t * pSrc, | |
q15_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the Q15 FIR decimator. | |
* @param[in,out] *S points to an instance of the Q15 FIR decimator structure. | |
* @param[in] numTaps number of coefficients in the filter. | |
* @param[in] M decimation factor. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @param[in] blockSize number of input samples to process per call. | |
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if | |
* <code>blockSize</code> is not a multiple of <code>M</code>. | |
*/ | |
arm_status arm_fir_decimate_init_q15( | |
arm_fir_decimate_instance_q15 * S, | |
uint16_t numTaps, | |
uint8_t M, | |
q15_t * pCoeffs, | |
q15_t * pState, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the Q31 FIR decimator. | |
* @param[in] *S points to an instance of the Q31 FIR decimator structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] blockSize number of input samples to process per call. | |
* @return none | |
*/ | |
void arm_fir_decimate_q31( | |
const arm_fir_decimate_instance_q31 * S, | |
q31_t * pSrc, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. | |
* @param[in] *S points to an instance of the Q31 FIR decimator structure. | |
* @param[in] *pSrc points to the block of input data. | |
* @param[out] *pDst points to the block of output data | |
* @param[in] blockSize number of input samples to process per call. | |
* @return none | |
*/ | |
void arm_fir_decimate_fast_q31( | |
arm_fir_decimate_instance_q31 * S, | |
q31_t * pSrc, | |
q31_t * pDst, | |
uint32_t blockSize); | |
/** | |
* @brief Initialization function for the Q31 FIR decimator. | |
* @param[in,out] *S points to an instance of the Q31 FIR decimator structure. | |
* @param[in] numTaps number of coefficients in the filter. | |
* @param[in] M decimation factor. | |
* @param[in] *pCoeffs points to the filter coefficients. | |
* @param[in] *pState points to the state buffer. | |
* @param[in] blockSize number of input samples to process per call. | |
* @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if | |
* <code>blockSize</code> is not a multiple of <code>M</code>. | |
*/ | |
arm_status arm_fir_decimate_init_q31( | |
arm_fir_decimate_instance_q31 * S, | |
uint16_t numTaps, | |
uint8_t M, | |
q31_t * pCoeffs, | |
q31_t * pState, | |
uint32_t blockSize); | |
/** | |
* @brief Instance structure for the Q15 FIR interpolator. | |
*/ | |