1 /* ----------------------------------------------------------------------
2  * Project:      CMSIS DSP Library
3  * Title:        arm_fir_init_q7.c
4  * Description:  Q7 FIR filter initialization function
5  *
6  * $Date:        23 April 2021
7  * $Revision:    V1.9.0
8  *
9  * Target Processor: Cortex-M and Cortex-A cores
10  * -------------------------------------------------------------------- */
11 /*
12  * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
13  *
14  * SPDX-License-Identifier: Apache-2.0
15  *
16  * Licensed under the Apache License, Version 2.0 (the License); you may
17  * not use this file except in compliance with the License.
18  * You may obtain a copy of the License at
19  *
20  * www.apache.org/licenses/LICENSE-2.0
21  *
22  * Unless required by applicable law or agreed to in writing, software
23  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
24  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25  * See the License for the specific language governing permissions and
26  * limitations under the License.
27  */
28 
29 #include "dsp/filtering_functions.h"
30 
31 /**
32   @ingroup groupFilters
33  */
34 
35 /**
36   @addtogroup FIR
37   @{
38  */
39 
40 /**
41   @brief         Initialization function for the Q7 FIR filter.
42   @param[in,out] S          points to an instance of the Q7 FIR filter structure
43   @param[in]     numTaps    number of filter coefficients in the filter
44   @param[in]     pCoeffs    points to the filter coefficients buffer
45   @param[in]     pState     points to the state buffer
46   @param[in]     blockSize  number of samples processed
47 
48   @par           Details
49                    <code>pCoeffs</code> points to the array of filter coefficients stored in time reversed order:
50   <pre>
51       {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
52   </pre>
53   @par
54                    <code>pState</code> points to the array of state variables.
55                    <code>pState</code> is of length <code>numTaps+blockSize-1</code> samples, where <code>blockSize</code> is the number of input samples processed by each call to <code>arm_fir_q7()</code>.
56 
57   @par          Initialization of Helium version
58                    For Helium version the array of coefficients must be a multiple of 16 (16a) even if less
59                    then 16a coefficients are defined in the FIR. The additional coefficients
60                    (16a - numTaps) must be set to 0.
61                    numTaps is still set to its right value in the init function. It means that
62                    the implementation may require to read more coefficients due to the vectorization and
63                    to avoid having to manage too many different cases in the code.
64 
65  */
66 
arm_fir_init_q7(arm_fir_instance_q7 * S,uint16_t numTaps,const q7_t * pCoeffs,q7_t * pState,uint32_t blockSize)67 void arm_fir_init_q7(
68         arm_fir_instance_q7 * S,
69         uint16_t numTaps,
70   const q7_t * pCoeffs,
71         q7_t * pState,
72         uint32_t blockSize)
73 {
74   /* Assign filter taps */
75   S->numTaps = numTaps;
76 
77   /* Assign coefficient pointer */
78   S->pCoeffs = pCoeffs;
79 
80   /* Clear state buffer. The size is always (blockSize + numTaps - 1) */
81   memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(q7_t));
82 
83   /* Assign state pointer */
84   S->pState = pState;
85 }
86 
87 /**
88   @} end of FIR group
89  */
90