1 /* ----------------------------------------------------------------------
2 * Project: CMSIS DSP Library
3 * Title: arm_cfft_init_f32.c
4 * Description: Split Radix Decimation in Frequency CFFT Floating point processing function
5 *
6 * $Date: 27. January 2017
7 * $Revision: V.1.5.1
8 *
9 * Target Processor: Cortex-M cores
10 * -------------------------------------------------------------------- */
11 /*
12 * Copyright (C) 2010-2017 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 "arm_math.h"
30 #include "arm_common_tables.h"
31
32 /**
33 * @ingroup groupTransforms
34 */
35
36 /**
37 * @addtogroup RealFFT
38 * @{
39 */
40
41 /**
42 * @brief Initialization function for the floating-point real FFT.
43 * @param[in,out] *S points to an arm_rfft_fast_instance_f32 structure.
44 * @param[in] fftLen length of the Real Sequence.
45 * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLen</code> is not a supported value.
46 *
47 * \par Description:
48 * \par
49 * The parameter <code>fftLen</code> Specifies length of RFFT/CIFFT process. Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096.
50 * \par
51 * This Function also initializes Twiddle factor table pointer and Bit reversal table pointer.
52 */
arm_rfft_fast_init_f32(arm_rfft_fast_instance_f32 * S,uint16_t fftLen)53 arm_status arm_rfft_fast_init_f32(
54 arm_rfft_fast_instance_f32 * S,
55 uint16_t fftLen)
56 {
57 arm_cfft_instance_f32 * Sint;
58 /* Initialise the default arm status */
59 arm_status status = ARM_MATH_SUCCESS;
60 /* Initialise the FFT length */
61 Sint = &(S->Sint);
62 Sint->fftLen = fftLen/2;
63 S->fftLenRFFT = fftLen;
64
65 /* Initializations of structure parameters depending on the FFT length */
66 switch (Sint->fftLen)
67 {
68 case 2048u:
69 /* Initializations of structure parameters for 2048 point FFT */
70 /* Initialise the bit reversal table length */
71 Sint->bitRevLength = ARMBITREVINDEXTABLE_2048_TABLE_LENGTH;
72 /* Initialise the bit reversal table pointer */
73 Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable2048;
74 /* Initialise the Twiddle coefficient pointers */
75 Sint->pTwiddle = (float32_t *) twiddleCoef_2048;
76 S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_4096;
77 break;
78 case 1024u:
79 Sint->bitRevLength = ARMBITREVINDEXTABLE_1024_TABLE_LENGTH;
80 Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable1024;
81 Sint->pTwiddle = (float32_t *) twiddleCoef_1024;
82 S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_2048;
83 break;
84 case 512u:
85 Sint->bitRevLength = ARMBITREVINDEXTABLE_512_TABLE_LENGTH;
86 Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable512;
87 Sint->pTwiddle = (float32_t *) twiddleCoef_512;
88 S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_1024;
89 break;
90 case 256u:
91 Sint->bitRevLength = ARMBITREVINDEXTABLE_256_TABLE_LENGTH;
92 Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable256;
93 Sint->pTwiddle = (float32_t *) twiddleCoef_256;
94 S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_512;
95 break;
96 case 128u:
97 Sint->bitRevLength = ARMBITREVINDEXTABLE_128_TABLE_LENGTH;
98 Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable128;
99 Sint->pTwiddle = (float32_t *) twiddleCoef_128;
100 S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_256;
101 break;
102 case 64u:
103 Sint->bitRevLength = ARMBITREVINDEXTABLE_64_TABLE_LENGTH;
104 Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable64;
105 Sint->pTwiddle = (float32_t *) twiddleCoef_64;
106 S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_128;
107 break;
108 case 32u:
109 Sint->bitRevLength = ARMBITREVINDEXTABLE_32_TABLE_LENGTH;
110 Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable32;
111 Sint->pTwiddle = (float32_t *) twiddleCoef_32;
112 S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_64;
113 break;
114 case 16u:
115 Sint->bitRevLength = ARMBITREVINDEXTABLE_16_TABLE_LENGTH;
116 Sint->pBitRevTable = (uint16_t *)armBitRevIndexTable16;
117 Sint->pTwiddle = (float32_t *) twiddleCoef_16;
118 S->pTwiddleRFFT = (float32_t *) twiddleCoef_rfft_32;
119 break;
120 default:
121 /* Reporting argument error if fftSize is not valid value */
122 status = ARM_MATH_ARGUMENT_ERROR;
123 break;
124 }
125
126 return (status);
127 }
128
129 /**
130 * @} end of RealFFT group
131 */
132