1 /* ----------------------------------------------------------------------
2  * Project:      CMSIS DSP Library
3  * Title:        arm_cfft_init_f32.c
4  * Description:  Initialization function for cfft f32 instance
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-2023 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 /**
30  * @defgroup ComplexFFTF32 Complex FFT F32
31  */
32 
33 /**
34   @ingroup groupTransforms
35  */
36 
37 /**
38   @addtogroup ComplexFFT
39   @{
40  */
41 
42 /**
43   @addtogroup ComplexFFTF32
44   @{
45  */
46 #include "dsp/transform_functions.h"
47 #include "arm_common_tables.h"
48 #include "arm_const_structs.h"
49 
50 
51 #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
52 
53 #include "arm_vec_fft.h"
54 #include "arm_mve_tables.h"
55 
56 
57 #define CFFT_RADIX4BY2_REARRANGE_TWIDDLES_F32(LEN)                                               \
58 static arm_status arm_cfft_radix4by2_rearrange_twiddles_##LEN##_f32(arm_cfft_instance_f32 *S)\
59 {                                                                                            \
60    S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_##LEN##_f32;   \
61    S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_##LEN##_f32;                 \
62                                                                                              \
63    S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_##LEN##_f32;   \
64    S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_##LEN##_f32;                 \
65                                                                                              \
66    S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_##LEN##_f32;   \
67    S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_##LEN##_f32;                 \
68    return(ARM_MATH_SUCCESS);                                                                 \
69 }
70 
71 CFFT_RADIX4BY2_REARRANGE_TWIDDLES_F32(4096);
72 CFFT_RADIX4BY2_REARRANGE_TWIDDLES_F32(1024);
73 CFFT_RADIX4BY2_REARRANGE_TWIDDLES_F32(256);
74 CFFT_RADIX4BY2_REARRANGE_TWIDDLES_F32(64);
75 CFFT_RADIX4BY2_REARRANGE_TWIDDLES_F32(16);
76 
77 
78 #define CFFTINIT_F32(LEN,LENTWIDDLE)                                               \
79 arm_status arm_cfft_init_##LEN##_f32(                                           \
80   arm_cfft_instance_f32 * S)                                                    \
81 {                                                                               \
82     /*  Initialise the default arm status */                                    \
83     arm_status status = ARM_MATH_SUCCESS;                                       \
84                                                                                 \
85     /*  Initialise the FFT length */                                            \
86     S->fftLen = LEN;                                                            \
87                                                                                 \
88     /*  Initialise the Twiddle coefficient pointer */                           \
89     S->pTwiddle = NULL;                                                         \
90                                                                                 \
91     /*  Initialise the bit reversal table modifier */                           \
92     S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_##LEN##_TABLE_LENGTH;           \
93     S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_##LEN;              \
94     S->pTwiddle = (float32_t *)twiddleCoef_##LEN;                               \
95     status=arm_cfft_radix4by2_rearrange_twiddles_##LENTWIDDLE##_f32(S);         \
96                                                                                 \
97     return (status);                                                            \
98 };
99 
100 #else
101 
102 #define FFTINIT(EXT,SIZE)                                           \
103   S->bitRevLength = arm_cfft_sR_##EXT##_len##SIZE.bitRevLength;        \
104   S->pBitRevTable = arm_cfft_sR_##EXT##_len##SIZE.pBitRevTable;         \
105   S->pTwiddle = arm_cfft_sR_##EXT##_len##SIZE.pTwiddle;
106 
107 #define CFFTINIT_F32(LEN,LENTWIDDLE)                                          \
108 arm_status arm_cfft_init_##LEN##_f32(arm_cfft_instance_f32 * S)\
109 {                                                              \
110     /*  Initialise the default arm status */                   \
111         arm_status status = ARM_MATH_SUCCESS;                  \
112                                                                \
113         /*  Initialise the FFT length */                       \
114         S->fftLen = LEN;                                       \
115                                                                \
116         /*  Initialise the Twiddle coefficient pointer */      \
117         S->pTwiddle = NULL;                                    \
118                                                                \
119         FFTINIT(f32,LEN);                                      \
120                                                                \
121         return (status);                                       \
122 };
123 
124 #endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
125 
126 /**
127   @brief         Initialization function for the cfft f32 function with 4096 samples
128   @param[in,out] S              points to an instance of the floating-point CFFT structure
129   @return        execution status
130                    - \ref ARM_MATH_SUCCESS        : Operation successful
131                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
132 
133   @par          Use of this function is mandatory only for the MVE version of the FFT.
134                 Other versions can still initialize directly the data structure using
135                 variables declared in arm_const_structs.h
136  */
137 CFFTINIT_F32(4096,4096);
138 
139 
140 /**
141   @brief         Initialization function for the cfft f32 function with 2048 samples
142   @param[in,out] S              points to an instance of the floating-point CFFT structure
143   @return        execution status
144                    - \ref ARM_MATH_SUCCESS        : Operation successful
145                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
146 
147   @par          Use of this function is mandatory only for the MVE version of the FFT.
148                 Other versions can still initialize directly the data structure using
149                 variables declared in arm_const_structs.h
150  */
151 CFFTINIT_F32(2048,1024);
152 
153 
154 /**
155   @brief         Initialization function for the cfft f32 function with 1024 samples
156   @param[in,out] S              points to an instance of the floating-point CFFT structure
157   @return        execution status
158                    - \ref ARM_MATH_SUCCESS        : Operation successful
159                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
160 
161   @par          Use of this function is mandatory only for the MVE version of the FFT.
162                 Other versions can still initialize directly the data structure using
163                 variables declared in arm_const_structs.h
164  */
165 CFFTINIT_F32(1024,1024);
166 
167 
168 /**
169   @brief         Initialization function for the cfft f32 function with 512 samples
170   @param[in,out] S              points to an instance of the floating-point CFFT structure
171   @return        execution status
172                    - \ref ARM_MATH_SUCCESS        : Operation successful
173                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
174 
175   @par          Use of this function is mandatory only for the MVE version of the FFT.
176                 Other versions can still initialize directly the data structure using
177                 variables declared in arm_const_structs.h
178  */
179 CFFTINIT_F32(512,256);
180 
181 
182 /**
183   @brief         Initialization function for the cfft f32 function with 256 samples
184   @param[in,out] S              points to an instance of the floating-point CFFT structure
185   @return        execution status
186                    - \ref ARM_MATH_SUCCESS        : Operation successful
187                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
188 
189   @par          Use of this function is mandatory only for the MVE version of the FFT.
190                 Other versions can still initialize directly the data structure using
191                 variables declared in arm_const_structs.h
192  */
193 CFFTINIT_F32(256,256);
194 
195 
196 /**
197   @brief         Initialization function for the cfft f32 function with 128 samples
198   @param[in,out] S              points to an instance of the floating-point CFFT structure
199   @return        execution status
200                    - \ref ARM_MATH_SUCCESS        : Operation successful
201                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
202 
203   @par          Use of this function is mandatory only for the MVE version of the FFT.
204                 Other versions can still initialize directly the data structure using
205                 variables declared in arm_const_structs.h
206  */
207 CFFTINIT_F32(128,64);
208 
209 
210 /**
211   @brief         Initialization function for the cfft f32 function with 64 samples
212   @param[in,out] S              points to an instance of the floating-point CFFT structure
213   @return        execution status
214                    - \ref ARM_MATH_SUCCESS        : Operation successful
215                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
216 
217   @par          Use of this function is mandatory only for the MVE version of the FFT.
218                 Other versions can still initialize directly the data structure using
219                 variables declared in arm_const_structs.h
220  */
221 CFFTINIT_F32(64,64);
222 
223 
224 /**
225   @brief         Initialization function for the cfft f32 function with 32 samples
226   @param[in,out] S              points to an instance of the floating-point CFFT structure
227   @return        execution status
228                    - \ref ARM_MATH_SUCCESS        : Operation successful
229                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
230 
231   @par          Use of this function is mandatory only for the MVE version of the FFT.
232                 Other versions can still initialize directly the data structure using
233                 variables declared in arm_const_structs.h
234  */
235 CFFTINIT_F32(32,16);
236 
237 
238 /**
239   @brief         Initialization function for the cfft f32 function with 16 samples
240   @param[in,out] S              points to an instance of the floating-point CFFT structure
241   @return        execution status
242                    - \ref ARM_MATH_SUCCESS        : Operation successful
243                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
244 
245   @par          Use of this function is mandatory only for the MVE version of the FFT.
246                 Other versions can still initialize directly the data structure using
247                 variables declared in arm_const_structs.h
248  */
249 CFFTINIT_F32(16,16);
250 
251 
252 /**
253   @brief         Generic initialization function for the cfft f32 function
254   @param[in,out] S              points to an instance of the floating-point CFFT structure
255   @param[in]     fftLen         fft length (number of complex samples)
256   @return        execution status
257                    - \ref ARM_MATH_SUCCESS        : Operation successful
258                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
259 
260   @par          Use of this function is mandatory only for the MVE version of the FFT.
261                 Other versions can still initialize directly the data structure using
262                 variables declared in arm_const_structs.h
263 
264   @par
265                 This function should be used only if you don't know the FFT sizes that
266                 you'll need at build time. The use of this function will prevent the
267                 linker from removing the FFT tables that are not needed and the library
268                 code size will be bigger than needed.
269 
270   @par
271                 If you use CMSIS-DSP as a static library, and if you know the FFT sizes
272                 that you need at build time, then it is better to use the initialization
273                 functions defined for each FFT size.
274  */
arm_cfft_init_f32(arm_cfft_instance_f32 * S,uint16_t fftLen)275 arm_status arm_cfft_init_f32(
276   arm_cfft_instance_f32 * S,
277   uint16_t fftLen)
278 {
279 
280         /*  Initialise the default arm status */
281         arm_status status = ARM_MATH_SUCCESS;
282 
283         /*  Initializations of Instance structure depending on the FFT length */
284         switch (fftLen) {
285             /*  Initializations of structure parameters for 4096 point FFT */
286         case 4096U:
287             /*  Initialise the bit reversal table modifier */
288             status=arm_cfft_init_4096_f32(S);
289             break;
290 
291             /*  Initializations of structure parameters for 2048 point FFT */
292         case 2048U:
293             /*  Initialise the bit reversal table modifier */
294             status=arm_cfft_init_2048_f32(S);
295             break;
296 
297             /*  Initializations of structure parameters for 1024 point FFT */
298         case 1024U:
299             /*  Initialise the bit reversal table modifier */
300             status=arm_cfft_init_1024_f32(S);
301             break;
302 
303             /*  Initializations of structure parameters for 512 point FFT */
304         case 512U:
305             /*  Initialise the bit reversal table modifier */
306             status=arm_cfft_init_512_f32(S);
307             break;
308 
309         case 256U:
310             status=arm_cfft_init_256_f32(S);
311             break;
312 
313         case 128U:
314             status=arm_cfft_init_128_f32(S);
315             break;
316 
317         case 64U:
318             status=arm_cfft_init_64_f32(S);
319             break;
320 
321         case 32U:
322             status=arm_cfft_init_32_f32(S);
323             break;
324 
325         case 16U:
326             /*  Initializations of structure parameters for 16 point FFT */
327             status=arm_cfft_init_16_f32(S);
328             break;
329 
330         default:
331             /*  Reporting argument error if fftSize is not valid value */
332             status = ARM_MATH_ARGUMENT_ERROR;
333             break;
334         }
335 
336 
337         return (status);
338 }
339 
340 /**
341   @} end of ComplexFFTF32 group
342  */
343 
344 /**
345   @} end of ComplexFFT group
346  */
347