* This user manual describes the CMSIS DSP software library,
* 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 functions each covering a specific category:
* The library is divided into a number of functions each covering a specific category:
* - Basic math functions
* - Fast math functions
* - Complex math functions
...
...
@@ -51,41 +59,7 @@
* - 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>Pre-processor Macros</b>
*
* Each library project have differant pre-processor macros.
*
* - UNALIGNED_SUPPORT_DISABLE:
*
* Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access
*
* - ARM_MATH_BIG_ENDIAN:
*
* Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets.
*
* - ARM_MATH_MATRIX_CHECK:
*
* Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices
*
* - ARM_MATH_ROUNDING:
*
* Define macro ARM_MATH_ROUNDING for rounding on support functions
*
* - ARM_MATH_CMx:
*
* 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.
*
* - __FPU_PRESENT:
*
* Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries
*
* <b>Toolchain Support</b>
*
* The library has been developed and tested with MDK-ARM version 4.23.
* The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly.
* 32-bit integer and 32-bit floating-point values.
*
* <b>Using the Library</b>
*
...
...
@@ -100,33 +74,67 @@
* - 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.
* 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 or ARM_MATH_CM0PLUS 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>Toolchain Support</b>
*
* The library has been developed and tested with MDK-ARM version 4.60.
* The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly.
*
* <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_cortexM3l_math.uvproj
* - arm_cortexM4b_math.uvproj
* - arm_cortexM4l_math.uvproj
* - arm_cortexM4bf_math.uvproj
* - arm_cortexM4lf_math.uvproj
*
*
* The project can be built by opening the appropriate project in MDK-ARM 4.23 chain and defining the optional pre processor MACROs detailed above.
* The project can be built by opening the appropriate project in MDK-ARM 4.60 chain and defining the optional pre processor MACROs detailed above.
*
* <b>Pre-processor Macros</b>
*
* Each library project have differant pre-processor macros.
*
* - UNALIGNED_SUPPORT_DISABLE:
*
* Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access
*
* - ARM_MATH_BIG_ENDIAN:
*
* Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets.
*
* - ARM_MATH_MATRIX_CHECK:
*
* Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices
*
* - ARM_MATH_ROUNDING:
*
* Define macro ARM_MATH_ROUNDING for rounding on support functions
*
* - ARM_MATH_CMx:
*
* 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, ARM_MATH_CM0PLUS for building library on cortex-M0+ target.
*
* - __FPU_PRESENT:
*
* Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for M4bf and M4lf libraries
*
* <b>Copyright Notice</b>
*
* Copyright (C) 2010 ARM Limited. All rights reserved.
* Copyright (C) 2010-2013 ARM Limited. All rights reserved.
*/
...
...
@@ -264,6 +272,10 @@
#include "core_cm3.h"
#elif defined (ARM_MATH_CM0)
#include "core_cm0.h"
#define ARM_MATH_CM0_FAMILY
#elif defined (ARM_MATH_CM0PLUS)
#include "core_cm0plus.h"
#define ARM_MATH_CM0_FAMILY
#else
#include "ARMCM4.h"
#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
...
...
@@ -365,17 +377,27 @@ extern "C"
/**
* @brief definition to read/write two 16 bit values.
#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
/**
* @brief definition to pack two 16 bit values.
*/
...
...
@@ -409,7 +431,7 @@ extern "C"
/**
* @brief Clips Q63 to Q31 values.
*/
__STATIC_INLINEq31_tclip_q63_to_q31(
static__INLINEq31_tclip_q63_to_q31(
q63_tx)
{
return((q31_t)(x>>32)!=((q31_t)x>>31))?
...
...
@@ -419,7 +441,7 @@ extern "C"
/**
* @brief Clips Q63 to Q15 values.
*/
__STATIC_INLINEq15_tclip_q63_to_q15(
static__INLINEq15_tclip_q63_to_q15(
q63_tx)
{
return((q31_t)(x>>32)!=((q31_t)x>>31))?
...
...
@@ -429,7 +451,7 @@ extern "C"
/**
* @brief Clips Q31 to Q7 values.
*/
__STATIC_INLINEq7_tclip_q31_to_q7(
static__INLINEq7_tclip_q31_to_q7(
q31_tx)
{
return((q31_t)(x>>24)!=((q31_t)x>>23))?
...
...
@@ -439,7 +461,7 @@ extern "C"
/**
* @brief Clips Q31 to Q15 values.
*/
__STATIC_INLINEq15_tclip_q31_to_q15(
static__INLINEq15_tclip_q31_to_q15(
q31_tx)
{
return((q31_t)(x>>16)!=((q31_t)x>>15))?
...
...
@@ -450,7 +472,7 @@ extern "C"
* @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format.
*/
__STATIC_INLINEq63_tmult32x64(
static__INLINEq63_tmult32x64(
q63_tx,
q31_ty)
{
...
...
@@ -459,20 +481,18 @@ extern "C"
}
#if defined (ARM_MATH_CM0) && defined ( __CC_ARM )
#if defined (ARM_MATH_CM0_FAMILY) && 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__)) )
#if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__)) ||(defined (__GNUC__)) || defined (__TASKING__) )
__STATIC_INLINEuint32_t__CLZ(q31_tdata);
static__INLINEuint32_t__CLZ(
q31_tdata);
__STATIC_INLINEuint32_t__CLZ(q31_tdata)
static__INLINEuint32_t__CLZ(
q31_tdata)
{
uint32_tcount=0;
uint32_tmask=0x80000000;
...
...
@@ -490,10 +510,10 @@ extern "C"
#endif
/**
* @brief Function to Calculates 1/in(reciprocal) value of Q31 Data type.
* @brief Function to Calculates 1/in(reciprocal) value of Q31 Data type.
*/
__STATIC_INLINEuint32_tarm_recip_q31(
static__INLINEuint32_tarm_recip_q31(
q31_tin,
q31_t*dst,
q31_t*pRecipTable)
...
...
@@ -542,9 +562,9 @@ extern "C"
}
/**
* @brief Function to Calculates 1/in(reciprocal) value of Q15 Data type.
* @brief Function to Calculates 1/in(reciprocal) value of Q15 Data type.
*/
__STATIC_INLINEuint32_tarm_recip_q15(
static__INLINEuint32_tarm_recip_q15(
q15_tin,
q15_t*dst,
q15_t*pRecipTable)
...
...
@@ -595,9 +615,9 @@ extern "C"
/*
* @brief C custom defined intrinisic function for only M0 processors
*/
#if defined(ARM_MATH_CM0)
#if defined(ARM_MATH_CM0_FAMILY)
__STATIC_INLINEq31_t__SSAT(
static__INLINEq31_t__SSAT(
q31_tx,
uint32_ty)
{
...
...
@@ -633,19 +653,19 @@ extern "C"
}
#endif /* end of ARM_MATH_CM0 */
#endif /* end of ARM_MATH_CM0_FAMILY */
/*
* @brief C custom defined intrinsic function for M3 and M0 processors
*/
#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0)
#if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY)
/*
* @brief C custom defined QADD8 for M3 and M0 processors
*/
__STATIC_INLINEq31_t__QADD8(
static__INLINEq31_t__QADD8(
q31_tx,
q31_ty)
{
...
...
@@ -672,7 +692,7 @@ extern "C"
/*
* @brief C custom defined QSUB8 for M3 and M0 processors
*/
__STATIC_INLINEq31_t__QSUB8(
static__INLINEq31_t__QSUB8(
q31_tx,
q31_ty)
{
...
...
@@ -702,7 +722,7 @@ extern "C"
/*
* @brief C custom defined QADD16 for M3 and M0 processors
*/
__STATIC_INLINEq31_t__QADD16(
static__INLINEq31_t__QADD16(
q31_tx,
q31_ty)
{
...
...
@@ -725,7 +745,7 @@ extern "C"
/*
* @brief C custom defined SHADD16 for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SHADD16(
static__INLINEq31_t__SHADD16(
q31_tx,
q31_ty)
{
...
...
@@ -748,7 +768,7 @@ extern "C"
/*
* @brief C custom defined QSUB16 for M3 and M0 processors
*/
__STATIC_INLINEq31_t__QSUB16(
static__INLINEq31_t__QSUB16(
q31_tx,
q31_ty)
{
...
...
@@ -770,7 +790,7 @@ extern "C"
/*
* @brief C custom defined SHSUB16 for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SHSUB16(
static__INLINEq31_t__SHSUB16(
q31_tx,
q31_ty)
{
...
...
@@ -792,7 +812,7 @@ extern "C"
/*
* @brief C custom defined QASX for M3 and M0 processors
*/
__STATIC_INLINEq31_t__QASX(
static__INLINEq31_t__QASX(
q31_tx,
q31_ty)
{
...
...
@@ -810,7 +830,7 @@ extern "C"
/*
* @brief C custom defined SHASX for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SHASX(
static__INLINEq31_t__SHASX(
q31_tx,
q31_ty)
{
...
...
@@ -833,7 +853,7 @@ extern "C"
/*
* @brief C custom defined QSAX for M3 and M0 processors
*/
__STATIC_INLINEq31_t__QSAX(
static__INLINEq31_t__QSAX(
q31_tx,
q31_ty)
{
...
...
@@ -851,7 +871,7 @@ extern "C"
/*
* @brief C custom defined SHSAX for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SHSAX(
static__INLINEq31_t__SHSAX(
q31_tx,
q31_ty)
{
...
...
@@ -873,7 +893,7 @@ extern "C"
/*
* @brief C custom defined SMUSDX for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SMUSDX(
static__INLINEq31_t__SMUSDX(
q31_tx,
q31_ty)
{
...
...
@@ -885,7 +905,7 @@ extern "C"
/*
* @brief C custom defined SMUADX for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SMUADX(
static__INLINEq31_t__SMUADX(
q31_tx,
q31_ty)
{
...
...
@@ -897,7 +917,7 @@ extern "C"
/*
* @brief C custom defined QADD for M3 and M0 processors
*/
__STATIC_INLINEq31_t__QADD(
static__INLINEq31_t__QADD(
q31_tx,
q31_ty)
{
...
...
@@ -907,7 +927,7 @@ extern "C"
/*
* @brief C custom defined QSUB for M3 and M0 processors
*/
__STATIC_INLINEq31_t__QSUB(
static__INLINEq31_t__QSUB(
q31_tx,
q31_ty)
{
...
...
@@ -917,7 +937,7 @@ extern "C"
/*
* @brief C custom defined SMLAD for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SMLAD(
static__INLINEq31_t__SMLAD(
q31_tx,
q31_ty,
q31_tsum)
...
...
@@ -930,7 +950,7 @@ extern "C"
/*
* @brief C custom defined SMLADX for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SMLADX(
static__INLINEq31_t__SMLADX(
q31_tx,
q31_ty,
q31_tsum)
...
...
@@ -943,7 +963,7 @@ extern "C"
/*
* @brief C custom defined SMLSDX for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SMLSDX(
static__INLINEq31_t__SMLSDX(
q31_tx,
q31_ty,
q31_tsum)
...
...
@@ -956,7 +976,7 @@ extern "C"
/*
* @brief C custom defined SMLALD for M3 and M0 processors
*/
__STATIC_INLINEq63_t__SMLALD(
static__INLINEq63_t__SMLALD(
q31_tx,
q31_ty,
q63_tsum)
...
...
@@ -969,7 +989,7 @@ extern "C"
/*
* @brief C custom defined SMLALDX for M3 and M0 processors
*/
__STATIC_INLINEq63_t__SMLALDX(
static__INLINEq63_t__SMLALDX(
q31_tx,
q31_ty,
q63_tsum)
...
...
@@ -982,7 +1002,7 @@ extern "C"
/*
* @brief C custom defined SMUAD for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SMUAD(
static__INLINEq31_t__SMUAD(
q31_tx,
q31_ty)
{
...
...
@@ -994,7 +1014,7 @@ extern "C"
/*
* @brief C custom defined SMUSD for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SMUSD(
static__INLINEq31_t__SMUSD(
q31_tx,
q31_ty)
{
...
...
@@ -1007,7 +1027,7 @@ extern "C"
/*
* @brief C custom defined SXTB16 for M3 and M0 processors
*/
__STATIC_INLINEq31_t__SXTB16(
static__INLINEq31_t__SXTB16(
q31_tx)
{
...
...
@@ -1016,7 +1036,7 @@ extern "C"
}
#endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0) */
#endif /* defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */
/**
...
...
@@ -1516,6 +1536,7 @@ extern "C"
* @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.
*/
...
...
@@ -1531,7 +1552,7 @@ extern "C"
* @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
* @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.
*/
...
...
@@ -1713,7 +1734,7 @@ extern "C"
typedefstruct
{
q15_tA0;/**< The derived gain, A0 = Kp + Ki + Kd . */
#ifdef ARM_MATH_CM0
#ifdef ARM_MATH_CM0_FAMILY
q15_tA1;
q15_tA2;
#else
...
...
@@ -1931,23 +1952,12 @@ extern "C"
uint32_tblockSize);
/**
* @brief Instance structure for the Q15 CFFT/CIFFT function.
*/
typedefstruct
{
uint16_tfftLen;/**< length of the FFT. */
uint8_tifftFlag;/**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_tbitReverseFlag;/**< 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_ttwidCoefModifier;/**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_tbitRevFactor;/**< 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.
* @brief Instance structure for the Q15 CFFT/CIFFT function.
*/
typedefstruct
...
...
@@ -1955,28 +1965,22 @@ extern "C"
uint16_tfftLen;/**< length of the FFT. */
uint8_tifftFlag;/**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_tbitReverseFlag;/**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
q31_t*pTwiddle;/**< points to the twiddle factor table. */
q15_t*pTwiddle;/**< points to the Sin twiddle factor table. */
uint16_t*pBitRevTable;/**< points to the bit reversal table. */
uint16_ttwidCoefModifier;/**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_tbitRevFactor;/**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
}arm_cfft_radix4_instance_q31;
}arm_cfft_radix2_instance_q15;
arm_statusarm_cfft_radix2_init_q15(
arm_cfft_radix2_instance_q15*S,
uint16_tfftLen,
uint8_tifftFlag,
uint8_tbitReverseFlag);
/**
* @brief Instance structure for the floating-point CFFT/CIFFT function.
*/
voidarm_cfft_radix2_q15(
constarm_cfft_radix2_instance_q15*S,
q15_t*pSrc);
typedefstruct
{
uint16_tfftLen;/**< length of the FFT. */
uint8_tifftFlag;/**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_tbitReverseFlag;/**< 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_ttwidCoefModifier;/**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_tbitRevFactor;/**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
float32_tonebyfftLen;/**< value of 1/fftLen. */
}arm_cfft_radix4_instance_f32;
/**
...
...
@@ -1988,11 +1992,21 @@ extern "C"
uint16_tfftLen;/**< length of the FFT. */
uint8_tifftFlag;/**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_tbitReverseFlag;/**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
q15_t*pTwiddle;/**< points to the Sin twiddle factor table. */
q15_t*pTwiddle;/**< points to the twiddle factor table. */
uint16_t*pBitRevTable;/**< points to the bit reversal table. */
uint16_ttwidCoefModifier;/**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_tbitRevFactor;/**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
}arm_cfft_radix2_instance_q15;
}arm_cfft_radix4_instance_q15;
arm_statusarm_cfft_radix4_init_q15(
arm_cfft_radix4_instance_q15*S,
uint16_tfftLen,
uint8_tifftFlag,
uint8_tbitReverseFlag);
voidarm_cfft_radix4_q15(
constarm_cfft_radix4_instance_q15*S,
q15_t*pSrc);
/**
* @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function.
...
...
@@ -2009,95 +2023,36 @@ extern "C"
uint16_tbitRevFactor;/**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
}arm_cfft_radix2_instance_q31;
/**
* @brief Instance structure for the floating-point CFFT/CIFFT function.
*/
typedefstruct
{
uint16_tfftLen;/**< length of the FFT. */
uint8_tifftFlag;/**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_tbitReverseFlag;/**< 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_ttwidCoefModifier;/**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_tbitRevFactor;/**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
float32_tonebyfftLen;/**< value of 1/fftLen. */
}arm_cfft_radix2_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.
*/
voidarm_cfft_radix4_q15(
constarm_cfft_radix4_instance_q15*S,
q15_t*pSrc);
/**
* @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.
*/
voidarm_cfft_radix2_q15(
constarm_cfft_radix2_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_statusarm_cfft_radix4_init_q15(
arm_cfft_radix4_instance_q15*S,
arm_statusarm_cfft_radix2_init_q31(
arm_cfft_radix2_instance_q31*S,
uint16_tfftLen,
uint8_tifftFlag,
uint8_tbitReverseFlag);
voidarm_cfft_radix2_q31(
constarm_cfft_radix2_instance_q31*S,
q31_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.
* @brief Instance structure for the Q31 CFFT/CIFFT function.
*/
arm_statusarm_cfft_radix2_init_q15(
arm_cfft_radix2_instance_q15*S,
uint16_tfftLen,
uint8_tifftFlag,
uint8_tbitReverseFlag);
typedefstruct
{
uint16_tfftLen;/**< length of the FFT. */
uint8_tifftFlag;/**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_tbitReverseFlag;/**< 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_ttwidCoefModifier;/**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_tbitRevFactor;/**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
}arm_cfft_radix4_instance_q31;
/**
* @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.
*/
voidarm_cfft_radix4_q31(
constarm_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_statusarm_cfft_radix4_init_q31(
arm_cfft_radix4_instance_q31*S,
uint16_tfftLen,
...
...
@@ -2105,322 +2060,79 @@ extern "C"
uint8_tbitReverseFlag);
/**
* @brief Processing function for the Radix-2 Q31 CFFT/CIFFT.
* @param[in] *S points to an instance of the Radix-2 Q31 CFFT/CIFFT structure.
* @param[in, out] *pSrc points to the complex data buffer. Processing occurs in-place.
* @return none.
* @brief Instance structure for the floating-point CFFT/CIFFT function.
*/
voidarm_cfft_radix2_q31(
constarm_cfft_radix2_instance_q31*S,
q31_t*pSrc);
/**
* @brief Initialization function for the Radix-2 Q31 CFFT/CIFFT.
* @param[in,out] *S points to an instance of the Radix-2 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.
*/
typedefstruct
{
uint16_tfftLen;/**< length of the FFT. */
uint8_tifftFlag;/**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_tbitReverseFlag;/**< 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_ttwidCoefModifier;/**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_tbitRevFactor;/**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
float32_tonebyfftLen;/**< value of 1/fftLen. */
}arm_cfft_radix2_instance_f32;
arm_statusarm_cfft_radix2_init_q31(
arm_cfft_radix2_instance_q31*S,
/* Deprecated */
arm_statusarm_cfft_radix2_init_f32(
arm_cfft_radix2_instance_f32*S,
uint16_tfftLen,
uint8_tifftFlag,
uint8_tbitReverseFlag);
/**
* @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.
*/
/* Deprecated */
voidarm_cfft_radix2_f32(
constarm_cfft_radix2_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.
* @brief Instance structure for the floating-point CFFT/CIFFT function.
*/
arm_statusarm_cfft_radix2_init_f32(
arm_cfft_radix2_instance_f32*S,
typedefstruct
{
uint16_tfftLen;/**< length of the FFT. */
uint8_tifftFlag;/**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
uint8_tbitReverseFlag;/**< 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_ttwidCoefModifier;/**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
uint16_tbitRevFactor;/**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
float32_tonebyfftLen;/**< value of 1/fftLen. */
}arm_cfft_radix4_instance_f32;
/* Deprecated */
arm_statusarm_cfft_radix4_init_f32(
arm_cfft_radix4_instance_f32*S,
uint16_tfftLen,
uint8_tifftFlag,
uint8_tbitReverseFlag);
/**
* @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.
*/
/* Deprecated */
voidarm_cfft_radix4_f32(
constarm_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.
* @brief Instance structure for the floating-point CFFT/CIFFT function.
*/
arm_statusarm_cfft_radix4_init_f32(
arm_cfft_radix4_instance_f32*S,
uint16_tfftLen,
typedefstruct
{
uint16_tfftLen;/**< length of the FFT. */
constfloat32_t*pTwiddle;/**< points to the Twiddle factor table. */
constuint16_t*pBitRevTable;/**< points to the bit reversal table. */
uint16_tbitRevLength;/**< bit reversal table length. */
* @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.
*/
voidarm_radix4_butterfly_f32(
float32_t*pSrc,
uint16_tfftLen,
float32_t*pCoef,
uint16_ttwidCoefModifier);
/**
* @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.
*/
voidarm_radix4_butterfly_inverse_f32(
float32_t*pSrc,
uint16_tfftLen,
float32_t*pCoef,
uint16_ttwidCoefModifier,
float32_tonebyfftLen);
/**
* @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.
*/
voidarm_bitreversal_f32(
float32_t*pSrc,
uint16_tfftSize,
uint16_tbitRevFactor,
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.
*/
voidarm_radix4_butterfly_q31(
q31_t*pSrc,
uint32_tfftLen,
q31_t*pCoef,
uint32_ttwidCoefModifier);
/**
* @brief Core function for the f32 FFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of f32 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.
*/
voidarm_radix2_butterfly_f32(
float32_t*pSrc,
uint32_tfftLen,
float32_t*pCoef,
uint16_ttwidCoefModifier);
/**
* @brief Core function for the Radix-2 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.
*/
voidarm_radix2_butterfly_q31(
q31_t*pSrc,
uint32_tfftLen,
q31_t*pCoef,
uint16_ttwidCoefModifier);
/**
* @brief Core function for the Radix-2 Q15 CFFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of Q15 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.
*/
voidarm_radix2_butterfly_q15(
q15_t*pSrc,
uint32_tfftLen,
q15_t*pCoef,
uint16_ttwidCoefModifier);
/**
* @brief Core function for the Radix-2 Q15 CFFT Inverse butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of Q15 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.
*/
voidarm_radix2_butterfly_inverse_q15(
q15_t*pSrc,
uint32_tfftLen,
q15_t*pCoef,
uint16_ttwidCoefModifier);
/**
* @brief Core function for the Radix-2 Q31 CFFT Inverse 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.
*/
voidarm_radix2_butterfly_inverse_q31(
q31_t*pSrc,
uint32_tfftLen,
q31_t*pCoef,
uint16_ttwidCoefModifier);
/**
* @brief Core function for the f32 IFFT butterfly process.
* @param[in, out] *pSrc points to the in-place buffer of f32 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 1/fftLenfth
* @return none.
*/
voidarm_radix2_butterfly_inverse_f32(
float32_t*pSrc,
uint32_tfftLen,
float32_t*pCoef,
uint16_ttwidCoefModifier,
float32_tonebyfftLen);
/**
* @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.
*/
voidarm_radix4_butterfly_inverse_q31(
q31_t*pSrc,
uint32_tfftLen,
q31_t*pCoef,
uint32_ttwidCoefModifier);
/**
* @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.
*/
voidarm_bitreversal_q31(
q31_t*pSrc,
uint32_tfftLen,
uint16_tbitRevFactor,
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.
*/
voidarm_radix4_butterfly_q15(
q15_t*pSrc16,
uint32_tfftLen,
q15_t*pCoef16,
uint32_ttwidCoefModifier);
/**
* @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.
*/
voidarm_radix4_butterfly_inverse_q15(
q15_t*pSrc16,
uint32_tfftLen,
q15_t*pCoef16,
uint32_ttwidCoefModifier);
/**
* @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.
*/
voidarm_bitreversal_q15(
q15_t*pSrc,
uint32_tfftLen,
uint16_tbitRevFactor,
uint16_t*pBitRevTab);
/**
* @brief Instance structure for the Q15 RFFT/RIFFT function.
*/
...
...
@@ -2437,6 +2149,18 @@ extern "C"
arm_cfft_radix4_instance_q15*pCfft;/**< points to the complex FFT instance. */
}arm_rfft_instance_q15;
arm_statusarm_rfft_init_q15(
arm_rfft_instance_q15*S,
arm_cfft_radix4_instance_q15*S_CFFT,
uint32_tfftLenReal,
uint32_tifftFlagR,
uint32_tbitReverseFlag);
voidarm_rfft_q15(
constarm_rfft_instance_q15*S,
q15_t*pSrc,
q15_t*pDst);
/**
* @brief Instance structure for the Q31 RFFT/RIFFT function.
*/
...
...
@@ -2453,6 +2177,18 @@ extern "C"
arm_cfft_radix4_instance_q31*pCfft;/**< points to the complex FFT instance. */
}arm_rfft_instance_q31;
arm_statusarm_rfft_init_q31(
arm_rfft_instance_q31*S,
arm_cfft_radix4_instance_q31*S_CFFT,
uint32_tfftLenReal,
uint32_tifftFlagR,
uint32_tbitReverseFlag);
voidarm_rfft_q31(
constarm_rfft_instance_q31*S,
q31_t*pSrc,
q31_t*pDst);
/**
* @brief Instance structure for the floating-point RFFT/RIFFT function.
*/
...
...
@@ -2469,76 +2205,6 @@ extern "C"
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.
*/
voidarm_rfft_q15(
constarm_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_statusarm_rfft_init_q15(
arm_rfft_instance_q15*S,
arm_cfft_radix4_instance_q15*S_CFFT,
uint32_tfftLenReal,
uint32_tifftFlagR,
uint32_tbitReverseFlag);
/**
* @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.
*/
voidarm_rfft_q31(
constarm_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_statusarm_rfft_init_q31(
arm_rfft_instance_q31*S,
arm_cfft_radix4_instance_q31*S_CFFT,
uint32_tfftLenReal,
uint32_tifftFlagR,
uint32_tbitReverseFlag);
/**
* @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_statusarm_rfft_init_f32(
arm_rfft_instance_f32*S,
arm_cfft_radix4_instance_f32*S_CFFT,
...
...
@@ -2546,19 +2212,31 @@ extern "C"
uint32_tifftFlagR,
uint32_tbitReverseFlag);
/**
* @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.
*/
voidarm_rfft_f32(
constarm_rfft_instance_f32*S,
float32_t*pSrc,
float32_t*pDst);
/**
* @brief Instance structure for the floating-point RFFT/RIFFT function.
uint16_tfftLenRFFT;/**< length of the real sequence */
float32_t*pTwiddleRFFT;/**< Twiddle factors real stage */
}arm_rfft_fast_instance_f32;
arm_statusarm_rfft_fast_init_f32(
arm_rfft_fast_instance_f32*S,
uint16_tfftLen);
voidarm_rfft_fast_f32(
arm_rfft_fast_instance_f32*S,
float32_t*p,float32_t*pOut,
uint8_tifftFlag);
/**
* @brief Instance structure for the floating-point DCT4/IDCT4 function.
*/
...
...
@@ -3155,7 +2833,7 @@ extern "C"
q31_t*pDst,
uint32_tblockSize);
/**
* @brief Copies the elements of a floating-point vector.
* @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
...
...
@@ -3167,7 +2845,7 @@ extern "C"
uint32_tblockSize);
/**
* @brief Copies the elements of a Q7 vector.
* @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
...
...
@@ -3179,7 +2857,7 @@ extern "C"
uint32_tblockSize);
/**
* @brief Copies the elements of a Q15 vector.
* @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
...
...
@@ -3191,7 +2869,7 @@ extern "C"
uint32_tblockSize);
/**
* @brief Copies the elements of a Q31 vector.
* @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
...
...
@@ -3202,7 +2880,7 @@ extern "C"
q31_t*pDst,
uint32_tblockSize);
/**
* @brief Fills a constant value into a floating-point vector.
* @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
...
...
@@ -3214,7 +2892,7 @@ extern "C"
uint32_tblockSize);
/**
* @brief Fills a constant value into a Q7 vector.
* @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
...
...
@@ -3226,7 +2904,7 @@ extern "C"
uint32_tblockSize);
/**
* @brief Fills a constant value into a Q15 vector.
* @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
...
...
@@ -3238,7 +2916,7 @@ extern "C"
uint32_tblockSize);
/**
* @brief Fills a constant value into a Q31 vector.
* @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
...
...
@@ -3249,14 +2927,14 @@ extern "C"
q31_t*pDst,
uint32_tblockSize);
/**
* @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.
/**
* @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.
*/
voidarm_conv_f32(
...
...
@@ -3266,17 +2944,17 @@ extern "C"
uint32_tsrcBLen,
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 block of output data Length srcALen+srcBLen-1.
* @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @return none.
/**
* @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 block of output data Length srcALen+srcBLen-1.
* @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @return none.
*/
...
...
@@ -3290,14 +2968,14 @@ extern "C"
q15_t*pScratch2);
/**
* @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.
/**
* @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.
*/
voidarm_conv_q15(
...
...
@@ -3331,9 +3009,9 @@ extern "C"
* @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.
* @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @return none.
* @param[in] *pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @return none.
*/
voidarm_conv_fast_opt_q15(
...
...
@@ -3382,16 +3060,16 @@ extern "C"
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.
* @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
* @return none.
/**
* @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.
* @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
* @return none.
*/
voidarm_conv_opt_q7(
...
...
@@ -3444,18 +3122,18 @@ extern "C"
uint32_tfirstIndex,
uint32_tnumPoints);
/**
* @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.
* @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @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].
/**
* @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.
* @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @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_statusarm_conv_partial_opt_q15(
...
...
@@ -3522,9 +3200,9 @@ extern "C"
* @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.
* @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @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].
* @param[in] * pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] * pScratch2 points to scratch buffer of size min(srcALen, srcBLen).
* @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_statusarm_conv_partial_fast_opt_q15(
...
...
@@ -3583,18 +3261,18 @@ extern "C"
uint32_tnumPoints);
/**
* @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.
* @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
* @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].
/**
* @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.
* @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
* @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_statusarm_conv_partial_opt_q7(
...
...
@@ -4086,8 +3764,8 @@ extern "C"
* @brief Initialization function for the Q15 FIR lattice filter.
* @param[in] *S points to an instance of the Q15 FIR lattice structure.
* @param[in] numStages number of filter stages.
* @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages.
* @param[in] *pState points to the state buffer. The array is of length numStages.
* @param[in] *pCoeffs points to the coefficient buffer. The array is of length numStages.
* @param[in] *pState points to the state buffer. The array is of length numStages.
* @return none.
*/
...
...
@@ -4654,15 +4332,15 @@ extern "C"
float32_t*pDst);
/**
* @brief Correlation 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 Length 2 * max(srcALen, srcBLen) - 1.
* @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @return none.
/**
* @brief Correlation 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 Length 2 * max(srcALen, srcBLen) - 1.
* @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @return none.
*/
voidarm_correlate_opt_q15(
q15_t*pSrcA,
...
...
@@ -4716,7 +4394,7 @@ extern "C"
* @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 2 * max(srcALen, srcBLen) - 1.
* @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @return none.
*/
...
...
@@ -4764,16 +4442,16 @@ extern "C"
/**
* @brief Correlation 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 2 * max(srcALen, srcBLen) - 1.
* @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
* @return none.
/**
* @brief Correlation 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 2 * max(srcALen, srcBLen) - 1.
* @param[in] *pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.
* @param[in] *pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).
* @return none.
*/
voidarm_correlate_opt_q7(
...
...
@@ -5019,9 +4697,9 @@ extern "C"
/*
* @brief Floating-point sin_cos function.
* @param[in] theta input value in degrees
* @param[out] *pSinVal points to the processed sine output.
* @param[out] *pCosVal points to the processed cos output.
* @param[in] theta input value in degrees
* @param[out] *pSinVal points to the processed sine output.
* @param[out] *pCosVal points to the processed cos output.
* @return none.
*/
...
...
@@ -5032,9 +4710,9 @@ extern "C"
/*
* @brief Q31 sin_cos function.
* @param[in] theta scaled input value in degrees
* @param[out] *pSinVal points to the processed sine output.
* @param[out] *pCosVal points to the processed cosine output.
* @param[in] theta scaled input value in degrees
* @param[out] *pSinVal points to the processed sine output.
* @param[out] *pCosVal points to the processed cosine output.
* @return none.
*/
...
...
@@ -5132,7 +4810,7 @@ extern "C"
/**
* @defgroup PID PID Motor Control
*
* A Proportional Integral Derivative (PID) controller is a generic feedback control
* A Proportional Integral Derivative (PID) controller is a generic feedback control
* loop mechanism widely used in industrial control systems.
* A PID controller is the most commonly used type of feedback controller.
*
...
...
@@ -5151,39 +4829,39 @@ extern "C"
*
* \par
* where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant
*
* \par
* \image html PID.gif "Proportional Integral Derivative Controller"
*
* \par
* \image html PID.gif "Proportional Integral Derivative Controller"
*
* \par
* The PID controller calculates an "error" value as the difference between
* the measured output and the reference input.
* The controller attempts to minimize the error by adjusting the process control inputs.
* The proportional value determines the reaction to the current error,
* the integral value determines the reaction based on the sum of recent errors,
* The controller attempts to minimize the error by adjusting the process control inputs.
* The proportional value determines the reaction to the current error,
* the integral value determines the reaction based on the sum of recent errors,
* and the derivative value determines the reaction based on the rate at which the error has been changing.
*
* \par Instance Structure
* The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure.
* A separate instance structure must be defined for each PID Controller.
* There are separate instance structure declarations for each of the 3 supported data types.
*
* \par Reset Functions
* There is also an associated reset function for each data type which clears the state array.
* \par Instance Structure
* The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure.
* A separate instance structure must be defined for each PID Controller.
* There are separate instance structure declarations for each of the 3 supported data types.
*
* \par Initialization Functions
* There is also an associated initialization function for each data type.
* The initialization function performs the following operations:
* \par Reset Functions
* There is also an associated reset function for each data type which clears the state array.
*
* \par Initialization Functions
* There is also an associated initialization function for each data type.
* The initialization function performs the following operations:
* - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains.
* - Zeros out the values in the state buffer.
*
* \par
* Instance structure cannot be placed into a const data section and it is recommended to use the initialization function.
* - Zeros out the values in the state buffer.
*
* \par Fixed-Point Behavior
* Care must be taken when using the fixed-point versions of the PID Controller functions.
* In particular, the overflow and saturation behavior of the accumulator used in each function must be considered.
* Refer to the function specific documentation below for usage guidelines.
* \par
* Instance structure cannot be placed into a const data section and it is recommended to use the initialization function.
*
* \par Fixed-Point Behavior
* Care must be taken when using the fixed-point versions of the PID Controller functions.
* In particular, the overflow and saturation behavior of the accumulator used in each function must be considered.
* Refer to the function specific documentation below for usage guidelines.
*/
/**
...
...
@@ -5199,7 +4877,7 @@ extern "C"
*/
__STATIC_INLINEfloat32_tarm_pid_f32(
static__INLINEfloat32_tarm_pid_f32(
arm_pid_instance_f32*S,
float32_tin)
{
...
...
@@ -5225,16 +4903,16 @@ extern "C"
* @param[in] in input sample to process
* @return out processed output sample.
*
* <b>Scaling and Overflow Behavior:</b>
* \par
* The function is implemented using an internal 64-bit accumulator.
* The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit.
* Thus, if the accumulator result overflows it wraps around rather than clip.
* In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions.
* After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format.
* <b>Scaling and Overflow Behavior:</b>
* \par
* The function is implemented using an internal 64-bit accumulator.
* The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit.
* Thus, if the accumulator result overflows it wraps around rather than clip.
* In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions.
* After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format.
*/
__STATIC_INLINEq31_tarm_pid_q31(
static__INLINEq31_tarm_pid_q31(
arm_pid_instance_q31*S,
q31_tin)
{
...
...
@@ -5272,47 +4950,42 @@ extern "C"
* @param[in] in input sample to process
* @return out processed output sample.
*
* <b>Scaling and Overflow Behavior:</b>
* \par
* The function is implemented using a 64-bit internal accumulator.
* Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result.
* The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format.
* There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved.
* After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits.
* <b>Scaling and Overflow Behavior:</b>
* \par
* The function is implemented using a 64-bit internal accumulator.
* Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result.
* The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format.
* There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved.
* After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits.
* Lastly, the accumulator is saturated to yield a result in 1.15 format.
* Linear interpolation is a method of curve fitting using linear polynomials.
* Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line
*
* \par
* \par
* \image html LinearInterp.gif "Linear interpolation"
*
* \par
...
...
@@ -5847,10 +5520,10 @@ extern "C"
* sample of data and each call to the function returns a single processed value.
* <code>S</code> points to an instance of the Linear Interpolate function data structure.
* <code>x</code> is the input sample value. The functions returns the output value.
*
*
* \par
* if x is outside of the table boundary, Linear interpolation returns first value of the table
* if x is below input range and returns last value of table if x is above range.
* if x is outside of the table boundary, Linear interpolation returns first value of the table
* if x is below input range and returns last value of table if x is above range.
*/
/**
...
...
@@ -5866,7 +5539,7 @@ extern "C"
*
*/
__STATIC_INLINEfloat32_tarm_linear_interp_f32(
static__INLINEfloat32_tarm_linear_interp_f32(
arm_linear_interp_instance_f32*S,
float32_tx)
{
...
...
@@ -5879,14 +5552,14 @@ extern "C"
float32_t*pYData=S->pYData;/* pointer to output table */
/* Calculation of index */
i=(x-S->x1)/xSpacing;
i=(int32_t)((x-S->x1)/xSpacing);
if(i<0)
{
/* Iniatilize output for below specified range as least output value of table */
y=pYData[0];
}
elseif(i>=S->nValues)
elseif((uint32_t)i>=S->nValues)
{
/* Iniatilize output for above specified range as last output value of table */
y=pYData[S->nValues-1];
...
...
@@ -5925,7 +5598,7 @@ extern "C"
*/
__STATIC_INLINEq31_tarm_linear_interp_q31(
static__INLINEq31_tarm_linear_interp_q31(
q31_t*pYData,
q31_tx,
uint32_tnValues)
...
...
@@ -5940,7 +5613,7 @@ extern "C"
/* Index value calculation */
index=((x&0xFFF00000)>>20);
if(index>=(nValues-1))
if(index>=(int32_t)(nValues-1))
{
return(pYData[nValues-1]);
}
...
...
@@ -5982,12 +5655,12 @@ extern "C"
*
* \par
* Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.
* This function can support maximum of table size 2^12.
* This function can support maximum of table size 2^12.
*
*/
__STATIC_INLINEq15_tarm_linear_interp_q15(
static__INLINEq15_tarm_linear_interp_q15(
q15_t*pYData,
q31_tx,
uint32_tnValues)
...
...
@@ -6002,7 +5675,7 @@ extern "C"
/* Index value calculation */
index=((x&0xFFF00000)>>20u);
if(index>=(nValues-1))
if(index>=(int32_t)(nValues-1))
{
return(pYData[nValues-1]);
}
...
...
@@ -6047,7 +5720,7 @@ extern "C"
*/
__STATIC_INLINEq7_tarm_linear_interp_q7(
static__INLINEq7_tarm_linear_interp_q7(
q7_t*pYData,
q31_tx,
uint32_tnValues)
...
...
@@ -6055,22 +5728,22 @@ extern "C"
q31_ty;/* output */
q7_ty0,y1;/* Nearest output values */
q31_tfract;/* fractional part */
int32_tindex;/* Index to read nearest output values */
uint32_tindex;/* Index to read nearest output values */
/* Input is in 12.20 format */
/* 12 bits for the table index */
/* Index value calculation */
index=((x&0xFFF00000)>>20u);
if(x<0)
{
return(pYData[0]);
}
index=(x>>20)&0xfff;
if(index>=(nValues-1))
{
return(pYData[nValues-1]);
}
elseif(index<0)
{
return(pYData[0]);
}
else
{
...
...
@@ -6162,14 +5835,14 @@ extern "C"
* @defgroup SQRT Square Root
*
* Computes the square root of a number.
* There are separate functions for Q15, Q31, and floating-point data types.
* There are separate functions for Q15, Q31, and floating-point data types.
* The square root function is computed using the Newton-Raphson algorithm.
* This is an iterative algorithm of the form:
* <pre>
* x1 = x0 - f(x0)/f'(x0)
* </pre>
* where <code>x1</code> is the current estimate,
* <code>x0</code> is the previous estimate and
* <code>x0</code> is the previous estimate, and
* <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>.
* For the square root function, the algorithm reduces to:
* <pre>
...
...
@@ -6192,21 +5865,19 @@ extern "C"
* <code>in</code> is negative value and returns zero output for negative values.
*/
__STATIC_INLINEarm_statusarm_sqrt_f32(
static__INLINEarm_statusarm_sqrt_f32(
float32_tin,
float32_t*pOut)
{
if(in>0)
{
// #if __FPU_USED
#if (__FPU_USED == 1) && defined ( __CC_ARM )
*pOut=__sqrtf(in);
#elif (__FPU_USED == 1) && defined ( __TMS_740 )
*pOut=__builtin_sqrtf(in);
#else
*pOut=sqrtf(in);
#endif
// #if __FPU_USED
#if (__FPU_USED == 1) && defined ( __CC_ARM )
*pOut=__sqrtf(in);
#else
*pOut=sqrtf(in);
#endif
return(ARM_MATH_SUCCESS);
}
...
...
@@ -6254,7 +5925,7 @@ extern "C"
* @brief floating-point Circular write function.
*/
__STATIC_INLINEvoidarm_circularWrite_f32(
static__INLINEvoidarm_circularWrite_f32(
int32_t*circBuffer,
int32_tL,
uint16_t*writeOffset,
...
...
@@ -6299,7 +5970,7 @@ extern "C"
/**
* @brief floating-point Circular Read function.
*/
__STATIC_INLINEvoidarm_circularRead_f32(
static__INLINEvoidarm_circularRead_f32(
int32_t*circBuffer,
int32_tL,
int32_t*readOffset,
...
...
@@ -6354,7 +6025,7 @@ extern "C"
* @brief Q15 Circular write function.
*/
__STATIC_INLINEvoidarm_circularWrite_q15(
static__INLINEvoidarm_circularWrite_q15(
q15_t*circBuffer,
int32_tL,
uint16_t*writeOffset,
...
...
@@ -6399,7 +6070,7 @@ extern "C"
/**
* @brief Q15 Circular Read function.
*/
__STATIC_INLINEvoidarm_circularRead_q15(
static__INLINEvoidarm_circularRead_q15(
q15_t*circBuffer,
int32_tL,
int32_t*readOffset,
...
...
@@ -6456,7 +6127,7 @@ extern "C"
* @brief Q7 Circular write function.
*/
__STATIC_INLINEvoidarm_circularWrite_q7(
static__INLINEvoidarm_circularWrite_q7(
q7_t*circBuffer,
int32_tL,
uint16_t*writeOffset,
...
...
@@ -6501,7 +6172,7 @@ extern "C"
/**
* @brief Q7 Circular Read function.
*/
__STATIC_INLINEvoidarm_circularRead_q7(
static__INLINEvoidarm_circularRead_q7(
q7_t*circBuffer,
int32_tL,
int32_t*readOffset,
...
...
@@ -7072,11 +6743,11 @@ extern "C"
uint32_tnumSamples);
/**
* @brief Converts the elements of the floating-point vector to Q31 vector.
* @param[in] *pSrc points to the floating-point input vector
* @brief Converts the elements of the floating-point vector to Q31 vector.
* @param[in] *pSrc points to the floating-point input vector
* @param[out] *pDst points to the Q31 output vector
* @param[in] blockSize length of the input vector
* @return none.
* @param[in] blockSize length of the input vector
* @return none.
*/
voidarm_float_to_q31(
float32_t*pSrc,
...
...
@@ -7084,10 +6755,10 @@ extern "C"
uint32_tblockSize);
/**
* @brief Converts the elements of the floating-point vector to Q15 vector.
* @param[in] *pSrc points to the floating-point input vector
* @brief Converts the elements of the floating-point vector to Q15 vector.
* @param[in] *pSrc points to the floating-point input vector
* @param[out] *pDst points to the Q15 output vector
* @param[in] blockSize length of the input vector
* @param[in] blockSize length of the input vector
* @return none
*/
voidarm_float_to_q15(
...
...
@@ -7096,10 +6767,10 @@ extern "C"
uint32_tblockSize);
/**
* @brief Converts the elements of the floating-point vector to Q7 vector.
* @param[in] *pSrc points to the floating-point input vector
* @brief Converts the elements of the floating-point vector to Q7 vector.
* @param[in] *pSrc points to the floating-point input vector
* @param[out] *pDst points to the Q7 output vector
* @param[in] blockSize length of the input vector
* @param[in] blockSize length of the input vector
* @return none
*/
voidarm_float_to_q7(
...
...
@@ -7219,12 +6890,12 @@ extern "C"
* + f(XF, YF+1) * (1-(x-XF))*(y-YF)
* + f(XF+1, YF+1) * (x-XF)*(y-YF)
* </pre>
* Note that the coordinates (x, y) contain integer and fractional components.
* Note that the coordinates (x, y) contain integer and fractional components.
* The integer components specify which portion of the table to use while the
* fractional components control the interpolation processor.
*
* \par
* if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output.
* if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output.
*/
/**
...
...
@@ -7242,7 +6913,7 @@ extern "C"
*/
__STATIC_INLINEfloat32_tarm_bilinear_interp_f32(
static__INLINEfloat32_tarm_bilinear_interp_f32(
constarm_bilinear_interp_instance_f32*S,
float32_tX,
float32_tY)
...
...
@@ -7310,7 +6981,7 @@ extern "C"
* @return out interpolated value.
*/
__STATIC_INLINEq31_tarm_bilinear_interp_q31(
static__INLINEq31_tarm_bilinear_interp_q31(
arm_bilinear_interp_instance_q31*S,
q31_tX,
q31_tY)
...
...
@@ -7386,7 +7057,7 @@ extern "C"
* @return out interpolated value.
*/
__STATIC_INLINEq15_tarm_bilinear_interp_q15(
static__INLINEq15_tarm_bilinear_interp_q15(
arm_bilinear_interp_instance_q15*S,
q31_tX,
q31_tY)
...
...
@@ -7466,7 +7137,7 @@ extern "C"
* @return out interpolated value.
*/
__STATIC_INLINEq7_tarm_bilinear_interp_q7(
static__INLINEq7_tarm_bilinear_interp_q7(
arm_bilinear_interp_instance_q7*S,
q31_tX,
q31_tY)
...
...
@@ -7539,6 +7210,84 @@ extern "C"
*/
#if defined ( __CC_ARM ) //Keil
//SMMLAR
#define multAcc_32x32_keep32_R(a, x, y) \
a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32)
//SMMLSR
#define multSub_32x32_keep32_R(a, x, y) \
a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32)
//SMMULR
#define mult_32x32_keep32_R(a, x, y) \
a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32)
//Enter low optimization region - place directly above function definition
#define LOW_OPTIMIZATION_ENTER \
_Pragma ("push") \
_Pragma ("O1")
//Exit low optimization region - place directly after end of function definition
#define LOW_OPTIMIZATION_EXIT \
_Pragma ("pop")
//Enter low optimization region - place directly above function definition
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER
//Exit low optimization region - place directly after end of function definition
#define IAR_ONLY_LOW_OPTIMIZATION_EXIT
#elif defined(__ICCARM__) //IAR
//SMMLA
#define multAcc_32x32_keep32_R(a, x, y) \
a += (q31_t) (((q63_t) x * y) >> 32)
//SMMLS
#define multSub_32x32_keep32_R(a, x, y) \
a -= (q31_t) (((q63_t) x * y) >> 32)
//SMMUL
#define mult_32x32_keep32_R(a, x, y) \
a = (q31_t) (((q63_t) x * y ) >> 32)
//Enter low optimization region - place directly above function definition
#define LOW_OPTIMIZATION_ENTER \
_Pragma ("optimize=low")
//Exit low optimization region - place directly after end of function definition
#define LOW_OPTIMIZATION_EXIT
//Enter low optimization region - place directly above function definition
#define IAR_ONLY_LOW_OPTIMIZATION_ENTER \
_Pragma ("optimize=low")
//Exit low optimization region - place directly after end of function definition