]> git.gag.com Git - fw/stlink/blob - exampleF4/CMSIS/DSP_Lib/Source/FilteringFunctions/arm_fir_interpolate_init_q31.c
Added all the F4 libraries to the project
[fw/stlink] / exampleF4 / CMSIS / DSP_Lib / Source / FilteringFunctions / arm_fir_interpolate_init_q31.c
1 /*-----------------------------------------------------------------------------   
2 * Copyright (C) 2010 ARM Limited. All rights reserved.   
3 *   
4 * $Date:        15. July 2011  
5 * $Revision:    V1.0.10  
6 *   
7 * Project:          CMSIS DSP Library   
8 * Title:        arm_fir_interpolate_init_q31.c   
9 *   
10 * Description:  Q31 FIR interpolator initialization function   
11 *   
12 * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
13 *  
14 * Version 1.0.10 2011/7/15 
15 *    Big Endian support added and Merged M0 and M3/M4 Source code.  
16 *   
17 * Version 1.0.3 2010/11/29  
18 *    Re-organized the CMSIS folders and updated documentation.   
19 *    
20 * Version 1.0.2 2010/11/11   
21 *    Documentation updated.    
22 *   
23 * Version 1.0.1 2010/10/05    
24 *    Production release and review comments incorporated.   
25 *   
26 * Version 1.0.0 2010/09/20    
27 *    Production release and review comments incorporated   
28 *   
29 * Version 0.0.7  2010/06/10    
30 *    Misra-C changes done   
31 * ---------------------------------------------------------------------------*/
32
33 #include "arm_math.h"
34
35 /**   
36  * @ingroup groupFilters   
37  */
38
39 /**   
40  * @addtogroup FIR_Interpolate   
41  * @{   
42  */
43
44
45 /**   
46  * @brief  Initialization function for the Q31 FIR interpolator.   
47  * @param[in,out] *S        points to an instance of the Q31 FIR interpolator structure.   
48  * @param[in]     L         upsample factor.   
49  * @param[in]     numTaps   number of filter coefficients in the filter.   
50  * @param[in]     *pCoeffs  points to the filter coefficient buffer.   
51  * @param[in]     *pState   points to the state buffer.   
52  * @param[in]     blockSize number of input samples to process per call.   
53  * @return        The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_LENGTH_ERROR if   
54  * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.   
55  *   
56  * <b>Description:</b>   
57  * \par   
58  * <code>pCoeffs</code> points to the array of filter coefficients stored in time reversed order:   
59  * <pre>   
60  *    {b[numTaps-1], b[numTaps-2], b[numTaps-2], ..., b[1], b[0]}   
61  * </pre>   
62  * The length of the filter <code>numTaps</code> must be a multiple of the interpolation factor <code>L</code>.   
63  * \par   
64  * <code>pState</code> points to the array of state variables.   
65  * <code>pState</code> is of length <code>(numTaps/L)+blockSize-1</code> words   
66  * where <code>blockSize</code> is the number of input samples processed by each call to <code>arm_fir_interpolate_q31()</code>.   
67  */
68
69 arm_status arm_fir_interpolate_init_q31(
70   arm_fir_interpolate_instance_q31 * S,
71   uint8_t L,
72   uint16_t numTaps,
73   q31_t * pCoeffs,
74   q31_t * pState,
75   uint32_t blockSize)
76 {
77   arm_status status;
78
79   /* The filter length must be a multiple of the interpolation factor */
80   if((numTaps % L) != 0u)
81   {
82     /* Set status as ARM_MATH_LENGTH_ERROR */
83     status = ARM_MATH_LENGTH_ERROR;
84   }
85   else
86   {
87
88     /* Assign coefficient pointer */
89     S->pCoeffs = pCoeffs;
90
91     /* Assign Interpolation factor */
92     S->L = L;
93
94     /* Assign polyPhaseLength */
95     S->phaseLength = numTaps / L;
96
97     /* Clear state buffer and size of buffer is always phaseLength + blockSize - 1 */
98     memset(pState, 0,
99            (blockSize + ((uint32_t) S->phaseLength - 1u)) * sizeof(q31_t));
100
101     /* Assign state pointer */
102     S->pState = pState;
103
104     status = ARM_MATH_SUCCESS;
105   }
106
107   return (status);
108
109 }
110
111  /**   
112   * @} end of FIR_Interpolate group   
113   */