/ Drivers / CMSIS / DSP / Source / TransformFunctions / arm_cfft_radix4_init_f32.c
arm_cfft_radix4_init_f32.c
  1  /* ----------------------------------------------------------------------
  2   * Project:      CMSIS DSP Library
  3   * Title:        arm_cfft_radix4_init_f32.c
  4   * Description:  Radix-4 Decimation in Frequency Floating-point CFFT & CIFFT Initialization function
  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  #include "dsp/transform_functions.h"
 30  #include "arm_common_tables.h"
 31  
 32  /**
 33    @ingroup groupTransforms
 34   */
 35  
 36  /**
 37    @addtogroup ComplexFFT
 38    @{
 39   */
 40  
 41  /**
 42    @brief         Initialization function for the floating-point CFFT/CIFFT.
 43    @deprecated    Do not use this function. It has been superceded by \ref arm_cfft_f32 and will be removed in the future.
 44    @param[in,out] S              points to an instance of the floating-point CFFT/CIFFT structure
 45    @param[in]     fftLen         length of the FFT
 46    @param[in]     ifftFlag       flag that selects transform direction
 47                     - value = 0: forward transform
 48                     - value = 1: inverse transform
 49    @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
 50                     - value = 0: disables bit reversal of output
 51                     - value = 1: enables bit reversal of output
 52    @return        execution status
 53                     - \ref ARM_MATH_SUCCESS        : Operation successful
 54                     - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLen</code> is not a supported length
 55  
 56    @par           Details
 57                     The parameter <code>ifftFlag</code> controls whether a forward or inverse transform is computed.
 58                     Set(=1) ifftFlag for calculation of CIFFT otherwise  CFFT is calculated
 59    @par
 60                     The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
 61                     Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
 62    @par
 63                     The parameter <code>fftLen</code> Specifies length of CFFT/CIFFT process. Supported FFT Lengths are 16, 64, 256, 1024.
 64    @par
 65                     This Function also initializes Twiddle factor table pointer and Bit reversal table pointer.
 66   */
 67  
 68  arm_status arm_cfft_radix4_init_f32(
 69    arm_cfft_radix4_instance_f32 * S,
 70    uint16_t fftLen,
 71    uint8_t ifftFlag,
 72    uint8_t bitReverseFlag)
 73  {
 74     /*  Initialise the default arm status */
 75    arm_status status = ARM_MATH_ARGUMENT_ERROR;
 76  
 77  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES)
 78  
 79  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096)
 80  
 81    /*  Initialise the default arm status */
 82    status = ARM_MATH_SUCCESS;
 83  
 84    /*  Initialise the FFT length */
 85    S->fftLen = fftLen;
 86  
 87    /*  Initialise the Twiddle coefficient pointer */
 88    S->pTwiddle = (float32_t *) twiddleCoef;
 89  
 90    /*  Initialise the Flag for selection of CFFT or CIFFT */
 91    S->ifftFlag = ifftFlag;
 92  
 93    /*  Initialise the Flag for calculation Bit reversal or not */
 94    S->bitReverseFlag = bitReverseFlag;
 95  
 96  #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096)
 97  
 98    /*  Initializations of structure parameters depending on the FFT length */
 99    switch (S->fftLen)
100    {
101  
102    case 4096U:
103      /*  Initializations of structure parameters for 4096 point FFT */
104  
105      /*  Initialise the twiddle coef modifier value */
106      S->twidCoefModifier = 1U;
107      /*  Initialise the bit reversal table modifier */
108      S->bitRevFactor = 1U;
109      /*  Initialise the bit reversal table pointer */
110      S->pBitRevTable = (uint16_t *) armBitRevTable;
111      /*  Initialise the 1/fftLen Value */
112      S->onebyfftLen = 0.000244140625;
113      break;
114  
115    case 1024U:
116      /*  Initializations of structure parameters for 1024 point FFT */
117  
118      /*  Initialise the twiddle coef modifier value */
119      S->twidCoefModifier = 4U;
120      /*  Initialise the bit reversal table modifier */
121      S->bitRevFactor = 4U;
122      /*  Initialise the bit reversal table pointer */
123      S->pBitRevTable = (uint16_t *) & armBitRevTable[3];
124      /*  Initialise the 1/fftLen Value */
125      S->onebyfftLen = 0.0009765625f;
126      break;
127  
128  
129    case 256U:
130      /*  Initializations of structure parameters for 256 point FFT */
131      S->twidCoefModifier = 16U;
132      S->bitRevFactor = 16U;
133      S->pBitRevTable = (uint16_t *) & armBitRevTable[15];
134      S->onebyfftLen = 0.00390625f;
135      break;
136  
137    case 64U:
138      /*  Initializations of structure parameters for 64 point FFT */
139      S->twidCoefModifier = 64U;
140      S->bitRevFactor = 64U;
141      S->pBitRevTable = (uint16_t *) & armBitRevTable[63];
142      S->onebyfftLen = 0.015625f;
143      break;
144  
145    case 16U:
146      /*  Initializations of structure parameters for 16 point FFT */
147      S->twidCoefModifier = 256U;
148      S->bitRevFactor = 256U;
149      S->pBitRevTable = (uint16_t *) & armBitRevTable[255];
150      S->onebyfftLen = 0.0625f;
151      break;
152  
153  
154    default:
155      /*  Reporting argument error if fftSize is not valid value */
156      status = ARM_MATH_ARGUMENT_ERROR;
157      break;
158    }
159  #endif
160  #endif
161  #endif
162    
163    return (status);
164  }
165  
166  /**
167    @} end of ComplexFFT group
168   */