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