/ Drivers / CMSIS / DSP / Source / TransformFunctions / arm_cfft_init_f16.c
arm_cfft_init_f16.c
  1  /* ----------------------------------------------------------------------
  2   * Project:      CMSIS DSP Library
  3   * Title:        arm_cfft_init_f16.c
  4   * Description:  Initialization function for cfft f16 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 f16 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_f16.h"
 53  #include "arm_common_tables_f16.h"
 54  #include "arm_const_structs_f16.h"
 55  
 56  
 57  #if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)
 58  
 59  #include "arm_vec_fft.h"
 60  #include "arm_mve_tables_f16.h"
 61  
 62  arm_status arm_cfft_radix4by2_rearrange_twiddles_f16(arm_cfft_instance_f16 *S, int twidCoefModifier)
 63  {
 64                                                                    
 65          switch (S->fftLen >> (twidCoefModifier - 1)) {  
 66  
 67  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
 68              || defined(ARM_TABLE_TWIDDLECOEF_F16_4096)
 69          case 4096U:                                                                                
 70              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_4096_f16;
 71              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_4096_f16;     
 72  
 73              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_4096_f16;
 74              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_4096_f16;    
 75  
 76              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_4096_f16;
 77              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_4096_f16;                                                     
 78              break; 
 79  #endif                                  
 80  
 81  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
 82              || defined(ARM_TABLE_TWIDDLECOEF_F16_1024) || defined(ARM_TABLE_TWIDDLECOEF_F16_2048)                                                                                                  
 83          case 1024U:                                                                                
 84              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_1024_f16;
 85              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_1024_f16;     
 86  
 87              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_1024_f16;
 88              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_1024_f16;    
 89  
 90              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_1024_f16;
 91              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_1024_f16;                                                                          
 92              break;                                                                                 
 93   #endif 
 94  
 95   #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
 96      || defined(ARM_TABLE_TWIDDLECOEF_F16_256) || defined(ARM_TABLE_TWIDDLECOEF_F16_512)                                                                                              
 97          case 256U:                                                                                 
 98              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_256_f16;
 99              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_256_f16;     
100  
101              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_256_f16;
102              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_256_f16;    
103  
104              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_256_f16;
105              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_256_f16;    
106  
107              break;                     
108  #endif 
109  
110  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
111              || defined(ARM_TABLE_TWIDDLECOEF_F16_64) || defined(ARM_TABLE_TWIDDLECOEF_F16_128)
112          case 64U:                                                                                  
113              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_64_f16;
114              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_64_f16;     
115  
116              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_64_f16;
117              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_64_f16;    
118  
119              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_64_f16;
120              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_64_f16;                                                                         
121              break;  
122  #endif                                                                               
123                
124  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) \
125              || defined(ARM_TABLE_TWIDDLECOEF_F16_16) || defined(ARM_TABLE_TWIDDLECOEF_F16_32)                                                                                                                                                                                                             
126          case 16U:                                                                                  
127              S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_16_f16;
128              S->rearranged_twiddle_stride1  =  rearranged_twiddle_stride1_16_f16;     
129  
130              S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_16_f16;
131              S->rearranged_twiddle_stride2  =  rearranged_twiddle_stride2_16_f16;    
132  
133              S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_16_f16;
134              S->rearranged_twiddle_stride3  =  rearranged_twiddle_stride3_16_f16;                                                                       
135              break;  
136  #endif                                                                               
137                                                                                                     
138          default:  
139              return(ARM_MATH_ARGUMENT_ERROR);                                                                                 
140              break;                                                                                 
141              /* invalid sizes already filtered */                                                   
142          }                                                                                          
143  
144          return(ARM_MATH_SUCCESS);
145  
146  }
147  
148  arm_status arm_cfft_init_f16(
149    arm_cfft_instance_f16 * S,
150    uint16_t fftLen)
151  {
152  
153          /*  Initialise the default arm status */                                
154          arm_status status = ARM_MATH_SUCCESS;                                   
155                                                                                  
156          /*  Initialise the FFT length */                                        
157          S->fftLen = fftLen;                                                     
158                                                                                  
159          /*  Initialise the Twiddle coefficient pointer */                       
160          S->pTwiddle = NULL;                         
161                                                                                  
162                                                                                  
163          /*  Initializations of Instance structure depending on the FFT length */
164          switch (S->fftLen) {                                                    
165              /*  Initializations of structure parameters for 4096 point FFT */   
166  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_4096) && defined(ARM_TABLE_TWIDDLECOEF_F16_4096))                                                          
167          case 4096U:  
168              /*  Initialise the bit reversal table modifier */                   
169              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH;      
170              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_4096;   
171              S->pTwiddle = (float16_t *)twiddleCoefF16_4096;       
172              status=arm_cfft_radix4by2_rearrange_twiddles_f16(S, 1);               
173              break;                                                              
174  #endif 
175  
176  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_2048) && defined(ARM_TABLE_TWIDDLECOEF_F16_2048))                                                                                                         
177              /*  Initializations of structure parameters for 2048 point FFT */   
178          case 2048U:                                                             
179              /*  Initialise the bit reversal table modifier */                   
180              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH;      
181              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_2048;
182              S->pTwiddle = (float16_t *)twiddleCoefF16_2048;          
183              status=arm_cfft_radix4by2_rearrange_twiddles_f16(S, 2);           
184              break;     
185  #endif 
186  
187  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_1024) && defined(ARM_TABLE_TWIDDLECOEF_F16_1024))                                                                                                                   
188              /*  Initializations of structure parameters for 1024 point FFT */   
189          case 1024U:                                                             
190              /*  Initialise the bit reversal table modifier */                   
191              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH;      
192              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_1024; 
193              S->pTwiddle = (float16_t *)twiddleCoefF16_1024;         
194              status=arm_cfft_radix4by2_rearrange_twiddles_f16(S, 1);           
195              break;                                                              
196  #endif 
197  
198  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_512) && defined(ARM_TABLE_TWIDDLECOEF_F16_512))                                                            
199              /*  Initializations of structure parameters for 512 point FFT */    
200          case 512U:                                                              
201              /*  Initialise the bit reversal table modifier */                   
202              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH;       
203              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_512;  
204              S->pTwiddle = (float16_t *)twiddleCoefF16_512;         
205              status=arm_cfft_radix4by2_rearrange_twiddles_f16(S, 2);           
206              break;                                                              
207  #endif 
208  
209  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_256) && defined(ARM_TABLE_TWIDDLECOEF_F16_256))                                                           
210          case 256U:                                                              
211              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH;       
212              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_256; 
213              S->pTwiddle = (float16_t *)twiddleCoefF16_256;          
214              status=arm_cfft_radix4by2_rearrange_twiddles_f16(S, 1);           
215              break;  
216  #endif                                                            
217                   
218  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_128) && defined(ARM_TABLE_TWIDDLECOEF_F16_128))                                                                                                                           
219          case 128U:                                                              
220              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH;       
221              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_128; 
222              S->pTwiddle = (float16_t *)twiddleCoefF16_128;          
223              status=arm_cfft_radix4by2_rearrange_twiddles_f16(S, 2);           
224              break;                                                              
225  #endif 
226  
227  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_64) && defined(ARM_TABLE_TWIDDLECOEF_F16_64))                                                                                                                       
228          case 64U:                                                               
229              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH;        
230              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_64;  
231              S->pTwiddle = (float16_t *)twiddleCoefF16_64;          
232              status=arm_cfft_radix4by2_rearrange_twiddles_f16(S, 1);           
233              break;                                                              
234  #endif 
235  
236  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_32) && defined(ARM_TABLE_TWIDDLECOEF_F16_32))                                                                                                                           
237          case 32U:                                                               
238              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH;        
239              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_32;  
240              S->pTwiddle = (float16_t *)twiddleCoefF16_32;          
241              status=arm_cfft_radix4by2_rearrange_twiddles_f16(S, 2);           
242              break;                                                              
243  #endif
244  
245  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_16) && defined(ARM_TABLE_TWIDDLECOEF_F16_16))                                                                                                                                 
246          case 16U:                                                               
247              /*  Initializations of structure parameters for 16 point FFT */     
248              S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH;        
249              S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_16; 
250              S->pTwiddle = (float16_t *)twiddleCoefF16_16;           
251              status=arm_cfft_radix4by2_rearrange_twiddles_f16(S, 1);           
252              break;                                                              
253  #endif                                                                             
254                                                                                  
255          default:                                                                
256              /*  Reporting argument error if fftSize is not valid value */       
257              status = ARM_MATH_ARGUMENT_ERROR;                                   
258              break;                                                              
259          }                                                                       
260                                                                                  
261                                                                                  
262          return (status);     
263  }
264  #else
265  
266  #if defined(ARM_FLOAT16_SUPPORTED)
267  
268  arm_status arm_cfft_init_f16(
269    arm_cfft_instance_f16 * S,
270    uint16_t fftLen)
271  {
272          /*  Initialise the default arm status */
273          arm_status status = ARM_MATH_SUCCESS;
274  
275          /*  Initialise the FFT length */
276          S->fftLen = fftLen;
277  
278          /*  Initialise the Twiddle coefficient pointer */
279          S->pTwiddle = NULL;
280  
281  
282          /*  Initializations of Instance structure depending on the FFT length */
283          switch (S->fftLen) {
284  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_4096) && defined(ARM_TABLE_BITREVIDX_FLT_4096))
285              /*  Initializations of structure parameters for 4096 point FFT */
286          case 4096U:
287              /*  Initialise the bit reversal table modifier */
288              FFTINIT(f16,4096);
289              break;
290  #endif
291  
292  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048))
293              /*  Initializations of structure parameters for 2048 point FFT */
294          case 2048U:
295              /*  Initialise the bit reversal table modifier */
296              FFTINIT(f16,2048);
297  
298              break;
299  #endif
300  
301  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024))
302              /*  Initializations of structure parameters for 1024 point FFT */
303          case 1024U:
304              /*  Initialise the bit reversal table modifier */
305              FFTINIT(f16,1024);
306  
307              break;
308  #endif
309  
310  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_512) && defined(ARM_TABLE_BITREVIDX_FLT_512))
311              /*  Initializations of structure parameters for 512 point FFT */
312          case 512U:
313              /*  Initialise the bit reversal table modifier */
314              FFTINIT(f16,512);
315              break;
316  #endif
317  
318  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_256) && defined(ARM_TABLE_BITREVIDX_FLT_256))
319          case 256U:
320              FFTINIT(f16,256);
321              break;
322  #endif
323  
324  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_128) && defined(ARM_TABLE_BITREVIDX_FLT_128))
325          case 128U:
326              FFTINIT(f16,128);
327              break;
328  #endif 
329  
330  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_64) && defined(ARM_TABLE_BITREVIDX_FLT_64))
331          case 64U:
332              FFTINIT(f16,64);
333              break;
334  #endif 
335  
336  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_32) && defined(ARM_TABLE_BITREVIDX_FLT_32))
337          case 32U:
338              FFTINIT(f16,32);
339              break;
340  #endif 
341  
342  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_16) && defined(ARM_TABLE_BITREVIDX_FLT_16))
343          case 16U:
344              /*  Initializations of structure parameters for 16 point FFT */
345              FFTINIT(f16,16);
346              break;
347  #endif
348  
349          default:
350              /*  Reporting argument error if fftSize is not valid value */
351              status = ARM_MATH_ARGUMENT_ERROR;
352              break;
353          }
354  
355  
356          return (status);
357  }
358  #endif /* #if defined(ARM_FLOAT16_SUPPORTED) */
359  #endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
360  
361  /**
362    @} end of ComplexFFT group
363   */