V4.0.1 of the ARM CMSIS DSP libraries. Note that arm_bitreversal2.s, arm_cfft_f32.c and arm_rfft_fast_f32.c had to be removed. arm_bitreversal2.s will not assemble with the online tools. So, the fast f32 FFT functions are not yet available. All the other FFT functions are available.

Dependents:   MPU9150_Example fir_f32 fir_f32 MPU9150_nucleo_noni2cdev ... more

Committer:
emh203
Date:
Mon Jul 28 15:03:15 2014 +0000
Revision:
0:3d9c67d97d6f
1st working commit.   Had to remove arm_bitreversal2.s     arm_cfft_f32.c and arm_rfft_fast_f32.c.    The .s will not assemble.      For now I removed these functions so we could at least have a library for the other functions.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emh203 0:3d9c67d97d6f 1 /* ----------------------------------------------------------------------
emh203 0:3d9c67d97d6f 2 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
emh203 0:3d9c67d97d6f 3 *
emh203 0:3d9c67d97d6f 4 * $Date: 12. March 2014
emh203 0:3d9c67d97d6f 5 * $Revision: V1.4.3
emh203 0:3d9c67d97d6f 6 *
emh203 0:3d9c67d97d6f 7 * Project: CMSIS DSP Library
emh203 0:3d9c67d97d6f 8 * Title: arm_cfft_radix2_f32.c
emh203 0:3d9c67d97d6f 9 *
emh203 0:3d9c67d97d6f 10 * Description: Radix-2 Decimation in Frequency CFFT & CIFFT Floating point processing function
emh203 0:3d9c67d97d6f 11 *
emh203 0:3d9c67d97d6f 12 *
emh203 0:3d9c67d97d6f 13 * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
emh203 0:3d9c67d97d6f 14 *
emh203 0:3d9c67d97d6f 15 * Redistribution and use in source and binary forms, with or without
emh203 0:3d9c67d97d6f 16 * modification, are permitted provided that the following conditions
emh203 0:3d9c67d97d6f 17 * are met:
emh203 0:3d9c67d97d6f 18 * - Redistributions of source code must retain the above copyright
emh203 0:3d9c67d97d6f 19 * notice, this list of conditions and the following disclaimer.
emh203 0:3d9c67d97d6f 20 * - Redistributions in binary form must reproduce the above copyright
emh203 0:3d9c67d97d6f 21 * notice, this list of conditions and the following disclaimer in
emh203 0:3d9c67d97d6f 22 * the documentation and/or other materials provided with the
emh203 0:3d9c67d97d6f 23 * distribution.
emh203 0:3d9c67d97d6f 24 * - Neither the name of ARM LIMITED nor the names of its contributors
emh203 0:3d9c67d97d6f 25 * may be used to endorse or promote products derived from this
emh203 0:3d9c67d97d6f 26 * software without specific prior written permission.
emh203 0:3d9c67d97d6f 27 *
emh203 0:3d9c67d97d6f 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
emh203 0:3d9c67d97d6f 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
emh203 0:3d9c67d97d6f 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
emh203 0:3d9c67d97d6f 31 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
emh203 0:3d9c67d97d6f 32 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
emh203 0:3d9c67d97d6f 33 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
emh203 0:3d9c67d97d6f 34 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
emh203 0:3d9c67d97d6f 35 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
emh203 0:3d9c67d97d6f 36 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
emh203 0:3d9c67d97d6f 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
emh203 0:3d9c67d97d6f 38 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
emh203 0:3d9c67d97d6f 39 * POSSIBILITY OF SUCH DAMAGE.
emh203 0:3d9c67d97d6f 40 * -------------------------------------------------------------------- */
emh203 0:3d9c67d97d6f 41
emh203 0:3d9c67d97d6f 42 #include "arm_math.h"
emh203 0:3d9c67d97d6f 43
emh203 0:3d9c67d97d6f 44 void arm_radix2_butterfly_f32(
emh203 0:3d9c67d97d6f 45 float32_t * pSrc,
emh203 0:3d9c67d97d6f 46 uint32_t fftLen,
emh203 0:3d9c67d97d6f 47 float32_t * pCoef,
emh203 0:3d9c67d97d6f 48 uint16_t twidCoefModifier);
emh203 0:3d9c67d97d6f 49
emh203 0:3d9c67d97d6f 50 void arm_radix2_butterfly_inverse_f32(
emh203 0:3d9c67d97d6f 51 float32_t * pSrc,
emh203 0:3d9c67d97d6f 52 uint32_t fftLen,
emh203 0:3d9c67d97d6f 53 float32_t * pCoef,
emh203 0:3d9c67d97d6f 54 uint16_t twidCoefModifier,
emh203 0:3d9c67d97d6f 55 float32_t onebyfftLen);
emh203 0:3d9c67d97d6f 56
emh203 0:3d9c67d97d6f 57 extern void arm_bitreversal_f32(
emh203 0:3d9c67d97d6f 58 float32_t * pSrc,
emh203 0:3d9c67d97d6f 59 uint16_t fftSize,
emh203 0:3d9c67d97d6f 60 uint16_t bitRevFactor,
emh203 0:3d9c67d97d6f 61 uint16_t * pBitRevTab);
emh203 0:3d9c67d97d6f 62
emh203 0:3d9c67d97d6f 63 /**
emh203 0:3d9c67d97d6f 64 * @ingroup groupTransforms
emh203 0:3d9c67d97d6f 65 */
emh203 0:3d9c67d97d6f 66
emh203 0:3d9c67d97d6f 67 /**
emh203 0:3d9c67d97d6f 68 * @addtogroup ComplexFFT
emh203 0:3d9c67d97d6f 69 * @{
emh203 0:3d9c67d97d6f 70 */
emh203 0:3d9c67d97d6f 71
emh203 0:3d9c67d97d6f 72 /**
emh203 0:3d9c67d97d6f 73 * @details
emh203 0:3d9c67d97d6f 74 * @brief Radix-2 CFFT/CIFFT.
emh203 0:3d9c67d97d6f 75 * @deprecated Do not use this function. It has been superceded by \ref arm_cfft_f32 and will be removed
emh203 0:3d9c67d97d6f 76 * in the future.
emh203 0:3d9c67d97d6f 77 * @param[in] *S points to an instance of the floating-point Radix-2 CFFT/CIFFT structure.
emh203 0:3d9c67d97d6f 78 * @param[in, out] *pSrc points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place.
emh203 0:3d9c67d97d6f 79 * @return none.
emh203 0:3d9c67d97d6f 80 */
emh203 0:3d9c67d97d6f 81
emh203 0:3d9c67d97d6f 82 void arm_cfft_radix2_f32(
emh203 0:3d9c67d97d6f 83 const arm_cfft_radix2_instance_f32 * S,
emh203 0:3d9c67d97d6f 84 float32_t * pSrc)
emh203 0:3d9c67d97d6f 85 {
emh203 0:3d9c67d97d6f 86
emh203 0:3d9c67d97d6f 87 if(S->ifftFlag == 1u)
emh203 0:3d9c67d97d6f 88 {
emh203 0:3d9c67d97d6f 89 /* Complex IFFT radix-2 */
emh203 0:3d9c67d97d6f 90 arm_radix2_butterfly_inverse_f32(pSrc, S->fftLen, S->pTwiddle,
emh203 0:3d9c67d97d6f 91 S->twidCoefModifier, S->onebyfftLen);
emh203 0:3d9c67d97d6f 92 }
emh203 0:3d9c67d97d6f 93 else
emh203 0:3d9c67d97d6f 94 {
emh203 0:3d9c67d97d6f 95 /* Complex FFT radix-2 */
emh203 0:3d9c67d97d6f 96 arm_radix2_butterfly_f32(pSrc, S->fftLen, S->pTwiddle,
emh203 0:3d9c67d97d6f 97 S->twidCoefModifier);
emh203 0:3d9c67d97d6f 98 }
emh203 0:3d9c67d97d6f 99
emh203 0:3d9c67d97d6f 100 if(S->bitReverseFlag == 1u)
emh203 0:3d9c67d97d6f 101 {
emh203 0:3d9c67d97d6f 102 /* Bit Reversal */
emh203 0:3d9c67d97d6f 103 arm_bitreversal_f32(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable);
emh203 0:3d9c67d97d6f 104 }
emh203 0:3d9c67d97d6f 105
emh203 0:3d9c67d97d6f 106 }
emh203 0:3d9c67d97d6f 107
emh203 0:3d9c67d97d6f 108
emh203 0:3d9c67d97d6f 109 /**
emh203 0:3d9c67d97d6f 110 * @} end of ComplexFFT group
emh203 0:3d9c67d97d6f 111 */
emh203 0:3d9c67d97d6f 112
emh203 0:3d9c67d97d6f 113
emh203 0:3d9c67d97d6f 114
emh203 0:3d9c67d97d6f 115 /* ----------------------------------------------------------------------
emh203 0:3d9c67d97d6f 116 ** Internal helper function used by the FFTs
emh203 0:3d9c67d97d6f 117 ** ------------------------------------------------------------------- */
emh203 0:3d9c67d97d6f 118
emh203 0:3d9c67d97d6f 119 /*
emh203 0:3d9c67d97d6f 120 * @brief Core function for the floating-point CFFT butterfly process.
emh203 0:3d9c67d97d6f 121 * @param[in, out] *pSrc points to the in-place buffer of floating-point data type.
emh203 0:3d9c67d97d6f 122 * @param[in] fftLen length of the FFT.
emh203 0:3d9c67d97d6f 123 * @param[in] *pCoef points to the twiddle coefficient buffer.
emh203 0:3d9c67d97d6f 124 * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
emh203 0:3d9c67d97d6f 125 * @return none.
emh203 0:3d9c67d97d6f 126 */
emh203 0:3d9c67d97d6f 127
emh203 0:3d9c67d97d6f 128 void arm_radix2_butterfly_f32(
emh203 0:3d9c67d97d6f 129 float32_t * pSrc,
emh203 0:3d9c67d97d6f 130 uint32_t fftLen,
emh203 0:3d9c67d97d6f 131 float32_t * pCoef,
emh203 0:3d9c67d97d6f 132 uint16_t twidCoefModifier)
emh203 0:3d9c67d97d6f 133 {
emh203 0:3d9c67d97d6f 134
emh203 0:3d9c67d97d6f 135 uint32_t i, j, k, l;
emh203 0:3d9c67d97d6f 136 uint32_t n1, n2, ia;
emh203 0:3d9c67d97d6f 137 float32_t xt, yt, cosVal, sinVal;
emh203 0:3d9c67d97d6f 138 float32_t p0, p1, p2, p3;
emh203 0:3d9c67d97d6f 139 float32_t a0, a1;
emh203 0:3d9c67d97d6f 140
emh203 0:3d9c67d97d6f 141 #ifndef ARM_MATH_CM0_FAMILY
emh203 0:3d9c67d97d6f 142
emh203 0:3d9c67d97d6f 143 /* Initializations for the first stage */
emh203 0:3d9c67d97d6f 144 n2 = fftLen >> 1;
emh203 0:3d9c67d97d6f 145 ia = 0;
emh203 0:3d9c67d97d6f 146 i = 0;
emh203 0:3d9c67d97d6f 147
emh203 0:3d9c67d97d6f 148 // loop for groups
emh203 0:3d9c67d97d6f 149 for (k = n2; k > 0; k--)
emh203 0:3d9c67d97d6f 150 {
emh203 0:3d9c67d97d6f 151 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 152 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 153
emh203 0:3d9c67d97d6f 154 /* Twiddle coefficients index modifier */
emh203 0:3d9c67d97d6f 155 ia += twidCoefModifier;
emh203 0:3d9c67d97d6f 156
emh203 0:3d9c67d97d6f 157 /* index calculation for the input as, */
emh203 0:3d9c67d97d6f 158 /* pSrc[i + 0], pSrc[i + fftLen/1] */
emh203 0:3d9c67d97d6f 159 l = i + n2;
emh203 0:3d9c67d97d6f 160
emh203 0:3d9c67d97d6f 161 /* Butterfly implementation */
emh203 0:3d9c67d97d6f 162 a0 = pSrc[2 * i] + pSrc[2 * l];
emh203 0:3d9c67d97d6f 163 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 164
emh203 0:3d9c67d97d6f 165 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 166 a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1];
emh203 0:3d9c67d97d6f 167
emh203 0:3d9c67d97d6f 168 p0 = xt * cosVal;
emh203 0:3d9c67d97d6f 169 p1 = yt * sinVal;
emh203 0:3d9c67d97d6f 170 p2 = yt * cosVal;
emh203 0:3d9c67d97d6f 171 p3 = xt * sinVal;
emh203 0:3d9c67d97d6f 172
emh203 0:3d9c67d97d6f 173 pSrc[2 * i] = a0;
emh203 0:3d9c67d97d6f 174 pSrc[2 * i + 1] = a1;
emh203 0:3d9c67d97d6f 175
emh203 0:3d9c67d97d6f 176 pSrc[2 * l] = p0 + p1;
emh203 0:3d9c67d97d6f 177 pSrc[2 * l + 1] = p2 - p3;
emh203 0:3d9c67d97d6f 178
emh203 0:3d9c67d97d6f 179 i++;
emh203 0:3d9c67d97d6f 180 } // groups loop end
emh203 0:3d9c67d97d6f 181
emh203 0:3d9c67d97d6f 182 twidCoefModifier <<= 1u;
emh203 0:3d9c67d97d6f 183
emh203 0:3d9c67d97d6f 184 // loop for stage
emh203 0:3d9c67d97d6f 185 for (k = n2; k > 2; k = k >> 1)
emh203 0:3d9c67d97d6f 186 {
emh203 0:3d9c67d97d6f 187 n1 = n2;
emh203 0:3d9c67d97d6f 188 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 189 ia = 0;
emh203 0:3d9c67d97d6f 190
emh203 0:3d9c67d97d6f 191 // loop for groups
emh203 0:3d9c67d97d6f 192 j = 0;
emh203 0:3d9c67d97d6f 193 do
emh203 0:3d9c67d97d6f 194 {
emh203 0:3d9c67d97d6f 195 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 196 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 197 ia += twidCoefModifier;
emh203 0:3d9c67d97d6f 198
emh203 0:3d9c67d97d6f 199 // loop for butterfly
emh203 0:3d9c67d97d6f 200 i = j;
emh203 0:3d9c67d97d6f 201 do
emh203 0:3d9c67d97d6f 202 {
emh203 0:3d9c67d97d6f 203 l = i + n2;
emh203 0:3d9c67d97d6f 204 a0 = pSrc[2 * i] + pSrc[2 * l];
emh203 0:3d9c67d97d6f 205 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 206
emh203 0:3d9c67d97d6f 207 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 208 a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1];
emh203 0:3d9c67d97d6f 209
emh203 0:3d9c67d97d6f 210 p0 = xt * cosVal;
emh203 0:3d9c67d97d6f 211 p1 = yt * sinVal;
emh203 0:3d9c67d97d6f 212 p2 = yt * cosVal;
emh203 0:3d9c67d97d6f 213 p3 = xt * sinVal;
emh203 0:3d9c67d97d6f 214
emh203 0:3d9c67d97d6f 215 pSrc[2 * i] = a0;
emh203 0:3d9c67d97d6f 216 pSrc[2 * i + 1] = a1;
emh203 0:3d9c67d97d6f 217
emh203 0:3d9c67d97d6f 218 pSrc[2 * l] = p0 + p1;
emh203 0:3d9c67d97d6f 219 pSrc[2 * l + 1] = p2 - p3;
emh203 0:3d9c67d97d6f 220
emh203 0:3d9c67d97d6f 221 i += n1;
emh203 0:3d9c67d97d6f 222 } while( i < fftLen ); // butterfly loop end
emh203 0:3d9c67d97d6f 223 j++;
emh203 0:3d9c67d97d6f 224 } while( j < n2); // groups loop end
emh203 0:3d9c67d97d6f 225 twidCoefModifier <<= 1u;
emh203 0:3d9c67d97d6f 226 } // stages loop end
emh203 0:3d9c67d97d6f 227
emh203 0:3d9c67d97d6f 228 // loop for butterfly
emh203 0:3d9c67d97d6f 229 for (i = 0; i < fftLen; i += 2)
emh203 0:3d9c67d97d6f 230 {
emh203 0:3d9c67d97d6f 231 a0 = pSrc[2 * i] + pSrc[2 * i + 2];
emh203 0:3d9c67d97d6f 232 xt = pSrc[2 * i] - pSrc[2 * i + 2];
emh203 0:3d9c67d97d6f 233
emh203 0:3d9c67d97d6f 234 yt = pSrc[2 * i + 1] - pSrc[2 * i + 3];
emh203 0:3d9c67d97d6f 235 a1 = pSrc[2 * i + 3] + pSrc[2 * i + 1];
emh203 0:3d9c67d97d6f 236
emh203 0:3d9c67d97d6f 237 pSrc[2 * i] = a0;
emh203 0:3d9c67d97d6f 238 pSrc[2 * i + 1] = a1;
emh203 0:3d9c67d97d6f 239 pSrc[2 * i + 2] = xt;
emh203 0:3d9c67d97d6f 240 pSrc[2 * i + 3] = yt;
emh203 0:3d9c67d97d6f 241 } // groups loop end
emh203 0:3d9c67d97d6f 242
emh203 0:3d9c67d97d6f 243 #else
emh203 0:3d9c67d97d6f 244
emh203 0:3d9c67d97d6f 245 n2 = fftLen;
emh203 0:3d9c67d97d6f 246
emh203 0:3d9c67d97d6f 247 // loop for stage
emh203 0:3d9c67d97d6f 248 for (k = fftLen; k > 1; k = k >> 1)
emh203 0:3d9c67d97d6f 249 {
emh203 0:3d9c67d97d6f 250 n1 = n2;
emh203 0:3d9c67d97d6f 251 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 252 ia = 0;
emh203 0:3d9c67d97d6f 253
emh203 0:3d9c67d97d6f 254 // loop for groups
emh203 0:3d9c67d97d6f 255 j = 0;
emh203 0:3d9c67d97d6f 256 do
emh203 0:3d9c67d97d6f 257 {
emh203 0:3d9c67d97d6f 258 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 259 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 260 ia += twidCoefModifier;
emh203 0:3d9c67d97d6f 261
emh203 0:3d9c67d97d6f 262 // loop for butterfly
emh203 0:3d9c67d97d6f 263 i = j;
emh203 0:3d9c67d97d6f 264 do
emh203 0:3d9c67d97d6f 265 {
emh203 0:3d9c67d97d6f 266 l = i + n2;
emh203 0:3d9c67d97d6f 267 a0 = pSrc[2 * i] + pSrc[2 * l];
emh203 0:3d9c67d97d6f 268 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 269
emh203 0:3d9c67d97d6f 270 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 271 a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1];
emh203 0:3d9c67d97d6f 272
emh203 0:3d9c67d97d6f 273 p0 = xt * cosVal;
emh203 0:3d9c67d97d6f 274 p1 = yt * sinVal;
emh203 0:3d9c67d97d6f 275 p2 = yt * cosVal;
emh203 0:3d9c67d97d6f 276 p3 = xt * sinVal;
emh203 0:3d9c67d97d6f 277
emh203 0:3d9c67d97d6f 278 pSrc[2 * i] = a0;
emh203 0:3d9c67d97d6f 279 pSrc[2 * i + 1] = a1;
emh203 0:3d9c67d97d6f 280
emh203 0:3d9c67d97d6f 281 pSrc[2 * l] = p0 + p1;
emh203 0:3d9c67d97d6f 282 pSrc[2 * l + 1] = p2 - p3;
emh203 0:3d9c67d97d6f 283
emh203 0:3d9c67d97d6f 284 i += n1;
emh203 0:3d9c67d97d6f 285 } while(i < fftLen);
emh203 0:3d9c67d97d6f 286 j++;
emh203 0:3d9c67d97d6f 287 } while(j < n2);
emh203 0:3d9c67d97d6f 288 twidCoefModifier <<= 1u;
emh203 0:3d9c67d97d6f 289 }
emh203 0:3d9c67d97d6f 290
emh203 0:3d9c67d97d6f 291 #endif // #ifndef ARM_MATH_CM0_FAMILY
emh203 0:3d9c67d97d6f 292
emh203 0:3d9c67d97d6f 293 }
emh203 0:3d9c67d97d6f 294
emh203 0:3d9c67d97d6f 295
emh203 0:3d9c67d97d6f 296 void arm_radix2_butterfly_inverse_f32(
emh203 0:3d9c67d97d6f 297 float32_t * pSrc,
emh203 0:3d9c67d97d6f 298 uint32_t fftLen,
emh203 0:3d9c67d97d6f 299 float32_t * pCoef,
emh203 0:3d9c67d97d6f 300 uint16_t twidCoefModifier,
emh203 0:3d9c67d97d6f 301 float32_t onebyfftLen)
emh203 0:3d9c67d97d6f 302 {
emh203 0:3d9c67d97d6f 303
emh203 0:3d9c67d97d6f 304 uint32_t i, j, k, l;
emh203 0:3d9c67d97d6f 305 uint32_t n1, n2, ia;
emh203 0:3d9c67d97d6f 306 float32_t xt, yt, cosVal, sinVal;
emh203 0:3d9c67d97d6f 307 float32_t p0, p1, p2, p3;
emh203 0:3d9c67d97d6f 308 float32_t a0, a1;
emh203 0:3d9c67d97d6f 309
emh203 0:3d9c67d97d6f 310 #ifndef ARM_MATH_CM0_FAMILY
emh203 0:3d9c67d97d6f 311
emh203 0:3d9c67d97d6f 312 n2 = fftLen >> 1;
emh203 0:3d9c67d97d6f 313 ia = 0;
emh203 0:3d9c67d97d6f 314
emh203 0:3d9c67d97d6f 315 // loop for groups
emh203 0:3d9c67d97d6f 316 for (i = 0; i < n2; i++)
emh203 0:3d9c67d97d6f 317 {
emh203 0:3d9c67d97d6f 318 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 319 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 320 ia += twidCoefModifier;
emh203 0:3d9c67d97d6f 321
emh203 0:3d9c67d97d6f 322 l = i + n2;
emh203 0:3d9c67d97d6f 323 a0 = pSrc[2 * i] + pSrc[2 * l];
emh203 0:3d9c67d97d6f 324 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 325
emh203 0:3d9c67d97d6f 326 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 327 a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1];
emh203 0:3d9c67d97d6f 328
emh203 0:3d9c67d97d6f 329 p0 = xt * cosVal;
emh203 0:3d9c67d97d6f 330 p1 = yt * sinVal;
emh203 0:3d9c67d97d6f 331 p2 = yt * cosVal;
emh203 0:3d9c67d97d6f 332 p3 = xt * sinVal;
emh203 0:3d9c67d97d6f 333
emh203 0:3d9c67d97d6f 334 pSrc[2 * i] = a0;
emh203 0:3d9c67d97d6f 335 pSrc[2 * i + 1] = a1;
emh203 0:3d9c67d97d6f 336
emh203 0:3d9c67d97d6f 337 pSrc[2 * l] = p0 - p1;
emh203 0:3d9c67d97d6f 338 pSrc[2 * l + 1] = p2 + p3;
emh203 0:3d9c67d97d6f 339 } // groups loop end
emh203 0:3d9c67d97d6f 340
emh203 0:3d9c67d97d6f 341 twidCoefModifier <<= 1u;
emh203 0:3d9c67d97d6f 342
emh203 0:3d9c67d97d6f 343 // loop for stage
emh203 0:3d9c67d97d6f 344 for (k = fftLen / 2; k > 2; k = k >> 1)
emh203 0:3d9c67d97d6f 345 {
emh203 0:3d9c67d97d6f 346 n1 = n2;
emh203 0:3d9c67d97d6f 347 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 348 ia = 0;
emh203 0:3d9c67d97d6f 349
emh203 0:3d9c67d97d6f 350 // loop for groups
emh203 0:3d9c67d97d6f 351 j = 0;
emh203 0:3d9c67d97d6f 352 do
emh203 0:3d9c67d97d6f 353 {
emh203 0:3d9c67d97d6f 354 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 355 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 356 ia += twidCoefModifier;
emh203 0:3d9c67d97d6f 357
emh203 0:3d9c67d97d6f 358 // loop for butterfly
emh203 0:3d9c67d97d6f 359 i = j;
emh203 0:3d9c67d97d6f 360 do
emh203 0:3d9c67d97d6f 361 {
emh203 0:3d9c67d97d6f 362 l = i + n2;
emh203 0:3d9c67d97d6f 363 a0 = pSrc[2 * i] + pSrc[2 * l];
emh203 0:3d9c67d97d6f 364 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 365
emh203 0:3d9c67d97d6f 366 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 367 a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1];
emh203 0:3d9c67d97d6f 368
emh203 0:3d9c67d97d6f 369 p0 = xt * cosVal;
emh203 0:3d9c67d97d6f 370 p1 = yt * sinVal;
emh203 0:3d9c67d97d6f 371 p2 = yt * cosVal;
emh203 0:3d9c67d97d6f 372 p3 = xt * sinVal;
emh203 0:3d9c67d97d6f 373
emh203 0:3d9c67d97d6f 374 pSrc[2 * i] = a0;
emh203 0:3d9c67d97d6f 375 pSrc[2 * i + 1] = a1;
emh203 0:3d9c67d97d6f 376
emh203 0:3d9c67d97d6f 377 pSrc[2 * l] = p0 - p1;
emh203 0:3d9c67d97d6f 378 pSrc[2 * l + 1] = p2 + p3;
emh203 0:3d9c67d97d6f 379
emh203 0:3d9c67d97d6f 380 i += n1;
emh203 0:3d9c67d97d6f 381 } while( i < fftLen ); // butterfly loop end
emh203 0:3d9c67d97d6f 382 j++;
emh203 0:3d9c67d97d6f 383 } while(j < n2); // groups loop end
emh203 0:3d9c67d97d6f 384
emh203 0:3d9c67d97d6f 385 twidCoefModifier <<= 1u;
emh203 0:3d9c67d97d6f 386 } // stages loop end
emh203 0:3d9c67d97d6f 387
emh203 0:3d9c67d97d6f 388 // loop for butterfly
emh203 0:3d9c67d97d6f 389 for (i = 0; i < fftLen; i += 2)
emh203 0:3d9c67d97d6f 390 {
emh203 0:3d9c67d97d6f 391 a0 = pSrc[2 * i] + pSrc[2 * i + 2];
emh203 0:3d9c67d97d6f 392 xt = pSrc[2 * i] - pSrc[2 * i + 2];
emh203 0:3d9c67d97d6f 393
emh203 0:3d9c67d97d6f 394 a1 = pSrc[2 * i + 3] + pSrc[2 * i + 1];
emh203 0:3d9c67d97d6f 395 yt = pSrc[2 * i + 1] - pSrc[2 * i + 3];
emh203 0:3d9c67d97d6f 396
emh203 0:3d9c67d97d6f 397 p0 = a0 * onebyfftLen;
emh203 0:3d9c67d97d6f 398 p2 = xt * onebyfftLen;
emh203 0:3d9c67d97d6f 399 p1 = a1 * onebyfftLen;
emh203 0:3d9c67d97d6f 400 p3 = yt * onebyfftLen;
emh203 0:3d9c67d97d6f 401
emh203 0:3d9c67d97d6f 402 pSrc[2 * i] = p0;
emh203 0:3d9c67d97d6f 403 pSrc[2 * i + 1] = p1;
emh203 0:3d9c67d97d6f 404 pSrc[2 * i + 2] = p2;
emh203 0:3d9c67d97d6f 405 pSrc[2 * i + 3] = p3;
emh203 0:3d9c67d97d6f 406 } // butterfly loop end
emh203 0:3d9c67d97d6f 407
emh203 0:3d9c67d97d6f 408 #else
emh203 0:3d9c67d97d6f 409
emh203 0:3d9c67d97d6f 410 n2 = fftLen;
emh203 0:3d9c67d97d6f 411
emh203 0:3d9c67d97d6f 412 // loop for stage
emh203 0:3d9c67d97d6f 413 for (k = fftLen; k > 2; k = k >> 1)
emh203 0:3d9c67d97d6f 414 {
emh203 0:3d9c67d97d6f 415 n1 = n2;
emh203 0:3d9c67d97d6f 416 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 417 ia = 0;
emh203 0:3d9c67d97d6f 418
emh203 0:3d9c67d97d6f 419 // loop for groups
emh203 0:3d9c67d97d6f 420 j = 0;
emh203 0:3d9c67d97d6f 421 do
emh203 0:3d9c67d97d6f 422 {
emh203 0:3d9c67d97d6f 423 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 424 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 425 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 426
emh203 0:3d9c67d97d6f 427 // loop for butterfly
emh203 0:3d9c67d97d6f 428 i = j;
emh203 0:3d9c67d97d6f 429 do
emh203 0:3d9c67d97d6f 430 {
emh203 0:3d9c67d97d6f 431 l = i + n2;
emh203 0:3d9c67d97d6f 432 a0 = pSrc[2 * i] + pSrc[2 * l];
emh203 0:3d9c67d97d6f 433 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 434
emh203 0:3d9c67d97d6f 435 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 436 a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1];
emh203 0:3d9c67d97d6f 437
emh203 0:3d9c67d97d6f 438 p0 = xt * cosVal;
emh203 0:3d9c67d97d6f 439 p1 = yt * sinVal;
emh203 0:3d9c67d97d6f 440 p2 = yt * cosVal;
emh203 0:3d9c67d97d6f 441 p3 = xt * sinVal;
emh203 0:3d9c67d97d6f 442
emh203 0:3d9c67d97d6f 443 pSrc[2 * i] = a0;
emh203 0:3d9c67d97d6f 444 pSrc[2 * i + 1] = a1;
emh203 0:3d9c67d97d6f 445
emh203 0:3d9c67d97d6f 446 pSrc[2 * l] = p0 - p1;
emh203 0:3d9c67d97d6f 447 pSrc[2 * l + 1] = p2 + p3;
emh203 0:3d9c67d97d6f 448
emh203 0:3d9c67d97d6f 449 i += n1;
emh203 0:3d9c67d97d6f 450 } while( i < fftLen ); // butterfly loop end
emh203 0:3d9c67d97d6f 451 j++;
emh203 0:3d9c67d97d6f 452 } while( j < n2 ); // groups loop end
emh203 0:3d9c67d97d6f 453
emh203 0:3d9c67d97d6f 454 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 455 } // stages loop end
emh203 0:3d9c67d97d6f 456
emh203 0:3d9c67d97d6f 457 n1 = n2;
emh203 0:3d9c67d97d6f 458 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 459
emh203 0:3d9c67d97d6f 460 // loop for butterfly
emh203 0:3d9c67d97d6f 461 for (i = 0; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 462 {
emh203 0:3d9c67d97d6f 463 l = i + n2;
emh203 0:3d9c67d97d6f 464
emh203 0:3d9c67d97d6f 465 a0 = pSrc[2 * i] + pSrc[2 * l];
emh203 0:3d9c67d97d6f 466 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 467
emh203 0:3d9c67d97d6f 468 a1 = pSrc[2 * l + 1] + pSrc[2 * i + 1];
emh203 0:3d9c67d97d6f 469 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 470
emh203 0:3d9c67d97d6f 471 p0 = a0 * onebyfftLen;
emh203 0:3d9c67d97d6f 472 p2 = xt * onebyfftLen;
emh203 0:3d9c67d97d6f 473 p1 = a1 * onebyfftLen;
emh203 0:3d9c67d97d6f 474 p3 = yt * onebyfftLen;
emh203 0:3d9c67d97d6f 475
emh203 0:3d9c67d97d6f 476 pSrc[2 * i] = p0;
emh203 0:3d9c67d97d6f 477 pSrc[2u * l] = p2;
emh203 0:3d9c67d97d6f 478
emh203 0:3d9c67d97d6f 479 pSrc[2 * i + 1] = p1;
emh203 0:3d9c67d97d6f 480 pSrc[2u * l + 1u] = p3;
emh203 0:3d9c67d97d6f 481 } // butterfly loop end
emh203 0:3d9c67d97d6f 482
emh203 0:3d9c67d97d6f 483 #endif // #ifndef ARM_MATH_CM0_FAMILY
emh203 0:3d9c67d97d6f 484
emh203 0:3d9c67d97d6f 485 }