/ Drivers / CMSIS / DSP / Source / TransformFunctions / arm_cfft_init_q31.c
arm_cfft_init_q31.c
  1  /* ----------------------------------------------------------------------
  2   * Project:      CMSIS DSP Library
  3   * Title:        arm_cfft_init_q31.c
  4   * Description:  Initialization function for cfft q31 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 q31 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_MVEI)  && !defined(ARM_MATH_AUTOVECTORIZE)
 57  
 58  #include "arm_vec_fft.h"
 59  #include "arm_mve_tables.h"
 60  
 61  
 62  arm_status arm_cfft_radix4by2_rearrange_twiddles_q31(arm_cfft_instance_q31 *S, int twidCoefModifier)
 63  {
 64                                                                    
 65          switch (S->fftLen >> (twidCoefModifier - 1)) {  
 66  
 67  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_4096) && defined(ARM_TABLE_TWIDDLECOEF_Q31_4096))
 68          case 4096U:                                                                                
 69              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_4096_q31;
 70              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_4096_q31;     
 71  
 72              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_4096_q31;
 73              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_4096_q31;    
 74  
 75              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_4096_q31;
 76              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_4096_q31;                                                     
 77              break; 
 78  #endif                                  
 79  
 80  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_1024) && defined(ARM_TABLE_TWIDDLECOEF_Q31_1024)) || (defined(ARM_TABLE_BITREVIDX_FXT_2048) && defined(ARM_TABLE_TWIDDLECOEF_Q31_2048))                                                                                                   
 81          case 1024U:                                                                                
 82              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_1024_q31;
 83              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_1024_q31;     
 84  
 85              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_1024_q31;
 86              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_1024_q31;    
 87  
 88              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_1024_q31;
 89              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_1024_q31;                                                                          
 90              break;                                                                                 
 91   #endif 
 92  
 93   #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_256) && defined(ARM_TABLE_TWIDDLECOEF_Q31_256)) || (defined(ARM_TABLE_BITREVIDX_FXT_512) && defined(ARM_TABLE_TWIDDLECOEF_Q31_512))                                                                                                  
 94          case 256U:                                                                                 
 95              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_256_q31;
 96              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_256_q31;     
 97  
 98              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_256_q31;
 99              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_256_q31;    
100  
101              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_256_q31;
102              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_256_q31;    
103  
104              break;                     
105  #endif 
106  
107  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_64) && defined(ARM_TABLE_TWIDDLECOEF_Q31_64)) || (defined(ARM_TABLE_BITREVIDX_FXT_128) && defined(ARM_TABLE_TWIDDLECOEF_Q31_128))
108          case 64U:                                                                                  
109              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_64_q31;
110              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_64_q31;     
111  
112              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_64_q31;
113              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_64_q31;    
114  
115              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_64_q31;
116              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_64_q31;                                                                         
117              break;  
118  #endif                                                                               
119                
120  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_16) && defined(ARM_TABLE_TWIDDLECOEF_Q31_16)) || (defined(ARM_TABLE_BITREVIDX_FXT_32) && defined(ARM_TABLE_TWIDDLECOEF_Q31_32))                                                                                                                                                                                                                
121          case 16U:                                                                                  
122              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_16_q31;
123              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_16_q31;     
124  
125              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_16_q31;
126              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_16_q31;    
127  
128              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_16_q31;
129              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_16_q31;                                                                       
130              break;  
131  #endif                                                                               
132                                                                                                     
133          default:  
134              return(ARM_MATH_ARGUMENT_ERROR);                                                                                 
135              break;                                                                                 
136              /* invalid sizes already filtered */                                                   
137          }                                                                                          
138  
139          return(ARM_MATH_SUCCESS);
140  
141  }
142  
143  
144  
145  arm_status arm_cfft_init_q31(
146    arm_cfft_instance_q31 * S,
147    uint16_t fftLen)
148  {
149  
150          /*  Initialise the default arm status */                                
151          arm_status status = ARM_MATH_SUCCESS;                                   
152                                                                                  
153          /*  Initialise the FFT length */                                        
154          S->fftLen = fftLen;                                                     
155                                                                                  
156          /*  Initialise the Twiddle coefficient pointer */                       
157          S->pTwiddle = NULL;                         
158                                                                                  
159                                                                                  
160          /*  Initializations of Instance structure depending on the FFT length */
161          switch (S->fftLen) {                                                    
162              /*  Initializations of structure parameters for 4096 point FFT */   
163  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_4096) && defined(ARM_TABLE_TWIDDLECOEF_Q31_4096))                                                           
164          case 4096U:  
165              /*  Initialise the bit reversal table modifier */                   
166              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH;      
167              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_4096;   
168              S->pTwiddle = (q31_t *)twiddleCoef_4096_q31;       
169              status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);               
170              break;                                                              
171  #endif 
172  
173  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_2048) && defined(ARM_TABLE_TWIDDLECOEF_Q31_2048))                                                                                                        
174              /*  Initializations of structure parameters for 2048 point FFT */   
175          case 2048U:                                                             
176              /*  Initialise the bit reversal table modifier */                   
177              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH;      
178              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_2048;
179              S->pTwiddle = (q31_t *)twiddleCoef_2048_q31;          
180              status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 2);           
181              break;     
182  #endif 
183  
184  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_1024) && defined(ARM_TABLE_TWIDDLECOEF_Q31_1024))                                                                                                                  
185              /*  Initializations of structure parameters for 1024 point FFT */   
186          case 1024U:                                                             
187              /*  Initialise the bit reversal table modifier */                   
188              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH;      
189              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_1024; 
190              S->pTwiddle = (q31_t *)twiddleCoef_1024_q31;         
191              status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);           
192              break;                                                              
193  #endif 
194  
195  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_512) && defined(ARM_TABLE_TWIDDLECOEF_Q31_512))                                                           
196              /*  Initializations of structure parameters for 512 point FFT */    
197          case 512U:                                                              
198              /*  Initialise the bit reversal table modifier */                   
199              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH;       
200              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_512;  
201              S->pTwiddle = (q31_t *)twiddleCoef_512_q31;         
202              status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 2);           
203              break;                                                              
204  #endif 
205  
206  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_256) && defined(ARM_TABLE_TWIDDLECOEF_Q31_256))                                                           
207          case 256U:                                                              
208              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH;       
209              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_256; 
210              S->pTwiddle = (q31_t *)twiddleCoef_256_q31;          
211              status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);           
212              break;  
213  #endif                                                            
214                   
215  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_128) && defined(ARM_TABLE_TWIDDLECOEF_Q31_128))                                                                                                                          
216          case 128U:                                                              
217              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH;       
218              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_128; 
219              S->pTwiddle = (q31_t *)twiddleCoef_128_q31;          
220              status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 2);           
221              break;                                                              
222  #endif 
223  
224  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_64) && defined(ARM_TABLE_TWIDDLECOEF_Q31_64))                                                                                                                      
225          case 64U:                                                               
226              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH;        
227              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_64;  
228              S->pTwiddle = (q31_t *)twiddleCoef_64_q31;          
229              status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);           
230              break;                                                              
231  #endif 
232  
233  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_32) && defined(ARM_TABLE_TWIDDLECOEF_Q31_32))                                                                                                                           
234          case 32U:                                                               
235              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH;        
236              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_32;  
237              S->pTwiddle = (q31_t *)twiddleCoef_32_q31;          
238              status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 2);           
239              break;                                                              
240  #endif
241  
242  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_16) && defined(ARM_TABLE_TWIDDLECOEF_Q31_16))                                                                                                                                
243          case 16U:                                                               
244              /*  Initializations of structure parameters for 16 point FFT */     
245              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH;        
246              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_16; 
247              S->pTwiddle = (q31_t *)twiddleCoef_16_q31;           
248              status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);           
249              break;                                                              
250  #endif                                                                             
251                                                                           
252          default:                                                                
253              /*  Reporting argument error if fftSize is not valid value */       
254              status = ARM_MATH_ARGUMENT_ERROR;                                   
255              break;                                                              
256          }                                                                       
257                                                                                  
258                                                                                  
259          return (status);     
260  }
261  #else
262  arm_status arm_cfft_init_q31(
263    arm_cfft_instance_q31 * S,
264    uint16_t fftLen)
265  {
266          /*  Initialise the default arm status */
267          arm_status status = ARM_MATH_SUCCESS;
268  
269          /*  Initialise the FFT length */
270          S->fftLen = fftLen;
271  
272          /*  Initialise the Twiddle coefficient pointer */
273          S->pTwiddle = NULL;
274  
275  
276          /*  Initializations of Instance structure depending on the FFT length */
277          switch (S->fftLen) {
278  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096))
279              /*  Initializations of structure parameters for 4096 point FFT */
280          case 4096U:
281              /*  Initialise the bit reversal table modifier */
282              FFTINIT(q31,4096);
283              break;
284  #endif
285  
286  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048))
287              /*  Initializations of structure parameters for 2048 point FFT */
288          case 2048U:
289              /*  Initialise the bit reversal table modifier */
290              FFTINIT(q31,2048);
291  
292              break;
293  #endif
294  
295  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024))
296              /*  Initializations of structure parameters for 1024 point FFT */
297          case 1024U:
298              /*  Initialise the bit reversal table modifier */
299              FFTINIT(q31,1024);
300  
301              break;
302  #endif
303  
304  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_512) && defined(ARM_TABLE_BITREVIDX_FXT_512))
305              /*  Initializations of structure parameters for 512 point FFT */
306          case 512U:
307              /*  Initialise the bit reversal table modifier */
308              FFTINIT(q31,512);
309              break;
310  #endif
311  
312  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_256) && defined(ARM_TABLE_BITREVIDX_FXT_256))
313          case 256U:
314              FFTINIT(q31,256);
315              break;
316  #endif
317  
318  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_128) && defined(ARM_TABLE_BITREVIDX_FXT_128))
319          case 128U:
320              FFTINIT(q31,128);
321              break;
322  #endif 
323  
324  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_64) && defined(ARM_TABLE_BITREVIDX_FXT_64))
325          case 64U:
326              FFTINIT(q31,64);
327              break;
328  #endif 
329  
330  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_32) && defined(ARM_TABLE_BITREVIDX_FXT_32))
331          case 32U:
332              FFTINIT(q31,32);
333              break;
334  #endif 
335  
336  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_16) && defined(ARM_TABLE_BITREVIDX_FXT_16))
337          case 16U:
338              /*  Initializations of structure parameters for 16 point FFT */
339              FFTINIT(q31,16);
340              break;
341  #endif
342  
343          default:
344              /*  Reporting argument error if fftSize is not valid value */
345              status = ARM_MATH_ARGUMENT_ERROR;
346              break;
347          }
348  
349  
350          return (status);
351  }
352  #endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
353  
354  /**
355    @} end of ComplexFFT group
356   */