1 /* ----------------------------------------------------------------------
2  * Project:      CMSIS DSP Library
3  * Title:        arm_rfft_init_q31.c
4  * Description:  RFFT & RIFFT Q31 initialisation 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 #include "arm_const_structs.h"
32 
33 /**
34   @ingroup RealFFT
35 */
36 
37 /**
38   @defgroup RealFFTQ31 Real FFT Q31 Functions
39 */
40 
41 /**
42   @addtogroup RealFFTQ31
43   @{
44  */
45 
46 
47 #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
48 #define RFFTINIT_Q31(LEN,CFFTLEN,TWIDMOD)                         \
49 ARM_DSP_ATTRIBUTE arm_status arm_rfft_init_##LEN##_q31( arm_rfft_instance_q31 * S,  \
50     uint32_t ifftFlagR,                                           \
51     uint32_t bitReverseFlag )                                     \
52 {                                                                 \
53     /*  Initialise the default arm status */                      \
54     arm_status status = ARM_MATH_ARGUMENT_ERROR;                  \
55                                                                   \
56     /*  Initialize the Real FFT length */                         \
57     S->fftLenReal = (uint16_t) LEN;                               \
58                                                                   \
59     /*  Initialize the Twiddle coefficientA pointer */            \
60     S->pTwiddleAReal = (q31_t *) realCoefAQ31;                    \
61                                                                   \
62     /*  Initialize the Twiddle coefficientB pointer */            \
63     S->pTwiddleBReal = (q31_t *) realCoefBQ31;                    \
64                                                                   \
65     /*  Initialize the Flag for selection of RFFT or RIFFT */     \
66     S->ifftFlagR = (uint8_t) ifftFlagR;                           \
67                                                                   \
68     /*  Initialize the Flag for calculation Bit reversal or not */\
69     S->bitReverseFlagR = (uint8_t) bitReverseFlag;                \
70                                                                   \
71     S->twidCoefRModifier = TWIDMOD;                               \
72                                                                   \
73     status=arm_cfft_init_##CFFTLEN##_q31(&(S->cfftInst));         \
74                                                                   \
75     /* return the status of RFFT Init function */                 \
76     return (status);                                              \
77 }
78 #else
79 #define RFFTINIT_Q31(LEN,CFFTLEN,TWIDMOD)                         \
80 ARM_DSP_ATTRIBUTE arm_status arm_rfft_init_##LEN##_q31( arm_rfft_instance_q31 * S,  \
81     uint32_t ifftFlagR,                                           \
82     uint32_t bitReverseFlag )                                     \
83 {                                                                 \
84     /*  Initialize the Real FFT length */                         \
85     S->fftLenReal = (uint16_t) LEN;                               \
86                                                                   \
87     /*  Initialize the Twiddle coefficientA pointer */            \
88     S->pTwiddleAReal = (q31_t *) realCoefAQ31;                    \
89                                                                   \
90     /*  Initialize the Twiddle coefficientB pointer */            \
91     S->pTwiddleBReal = (q31_t *) realCoefBQ31;                    \
92                                                                   \
93     /*  Initialize the Flag for selection of RFFT or RIFFT */     \
94     S->ifftFlagR = (uint8_t) ifftFlagR;                           \
95                                                                   \
96     /*  Initialize the Flag for calculation Bit reversal or not */\
97     S->bitReverseFlagR = (uint8_t) bitReverseFlag;                \
98                                                                   \
99     S->twidCoefRModifier = TWIDMOD;                               \
100                                                                   \
101     S->pCfft = &arm_cfft_sR_q31_len##CFFTLEN;                     \
102                                                                   \
103     /* return the status of RFFT Init function */                 \
104     return (ARM_MATH_SUCCESS);                                    \
105 }
106 #endif
107 
108 
109 /**
110   @brief         Initialization function for the 8192 pt Q31 real FFT.
111   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
112   @param[in]     ifftFlagR      flag that selects transform direction
113                    - value = 0: forward transform
114                    - value = 1: inverse transform
115   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
116                    - value = 0: disables bit reversal of output
117                    - value = 1: enables bit reversal of output
118   @return        execution status
119                    - \ref ARM_MATH_SUCCESS        : Operation successful
120                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
121 
122   @par
123                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
124                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
125   @par
126                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
127                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
128   @par
129                    This function also initializes Twiddle factor table.
130  */
131 RFFTINIT_Q31(8192,4096,1)
132 
133 /**
134   @brief         Initialization function for the 4096 pt Q31 real FFT.
135   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
136   @param[in]     ifftFlagR      flag that selects transform direction
137                    - value = 0: forward transform
138                    - value = 1: inverse transform
139   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
140                    - value = 0: disables bit reversal of output
141                    - value = 1: enables bit reversal of output
142   @return        execution status
143                    - \ref ARM_MATH_SUCCESS        : Operation successful
144                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
145 
146   @par
147                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
148                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
149   @par
150                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
151                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
152   @par
153                    This function also initializes Twiddle factor table.
154  */
155 RFFTINIT_Q31(4096,2048,2)
156 
157 /**
158   @brief         Initialization function for the 2048 pt Q31 real FFT.
159   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
160   @param[in]     ifftFlagR      flag that selects transform direction
161                    - value = 0: forward transform
162                    - value = 1: inverse transform
163   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
164                    - value = 0: disables bit reversal of output
165                    - value = 1: enables bit reversal of output
166   @return        execution status
167                    - \ref ARM_MATH_SUCCESS        : Operation successful
168                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
169 
170   @par
171                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
172                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
173   @par
174                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
175                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
176   @par
177                    This function also initializes Twiddle factor table.
178  */
179 RFFTINIT_Q31(2048,1024,4)
180 
181 /**
182   @brief         Initialization function for the 1024 pt Q31 real FFT.
183   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
184   @param[in]     ifftFlagR      flag that selects transform direction
185                    - value = 0: forward transform
186                    - value = 1: inverse transform
187   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
188                    - value = 0: disables bit reversal of output
189                    - value = 1: enables bit reversal of output
190   @return        execution status
191                    - \ref ARM_MATH_SUCCESS        : Operation successful
192                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
193 
194   @par
195                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
196                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
197   @par
198                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
199                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
200   @par
201                    This function also initializes Twiddle factor table.
202  */
203 RFFTINIT_Q31(1024,512,8)
204 
205 /**
206   @brief         Initialization function for the 512 pt Q31 real FFT.
207   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
208   @param[in]     ifftFlagR      flag that selects transform direction
209                    - value = 0: forward transform
210                    - value = 1: inverse transform
211   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
212                    - value = 0: disables bit reversal of output
213                    - value = 1: enables bit reversal of output
214   @return        execution status
215                    - \ref ARM_MATH_SUCCESS        : Operation successful
216                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
217 
218   @par
219                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
220                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
221   @par
222                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
223                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
224   @par
225                    This function also initializes Twiddle factor table.
226  */
227 RFFTINIT_Q31(512,256,16)
228 
229 /**
230   @brief         Initialization function for the 256 pt Q31 real FFT.
231   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
232   @param[in]     ifftFlagR      flag that selects transform direction
233                    - value = 0: forward transform
234                    - value = 1: inverse transform
235   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
236                    - value = 0: disables bit reversal of output
237                    - value = 1: enables bit reversal of output
238   @return        execution status
239                    - \ref ARM_MATH_SUCCESS        : Operation successful
240                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
241 
242   @par
243                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
244                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
245   @par
246                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
247                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
248   @par
249                    This function also initializes Twiddle factor table.
250  */
251 RFFTINIT_Q31(256,128,32)
252 
253 /**
254   @brief         Initialization function for the 128 pt Q31 real FFT.
255   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
256   @param[in]     ifftFlagR      flag that selects transform direction
257                    - value = 0: forward transform
258                    - value = 1: inverse transform
259   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
260                    - value = 0: disables bit reversal of output
261                    - value = 1: enables bit reversal of output
262   @return        execution status
263                    - \ref ARM_MATH_SUCCESS        : Operation successful
264                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
265 
266   @par
267                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
268                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
269   @par
270                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
271                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
272   @par
273                    This function also initializes Twiddle factor table.
274  */
275 RFFTINIT_Q31(128,64,64)
276 
277 /**
278   @brief         Initialization function for the 64 pt Q31 real FFT.
279   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
280   @param[in]     ifftFlagR      flag that selects transform direction
281                    - value = 0: forward transform
282                    - value = 1: inverse transform
283   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
284                    - value = 0: disables bit reversal of output
285                    - value = 1: enables bit reversal of output
286   @return        execution status
287                    - \ref ARM_MATH_SUCCESS        : Operation successful
288                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
289 
290   @par
291                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
292                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
293   @par
294                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
295                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
296   @par
297                    This function also initializes Twiddle factor table.
298  */
299 RFFTINIT_Q31(64,32,128)
300 
301 /**
302   @brief         Initialization function for the 32 pt Q31 real FFT.
303   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
304   @param[in]     ifftFlagR      flag that selects transform direction
305                    - value = 0: forward transform
306                    - value = 1: inverse transform
307   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
308                    - value = 0: disables bit reversal of output
309                    - value = 1: enables bit reversal of output
310   @return        execution status
311                    - \ref ARM_MATH_SUCCESS        : Operation successful
312                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
313 
314   @par
315                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
316                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
317   @par
318                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
319                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
320   @par
321                    This function also initializes Twiddle factor table.
322  */
323 RFFTINIT_Q31(32,16,256)
324 
325 
326 /**
327   @brief         Generic initialization function for the Q31 RFFT/RIFFT.
328   @param[in,out] S              points to an instance of the Q31 RFFT/RIFFT structure
329   @param[in]     fftLenReal     length of the FFT
330   @param[in]     ifftFlagR      flag that selects transform direction
331                    - value = 0: forward transform
332                    - value = 1: inverse transform
333   @param[in]     bitReverseFlag flag that enables / disables bit reversal of output
334                    - value = 0: disables bit reversal of output
335                    - value = 1: enables bit reversal of output
336   @return        execution status
337                    - \ref ARM_MATH_SUCCESS        : Operation successful
338                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLenReal</code> is not a supported length
339 
340   @par           Details
341                    The parameter <code>fftLenReal</code> specifies length of RFFT/RIFFT Process.
342                    Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192.
343   @par
344                    The parameter <code>ifftFlagR</code> controls whether a forward or inverse transform is computed.
345                    Set(=1) ifftFlagR to calculate RIFFT, otherwise RFFT is calculated.
346   @par
347                    The parameter <code>bitReverseFlag</code> controls whether output is in normal order or bit reversed order.
348                    Set(=1) bitReverseFlag for output to be in normal order otherwise output is in bit reversed order.
349   @par
350                    This function also initializes Twiddle factor table.
351   @par
352                    This function should be used only if you don't know the FFT sizes that
353                    you'll need at build time. The use of this function will prevent the
354                    linker from removing the FFT tables that are not needed and the library
355                    code size will be bigger than needed.
356   @par
357                    If you use CMSIS-DSP as a static library, and if you know the FFT sizes
358                    that you need at build time, then it is better to use the initialization
359                    functions defined for each FFT size.
360 
361 */
362 
arm_rfft_init_q31(arm_rfft_instance_q31 * S,uint32_t fftLenReal,uint32_t ifftFlagR,uint32_t bitReverseFlag)363 ARM_DSP_ATTRIBUTE arm_status arm_rfft_init_q31(
364     arm_rfft_instance_q31 * S,
365     uint32_t fftLenReal,
366     uint32_t ifftFlagR,
367     uint32_t bitReverseFlag)
368 {
369      /*  Initialise the default arm status */
370     arm_status status = ARM_MATH_ARGUMENT_ERROR;
371     /*  Initialization of coef modifier depending on the FFT length */
372     switch (fftLenReal)
373     {
374     case 8192U:
375         status = arm_rfft_init_8192_q31( S,ifftFlagR,bitReverseFlag );
376         break;
377     case 4096U:
378         status = arm_rfft_init_4096_q31( S,ifftFlagR,bitReverseFlag );
379         break;
380     case 2048U:
381         status = arm_rfft_init_2048_q31( S,ifftFlagR,bitReverseFlag );
382         break;
383     case 1024U:
384         status = arm_rfft_init_1024_q31( S,ifftFlagR,bitReverseFlag );
385         break;
386     case 512U:
387         status = arm_rfft_init_512_q31( S,ifftFlagR,bitReverseFlag );
388         break;
389     case 256U:
390         status = arm_rfft_init_256_q31( S,ifftFlagR,bitReverseFlag );
391         break;
392     case 128U:
393         status = arm_rfft_init_128_q31( S,ifftFlagR,bitReverseFlag );
394         break;
395     case 64U:
396         status = arm_rfft_init_64_q31( S,ifftFlagR,bitReverseFlag );
397         break;
398     case 32U:
399         status = arm_rfft_init_32_q31( S,ifftFlagR,bitReverseFlag );
400         break;
401     default:
402         /*  Reporting argument error if rfftSize is not valid value */
403         status = ARM_MATH_ARGUMENT_ERROR;
404         break;
405     }
406 
407     /* return the status of RFFT Init function */
408     return (status);
409 }
410 /**
411   @} end of RealFFTQ31 group
412  */
413