1 /******************************************************************************
2  * @file     transform_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 TRANSFORM_FUNCTIONS_F16_H_
28 #define TRANSFORM_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 #ifdef   __cplusplus
37 extern "C"
38 {
39 #endif
40 
41 
42 
43 #if defined(ARM_FLOAT16_SUPPORTED)
44 
45 
46   /**
47    * @brief Instance structure for the floating-point CFFT/CIFFT function.
48    */
49   typedef struct
50   {
51           uint16_t fftLen;                   /**< length of the FFT. */
52           uint8_t ifftFlag;                  /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
53           uint8_t bitReverseFlag;            /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
54     const float16_t *pTwiddle;               /**< points to the Twiddle factor table. */
55     const uint16_t *pBitRevTable;            /**< points to the bit reversal table. */
56           uint16_t twidCoefModifier;         /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
57           uint16_t bitRevFactor;             /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
58           float16_t onebyfftLen;             /**< value of 1/fftLen. */
59   } arm_cfft_radix2_instance_f16;
60 
61   /**
62    * @brief Instance structure for the floating-point CFFT/CIFFT function.
63    */
64   typedef struct
65   {
66           uint16_t fftLen;                   /**< length of the FFT. */
67           uint8_t ifftFlag;                  /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
68           uint8_t bitReverseFlag;            /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
69     const float16_t *pTwiddle;               /**< points to the Twiddle factor table. */
70     const uint16_t *pBitRevTable;            /**< points to the bit reversal table. */
71           uint16_t twidCoefModifier;         /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
72           uint16_t bitRevFactor;             /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
73           float16_t onebyfftLen;             /**< value of 1/fftLen. */
74   } arm_cfft_radix4_instance_f16;
75 
76   /**
77    * @brief Instance structure for the floating-point CFFT/CIFFT function.
78    */
79   typedef struct
80   {
81           uint16_t fftLen;                   /**< length of the FFT. */
82     const float16_t *pTwiddle;         /**< points to the Twiddle factor table. */
83     const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */
84           uint16_t bitRevLength;             /**< bit reversal table length. */
85 #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
86    const uint32_t *rearranged_twiddle_tab_stride1_arr;        /**< Per stage reordered twiddle pointer (offset 1) */                                                       \
87    const uint32_t *rearranged_twiddle_tab_stride2_arr;        /**< Per stage reordered twiddle pointer (offset 2) */                                                       \
88    const uint32_t *rearranged_twiddle_tab_stride3_arr;        /**< Per stage reordered twiddle pointer (offset 3) */                                                       \
89    const float16_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */                                                                   \
90    const float16_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */                                                                   \
91    const float16_t *rearranged_twiddle_stride3;
92 #endif
93   } arm_cfft_instance_f16;
94 
95 
96 arm_status arm_cfft_init_4096_f16(arm_cfft_instance_f16 * S);
97 arm_status arm_cfft_init_2048_f16(arm_cfft_instance_f16 * S);
98 arm_status arm_cfft_init_1024_f16(arm_cfft_instance_f16 * S);
99 arm_status arm_cfft_init_512_f16(arm_cfft_instance_f16 * S);
100 arm_status arm_cfft_init_256_f16(arm_cfft_instance_f16 * S);
101 arm_status arm_cfft_init_128_f16(arm_cfft_instance_f16 * S);
102 arm_status arm_cfft_init_64_f16(arm_cfft_instance_f16 * S);
103 arm_status arm_cfft_init_32_f16(arm_cfft_instance_f16 * S);
104 arm_status arm_cfft_init_16_f16(arm_cfft_instance_f16 * S);
105 
106 
107   arm_status arm_cfft_init_f16(
108   arm_cfft_instance_f16 * S,
109   uint16_t fftLen);
110 
111   void arm_cfft_f16(
112   const arm_cfft_instance_f16 * S,
113         float16_t * p1,
114         uint8_t ifftFlag,
115         uint8_t bitReverseFlag);
116 
117   /**
118    * @brief Instance structure for the floating-point RFFT/RIFFT function.
119    */
120 typedef struct
121   {
122           arm_cfft_instance_f16 Sint;      /**< Internal CFFT structure. */
123           uint16_t fftLenRFFT;             /**< length of the real sequence */
124     const float16_t * pTwiddleRFFT;        /**< Twiddle factors real stage  */
125   } arm_rfft_fast_instance_f16 ;
126 
127 arm_status arm_rfft_fast_init_32_f16( arm_rfft_fast_instance_f16 * S );
128 arm_status arm_rfft_fast_init_64_f16( arm_rfft_fast_instance_f16 * S );
129 arm_status arm_rfft_fast_init_128_f16( arm_rfft_fast_instance_f16 * S );
130 arm_status arm_rfft_fast_init_256_f16( arm_rfft_fast_instance_f16 * S );
131 arm_status arm_rfft_fast_init_512_f16( arm_rfft_fast_instance_f16 * S );
132 arm_status arm_rfft_fast_init_1024_f16( arm_rfft_fast_instance_f16 * S );
133 arm_status arm_rfft_fast_init_2048_f16( arm_rfft_fast_instance_f16 * S );
134 arm_status arm_rfft_fast_init_4096_f16( arm_rfft_fast_instance_f16 * S );
135 
136 arm_status arm_rfft_fast_init_f16 (
137          arm_rfft_fast_instance_f16 * S,
138          uint16_t fftLen);
139 
140 
141   void arm_rfft_fast_f16(
142         const arm_rfft_fast_instance_f16 * S,
143         float16_t * p, float16_t * pOut,
144         uint8_t ifftFlag);
145 
146 /* Deprecated */
147   arm_status arm_cfft_radix4_init_f16(
148         arm_cfft_radix4_instance_f16 * S,
149         uint16_t fftLen,
150         uint8_t ifftFlag,
151         uint8_t bitReverseFlag);
152 
153 /* Deprecated */
154   void arm_cfft_radix4_f16(
155   const arm_cfft_radix4_instance_f16 * S,
156         float16_t * pSrc);
157 
158 
159 /* Deprecated */
160   arm_status arm_cfft_radix2_init_f16(
161         arm_cfft_radix2_instance_f16 * S,
162         uint16_t fftLen,
163         uint8_t ifftFlag,
164         uint8_t bitReverseFlag);
165 
166 /* Deprecated */
167   void arm_cfft_radix2_f16(
168   const arm_cfft_radix2_instance_f16 * S,
169         float16_t * pSrc);
170 
171   /**
172    * @brief Instance structure for the Floating-point MFCC function.
173    */
174 typedef struct
175   {
176      const float16_t *dctCoefs; /**< Internal DCT coefficients */
177      const float16_t *filterCoefs; /**< Internal Mel filter coefficients */
178      const float16_t *windowCoefs; /**< Windowing coefficients */
179      const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */
180      const uint32_t *filterLengths; /**< Internal Mel filter  lengths */
181      uint32_t fftLen; /**< FFT length */
182      uint32_t nbMelFilters; /**< Number of Mel filters */
183      uint32_t nbDctOutputs; /**< Number of DCT outputs */
184 #if defined(ARM_MFCC_CFFT_BASED)
185      /* Implementation of the MFCC is using a CFFT */
186      arm_cfft_instance_f16 cfft; /**< Internal CFFT instance */
187 #else
188      /* Implementation of the MFCC is using a RFFT (default) */
189      arm_rfft_fast_instance_f16 rfft;
190 #endif
191   } arm_mfcc_instance_f16 ;
192 
193 arm_status arm_mfcc_init_32_f16(
194   arm_mfcc_instance_f16 * S,
195   uint32_t nbMelFilters,
196   uint32_t nbDctOutputs,
197   const float16_t *dctCoefs,
198   const uint32_t *filterPos,
199   const uint32_t *filterLengths,
200   const float16_t *filterCoefs,
201   const float16_t *windowCoefs
202   );
203 
204 arm_status arm_mfcc_init_64_f16(
205   arm_mfcc_instance_f16 * S,
206   uint32_t nbMelFilters,
207   uint32_t nbDctOutputs,
208   const float16_t *dctCoefs,
209   const uint32_t *filterPos,
210   const uint32_t *filterLengths,
211   const float16_t *filterCoefs,
212   const float16_t *windowCoefs
213   );
214 
215 arm_status arm_mfcc_init_128_f16(
216   arm_mfcc_instance_f16 * S,
217   uint32_t nbMelFilters,
218   uint32_t nbDctOutputs,
219   const float16_t *dctCoefs,
220   const uint32_t *filterPos,
221   const uint32_t *filterLengths,
222   const float16_t *filterCoefs,
223   const float16_t *windowCoefs
224   );
225 
226 arm_status arm_mfcc_init_256_f16(
227   arm_mfcc_instance_f16 * S,
228   uint32_t nbMelFilters,
229   uint32_t nbDctOutputs,
230   const float16_t *dctCoefs,
231   const uint32_t *filterPos,
232   const uint32_t *filterLengths,
233   const float16_t *filterCoefs,
234   const float16_t *windowCoefs
235   );
236 
237 arm_status arm_mfcc_init_512_f16(
238   arm_mfcc_instance_f16 * S,
239   uint32_t nbMelFilters,
240   uint32_t nbDctOutputs,
241   const float16_t *dctCoefs,
242   const uint32_t *filterPos,
243   const uint32_t *filterLengths,
244   const float16_t *filterCoefs,
245   const float16_t *windowCoefs
246   );
247 
248 arm_status arm_mfcc_init_1024_f16(
249   arm_mfcc_instance_f16 * S,
250   uint32_t nbMelFilters,
251   uint32_t nbDctOutputs,
252   const float16_t *dctCoefs,
253   const uint32_t *filterPos,
254   const uint32_t *filterLengths,
255   const float16_t *filterCoefs,
256   const float16_t *windowCoefs
257   );
258 
259 arm_status arm_mfcc_init_2048_f16(
260   arm_mfcc_instance_f16 * S,
261   uint32_t nbMelFilters,
262   uint32_t nbDctOutputs,
263   const float16_t *dctCoefs,
264   const uint32_t *filterPos,
265   const uint32_t *filterLengths,
266   const float16_t *filterCoefs,
267   const float16_t *windowCoefs
268   );
269 
270 arm_status arm_mfcc_init_4096_f16(
271   arm_mfcc_instance_f16 * S,
272   uint32_t nbMelFilters,
273   uint32_t nbDctOutputs,
274   const float16_t *dctCoefs,
275   const uint32_t *filterPos,
276   const uint32_t *filterLengths,
277   const float16_t *filterCoefs,
278   const float16_t *windowCoefs
279   );
280 
281 arm_status arm_mfcc_init_f16(
282   arm_mfcc_instance_f16 * S,
283   uint32_t fftLen,
284   uint32_t nbMelFilters,
285   uint32_t nbDctOutputs,
286   const float16_t *dctCoefs,
287   const uint32_t *filterPos,
288   const uint32_t *filterLengths,
289   const float16_t *filterCoefs,
290   const float16_t *windowCoefs
291   );
292 
293 
294 
295 /**
296   @brief         MFCC F16
297   @param[in]    S       points to the mfcc instance structure
298   @param[in]     pSrc points to the input samples
299   @param[out]     pDst  points to the output MFCC values
300   @param[inout]     pTmp  points to a temporary buffer of complex
301  */
302   void arm_mfcc_f16(
303   const arm_mfcc_instance_f16 * S,
304   float16_t *pSrc,
305   float16_t *pDst,
306   float16_t *pTmp
307   );
308 
309 
310 #endif /* defined(ARM_FLOAT16_SUPPORTED)*/
311 
312 #ifdef   __cplusplus
313 }
314 #endif
315 
316 #endif /* ifndef _TRANSFORM_FUNCTIONS_F16_H_ */
317