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 */