1 /******************************************************************************
2  * @file     filtering_functions_f16.h
3  * @brief    Public header file for CMSIS DSP Library
4  * @version  V1.10.0
5  * @date     08 July 2021
6  * Target Processor: Cortex-M and Cortex-A cores
7  ******************************************************************************/
8 /*
9  * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
10  *
11  * SPDX-License-Identifier: Apache-2.0
12  *
13  * Licensed under the Apache License, Version 2.0 (the License); you may
14  * not use this file except in compliance with the License.
15  * You may obtain a copy of the License at
16  *
17  * www.apache.org/licenses/LICENSE-2.0
18  *
19  * Unless required by applicable law or agreed to in writing, software
20  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
21  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22  * See the License for the specific language governing permissions and
23  * limitations under the License.
24  */
25 
26 
27 #ifndef FILTERING_FUNCTIONS_F16_H_
28 #define FILTERING_FUNCTIONS_F16_H_
29 
30 #include "arm_math_types_f16.h"
31 #include "arm_math_memory.h"
32 
33 #include "dsp/none.h"
34 #include "dsp/utils.h"
35 
36 
37 #ifdef   __cplusplus
38 extern "C"
39 {
40 #endif
41 
42 #if defined(ARM_FLOAT16_SUPPORTED)
43 
44  /**
45    * @brief Instance structure for the floating-point FIR filter.
46    */
47   typedef struct
48   {
49           uint16_t numTaps;     /**< number of filter coefficients in the filter. */
50           float16_t *pState;    /**< points to the state variable array. The array is of length numTaps+blockSize-1. */
51     const float16_t *pCoeffs;   /**< points to the coefficient array. The array is of length numTaps. */
52   } arm_fir_instance_f16;
53 
54   /**
55    * @brief  Initialization function for the floating-point FIR filter.
56    * @param[in,out] S          points to an instance of the floating-point FIR filter structure.
57    * @param[in]     numTaps    Number of filter coefficients in the filter.
58    * @param[in]     pCoeffs    points to the filter coefficients.
59    * @param[in]     pState     points to the state buffer.
60    * @param[in]     blockSize  number of samples that are processed at a time.
61    */
62   void arm_fir_init_f16(
63         arm_fir_instance_f16 * S,
64         uint16_t numTaps,
65   const float16_t * pCoeffs,
66         float16_t * pState,
67         uint32_t blockSize);
68 
69   /**
70    * @brief Processing function for the floating-point FIR filter.
71    * @param[in]  S          points to an instance of the floating-point FIR structure.
72    * @param[in]  pSrc       points to the block of input data.
73    * @param[out] pDst       points to the block of output data.
74    * @param[in]  blockSize  number of samples to process.
75    */
76   void arm_fir_f16(
77   const arm_fir_instance_f16 * S,
78   const float16_t * pSrc,
79         float16_t * pDst,
80         uint32_t blockSize);
81 
82 
83   /**
84    * @brief Instance structure for the floating-point Biquad cascade filter.
85    */
86   typedef struct
87   {
88           uint32_t numStages;      /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
89           float16_t *pState;       /**< Points to the array of state coefficients.  The array is of length 4*numStages. */
90     const float16_t *pCoeffs;      /**< Points to the array of coefficients.  The array is of length 5*numStages. */
91   } arm_biquad_casd_df1_inst_f16;
92 
93 #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
94   /**
95    * @brief Instance structure for the modified Biquad coefs required by vectorized code.
96    */
97   typedef struct
98   {
99       float16_t coeffs[12][8]; /**< Points to the array of modified coefficients.  The array is of length 32. There is one per stage */
100   } arm_biquad_mod_coef_f16;
101 #endif
102 
103   /**
104    * @brief Processing function for the floating-point Biquad cascade filter.
105    * @param[in]  S          points to an instance of the floating-point Biquad cascade structure.
106    * @param[in]  pSrc       points to the block of input data.
107    * @param[out] pDst       points to the block of output data.
108    * @param[in]  blockSize  number of samples to process.
109    */
110   void arm_biquad_cascade_df1_f16(
111   const arm_biquad_casd_df1_inst_f16 * S,
112   const float16_t * pSrc,
113         float16_t * pDst,
114         uint32_t blockSize);
115 
116 #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
117   void arm_biquad_cascade_df1_mve_init_f16(
118       arm_biquad_casd_df1_inst_f16 * S,
119       uint8_t numStages,
120       const float16_t * pCoeffs,
121       arm_biquad_mod_coef_f16 * pCoeffsMod,
122       float16_t * pState);
123 #endif
124 
125   void arm_biquad_cascade_df1_init_f16(
126         arm_biquad_casd_df1_inst_f16 * S,
127         uint8_t numStages,
128   const float16_t * pCoeffs,
129         float16_t * pState);
130 
131   /**
132    * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.
133    */
134   typedef struct
135   {
136           uint8_t numStages;         /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
137           float16_t *pState;         /**< points to the array of state coefficients.  The array is of length 2*numStages. */
138     const float16_t *pCoeffs;        /**< points to the array of coefficients.  The array is of length 5*numStages. */
139   } arm_biquad_cascade_df2T_instance_f16;
140 
141   /**
142    * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.
143    */
144   typedef struct
145   {
146           uint8_t numStages;         /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */
147           float16_t *pState;         /**< points to the array of state coefficients.  The array is of length 4*numStages. */
148     const float16_t *pCoeffs;        /**< points to the array of coefficients.  The array is of length 5*numStages. */
149   } arm_biquad_cascade_stereo_df2T_instance_f16;
150 
151   /**
152    * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter.
153    * @param[in]  S          points to an instance of the filter data structure.
154    * @param[in]  pSrc       points to the block of input data.
155    * @param[out] pDst       points to the block of output data
156    * @param[in]  blockSize  number of samples to process.
157    */
158   void arm_biquad_cascade_df2T_f16(
159   const arm_biquad_cascade_df2T_instance_f16 * S,
160   const float16_t * pSrc,
161         float16_t * pDst,
162         uint32_t blockSize);
163 
164   /**
165    * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels
166    * @param[in]  S          points to an instance of the filter data structure.
167    * @param[in]  pSrc       points to the block of input data.
168    * @param[out] pDst       points to the block of output data
169    * @param[in]  blockSize  number of samples to process.
170    */
171   void arm_biquad_cascade_stereo_df2T_f16(
172   const arm_biquad_cascade_stereo_df2T_instance_f16 * S,
173   const float16_t * pSrc,
174         float16_t * pDst,
175         uint32_t blockSize);
176 
177   /**
178    * @brief  Initialization function for the floating-point transposed direct form II Biquad cascade filter.
179    * @param[in,out] S          points to an instance of the filter data structure.
180    * @param[in]     numStages  number of 2nd order stages in the filter.
181    * @param[in]     pCoeffs    points to the filter coefficients.
182    * @param[in]     pState     points to the state buffer.
183    */
184   void arm_biquad_cascade_df2T_init_f16(
185         arm_biquad_cascade_df2T_instance_f16 * S,
186         uint8_t numStages,
187   const float16_t * pCoeffs,
188         float16_t * pState);
189 
190   /**
191    * @brief  Initialization function for the floating-point transposed direct form II Biquad cascade filter.
192    * @param[in,out] S          points to an instance of the filter data structure.
193    * @param[in]     numStages  number of 2nd order stages in the filter.
194    * @param[in]     pCoeffs    points to the filter coefficients.
195    * @param[in]     pState     points to the state buffer.
196    */
197   void arm_biquad_cascade_stereo_df2T_init_f16(
198         arm_biquad_cascade_stereo_df2T_instance_f16 * S,
199         uint8_t numStages,
200   const float16_t * pCoeffs,
201         float16_t * pState);
202 
203   /**
204    * @brief Correlation of floating-point sequences.
205    * @param[in]  pSrcA    points to the first input sequence.
206    * @param[in]  srcALen  length of the first input sequence.
207    * @param[in]  pSrcB    points to the second input sequence.
208    * @param[in]  srcBLen  length of the second input sequence.
209    * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.
210    */
211   void arm_correlate_f16(
212   const float16_t * pSrcA,
213         uint32_t srcALen,
214   const float16_t * pSrcB,
215         uint32_t srcBLen,
216         float16_t * pDst);
217 
218 
219 /**
220   @brief         Levinson Durbin
221   @param[in]     phi      autocovariance vector starting with lag 0 (length is nbCoefs + 1)
222   @param[out]    a        autoregressive coefficients
223   @param[out]    err      prediction error (variance)
224   @param[in]     nbCoefs  number of autoregressive coefficients
225  */
226 void arm_levinson_durbin_f16(const float16_t *phi,
227   float16_t *a,
228   float16_t *err,
229   int nbCoefs);
230 
231 #endif /*defined(ARM_FLOAT16_SUPPORTED)*/
232 #ifdef   __cplusplus
233 }
234 #endif
235 
236 #endif /* ifndef _FILTERING_FUNCTIONS_F16_H_ */
237