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