1 /* ----------------------------------------------------------------------
2 * Project: CMSIS DSP Library
3 * Title: arm_fir_init_f16.c
4 * Description: Floating-point 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_f16.h"
30
31 #if defined(ARM_FLOAT16_SUPPORTED)
32
33 /**
34 @ingroup groupFilters
35 */
36
37 /**
38 @addtogroup FIR
39 @{
40 */
41
42 /**
43 @brief Initialization function for the floating-point FIR filter.
44 @param[in,out] S points to an instance of the floating-point FIR filter structure
45 @param[in] numTaps number of filter coefficients in the filter
46 @param[in] pCoeffs points to the filter coefficients buffer
47 @param[in] pState points to the state buffer
48 @param[in] blockSize number of samples processed per call
49
50 @par Details
51 <code>pCoeffs</code> points to the array of filter coefficients stored in time reversed order:
52 <pre>
53 {b[numTaps-1], b[numTaps-2], b[N-2], ..., b[1], b[0]}
54 </pre>
55 @par
56 <code>pState</code> points to the array of state variables.
57 <code>pState</code> is of length <code>numTaps+blockSize-1</code> samples (except for Helium - see below), where <code>blockSize</code> is the number of input samples processed by each call to <code>arm_fir_f16()</code>.
58 @par Initialization of Helium version
59 For Helium version the array of coefficients must be a multiple of 4 (4a) even if less
60 then 4a coefficients are defined in the FIR. The additional coefficients
61 (4a - numTaps) must be set to 0.
62 numTaps is still set to its right value in the init function. It means that
63 the implementation may require to read more coefficients due to the vectorization and
64 to avoid having to manage too many different cases in the code.
65
66
67 @par Helium state buffer
68 The state buffer must contain some additional temporary data
69 used during the computation but which is not the state of the FIR.
70 The first 8*ceil(blockSize/8) samples are temporary data.
71 The remaining samples are the state of the FIR filter.
72 So the state buffer has size <code> numTaps + 8*ceil(blockSize/8) + blockSize - 1 </code>
73
74 */
75
arm_fir_init_f16(arm_fir_instance_f16 * S,uint16_t numTaps,const float16_t * pCoeffs,float16_t * pState,uint32_t blockSize)76 void arm_fir_init_f16(
77 arm_fir_instance_f16 * S,
78 uint16_t numTaps,
79 const float16_t * pCoeffs,
80 float16_t * pState,
81 uint32_t blockSize)
82 {
83 /* Assign filter taps */
84 S->numTaps = numTaps;
85
86 /* Assign coefficient pointer */
87 S->pCoeffs = pCoeffs;
88
89 /* Clear state buffer. The size is always (blockSize + numTaps - 1) */
90 #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
91 memset(pState, 0, (numTaps + (blockSize - 1U) + ARM_ROUND_UP(blockSize, 8)) * sizeof(float16_t));
92 #else
93 memset(pState, 0, (numTaps + (blockSize - 1U)) * sizeof(float16_t));
94 #endif
95
96 /* Assign state pointer */
97 S->pState = pState;
98 }
99
100 /**
101 @} end of FIR group
102 */
103
104 #endif /* #if defined(ARM_FLOAT16_SUPPORTED) */
105