CMSIS DSP library

Dependents:   performance_timer Surfboard_ gps2rtty Capstone ... more

Legacy Warning

This is an mbed 2 library. To learn more about mbed OS 5, visit the docs.

Committer:
mbed_official
Date:
Fri Nov 20 08:45:18 2015 +0000
Revision:
5:3762170b6d4d
Parent:
3:7a284390b0ce
Synchronized with git revision 2eb940b9a73af188d3004a2575fdfbb05febe62b

Full URL: https://github.com/mbedmicro/mbed/commit/2eb940b9a73af188d3004a2575fdfbb05febe62b/

Added option to build rpc library. closes #1426

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 3:7a284390b0ce 1 /* ----------------------------------------------------------------------
mbed_official 5:3762170b6d4d 2 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
mbed_official 3:7a284390b0ce 3 *
mbed_official 5:3762170b6d4d 4 * $Date: 19. March 2015
mbed_official 5:3762170b6d4d 5 * $Revision: V.1.4.5
mbed_official 3:7a284390b0ce 6 *
mbed_official 3:7a284390b0ce 7 * Project: CMSIS DSP Library
mbed_official 3:7a284390b0ce 8 * Title: arm_cfft_f32.c
mbed_official 3:7a284390b0ce 9 *
mbed_official 3:7a284390b0ce 10 * Description: Combined Radix Decimation in Frequency CFFT Floating point processing function
mbed_official 3:7a284390b0ce 11 *
mbed_official 3:7a284390b0ce 12 * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
mbed_official 3:7a284390b0ce 13 *
mbed_official 3:7a284390b0ce 14 * Redistribution and use in source and binary forms, with or without
mbed_official 3:7a284390b0ce 15 * modification, are permitted provided that the following conditions
mbed_official 3:7a284390b0ce 16 * are met:
mbed_official 3:7a284390b0ce 17 * - Redistributions of source code must retain the above copyright
mbed_official 3:7a284390b0ce 18 * notice, this list of conditions and the following disclaimer.
mbed_official 3:7a284390b0ce 19 * - Redistributions in binary form must reproduce the above copyright
mbed_official 3:7a284390b0ce 20 * notice, this list of conditions and the following disclaimer in
mbed_official 3:7a284390b0ce 21 * the documentation and/or other materials provided with the
mbed_official 3:7a284390b0ce 22 * distribution.
mbed_official 3:7a284390b0ce 23 * - Neither the name of ARM LIMITED nor the names of its contributors
mbed_official 3:7a284390b0ce 24 * may be used to endorse or promote products derived from this
mbed_official 3:7a284390b0ce 25 * software without specific prior written permission.
mbed_official 3:7a284390b0ce 26 *
mbed_official 3:7a284390b0ce 27 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
mbed_official 3:7a284390b0ce 28 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
mbed_official 3:7a284390b0ce 29 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
mbed_official 3:7a284390b0ce 30 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
mbed_official 3:7a284390b0ce 31 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
mbed_official 3:7a284390b0ce 32 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
mbed_official 3:7a284390b0ce 33 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
mbed_official 3:7a284390b0ce 34 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 3:7a284390b0ce 35 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
mbed_official 3:7a284390b0ce 36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 3:7a284390b0ce 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 3:7a284390b0ce 38 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 3:7a284390b0ce 39 * -------------------------------------------------------------------- */
mbed_official 3:7a284390b0ce 40
mbed_official 3:7a284390b0ce 41 #include "arm_math.h"
mbed_official 3:7a284390b0ce 42 #include "arm_common_tables.h"
mbed_official 3:7a284390b0ce 43
mbed_official 3:7a284390b0ce 44 extern void arm_radix8_butterfly_f32(
mbed_official 5:3762170b6d4d 45 float32_t * pSrc,
mbed_official 5:3762170b6d4d 46 uint16_t fftLen,
mbed_official 5:3762170b6d4d 47 const float32_t * pCoef,
mbed_official 5:3762170b6d4d 48 uint16_t twidCoefModifier);
mbed_official 3:7a284390b0ce 49
mbed_official 3:7a284390b0ce 50 extern void arm_bitreversal_32(
mbed_official 5:3762170b6d4d 51 uint32_t * pSrc,
mbed_official 5:3762170b6d4d 52 const uint16_t bitRevLen,
mbed_official 5:3762170b6d4d 53 const uint16_t * pBitRevTable);
mbed_official 3:7a284390b0ce 54
mbed_official 3:7a284390b0ce 55 /**
mbed_official 3:7a284390b0ce 56 * @ingroup groupTransforms
mbed_official 3:7a284390b0ce 57 */
mbed_official 3:7a284390b0ce 58
mbed_official 3:7a284390b0ce 59 /**
mbed_official 3:7a284390b0ce 60 * @defgroup ComplexFFT Complex FFT Functions
mbed_official 3:7a284390b0ce 61 *
mbed_official 3:7a284390b0ce 62 * \par
mbed_official 3:7a284390b0ce 63 * The Fast Fourier Transform (FFT) is an efficient algorithm for computing the
mbed_official 3:7a284390b0ce 64 * Discrete Fourier Transform (DFT). The FFT can be orders of magnitude faster
mbed_official 3:7a284390b0ce 65 * than the DFT, especially for long lengths.
mbed_official 3:7a284390b0ce 66 * The algorithms described in this section
mbed_official 3:7a284390b0ce 67 * operate on complex data. A separate set of functions is devoted to handling
mbed_official 3:7a284390b0ce 68 * of real sequences.
mbed_official 3:7a284390b0ce 69 * \par
mbed_official 3:7a284390b0ce 70 * There are separate algorithms for handling floating-point, Q15, and Q31 data
mbed_official 3:7a284390b0ce 71 * types. The algorithms available for each data type are described next.
mbed_official 3:7a284390b0ce 72 * \par
mbed_official 3:7a284390b0ce 73 * The FFT functions operate in-place. That is, the array holding the input data
mbed_official 3:7a284390b0ce 74 * will also be used to hold the corresponding result. The input data is complex
mbed_official 3:7a284390b0ce 75 * and contains <code>2*fftLen</code> interleaved values as shown below.
mbed_official 3:7a284390b0ce 76 * <pre> {real[0], imag[0], real[1], imag[1],..} </pre>
mbed_official 3:7a284390b0ce 77 * The FFT result will be contained in the same array and the frequency domain
mbed_official 3:7a284390b0ce 78 * values will have the same interleaving.
mbed_official 3:7a284390b0ce 79 *
mbed_official 3:7a284390b0ce 80 * \par Floating-point
mbed_official 3:7a284390b0ce 81 * The floating-point complex FFT uses a mixed-radix algorithm. Multiple radix-8
mbed_official 3:7a284390b0ce 82 * stages are performed along with a single radix-2 or radix-4 stage, as needed.
mbed_official 3:7a284390b0ce 83 * The algorithm supports lengths of [16, 32, 64, ..., 4096] and each length uses
mbed_official 3:7a284390b0ce 84 * a different twiddle factor table.
mbed_official 3:7a284390b0ce 85 * \par
mbed_official 3:7a284390b0ce 86 * The function uses the standard FFT definition and output values may grow by a
mbed_official 3:7a284390b0ce 87 * factor of <code>fftLen</code> when computing the forward transform. The
mbed_official 3:7a284390b0ce 88 * inverse transform includes a scale of <code>1/fftLen</code> as part of the
mbed_official 3:7a284390b0ce 89 * calculation and this matches the textbook definition of the inverse FFT.
mbed_official 3:7a284390b0ce 90 * \par
mbed_official 5:3762170b6d4d 91 * Pre-initialized data structures containing twiddle factors and bit reversal
mbed_official 3:7a284390b0ce 92 * tables are provided and defined in <code>arm_const_structs.h</code>. Include
mbed_official 3:7a284390b0ce 93 * this header in your function and then pass one of the constant structures as
mbed_official 3:7a284390b0ce 94 * an argument to arm_cfft_f32. For example:
mbed_official 3:7a284390b0ce 95 * \par
mbed_official 3:7a284390b0ce 96 * <code>arm_cfft_f32(arm_cfft_sR_f32_len64, pSrc, 1, 1)</code>
mbed_official 3:7a284390b0ce 97 * \par
mbed_official 3:7a284390b0ce 98 * computes a 64-point inverse complex FFT including bit reversal.
mbed_official 3:7a284390b0ce 99 * The data structures are treated as constant data and not modified during the
mbed_official 3:7a284390b0ce 100 * calculation. The same data structure can be reused for multiple transforms
mbed_official 3:7a284390b0ce 101 * including mixing forward and inverse transforms.
mbed_official 3:7a284390b0ce 102 * \par
mbed_official 3:7a284390b0ce 103 * Earlier releases of the library provided separate radix-2 and radix-4
mbed_official 3:7a284390b0ce 104 * algorithms that operated on floating-point data. These functions are still
mbed_official 3:7a284390b0ce 105 * provided but are deprecated. The older functions are slower and less general
mbed_official 3:7a284390b0ce 106 * than the new functions.
mbed_official 3:7a284390b0ce 107 * \par
mbed_official 3:7a284390b0ce 108 * An example of initialization of the constants for the arm_cfft_f32 function follows:
mbed_official 5:3762170b6d4d 109 * \code
mbed_official 3:7a284390b0ce 110 * const static arm_cfft_instance_f32 *S;
mbed_official 3:7a284390b0ce 111 * ...
mbed_official 5:3762170b6d4d 112 * switch (length) {
mbed_official 5:3762170b6d4d 113 * case 16:
mbed_official 5:3762170b6d4d 114 * S = &arm_cfft_sR_f32_len16;
mbed_official 5:3762170b6d4d 115 * break;
mbed_official 5:3762170b6d4d 116 * case 32:
mbed_official 5:3762170b6d4d 117 * S = &arm_cfft_sR_f32_len32;
mbed_official 5:3762170b6d4d 118 * break;
mbed_official 5:3762170b6d4d 119 * case 64:
mbed_official 5:3762170b6d4d 120 * S = &arm_cfft_sR_f32_len64;
mbed_official 5:3762170b6d4d 121 * break;
mbed_official 5:3762170b6d4d 122 * case 128:
mbed_official 5:3762170b6d4d 123 * S = &arm_cfft_sR_f32_len128;
mbed_official 5:3762170b6d4d 124 * break;
mbed_official 5:3762170b6d4d 125 * case 256:
mbed_official 5:3762170b6d4d 126 * S = &arm_cfft_sR_f32_len256;
mbed_official 5:3762170b6d4d 127 * break;
mbed_official 5:3762170b6d4d 128 * case 512:
mbed_official 5:3762170b6d4d 129 * S = &arm_cfft_sR_f32_len512;
mbed_official 5:3762170b6d4d 130 * break;
mbed_official 5:3762170b6d4d 131 * case 1024:
mbed_official 5:3762170b6d4d 132 * S = &arm_cfft_sR_f32_len1024;
mbed_official 5:3762170b6d4d 133 * break;
mbed_official 5:3762170b6d4d 134 * case 2048:
mbed_official 5:3762170b6d4d 135 * S = &arm_cfft_sR_f32_len2048;
mbed_official 5:3762170b6d4d 136 * break;
mbed_official 5:3762170b6d4d 137 * case 4096:
mbed_official 5:3762170b6d4d 138 * S = &arm_cfft_sR_f32_len4096;
mbed_official 5:3762170b6d4d 139 * break;
mbed_official 5:3762170b6d4d 140 * }
mbed_official 5:3762170b6d4d 141 * \endcode
mbed_official 3:7a284390b0ce 142 * \par Q15 and Q31
mbed_official 5:3762170b6d4d 143 * The floating-point complex FFT uses a mixed-radix algorithm. Multiple radix-4
mbed_official 5:3762170b6d4d 144 * stages are performed along with a single radix-2 stage, as needed.
mbed_official 5:3762170b6d4d 145 * The algorithm supports lengths of [16, 32, 64, ..., 4096] and each length uses
mbed_official 5:3762170b6d4d 146 * a different twiddle factor table.
mbed_official 5:3762170b6d4d 147 * \par
mbed_official 5:3762170b6d4d 148 * The function uses the standard FFT definition and output values may grow by a
mbed_official 5:3762170b6d4d 149 * factor of <code>fftLen</code> when computing the forward transform. The
mbed_official 5:3762170b6d4d 150 * inverse transform includes a scale of <code>1/fftLen</code> as part of the
mbed_official 5:3762170b6d4d 151 * calculation and this matches the textbook definition of the inverse FFT.
mbed_official 5:3762170b6d4d 152 * \par
mbed_official 5:3762170b6d4d 153 * Pre-initialized data structures containing twiddle factors and bit reversal
mbed_official 5:3762170b6d4d 154 * tables are provided and defined in <code>arm_const_structs.h</code>. Include
mbed_official 5:3762170b6d4d 155 * this header in your function and then pass one of the constant structures as
mbed_official 5:3762170b6d4d 156 * an argument to arm_cfft_q31. For example:
mbed_official 3:7a284390b0ce 157 * \par
mbed_official 5:3762170b6d4d 158 * <code>arm_cfft_q31(arm_cfft_sR_q31_len64, pSrc, 1, 1)</code>
mbed_official 5:3762170b6d4d 159 * \par
mbed_official 5:3762170b6d4d 160 * computes a 64-point inverse complex FFT including bit reversal.
mbed_official 5:3762170b6d4d 161 * The data structures are treated as constant data and not modified during the
mbed_official 5:3762170b6d4d 162 * calculation. The same data structure can be reused for multiple transforms
mbed_official 5:3762170b6d4d 163 * including mixing forward and inverse transforms.
mbed_official 5:3762170b6d4d 164 * \par
mbed_official 5:3762170b6d4d 165 * Earlier releases of the library provided separate radix-2 and radix-4
mbed_official 5:3762170b6d4d 166 * algorithms that operated on floating-point data. These functions are still
mbed_official 5:3762170b6d4d 167 * provided but are deprecated. The older functions are slower and less general
mbed_official 5:3762170b6d4d 168 * than the new functions.
mbed_official 3:7a284390b0ce 169 * \par
mbed_official 5:3762170b6d4d 170 * An example of initialization of the constants for the arm_cfft_q31 function follows:
mbed_official 5:3762170b6d4d 171 * \code
mbed_official 5:3762170b6d4d 172 * const static arm_cfft_instance_q31 *S;
mbed_official 5:3762170b6d4d 173 * ...
mbed_official 5:3762170b6d4d 174 * switch (length) {
mbed_official 5:3762170b6d4d 175 * case 16:
mbed_official 5:3762170b6d4d 176 * S = &arm_cfft_sR_q31_len16;
mbed_official 5:3762170b6d4d 177 * break;
mbed_official 5:3762170b6d4d 178 * case 32:
mbed_official 5:3762170b6d4d 179 * S = &arm_cfft_sR_q31_len32;
mbed_official 5:3762170b6d4d 180 * break;
mbed_official 5:3762170b6d4d 181 * case 64:
mbed_official 5:3762170b6d4d 182 * S = &arm_cfft_sR_q31_len64;
mbed_official 5:3762170b6d4d 183 * break;
mbed_official 5:3762170b6d4d 184 * case 128:
mbed_official 5:3762170b6d4d 185 * S = &arm_cfft_sR_q31_len128;
mbed_official 5:3762170b6d4d 186 * break;
mbed_official 5:3762170b6d4d 187 * case 256:
mbed_official 5:3762170b6d4d 188 * S = &arm_cfft_sR_q31_len256;
mbed_official 5:3762170b6d4d 189 * break;
mbed_official 5:3762170b6d4d 190 * case 512:
mbed_official 5:3762170b6d4d 191 * S = &arm_cfft_sR_q31_len512;
mbed_official 5:3762170b6d4d 192 * break;
mbed_official 5:3762170b6d4d 193 * case 1024:
mbed_official 5:3762170b6d4d 194 * S = &arm_cfft_sR_q31_len1024;
mbed_official 5:3762170b6d4d 195 * break;
mbed_official 5:3762170b6d4d 196 * case 2048:
mbed_official 5:3762170b6d4d 197 * S = &arm_cfft_sR_q31_len2048;
mbed_official 5:3762170b6d4d 198 * break;
mbed_official 5:3762170b6d4d 199 * case 4096:
mbed_official 5:3762170b6d4d 200 * S = &arm_cfft_sR_q31_len4096;
mbed_official 5:3762170b6d4d 201 * break;
mbed_official 5:3762170b6d4d 202 * }
mbed_official 5:3762170b6d4d 203 * \endcode
mbed_official 3:7a284390b0ce 204 *
mbed_official 3:7a284390b0ce 205 */
mbed_official 3:7a284390b0ce 206
mbed_official 3:7a284390b0ce 207 void arm_cfft_radix8by2_f32( arm_cfft_instance_f32 * S, float32_t * p1)
mbed_official 3:7a284390b0ce 208 {
mbed_official 5:3762170b6d4d 209 uint32_t L = S->fftLen;
mbed_official 5:3762170b6d4d 210 float32_t * pCol1, * pCol2, * pMid1, * pMid2;
mbed_official 5:3762170b6d4d 211 float32_t * p2 = p1 + L;
mbed_official 5:3762170b6d4d 212 const float32_t * tw = (float32_t *) S->pTwiddle;
mbed_official 5:3762170b6d4d 213 float32_t t1[4], t2[4], t3[4], t4[4], twR, twI;
mbed_official 5:3762170b6d4d 214 float32_t m0, m1, m2, m3;
mbed_official 5:3762170b6d4d 215 uint32_t l;
mbed_official 3:7a284390b0ce 216
mbed_official 5:3762170b6d4d 217 pCol1 = p1;
mbed_official 5:3762170b6d4d 218 pCol2 = p2;
mbed_official 3:7a284390b0ce 219
mbed_official 5:3762170b6d4d 220 // Define new length
mbed_official 5:3762170b6d4d 221 L >>= 1;
mbed_official 5:3762170b6d4d 222 // Initialize mid pointers
mbed_official 5:3762170b6d4d 223 pMid1 = p1 + L;
mbed_official 5:3762170b6d4d 224 pMid2 = p2 + L;
mbed_official 3:7a284390b0ce 225
mbed_official 5:3762170b6d4d 226 // do two dot Fourier transform
mbed_official 5:3762170b6d4d 227 for ( l = L >> 2; l > 0; l-- )
mbed_official 5:3762170b6d4d 228 {
mbed_official 5:3762170b6d4d 229 t1[0] = p1[0];
mbed_official 5:3762170b6d4d 230 t1[1] = p1[1];
mbed_official 5:3762170b6d4d 231 t1[2] = p1[2];
mbed_official 5:3762170b6d4d 232 t1[3] = p1[3];
mbed_official 3:7a284390b0ce 233
mbed_official 5:3762170b6d4d 234 t2[0] = p2[0];
mbed_official 5:3762170b6d4d 235 t2[1] = p2[1];
mbed_official 5:3762170b6d4d 236 t2[2] = p2[2];
mbed_official 5:3762170b6d4d 237 t2[3] = p2[3];
mbed_official 3:7a284390b0ce 238
mbed_official 5:3762170b6d4d 239 t3[0] = pMid1[0];
mbed_official 5:3762170b6d4d 240 t3[1] = pMid1[1];
mbed_official 5:3762170b6d4d 241 t3[2] = pMid1[2];
mbed_official 5:3762170b6d4d 242 t3[3] = pMid1[3];
mbed_official 3:7a284390b0ce 243
mbed_official 5:3762170b6d4d 244 t4[0] = pMid2[0];
mbed_official 5:3762170b6d4d 245 t4[1] = pMid2[1];
mbed_official 5:3762170b6d4d 246 t4[2] = pMid2[2];
mbed_official 5:3762170b6d4d 247 t4[3] = pMid2[3];
mbed_official 3:7a284390b0ce 248
mbed_official 5:3762170b6d4d 249 *p1++ = t1[0] + t2[0];
mbed_official 5:3762170b6d4d 250 *p1++ = t1[1] + t2[1];
mbed_official 5:3762170b6d4d 251 *p1++ = t1[2] + t2[2];
mbed_official 5:3762170b6d4d 252 *p1++ = t1[3] + t2[3]; // col 1
mbed_official 3:7a284390b0ce 253
mbed_official 5:3762170b6d4d 254 t2[0] = t1[0] - t2[0];
mbed_official 5:3762170b6d4d 255 t2[1] = t1[1] - t2[1];
mbed_official 5:3762170b6d4d 256 t2[2] = t1[2] - t2[2];
mbed_official 5:3762170b6d4d 257 t2[3] = t1[3] - t2[3]; // for col 2
mbed_official 3:7a284390b0ce 258
mbed_official 5:3762170b6d4d 259 *pMid1++ = t3[0] + t4[0];
mbed_official 5:3762170b6d4d 260 *pMid1++ = t3[1] + t4[1];
mbed_official 5:3762170b6d4d 261 *pMid1++ = t3[2] + t4[2];
mbed_official 5:3762170b6d4d 262 *pMid1++ = t3[3] + t4[3]; // col 1
mbed_official 3:7a284390b0ce 263
mbed_official 5:3762170b6d4d 264 t4[0] = t4[0] - t3[0];
mbed_official 5:3762170b6d4d 265 t4[1] = t4[1] - t3[1];
mbed_official 5:3762170b6d4d 266 t4[2] = t4[2] - t3[2];
mbed_official 5:3762170b6d4d 267 t4[3] = t4[3] - t3[3]; // for col 2
mbed_official 5:3762170b6d4d 268
mbed_official 5:3762170b6d4d 269 twR = *tw++;
mbed_official 5:3762170b6d4d 270 twI = *tw++;
mbed_official 3:7a284390b0ce 271
mbed_official 5:3762170b6d4d 272 // multiply by twiddle factors
mbed_official 5:3762170b6d4d 273 m0 = t2[0] * twR;
mbed_official 5:3762170b6d4d 274 m1 = t2[1] * twI;
mbed_official 5:3762170b6d4d 275 m2 = t2[1] * twR;
mbed_official 5:3762170b6d4d 276 m3 = t2[0] * twI;
mbed_official 5:3762170b6d4d 277
mbed_official 5:3762170b6d4d 278 // R = R * Tr - I * Ti
mbed_official 5:3762170b6d4d 279 *p2++ = m0 + m1;
mbed_official 5:3762170b6d4d 280 // I = I * Tr + R * Ti
mbed_official 5:3762170b6d4d 281 *p2++ = m2 - m3;
mbed_official 5:3762170b6d4d 282
mbed_official 5:3762170b6d4d 283 // use vertical symmetry
mbed_official 5:3762170b6d4d 284 // 0.9988 - 0.0491i <==> -0.0491 - 0.9988i
mbed_official 5:3762170b6d4d 285 m0 = t4[0] * twI;
mbed_official 5:3762170b6d4d 286 m1 = t4[1] * twR;
mbed_official 5:3762170b6d4d 287 m2 = t4[1] * twI;
mbed_official 5:3762170b6d4d 288 m3 = t4[0] * twR;
mbed_official 5:3762170b6d4d 289
mbed_official 5:3762170b6d4d 290 *pMid2++ = m0 - m1;
mbed_official 5:3762170b6d4d 291 *pMid2++ = m2 + m3;
mbed_official 3:7a284390b0ce 292
mbed_official 5:3762170b6d4d 293 twR = *tw++;
mbed_official 5:3762170b6d4d 294 twI = *tw++;
mbed_official 5:3762170b6d4d 295
mbed_official 5:3762170b6d4d 296 m0 = t2[2] * twR;
mbed_official 5:3762170b6d4d 297 m1 = t2[3] * twI;
mbed_official 5:3762170b6d4d 298 m2 = t2[3] * twR;
mbed_official 5:3762170b6d4d 299 m3 = t2[2] * twI;
mbed_official 5:3762170b6d4d 300
mbed_official 5:3762170b6d4d 301 *p2++ = m0 + m1;
mbed_official 5:3762170b6d4d 302 *p2++ = m2 - m3;
mbed_official 5:3762170b6d4d 303
mbed_official 5:3762170b6d4d 304 m0 = t4[2] * twI;
mbed_official 5:3762170b6d4d 305 m1 = t4[3] * twR;
mbed_official 5:3762170b6d4d 306 m2 = t4[3] * twI;
mbed_official 5:3762170b6d4d 307 m3 = t4[2] * twR;
mbed_official 5:3762170b6d4d 308
mbed_official 5:3762170b6d4d 309 *pMid2++ = m0 - m1;
mbed_official 5:3762170b6d4d 310 *pMid2++ = m2 + m3;
mbed_official 5:3762170b6d4d 311 }
mbed_official 3:7a284390b0ce 312
mbed_official 5:3762170b6d4d 313 // first col
mbed_official 5:3762170b6d4d 314 arm_radix8_butterfly_f32( pCol1, L, (float32_t *) S->pTwiddle, 2u);
mbed_official 5:3762170b6d4d 315 // second col
mbed_official 5:3762170b6d4d 316 arm_radix8_butterfly_f32( pCol2, L, (float32_t *) S->pTwiddle, 2u);
mbed_official 3:7a284390b0ce 317 }
mbed_official 3:7a284390b0ce 318
mbed_official 3:7a284390b0ce 319 void arm_cfft_radix8by4_f32( arm_cfft_instance_f32 * S, float32_t * p1)
mbed_official 3:7a284390b0ce 320 {
mbed_official 5:3762170b6d4d 321 uint32_t L = S->fftLen >> 1;
mbed_official 5:3762170b6d4d 322 float32_t * pCol1, *pCol2, *pCol3, *pCol4, *pEnd1, *pEnd2, *pEnd3, *pEnd4;
mbed_official 5:3762170b6d4d 323 const float32_t *tw2, *tw3, *tw4;
mbed_official 5:3762170b6d4d 324 float32_t * p2 = p1 + L;
mbed_official 5:3762170b6d4d 325 float32_t * p3 = p2 + L;
mbed_official 5:3762170b6d4d 326 float32_t * p4 = p3 + L;
mbed_official 5:3762170b6d4d 327 float32_t t2[4], t3[4], t4[4], twR, twI;
mbed_official 5:3762170b6d4d 328 float32_t p1ap3_0, p1sp3_0, p1ap3_1, p1sp3_1;
mbed_official 5:3762170b6d4d 329 float32_t m0, m1, m2, m3;
mbed_official 5:3762170b6d4d 330 uint32_t l, twMod2, twMod3, twMod4;
mbed_official 3:7a284390b0ce 331
mbed_official 5:3762170b6d4d 332 pCol1 = p1; // points to real values by default
mbed_official 5:3762170b6d4d 333 pCol2 = p2;
mbed_official 5:3762170b6d4d 334 pCol3 = p3;
mbed_official 5:3762170b6d4d 335 pCol4 = p4;
mbed_official 5:3762170b6d4d 336 pEnd1 = p2 - 1; // points to imaginary values by default
mbed_official 5:3762170b6d4d 337 pEnd2 = p3 - 1;
mbed_official 5:3762170b6d4d 338 pEnd3 = p4 - 1;
mbed_official 5:3762170b6d4d 339 pEnd4 = pEnd3 + L;
mbed_official 5:3762170b6d4d 340
mbed_official 5:3762170b6d4d 341 tw2 = tw3 = tw4 = (float32_t *) S->pTwiddle;
mbed_official 5:3762170b6d4d 342
mbed_official 5:3762170b6d4d 343 L >>= 1;
mbed_official 3:7a284390b0ce 344
mbed_official 5:3762170b6d4d 345 // do four dot Fourier transform
mbed_official 3:7a284390b0ce 346
mbed_official 5:3762170b6d4d 347 twMod2 = 2;
mbed_official 5:3762170b6d4d 348 twMod3 = 4;
mbed_official 5:3762170b6d4d 349 twMod4 = 6;
mbed_official 3:7a284390b0ce 350
mbed_official 5:3762170b6d4d 351 // TOP
mbed_official 5:3762170b6d4d 352 p1ap3_0 = p1[0] + p3[0];
mbed_official 5:3762170b6d4d 353 p1sp3_0 = p1[0] - p3[0];
mbed_official 5:3762170b6d4d 354 p1ap3_1 = p1[1] + p3[1];
mbed_official 5:3762170b6d4d 355 p1sp3_1 = p1[1] - p3[1];
mbed_official 3:7a284390b0ce 356
mbed_official 5:3762170b6d4d 357 // col 2
mbed_official 5:3762170b6d4d 358 t2[0] = p1sp3_0 + p2[1] - p4[1];
mbed_official 5:3762170b6d4d 359 t2[1] = p1sp3_1 - p2[0] + p4[0];
mbed_official 5:3762170b6d4d 360 // col 3
mbed_official 5:3762170b6d4d 361 t3[0] = p1ap3_0 - p2[0] - p4[0];
mbed_official 5:3762170b6d4d 362 t3[1] = p1ap3_1 - p2[1] - p4[1];
mbed_official 5:3762170b6d4d 363 // col 4
mbed_official 5:3762170b6d4d 364 t4[0] = p1sp3_0 - p2[1] + p4[1];
mbed_official 5:3762170b6d4d 365 t4[1] = p1sp3_1 + p2[0] - p4[0];
mbed_official 5:3762170b6d4d 366 // col 1
mbed_official 5:3762170b6d4d 367 *p1++ = p1ap3_0 + p2[0] + p4[0];
mbed_official 5:3762170b6d4d 368 *p1++ = p1ap3_1 + p2[1] + p4[1];
mbed_official 3:7a284390b0ce 369
mbed_official 5:3762170b6d4d 370 // Twiddle factors are ones
mbed_official 5:3762170b6d4d 371 *p2++ = t2[0];
mbed_official 5:3762170b6d4d 372 *p2++ = t2[1];
mbed_official 5:3762170b6d4d 373 *p3++ = t3[0];
mbed_official 5:3762170b6d4d 374 *p3++ = t3[1];
mbed_official 5:3762170b6d4d 375 *p4++ = t4[0];
mbed_official 5:3762170b6d4d 376 *p4++ = t4[1];
mbed_official 5:3762170b6d4d 377
mbed_official 5:3762170b6d4d 378 tw2 += twMod2;
mbed_official 5:3762170b6d4d 379 tw3 += twMod3;
mbed_official 5:3762170b6d4d 380 tw4 += twMod4;
mbed_official 3:7a284390b0ce 381
mbed_official 5:3762170b6d4d 382 for (l = (L - 2) >> 1; l > 0; l-- )
mbed_official 5:3762170b6d4d 383 {
mbed_official 5:3762170b6d4d 384 // TOP
mbed_official 5:3762170b6d4d 385 p1ap3_0 = p1[0] + p3[0];
mbed_official 5:3762170b6d4d 386 p1sp3_0 = p1[0] - p3[0];
mbed_official 5:3762170b6d4d 387 p1ap3_1 = p1[1] + p3[1];
mbed_official 5:3762170b6d4d 388 p1sp3_1 = p1[1] - p3[1];
mbed_official 5:3762170b6d4d 389 // col 2
mbed_official 5:3762170b6d4d 390 t2[0] = p1sp3_0 + p2[1] - p4[1];
mbed_official 5:3762170b6d4d 391 t2[1] = p1sp3_1 - p2[0] + p4[0];
mbed_official 5:3762170b6d4d 392 // col 3
mbed_official 5:3762170b6d4d 393 t3[0] = p1ap3_0 - p2[0] - p4[0];
mbed_official 5:3762170b6d4d 394 t3[1] = p1ap3_1 - p2[1] - p4[1];
mbed_official 5:3762170b6d4d 395 // col 4
mbed_official 5:3762170b6d4d 396 t4[0] = p1sp3_0 - p2[1] + p4[1];
mbed_official 5:3762170b6d4d 397 t4[1] = p1sp3_1 + p2[0] - p4[0];
mbed_official 5:3762170b6d4d 398 // col 1 - top
mbed_official 5:3762170b6d4d 399 *p1++ = p1ap3_0 + p2[0] + p4[0];
mbed_official 5:3762170b6d4d 400 *p1++ = p1ap3_1 + p2[1] + p4[1];
mbed_official 3:7a284390b0ce 401
mbed_official 5:3762170b6d4d 402 // BOTTOM
mbed_official 5:3762170b6d4d 403 p1ap3_1 = pEnd1[-1] + pEnd3[-1];
mbed_official 5:3762170b6d4d 404 p1sp3_1 = pEnd1[-1] - pEnd3[-1];
mbed_official 5:3762170b6d4d 405 p1ap3_0 = pEnd1[0] + pEnd3[0];
mbed_official 5:3762170b6d4d 406 p1sp3_0 = pEnd1[0] - pEnd3[0];
mbed_official 5:3762170b6d4d 407 // col 2
mbed_official 5:3762170b6d4d 408 t2[2] = pEnd2[0] - pEnd4[0] + p1sp3_1;
mbed_official 5:3762170b6d4d 409 t2[3] = pEnd1[0] - pEnd3[0] - pEnd2[-1] + pEnd4[-1];
mbed_official 5:3762170b6d4d 410 // col 3
mbed_official 5:3762170b6d4d 411 t3[2] = p1ap3_1 - pEnd2[-1] - pEnd4[-1];
mbed_official 5:3762170b6d4d 412 t3[3] = p1ap3_0 - pEnd2[0] - pEnd4[0];
mbed_official 5:3762170b6d4d 413 // col 4
mbed_official 5:3762170b6d4d 414 t4[2] = pEnd2[0] - pEnd4[0] - p1sp3_1;
mbed_official 5:3762170b6d4d 415 t4[3] = pEnd4[-1] - pEnd2[-1] - p1sp3_0;
mbed_official 5:3762170b6d4d 416 // col 1 - Bottom
mbed_official 5:3762170b6d4d 417 *pEnd1-- = p1ap3_0 + pEnd2[0] + pEnd4[0];
mbed_official 5:3762170b6d4d 418 *pEnd1-- = p1ap3_1 + pEnd2[-1] + pEnd4[-1];
mbed_official 3:7a284390b0ce 419
mbed_official 5:3762170b6d4d 420 // COL 2
mbed_official 5:3762170b6d4d 421 // read twiddle factors
mbed_official 5:3762170b6d4d 422 twR = *tw2++;
mbed_official 5:3762170b6d4d 423 twI = *tw2++;
mbed_official 5:3762170b6d4d 424 // multiply by twiddle factors
mbed_official 5:3762170b6d4d 425 // let Z1 = a + i(b), Z2 = c + i(d)
mbed_official 5:3762170b6d4d 426 // => Z1 * Z2 = (a*c - b*d) + i(b*c + a*d)
mbed_official 5:3762170b6d4d 427
mbed_official 5:3762170b6d4d 428 // Top
mbed_official 5:3762170b6d4d 429 m0 = t2[0] * twR;
mbed_official 5:3762170b6d4d 430 m1 = t2[1] * twI;
mbed_official 5:3762170b6d4d 431 m2 = t2[1] * twR;
mbed_official 5:3762170b6d4d 432 m3 = t2[0] * twI;
mbed_official 5:3762170b6d4d 433
mbed_official 5:3762170b6d4d 434 *p2++ = m0 + m1;
mbed_official 5:3762170b6d4d 435 *p2++ = m2 - m3;
mbed_official 5:3762170b6d4d 436 // use vertical symmetry col 2
mbed_official 5:3762170b6d4d 437 // 0.9997 - 0.0245i <==> 0.0245 - 0.9997i
mbed_official 5:3762170b6d4d 438 // Bottom
mbed_official 5:3762170b6d4d 439 m0 = t2[3] * twI;
mbed_official 5:3762170b6d4d 440 m1 = t2[2] * twR;
mbed_official 5:3762170b6d4d 441 m2 = t2[2] * twI;
mbed_official 5:3762170b6d4d 442 m3 = t2[3] * twR;
mbed_official 5:3762170b6d4d 443
mbed_official 5:3762170b6d4d 444 *pEnd2-- = m0 - m1;
mbed_official 5:3762170b6d4d 445 *pEnd2-- = m2 + m3;
mbed_official 3:7a284390b0ce 446
mbed_official 5:3762170b6d4d 447 // COL 3
mbed_official 5:3762170b6d4d 448 twR = tw3[0];
mbed_official 5:3762170b6d4d 449 twI = tw3[1];
mbed_official 5:3762170b6d4d 450 tw3 += twMod3;
mbed_official 5:3762170b6d4d 451 // Top
mbed_official 5:3762170b6d4d 452 m0 = t3[0] * twR;
mbed_official 5:3762170b6d4d 453 m1 = t3[1] * twI;
mbed_official 5:3762170b6d4d 454 m2 = t3[1] * twR;
mbed_official 5:3762170b6d4d 455 m3 = t3[0] * twI;
mbed_official 5:3762170b6d4d 456
mbed_official 5:3762170b6d4d 457 *p3++ = m0 + m1;
mbed_official 5:3762170b6d4d 458 *p3++ = m2 - m3;
mbed_official 5:3762170b6d4d 459 // use vertical symmetry col 3
mbed_official 5:3762170b6d4d 460 // 0.9988 - 0.0491i <==> -0.9988 - 0.0491i
mbed_official 5:3762170b6d4d 461 // Bottom
mbed_official 5:3762170b6d4d 462 m0 = -t3[3] * twR;
mbed_official 5:3762170b6d4d 463 m1 = t3[2] * twI;
mbed_official 5:3762170b6d4d 464 m2 = t3[2] * twR;
mbed_official 5:3762170b6d4d 465 m3 = t3[3] * twI;
mbed_official 5:3762170b6d4d 466
mbed_official 5:3762170b6d4d 467 *pEnd3-- = m0 - m1;
mbed_official 5:3762170b6d4d 468 *pEnd3-- = m3 - m2;
mbed_official 5:3762170b6d4d 469
mbed_official 5:3762170b6d4d 470 // COL 4
mbed_official 5:3762170b6d4d 471 twR = tw4[0];
mbed_official 5:3762170b6d4d 472 twI = tw4[1];
mbed_official 5:3762170b6d4d 473 tw4 += twMod4;
mbed_official 5:3762170b6d4d 474 // Top
mbed_official 5:3762170b6d4d 475 m0 = t4[0] * twR;
mbed_official 5:3762170b6d4d 476 m1 = t4[1] * twI;
mbed_official 5:3762170b6d4d 477 m2 = t4[1] * twR;
mbed_official 5:3762170b6d4d 478 m3 = t4[0] * twI;
mbed_official 5:3762170b6d4d 479
mbed_official 5:3762170b6d4d 480 *p4++ = m0 + m1;
mbed_official 5:3762170b6d4d 481 *p4++ = m2 - m3;
mbed_official 5:3762170b6d4d 482 // use vertical symmetry col 4
mbed_official 5:3762170b6d4d 483 // 0.9973 - 0.0736i <==> -0.0736 + 0.9973i
mbed_official 5:3762170b6d4d 484 // Bottom
mbed_official 5:3762170b6d4d 485 m0 = t4[3] * twI;
mbed_official 5:3762170b6d4d 486 m1 = t4[2] * twR;
mbed_official 5:3762170b6d4d 487 m2 = t4[2] * twI;
mbed_official 5:3762170b6d4d 488 m3 = t4[3] * twR;
mbed_official 5:3762170b6d4d 489
mbed_official 5:3762170b6d4d 490 *pEnd4-- = m0 - m1;
mbed_official 5:3762170b6d4d 491 *pEnd4-- = m2 + m3;
mbed_official 5:3762170b6d4d 492 }
mbed_official 3:7a284390b0ce 493
mbed_official 5:3762170b6d4d 494 //MIDDLE
mbed_official 5:3762170b6d4d 495 // Twiddle factors are
mbed_official 5:3762170b6d4d 496 // 1.0000 0.7071-0.7071i -1.0000i -0.7071-0.7071i
mbed_official 5:3762170b6d4d 497 p1ap3_0 = p1[0] + p3[0];
mbed_official 5:3762170b6d4d 498 p1sp3_0 = p1[0] - p3[0];
mbed_official 5:3762170b6d4d 499 p1ap3_1 = p1[1] + p3[1];
mbed_official 5:3762170b6d4d 500 p1sp3_1 = p1[1] - p3[1];
mbed_official 3:7a284390b0ce 501
mbed_official 5:3762170b6d4d 502 // col 2
mbed_official 5:3762170b6d4d 503 t2[0] = p1sp3_0 + p2[1] - p4[1];
mbed_official 5:3762170b6d4d 504 t2[1] = p1sp3_1 - p2[0] + p4[0];
mbed_official 5:3762170b6d4d 505 // col 3
mbed_official 5:3762170b6d4d 506 t3[0] = p1ap3_0 - p2[0] - p4[0];
mbed_official 5:3762170b6d4d 507 t3[1] = p1ap3_1 - p2[1] - p4[1];
mbed_official 5:3762170b6d4d 508 // col 4
mbed_official 5:3762170b6d4d 509 t4[0] = p1sp3_0 - p2[1] + p4[1];
mbed_official 5:3762170b6d4d 510 t4[1] = p1sp3_1 + p2[0] - p4[0];
mbed_official 5:3762170b6d4d 511 // col 1 - Top
mbed_official 5:3762170b6d4d 512 *p1++ = p1ap3_0 + p2[0] + p4[0];
mbed_official 5:3762170b6d4d 513 *p1++ = p1ap3_1 + p2[1] + p4[1];
mbed_official 5:3762170b6d4d 514
mbed_official 5:3762170b6d4d 515 // COL 2
mbed_official 5:3762170b6d4d 516 twR = tw2[0];
mbed_official 5:3762170b6d4d 517 twI = tw2[1];
mbed_official 5:3762170b6d4d 518
mbed_official 5:3762170b6d4d 519 m0 = t2[0] * twR;
mbed_official 5:3762170b6d4d 520 m1 = t2[1] * twI;
mbed_official 5:3762170b6d4d 521 m2 = t2[1] * twR;
mbed_official 5:3762170b6d4d 522 m3 = t2[0] * twI;
mbed_official 5:3762170b6d4d 523
mbed_official 5:3762170b6d4d 524 *p2++ = m0 + m1;
mbed_official 5:3762170b6d4d 525 *p2++ = m2 - m3;
mbed_official 5:3762170b6d4d 526 // COL 3
mbed_official 5:3762170b6d4d 527 twR = tw3[0];
mbed_official 5:3762170b6d4d 528 twI = tw3[1];
mbed_official 3:7a284390b0ce 529
mbed_official 5:3762170b6d4d 530 m0 = t3[0] * twR;
mbed_official 5:3762170b6d4d 531 m1 = t3[1] * twI;
mbed_official 5:3762170b6d4d 532 m2 = t3[1] * twR;
mbed_official 5:3762170b6d4d 533 m3 = t3[0] * twI;
mbed_official 5:3762170b6d4d 534
mbed_official 5:3762170b6d4d 535 *p3++ = m0 + m1;
mbed_official 5:3762170b6d4d 536 *p3++ = m2 - m3;
mbed_official 5:3762170b6d4d 537 // COL 4
mbed_official 5:3762170b6d4d 538 twR = tw4[0];
mbed_official 5:3762170b6d4d 539 twI = tw4[1];
mbed_official 3:7a284390b0ce 540
mbed_official 5:3762170b6d4d 541 m0 = t4[0] * twR;
mbed_official 5:3762170b6d4d 542 m1 = t4[1] * twI;
mbed_official 5:3762170b6d4d 543 m2 = t4[1] * twR;
mbed_official 5:3762170b6d4d 544 m3 = t4[0] * twI;
mbed_official 5:3762170b6d4d 545
mbed_official 5:3762170b6d4d 546 *p4++ = m0 + m1;
mbed_official 5:3762170b6d4d 547 *p4++ = m2 - m3;
mbed_official 5:3762170b6d4d 548
mbed_official 5:3762170b6d4d 549 // first col
mbed_official 5:3762170b6d4d 550 arm_radix8_butterfly_f32( pCol1, L, (float32_t *) S->pTwiddle, 4u);
mbed_official 5:3762170b6d4d 551 // second col
mbed_official 5:3762170b6d4d 552 arm_radix8_butterfly_f32( pCol2, L, (float32_t *) S->pTwiddle, 4u);
mbed_official 5:3762170b6d4d 553 // third col
mbed_official 5:3762170b6d4d 554 arm_radix8_butterfly_f32( pCol3, L, (float32_t *) S->pTwiddle, 4u);
mbed_official 5:3762170b6d4d 555 // fourth col
mbed_official 5:3762170b6d4d 556 arm_radix8_butterfly_f32( pCol4, L, (float32_t *) S->pTwiddle, 4u);
mbed_official 3:7a284390b0ce 557 }
mbed_official 3:7a284390b0ce 558
mbed_official 3:7a284390b0ce 559 /**
mbed_official 3:7a284390b0ce 560 * @addtogroup ComplexFFT
mbed_official 3:7a284390b0ce 561 * @{
mbed_official 3:7a284390b0ce 562 */
mbed_official 3:7a284390b0ce 563
mbed_official 3:7a284390b0ce 564 /**
mbed_official 3:7a284390b0ce 565 * @details
mbed_official 3:7a284390b0ce 566 * @brief Processing function for the floating-point complex FFT.
mbed_official 3:7a284390b0ce 567 * @param[in] *S points to an instance of the floating-point CFFT structure.
mbed_official 3:7a284390b0ce 568 * @param[in, out] *p1 points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place.
mbed_official 3:7a284390b0ce 569 * @param[in] ifftFlag flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform.
mbed_official 3:7a284390b0ce 570 * @param[in] bitReverseFlag flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output.
mbed_official 3:7a284390b0ce 571 * @return none.
mbed_official 3:7a284390b0ce 572 */
mbed_official 3:7a284390b0ce 573
mbed_official 3:7a284390b0ce 574 void arm_cfft_f32(
mbed_official 5:3762170b6d4d 575 const arm_cfft_instance_f32 * S,
mbed_official 5:3762170b6d4d 576 float32_t * p1,
mbed_official 5:3762170b6d4d 577 uint8_t ifftFlag,
mbed_official 5:3762170b6d4d 578 uint8_t bitReverseFlag)
mbed_official 3:7a284390b0ce 579 {
mbed_official 5:3762170b6d4d 580 uint32_t L = S->fftLen, l;
mbed_official 5:3762170b6d4d 581 float32_t invL, * pSrc;
mbed_official 3:7a284390b0ce 582
mbed_official 5:3762170b6d4d 583 if(ifftFlag == 1u)
mbed_official 5:3762170b6d4d 584 {
mbed_official 5:3762170b6d4d 585 /* Conjugate input data */
mbed_official 5:3762170b6d4d 586 pSrc = p1 + 1;
mbed_official 5:3762170b6d4d 587 for(l=0; l<L; l++)
mbed_official 5:3762170b6d4d 588 {
mbed_official 5:3762170b6d4d 589 *pSrc = -*pSrc;
mbed_official 5:3762170b6d4d 590 pSrc += 2;
mbed_official 5:3762170b6d4d 591 }
mbed_official 5:3762170b6d4d 592 }
mbed_official 3:7a284390b0ce 593
mbed_official 5:3762170b6d4d 594 switch (L)
mbed_official 5:3762170b6d4d 595 {
mbed_official 5:3762170b6d4d 596 case 16:
mbed_official 5:3762170b6d4d 597 case 128:
mbed_official 5:3762170b6d4d 598 case 1024:
mbed_official 5:3762170b6d4d 599 arm_cfft_radix8by2_f32 ( (arm_cfft_instance_f32 *) S, p1);
mbed_official 5:3762170b6d4d 600 break;
mbed_official 5:3762170b6d4d 601 case 32:
mbed_official 5:3762170b6d4d 602 case 256:
mbed_official 5:3762170b6d4d 603 case 2048:
mbed_official 5:3762170b6d4d 604 arm_cfft_radix8by4_f32 ( (arm_cfft_instance_f32 *) S, p1);
mbed_official 5:3762170b6d4d 605 break;
mbed_official 5:3762170b6d4d 606 case 64:
mbed_official 5:3762170b6d4d 607 case 512:
mbed_official 5:3762170b6d4d 608 case 4096:
mbed_official 5:3762170b6d4d 609 arm_radix8_butterfly_f32( p1, L, (float32_t *) S->pTwiddle, 1);
mbed_official 5:3762170b6d4d 610 break;
mbed_official 5:3762170b6d4d 611 }
mbed_official 3:7a284390b0ce 612
mbed_official 5:3762170b6d4d 613 if( bitReverseFlag )
mbed_official 5:3762170b6d4d 614 arm_bitreversal_32((uint32_t*)p1,S->bitRevLength,S->pBitRevTable);
mbed_official 3:7a284390b0ce 615
mbed_official 5:3762170b6d4d 616 if(ifftFlag == 1u)
mbed_official 5:3762170b6d4d 617 {
mbed_official 5:3762170b6d4d 618 invL = 1.0f/(float32_t)L;
mbed_official 5:3762170b6d4d 619 /* Conjugate and scale output data */
mbed_official 5:3762170b6d4d 620 pSrc = p1;
mbed_official 5:3762170b6d4d 621 for(l=0; l<L; l++)
mbed_official 5:3762170b6d4d 622 {
mbed_official 5:3762170b6d4d 623 *pSrc++ *= invL ;
mbed_official 5:3762170b6d4d 624 *pSrc = -(*pSrc) * invL;
mbed_official 5:3762170b6d4d 625 pSrc++;
mbed_official 5:3762170b6d4d 626 }
mbed_official 5:3762170b6d4d 627 }
mbed_official 3:7a284390b0ce 628 }
mbed_official 3:7a284390b0ce 629
mbed_official 5:3762170b6d4d 630 /**
mbed_official 5:3762170b6d4d 631 * @} end of ComplexFFT group
mbed_official 5:3762170b6d4d 632 */