• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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-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 #define FFTINIT(EXT,SIZE)                                           \
30   S->bitRevLength = arm_cfft_sR_##EXT##_len##SIZE.bitRevLength;        \
31   S->pBitRevTable = arm_cfft_sR_##EXT##_len##SIZE.pBitRevTable;         \
32   S->pTwiddle = arm_cfft_sR_##EXT##_len##SIZE.pTwiddle;
33 
34 /**
35   @addtogroup ComplexFFT
36   @{
37  */
38 
39 /**
40   @brief         Initialization function for the cfft f32 function
41   @param[in,out] S              points to an instance of the floating-point CFFT structure
42   @param[in]     fftLen         fft length (number of complex samples)
43   @return        execution status
44                    - \ref ARM_MATH_SUCCESS        : Operation successful
45                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
46 
47   @par          Use of this function is mandatory only for the MVE version of the FFT.
48                 Other versions can still initialize directly the data structure using
49                 variables declared in arm_const_structs.h
50  */
51 
52 #include "dsp/transform_functions.h"
53 #include "arm_common_tables.h"
54 #include "arm_const_structs.h"
55 
56 #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
57 
58 #include "arm_vec_fft.h"
59 #include "arm_mve_tables.h"
60 
arm_cfft_radix4by2_rearrange_twiddles_f32(arm_cfft_instance_f32 * S,int twidCoefModifier)61 arm_status arm_cfft_radix4by2_rearrange_twiddles_f32(arm_cfft_instance_f32 *S, int twidCoefModifier)
62 {
63 
64         switch (S->fftLen >> (twidCoefModifier - 1)) {
65 
66 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
67             || defined(ARM_TABLE_TWIDDLECOEF_F32_4096)
68         case 4096U:
69             S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_4096_f32;
70             S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_4096_f32;
71 
72             S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_4096_f32;
73             S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_4096_f32;
74 
75             S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_4096_f32;
76             S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_4096_f32;
77             break;
78 #endif
79 
80 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
81             || defined(ARM_TABLE_TWIDDLECOEF_F32_1024) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048)
82         case 1024U:
83             S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_1024_f32;
84             S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_1024_f32;
85 
86             S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_1024_f32;
87             S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_1024_f32;
88 
89             S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_1024_f32;
90             S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_1024_f32;
91             break;
92  #endif
93 
94  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
95             || defined(ARM_TABLE_TWIDDLECOEF_F32_256) || defined(ARM_TABLE_TWIDDLECOEF_F32_512)
96         case 256U:
97             S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_256_f32;
98             S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_256_f32;
99 
100             S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_256_f32;
101             S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_256_f32;
102 
103             S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_256_f32;
104             S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_256_f32;
105 
106             break;
107 #endif
108 
109 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
110             || defined(ARM_TABLE_TWIDDLECOEF_F32_64) || defined(ARM_TABLE_TWIDDLECOEF_F32_128)
111         case 64U:
112             S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_64_f32;
113             S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_64_f32;
114 
115             S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_64_f32;
116             S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_64_f32;
117 
118             S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_64_f32;
119             S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_64_f32;
120             break;
121 #endif
122 
123 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
124             || defined(ARM_TABLE_TWIDDLECOEF_F32_16) || defined(ARM_TABLE_TWIDDLECOEF_F32_32)
125         case 16U:
126             S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_16_f32;
127             S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_16_f32;
128 
129             S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_16_f32;
130             S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_16_f32;
131 
132             S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_16_f32;
133             S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_16_f32;
134             break;
135 #endif
136 
137         default:
138             return(ARM_MATH_ARGUMENT_ERROR);
139             break;
140             /* invalid sizes already filtered */
141         }
142 
143         return(ARM_MATH_SUCCESS);
144 
145 }
146 
arm_cfft_init_f32(arm_cfft_instance_f32 * S,uint16_t fftLen)147 arm_status arm_cfft_init_f32(
148   arm_cfft_instance_f32 * S,
149   uint16_t fftLen)
150 {
151 
152         /*  Initialise the default arm status */
153         arm_status status = ARM_MATH_SUCCESS;
154 
155         /*  Initialise the FFT length */
156         S->fftLen = fftLen;
157 
158         /*  Initialise the Twiddle coefficient pointer */
159         S->pTwiddle = NULL;
160 
161 
162         /*  Initializations of Instance structure depending on the FFT length */
163         switch (S->fftLen) {
164             /*  Initializations of structure parameters for 4096 point FFT */
165 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_4096) && defined(ARM_TABLE_TWIDDLECOEF_F32_4096))
166         case 4096U:
167             /*  Initialise the bit reversal table modifier */
168             S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH;
169             S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_4096;
170             S->pTwiddle = (float32_t *)twiddleCoef_4096;
171             status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
172             break;
173 #endif
174 
175 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_2048) && defined(ARM_TABLE_TWIDDLECOEF_F32_2048))
176             /*  Initializations of structure parameters for 2048 point FFT */
177         case 2048U:
178             /*  Initialise the bit reversal table modifier */
179             S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH;
180             S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_2048;
181             S->pTwiddle = (float32_t *)twiddleCoef_2048;
182             status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
183             break;
184 #endif
185 
186 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_1024) && defined(ARM_TABLE_TWIDDLECOEF_F32_1024))
187             /*  Initializations of structure parameters for 1024 point FFT */
188         case 1024U:
189             /*  Initialise the bit reversal table modifier */
190             S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH;
191             S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_1024;
192             S->pTwiddle = (float32_t *)twiddleCoef_1024;
193             status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
194             break;
195 #endif
196 
197 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_512) && defined(ARM_TABLE_TWIDDLECOEF_F32_512))
198             /*  Initializations of structure parameters for 512 point FFT */
199         case 512U:
200             /*  Initialise the bit reversal table modifier */
201             S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH;
202             S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_512;
203             S->pTwiddle = (float32_t *)twiddleCoef_512;
204             status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
205             break;
206 #endif
207 
208 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_256) && defined(ARM_TABLE_TWIDDLECOEF_F32_256))
209         case 256U:
210             S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH;
211             S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_256;
212             S->pTwiddle = (float32_t *)twiddleCoef_256;
213             status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
214             break;
215 #endif
216 
217 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_128) && defined(ARM_TABLE_TWIDDLECOEF_F32_128))
218         case 128U:
219             S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH;
220             S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_128;
221             S->pTwiddle = (float32_t *)twiddleCoef_128;
222             status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
223             break;
224 #endif
225 
226 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_64) && defined(ARM_TABLE_TWIDDLECOEF_F32_64))
227         case 64U:
228             S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH;
229             S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_64;
230             S->pTwiddle = (float32_t *)twiddleCoef_64;
231             status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
232             break;
233 #endif
234 
235 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_32) && defined(ARM_TABLE_TWIDDLECOEF_F32_32))
236         case 32U:
237             S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH;
238             S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_32;
239             S->pTwiddle = (float32_t *)twiddleCoef_32;
240             status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 2);
241             break;
242 #endif
243 
244 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_16) && defined(ARM_TABLE_TWIDDLECOEF_F32_16))
245         case 16U:
246             /*  Initializations of structure parameters for 16 point FFT */
247             S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH;
248             S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_16;
249             S->pTwiddle = (float32_t *)twiddleCoef_16;
250             status=arm_cfft_radix4by2_rearrange_twiddles_f32(S, 1);
251             break;
252 #endif
253 
254         default:
255             /*  Reporting argument error if fftSize is not valid value */
256             status = ARM_MATH_ARGUMENT_ERROR;
257             break;
258         }
259 
260 
261         return (status);
262 }
263 #else
arm_cfft_init_f32(arm_cfft_instance_f32 * S,uint16_t fftLen)264 arm_status arm_cfft_init_f32(
265   arm_cfft_instance_f32 * S,
266   uint16_t fftLen)
267 {
268         /*  Initialise the default arm status */
269         arm_status status = ARM_MATH_SUCCESS;
270 
271         /*  Initialise the FFT length */
272         S->fftLen = fftLen;
273 
274         /*  Initialise the Twiddle coefficient pointer */
275         S->pTwiddle = NULL;
276 
277 
278         /*  Initializations of Instance structure depending on the FFT length */
279         switch (S->fftLen) {
280 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_4096) && defined(ARM_TABLE_BITREVIDX_FLT_4096))
281             /*  Initializations of structure parameters for 4096 point FFT */
282         case 4096U:
283             /*  Initialise the bit reversal table modifier */
284             FFTINIT(f32,4096);
285             break;
286 #endif
287 
288 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048))
289             /*  Initializations of structure parameters for 2048 point FFT */
290         case 2048U:
291             /*  Initialise the bit reversal table modifier */
292             FFTINIT(f32,2048);
293 
294             break;
295 #endif
296 
297 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024))
298             /*  Initializations of structure parameters for 1024 point FFT */
299         case 1024U:
300             /*  Initialise the bit reversal table modifier */
301             FFTINIT(f32,1024);
302 
303             break;
304 #endif
305 
306 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_512) && defined(ARM_TABLE_BITREVIDX_FLT_512))
307             /*  Initializations of structure parameters for 512 point FFT */
308         case 512U:
309             /*  Initialise the bit reversal table modifier */
310             FFTINIT(f32,512);
311             break;
312 #endif
313 
314 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_256) && defined(ARM_TABLE_BITREVIDX_FLT_256))
315         case 256U:
316             FFTINIT(f32,256);
317             break;
318 #endif
319 
320 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_128) && defined(ARM_TABLE_BITREVIDX_FLT_128))
321         case 128U:
322             FFTINIT(f32,128);
323             break;
324 #endif
325 
326 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_64) && defined(ARM_TABLE_BITREVIDX_FLT_64))
327         case 64U:
328             FFTINIT(f32,64);
329             break;
330 #endif
331 
332 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_32) && defined(ARM_TABLE_BITREVIDX_FLT_32))
333         case 32U:
334             FFTINIT(f32,32);
335             break;
336 #endif
337 
338 #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F32_16) && defined(ARM_TABLE_BITREVIDX_FLT_16))
339         case 16U:
340             /*  Initializations of structure parameters for 16 point FFT */
341             FFTINIT(f32,16);
342             break;
343 #endif
344 
345         default:
346             /*  Reporting argument error if fftSize is not valid value */
347             status = ARM_MATH_ARGUMENT_ERROR;
348             break;
349         }
350 
351 
352         return (status);
353 }
354 #endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
355 
356 /**
357   @} end of ComplexFFT group
358  */
359