/ Drivers / CMSIS / DSP / Source / TransformFunctions / arm_cfft_init_f32.c
arm_cfft_init_f32.c
  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  
 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  
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
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   */