1 /* ----------------------------------------------------------------------
2  * Project:      CMSIS DSP Library
3  * Title:        arm_rfft_fast_init_f64.c
4  * Description:  Split Radix Decimation in Frequency CFFT Double Precision Floating point processing 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 RealFFT
34  */
35 
36 /**
37   @addtogroup RealFFTF64
38   @{
39  */
40 
41 
42 /**
43   @brief         Initialization function for the 32pt double precision floating-point real FFT.
44   @param[in,out] S  points to an arm_rfft_fast_instance_f64 structure
45   @return        execution status
46                    - \ref ARM_MATH_SUCCESS        : Operation successful
47                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
48  */
49 
arm_rfft_fast_init_32_f64(arm_rfft_fast_instance_f64 * S)50 arm_status arm_rfft_fast_init_32_f64( arm_rfft_fast_instance_f64 * S ) {
51 
52   arm_cfft_instance_f64 * Sint;
53 
54   if( !S ) return ARM_MATH_ARGUMENT_ERROR;
55 
56   Sint = &(S->Sint);
57   Sint->fftLen = 16U;
58   S->fftLenRFFT = 32U;
59 
60   Sint->bitRevLength = ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH;
61   Sint->pBitRevTable = (uint16_t *)armBitRevIndexTableF64_16;
62   Sint->pTwiddle     = (float64_t *) twiddleCoefF64_16;
63   S->pTwiddleRFFT    = (float64_t *) twiddleCoefF64_rfft_32;
64 
65   return ARM_MATH_SUCCESS;
66 }
67 
68 
69 /**
70   @brief         Initialization function for the 64pt Double Precision floating-point real FFT.
71   @param[in,out] S  points to an arm_rfft_fast_instance_f64 structure
72   @return        execution status
73                    - \ref ARM_MATH_SUCCESS        : Operation successful
74                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
75  */
76 
arm_rfft_fast_init_64_f64(arm_rfft_fast_instance_f64 * S)77 arm_status arm_rfft_fast_init_64_f64( arm_rfft_fast_instance_f64 * S ) {
78 
79   arm_cfft_instance_f64 * Sint;
80 
81   if( !S ) return ARM_MATH_ARGUMENT_ERROR;
82 
83   Sint = &(S->Sint);
84   Sint->fftLen = 32U;
85   S->fftLenRFFT = 64U;
86 
87   Sint->bitRevLength = ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH;
88   Sint->pBitRevTable = (uint16_t *)armBitRevIndexTableF64_32;
89   Sint->pTwiddle     = (float64_t *) twiddleCoefF64_32;
90   S->pTwiddleRFFT    = (float64_t *) twiddleCoefF64_rfft_64;
91 
92   return ARM_MATH_SUCCESS;
93 }
94 
95 
96 /**
97   @brief         Initialization function for the 128pt Double Precision floating-point real FFT.
98   @param[in,out] S  points to an arm_rfft_fast_instance_f64 structure
99   @return        execution status
100                    - \ref ARM_MATH_SUCCESS        : Operation successful
101                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
102  */
103 
arm_rfft_fast_init_128_f64(arm_rfft_fast_instance_f64 * S)104 arm_status arm_rfft_fast_init_128_f64( arm_rfft_fast_instance_f64 * S ) {
105 
106   arm_cfft_instance_f64 * Sint;
107 
108   if( !S ) return ARM_MATH_ARGUMENT_ERROR;
109 
110   Sint = &(S->Sint);
111   Sint->fftLen = 64U;
112   S->fftLenRFFT = 128U;
113 
114   Sint->bitRevLength = ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH;
115   Sint->pBitRevTable = (uint16_t *)armBitRevIndexTableF64_64;
116   Sint->pTwiddle     = (float64_t *) twiddleCoefF64_64;
117   S->pTwiddleRFFT    = (float64_t *) twiddleCoefF64_rfft_128;
118 
119   return ARM_MATH_SUCCESS;
120 }
121 
122 
123 /**
124   @brief         Initialization function for the 256pt Double Precision floating-point real FFT.
125   @param[in,out] S  points to an arm_rfft_fast_instance_f64 structure
126   @return        execution status
127                    - \ref ARM_MATH_SUCCESS        : Operation successful
128                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
129 */
130 
arm_rfft_fast_init_256_f64(arm_rfft_fast_instance_f64 * S)131 arm_status arm_rfft_fast_init_256_f64( arm_rfft_fast_instance_f64 * S ) {
132 
133   arm_cfft_instance_f64 * Sint;
134 
135   if( !S ) return ARM_MATH_ARGUMENT_ERROR;
136 
137   Sint = &(S->Sint);
138   Sint->fftLen = 128U;
139   S->fftLenRFFT = 256U;
140 
141   Sint->bitRevLength = ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH;
142   Sint->pBitRevTable = (uint16_t *)armBitRevIndexTableF64_128;
143   Sint->pTwiddle     = (float64_t *) twiddleCoefF64_128;
144   S->pTwiddleRFFT    = (float64_t *) twiddleCoefF64_rfft_256;
145 
146   return ARM_MATH_SUCCESS;
147 }
148 
149 
150 /**
151   @brief         Initialization function for the 512pt Double Precision floating-point real FFT.
152   @param[in,out] S  points to an arm_rfft_fast_instance_f64 structure
153   @return        execution status
154                    - \ref ARM_MATH_SUCCESS        : Operation successful
155                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
156  */
157 
arm_rfft_fast_init_512_f64(arm_rfft_fast_instance_f64 * S)158 arm_status arm_rfft_fast_init_512_f64( arm_rfft_fast_instance_f64 * S ) {
159 
160   arm_cfft_instance_f64 * Sint;
161 
162   if( !S ) return ARM_MATH_ARGUMENT_ERROR;
163 
164   Sint = &(S->Sint);
165   Sint->fftLen = 256U;
166   S->fftLenRFFT = 512U;
167 
168   Sint->bitRevLength = ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH;
169   Sint->pBitRevTable = (uint16_t *)armBitRevIndexTableF64_256;
170   Sint->pTwiddle     = (float64_t *) twiddleCoefF64_256;
171   S->pTwiddleRFFT    = (float64_t *) twiddleCoefF64_rfft_512;
172 
173   return ARM_MATH_SUCCESS;
174 }
175 
176 /**
177   @brief         Initialization function for the 1024pt Double Precision floating-point real FFT.
178   @param[in,out] S  points to an arm_rfft_fast_instance_f64 structure
179   @return        execution status
180                    - \ref ARM_MATH_SUCCESS        : Operation successful
181                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
182  */
183 
arm_rfft_fast_init_1024_f64(arm_rfft_fast_instance_f64 * S)184 arm_status arm_rfft_fast_init_1024_f64( arm_rfft_fast_instance_f64 * S ) {
185 
186   arm_cfft_instance_f64 * Sint;
187 
188   if( !S ) return ARM_MATH_ARGUMENT_ERROR;
189 
190   Sint = &(S->Sint);
191   Sint->fftLen = 512U;
192   S->fftLenRFFT = 1024U;
193 
194   Sint->bitRevLength = ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH;
195   Sint->pBitRevTable = (uint16_t *)armBitRevIndexTableF64_512;
196   Sint->pTwiddle     = (float64_t *) twiddleCoefF64_512;
197   S->pTwiddleRFFT    = (float64_t *) twiddleCoefF64_rfft_1024;
198 
199   return ARM_MATH_SUCCESS;
200 }
201 
202 /**
203   @brief         Initialization function for the 2048pt Double Precision floating-point real FFT.
204   @param[in,out] S  points to an arm_rfft_fast_instance_f64 structure
205   @return        execution status
206                    - \ref ARM_MATH_SUCCESS        : Operation successful
207                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
208  */
arm_rfft_fast_init_2048_f64(arm_rfft_fast_instance_f64 * S)209 arm_status arm_rfft_fast_init_2048_f64( arm_rfft_fast_instance_f64 * S ) {
210 
211   arm_cfft_instance_f64 * Sint;
212 
213   if( !S ) return ARM_MATH_ARGUMENT_ERROR;
214 
215   Sint = &(S->Sint);
216   Sint->fftLen = 1024U;
217   S->fftLenRFFT = 2048U;
218 
219   Sint->bitRevLength = ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH;
220   Sint->pBitRevTable = (uint16_t *)armBitRevIndexTableF64_1024;
221   Sint->pTwiddle     = (float64_t *) twiddleCoefF64_1024;
222   S->pTwiddleRFFT    = (float64_t *) twiddleCoefF64_rfft_2048;
223 
224   return ARM_MATH_SUCCESS;
225 }
226 
227 /**
228 * @brief         Initialization function for the 4096pt Double Precision floating-point real FFT.
229 * @param[in,out] S  points to an arm_rfft_fast_instance_f64 structure
230   @return        execution status
231                    - \ref ARM_MATH_SUCCESS        : Operation successful
232                    - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
233  */
234 
arm_rfft_fast_init_4096_f64(arm_rfft_fast_instance_f64 * S)235 arm_status arm_rfft_fast_init_4096_f64( arm_rfft_fast_instance_f64 * S ) {
236 
237   arm_cfft_instance_f64 * Sint;
238 
239   if( !S ) return ARM_MATH_ARGUMENT_ERROR;
240 
241   Sint = &(S->Sint);
242   Sint->fftLen = 2048U;
243   S->fftLenRFFT = 4096U;
244 
245   Sint->bitRevLength = ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH;
246   Sint->pBitRevTable = (uint16_t *)armBitRevIndexTableF64_2048;
247   Sint->pTwiddle     = (float64_t *) twiddleCoefF64_2048;
248   S->pTwiddleRFFT    = (float64_t *) twiddleCoefF64_rfft_4096;
249 
250   return ARM_MATH_SUCCESS;
251 }
252 
253 /**
254   @brief         Generic initialization function for the Double Precision floating-point real FFT.
255   @param[in,out] S       points to an arm_rfft_fast_instance_f64 structure
256   @param[in]     fftLen  length of the Real Sequence
257   @return        execution status
258                    - \ref ARM_MATH_SUCCESS        : Operation successful
259                    - \ref ARM_MATH_ARGUMENT_ERROR : <code>fftLen</code> is not a supported length
260 
261   @par           Description
262                    The parameter <code>fftLen</code> specifies the length of RFFT/CIFFT process.
263                    Supported FFT Lengths are 32, 64, 128, 256, 512, 1024, 2048, 4096.
264 
265   @par
266                 This Function also initializes Twiddle factor table pointer and Bit reversal table pointer.
267 
268   @par
269                 This function should be used only if you don't know the FFT sizes that
270                 you'll need at build time. The use of this function will prevent the
271                 linker from removing the FFT tables that are not needed and the library
272                 code size will be bigger than needed.
273 
274   @par
275                 If you use CMSIS-DSP as a library, and if you know the FFT sizes
276                 that you need at build time, then it is better to use the initialization
277                 functions defined for each FFT size.
278 
279  */
280 
arm_rfft_fast_init_f64(arm_rfft_fast_instance_f64 * S,uint16_t fftLen)281 arm_status arm_rfft_fast_init_f64(
282   arm_rfft_fast_instance_f64 * S,
283   uint16_t fftLen)
284 {
285   arm_status status;
286 
287 
288   switch (fftLen)
289   {
290   case 4096U:
291     status = arm_rfft_fast_init_4096_f64(S);
292     break;
293   case 2048U:
294     status = arm_rfft_fast_init_2048_f64(S);
295     break;
296   case 1024U:
297     status = arm_rfft_fast_init_1024_f64(S);
298     break;
299   case 512U:
300     status = arm_rfft_fast_init_512_f64(S);
301     break;
302   case 256U:
303     status = arm_rfft_fast_init_256_f64(S);
304     break;
305   case 128U:
306     status = arm_rfft_fast_init_128_f64(S);
307     break;
308   case 64U:
309     status = arm_rfft_fast_init_64_f64(S);
310     break;
311   case 32U:
312     status = arm_rfft_fast_init_32_f64(S);
313     break;
314   default:
315     return(ARM_MATH_ARGUMENT_ERROR);
316     break;
317   }
318 
319   return(status);
320 
321 }
322 
323 /**
324   @} end of RealFFTF64 group
325  */
326