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:
Mon Jun 23 09:30:09 2014 +0100
Revision:
4:9cee975aadce
Parent:
3:7a284390b0ce
Child:
5:3762170b6d4d
Synchronized with git revision 6e7c7bcec41226f536474daae3c13d49e4c0e865

Full URL: https://github.com/mbedmicro/mbed/commit/6e7c7bcec41226f536474daae3c13d49e4c0e865/

Fix signed unsigned compare in dsp library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:fdd22bb7aa52 1 /* ----------------------------------------------------------------------
mbed_official 3:7a284390b0ce 2 * Copyright (C) 2010-2013 ARM Limited. All rights reserved.
emilmont 1:fdd22bb7aa52 3 *
mbed_official 3:7a284390b0ce 4 * $Date: 17. January 2013
mbed_official 3:7a284390b0ce 5 * $Revision: V1.4.1
emilmont 1:fdd22bb7aa52 6 *
emilmont 2:da51fb522205 7 * Project: CMSIS DSP Library
emilmont 2:da51fb522205 8 * Title: arm_cfft_radix4_f32.c
emilmont 1:fdd22bb7aa52 9 *
emilmont 2:da51fb522205 10 * Description: Radix-4 Decimation in Frequency CFFT & CIFFT Floating point processing function
emilmont 1:fdd22bb7aa52 11 *
emilmont 1:fdd22bb7aa52 12 *
emilmont 1:fdd22bb7aa52 13 * Target Processor: Cortex-M4/Cortex-M3/Cortex-M0
emilmont 1:fdd22bb7aa52 14 *
mbed_official 3:7a284390b0ce 15 * Redistribution and use in source and binary forms, with or without
mbed_official 3:7a284390b0ce 16 * modification, are permitted provided that the following conditions
mbed_official 3:7a284390b0ce 17 * are met:
mbed_official 3:7a284390b0ce 18 * - Redistributions of source code must retain the above copyright
mbed_official 3:7a284390b0ce 19 * notice, this list of conditions and the following disclaimer.
mbed_official 3:7a284390b0ce 20 * - Redistributions in binary form must reproduce the above copyright
mbed_official 3:7a284390b0ce 21 * notice, this list of conditions and the following disclaimer in
mbed_official 3:7a284390b0ce 22 * the documentation and/or other materials provided with the
mbed_official 3:7a284390b0ce 23 * distribution.
mbed_official 3:7a284390b0ce 24 * - Neither the name of ARM LIMITED nor the names of its contributors
mbed_official 3:7a284390b0ce 25 * may be used to endorse or promote products derived from this
mbed_official 3:7a284390b0ce 26 * software without specific prior written permission.
mbed_official 3:7a284390b0ce 27 *
mbed_official 3:7a284390b0ce 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
mbed_official 3:7a284390b0ce 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
mbed_official 3:7a284390b0ce 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
mbed_official 3:7a284390b0ce 31 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
mbed_official 3:7a284390b0ce 32 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
mbed_official 3:7a284390b0ce 33 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
mbed_official 3:7a284390b0ce 34 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
mbed_official 3:7a284390b0ce 35 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
mbed_official 3:7a284390b0ce 36 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
mbed_official 3:7a284390b0ce 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
mbed_official 3:7a284390b0ce 38 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 3:7a284390b0ce 39 * POSSIBILITY OF SUCH DAMAGE.
emilmont 1:fdd22bb7aa52 40 * -------------------------------------------------------------------- */
emilmont 1:fdd22bb7aa52 41
emilmont 1:fdd22bb7aa52 42 #include "arm_math.h"
emilmont 1:fdd22bb7aa52 43
mbed_official 3:7a284390b0ce 44 extern void arm_bitreversal_f32(
mbed_official 3:7a284390b0ce 45 float32_t * pSrc,
mbed_official 3:7a284390b0ce 46 uint16_t fftSize,
mbed_official 3:7a284390b0ce 47 uint16_t bitRevFactor,
mbed_official 3:7a284390b0ce 48 uint16_t * pBitRevTab);
emilmont 1:fdd22bb7aa52 49
emilmont 1:fdd22bb7aa52 50 /**
mbed_official 3:7a284390b0ce 51 * @ingroup groupTransforms
mbed_official 3:7a284390b0ce 52 */
emilmont 1:fdd22bb7aa52 53
emilmont 1:fdd22bb7aa52 54 /* ----------------------------------------------------------------------
emilmont 1:fdd22bb7aa52 55 ** Internal helper function used by the FFTs
emilmont 1:fdd22bb7aa52 56 ** ------------------------------------------------------------------- */
emilmont 1:fdd22bb7aa52 57
emilmont 1:fdd22bb7aa52 58 /*
mbed_official 3:7a284390b0ce 59 * @brief Core function for the floating-point CFFT butterfly process.
mbed_official 3:7a284390b0ce 60 * @param[in, out] *pSrc points to the in-place buffer of floating-point data type.
mbed_official 3:7a284390b0ce 61 * @param[in] fftLen length of the FFT.
mbed_official 3:7a284390b0ce 62 * @param[in] *pCoef points to the twiddle coefficient buffer.
mbed_official 3:7a284390b0ce 63 * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
mbed_official 3:7a284390b0ce 64 * @return none.
mbed_official 3:7a284390b0ce 65 */
emilmont 1:fdd22bb7aa52 66
emilmont 1:fdd22bb7aa52 67 void arm_radix4_butterfly_f32(
mbed_official 3:7a284390b0ce 68 float32_t * pSrc,
mbed_official 3:7a284390b0ce 69 uint16_t fftLen,
mbed_official 3:7a284390b0ce 70 float32_t * pCoef,
mbed_official 3:7a284390b0ce 71 uint16_t twidCoefModifier)
emilmont 1:fdd22bb7aa52 72 {
emilmont 1:fdd22bb7aa52 73
mbed_official 3:7a284390b0ce 74 float32_t co1, co2, co3, si1, si2, si3;
mbed_official 3:7a284390b0ce 75 uint32_t ia1, ia2, ia3;
mbed_official 3:7a284390b0ce 76 uint32_t i0, i1, i2, i3;
mbed_official 3:7a284390b0ce 77 uint32_t n1, n2, j, k;
emilmont 1:fdd22bb7aa52 78
mbed_official 3:7a284390b0ce 79 #ifndef ARM_MATH_CM0_FAMILY_FAMILY
emilmont 1:fdd22bb7aa52 80
mbed_official 3:7a284390b0ce 81 /* Run the below code for Cortex-M4 and Cortex-M3 */
emilmont 1:fdd22bb7aa52 82
mbed_official 3:7a284390b0ce 83 float32_t xaIn, yaIn, xbIn, ybIn, xcIn, ycIn, xdIn, ydIn;
mbed_official 3:7a284390b0ce 84 float32_t Xaplusc, Xbplusd, Yaplusc, Ybplusd, Xaminusc, Xbminusd, Yaminusc,
mbed_official 3:7a284390b0ce 85 Ybminusd;
mbed_official 3:7a284390b0ce 86 float32_t Xb12C_out, Yb12C_out, Xc12C_out, Yc12C_out, Xd12C_out, Yd12C_out;
mbed_official 3:7a284390b0ce 87 float32_t Xb12_out, Yb12_out, Xc12_out, Yc12_out, Xd12_out, Yd12_out;
mbed_official 3:7a284390b0ce 88 float32_t *ptr1;
mbed_official 3:7a284390b0ce 89 float32_t p0,p1,p2,p3,p4,p5;
mbed_official 3:7a284390b0ce 90 float32_t a0,a1,a2,a3,a4,a5,a6,a7;
emilmont 1:fdd22bb7aa52 91
mbed_official 3:7a284390b0ce 92 /* Initializations for the first stage */
mbed_official 3:7a284390b0ce 93 n2 = fftLen;
mbed_official 3:7a284390b0ce 94 n1 = n2;
emilmont 1:fdd22bb7aa52 95
mbed_official 3:7a284390b0ce 96 /* n2 = fftLen/4 */
mbed_official 3:7a284390b0ce 97 n2 >>= 2u;
mbed_official 3:7a284390b0ce 98 i0 = 0u;
mbed_official 3:7a284390b0ce 99 ia1 = 0u;
emilmont 1:fdd22bb7aa52 100
mbed_official 3:7a284390b0ce 101 j = n2;
emilmont 1:fdd22bb7aa52 102
mbed_official 3:7a284390b0ce 103 /* Calculation of first stage */
mbed_official 3:7a284390b0ce 104 do
mbed_official 3:7a284390b0ce 105 {
mbed_official 3:7a284390b0ce 106 /* index calculation for the input as, */
mbed_official 3:7a284390b0ce 107 /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */
mbed_official 3:7a284390b0ce 108 i1 = i0 + n2;
mbed_official 3:7a284390b0ce 109 i2 = i1 + n2;
mbed_official 3:7a284390b0ce 110 i3 = i2 + n2;
emilmont 1:fdd22bb7aa52 111
mbed_official 3:7a284390b0ce 112 xaIn = pSrc[(2u * i0)];
mbed_official 3:7a284390b0ce 113 yaIn = pSrc[(2u * i0) + 1u];
emilmont 1:fdd22bb7aa52 114
mbed_official 3:7a284390b0ce 115 xbIn = pSrc[(2u * i1)];
mbed_official 3:7a284390b0ce 116 ybIn = pSrc[(2u * i1) + 1u];
emilmont 1:fdd22bb7aa52 117
mbed_official 3:7a284390b0ce 118 xcIn = pSrc[(2u * i2)];
mbed_official 3:7a284390b0ce 119 ycIn = pSrc[(2u * i2) + 1u];
emilmont 1:fdd22bb7aa52 120
mbed_official 3:7a284390b0ce 121 xdIn = pSrc[(2u * i3)];
mbed_official 3:7a284390b0ce 122 ydIn = pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 123
mbed_official 3:7a284390b0ce 124 /* xa + xc */
mbed_official 3:7a284390b0ce 125 Xaplusc = xaIn + xcIn;
mbed_official 3:7a284390b0ce 126 /* xb + xd */
mbed_official 3:7a284390b0ce 127 Xbplusd = xbIn + xdIn;
mbed_official 3:7a284390b0ce 128 /* ya + yc */
mbed_official 3:7a284390b0ce 129 Yaplusc = yaIn + ycIn;
mbed_official 3:7a284390b0ce 130 /* yb + yd */
mbed_official 3:7a284390b0ce 131 Ybplusd = ybIn + ydIn;
emilmont 1:fdd22bb7aa52 132
emilmont 1:fdd22bb7aa52 133 /* index calculation for the coefficients */
emilmont 1:fdd22bb7aa52 134 ia2 = ia1 + ia1;
mbed_official 3:7a284390b0ce 135 co2 = pCoef[ia2 * 2u];
mbed_official 3:7a284390b0ce 136 si2 = pCoef[(ia2 * 2u) + 1u];
mbed_official 3:7a284390b0ce 137
mbed_official 3:7a284390b0ce 138 /* xa - xc */
mbed_official 3:7a284390b0ce 139 Xaminusc = xaIn - xcIn;
mbed_official 3:7a284390b0ce 140 /* xb - xd */
mbed_official 3:7a284390b0ce 141 Xbminusd = xbIn - xdIn;
mbed_official 3:7a284390b0ce 142 /* ya - yc */
mbed_official 3:7a284390b0ce 143 Yaminusc = yaIn - ycIn;
mbed_official 3:7a284390b0ce 144 /* yb - yd */
mbed_official 3:7a284390b0ce 145 Ybminusd = ybIn - ydIn;
mbed_official 3:7a284390b0ce 146
mbed_official 3:7a284390b0ce 147 /* xa' = xa + xb + xc + xd */
mbed_official 3:7a284390b0ce 148 pSrc[(2u * i0)] = Xaplusc + Xbplusd;
mbed_official 3:7a284390b0ce 149 /* ya' = ya + yb + yc + yd */
mbed_official 3:7a284390b0ce 150 pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd;
mbed_official 3:7a284390b0ce 151
mbed_official 3:7a284390b0ce 152 /* (xa - xc) + (yb - yd) */
mbed_official 3:7a284390b0ce 153 Xb12C_out = (Xaminusc + Ybminusd);
mbed_official 3:7a284390b0ce 154 /* (ya - yc) + (xb - xd) */
mbed_official 3:7a284390b0ce 155 Yb12C_out = (Yaminusc - Xbminusd);
mbed_official 3:7a284390b0ce 156 /* (xa + xc) - (xb + xd) */
mbed_official 3:7a284390b0ce 157 Xc12C_out = (Xaplusc - Xbplusd);
mbed_official 3:7a284390b0ce 158 /* (ya + yc) - (yb + yd) */
mbed_official 3:7a284390b0ce 159 Yc12C_out = (Yaplusc - Ybplusd);
mbed_official 3:7a284390b0ce 160 /* (xa - xc) - (yb - yd) */
mbed_official 3:7a284390b0ce 161 Xd12C_out = (Xaminusc - Ybminusd);
mbed_official 3:7a284390b0ce 162 /* (ya - yc) + (xb - xd) */
mbed_official 3:7a284390b0ce 163 Yd12C_out = (Xbminusd + Yaminusc);
mbed_official 3:7a284390b0ce 164
emilmont 1:fdd22bb7aa52 165 co1 = pCoef[ia1 * 2u];
emilmont 1:fdd22bb7aa52 166 si1 = pCoef[(ia1 * 2u) + 1u];
mbed_official 3:7a284390b0ce 167
mbed_official 3:7a284390b0ce 168 /* index calculation for the coefficients */
mbed_official 3:7a284390b0ce 169 ia3 = ia2 + ia1;
emilmont 1:fdd22bb7aa52 170 co3 = pCoef[ia3 * 2u];
emilmont 1:fdd22bb7aa52 171 si3 = pCoef[(ia3 * 2u) + 1u];
emilmont 1:fdd22bb7aa52 172
mbed_official 3:7a284390b0ce 173 Xb12_out = Xb12C_out * co1;
mbed_official 3:7a284390b0ce 174 Yb12_out = Yb12C_out * co1;
mbed_official 3:7a284390b0ce 175 Xc12_out = Xc12C_out * co2;
mbed_official 3:7a284390b0ce 176 Yc12_out = Yc12C_out * co2;
mbed_official 3:7a284390b0ce 177 Xd12_out = Xd12C_out * co3;
mbed_official 3:7a284390b0ce 178 Yd12_out = Yd12C_out * co3;
mbed_official 3:7a284390b0ce 179
mbed_official 3:7a284390b0ce 180 /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 181 //Xb12_out -= Yb12C_out * si1;
mbed_official 3:7a284390b0ce 182 p0 = Yb12C_out * si1;
mbed_official 3:7a284390b0ce 183 /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 184 //Yb12_out += Xb12C_out * si1;
mbed_official 3:7a284390b0ce 185 p1 = Xb12C_out * si1;
mbed_official 3:7a284390b0ce 186 /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 187 //Xc12_out -= Yc12C_out * si2;
mbed_official 3:7a284390b0ce 188 p2 = Yc12C_out * si2;
mbed_official 3:7a284390b0ce 189 /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 190 //Yc12_out += Xc12C_out * si2;
mbed_official 3:7a284390b0ce 191 p3 = Xc12C_out * si2;
mbed_official 3:7a284390b0ce 192 /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 193 //Xd12_out -= Yd12C_out * si3;
mbed_official 3:7a284390b0ce 194 p4 = Yd12C_out * si3;
mbed_official 3:7a284390b0ce 195 /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 196 //Yd12_out += Xd12C_out * si3;
mbed_official 3:7a284390b0ce 197 p5 = Xd12C_out * si3;
mbed_official 3:7a284390b0ce 198
mbed_official 3:7a284390b0ce 199 Xb12_out += p0;
mbed_official 3:7a284390b0ce 200 Yb12_out -= p1;
mbed_official 3:7a284390b0ce 201 Xc12_out += p2;
mbed_official 3:7a284390b0ce 202 Yc12_out -= p3;
mbed_official 3:7a284390b0ce 203 Xd12_out += p4;
mbed_official 3:7a284390b0ce 204 Yd12_out -= p5;
emilmont 1:fdd22bb7aa52 205
mbed_official 3:7a284390b0ce 206 /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 207 pSrc[2u * i1] = Xc12_out;
mbed_official 3:7a284390b0ce 208
mbed_official 3:7a284390b0ce 209 /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 210 pSrc[(2u * i1) + 1u] = Yc12_out;
mbed_official 3:7a284390b0ce 211
mbed_official 3:7a284390b0ce 212 /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 213 pSrc[2u * i2] = Xb12_out;
mbed_official 3:7a284390b0ce 214
mbed_official 3:7a284390b0ce 215 /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 216 pSrc[(2u * i2) + 1u] = Yb12_out;
emilmont 1:fdd22bb7aa52 217
mbed_official 3:7a284390b0ce 218 /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 219 pSrc[2u * i3] = Xd12_out;
mbed_official 3:7a284390b0ce 220
mbed_official 3:7a284390b0ce 221 /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 222 pSrc[(2u * i3) + 1u] = Yd12_out;
emilmont 1:fdd22bb7aa52 223
mbed_official 3:7a284390b0ce 224 /* Twiddle coefficients index modifier */
mbed_official 3:7a284390b0ce 225 ia1 += twidCoefModifier;
mbed_official 3:7a284390b0ce 226
mbed_official 3:7a284390b0ce 227 /* Updating input index */
mbed_official 3:7a284390b0ce 228 i0++;
mbed_official 3:7a284390b0ce 229
mbed_official 3:7a284390b0ce 230 }
mbed_official 3:7a284390b0ce 231 while(--j);
mbed_official 3:7a284390b0ce 232
mbed_official 3:7a284390b0ce 233 twidCoefModifier <<= 2u;
emilmont 1:fdd22bb7aa52 234
mbed_official 3:7a284390b0ce 235 /* Calculation of second stage to excluding last stage */
mbed_official 3:7a284390b0ce 236 for (k = fftLen >> 2u; k > 4u; k >>= 2u)
mbed_official 3:7a284390b0ce 237 {
mbed_official 3:7a284390b0ce 238 /* Initializations for the first stage */
mbed_official 3:7a284390b0ce 239 n1 = n2;
mbed_official 3:7a284390b0ce 240 n2 >>= 2u;
mbed_official 3:7a284390b0ce 241 ia1 = 0u;
emilmont 1:fdd22bb7aa52 242
mbed_official 3:7a284390b0ce 243 /* Calculation of first stage */
mbed_official 3:7a284390b0ce 244 j = 0;
mbed_official 3:7a284390b0ce 245 do
mbed_official 3:7a284390b0ce 246 {
mbed_official 3:7a284390b0ce 247 /* index calculation for the coefficients */
mbed_official 3:7a284390b0ce 248 ia2 = ia1 + ia1;
mbed_official 3:7a284390b0ce 249 ia3 = ia2 + ia1;
mbed_official 3:7a284390b0ce 250 co1 = pCoef[ia1 * 2u];
mbed_official 3:7a284390b0ce 251 si1 = pCoef[(ia1 * 2u) + 1u];
mbed_official 3:7a284390b0ce 252 co2 = pCoef[ia2 * 2u];
mbed_official 3:7a284390b0ce 253 si2 = pCoef[(ia2 * 2u) + 1u];
mbed_official 3:7a284390b0ce 254 co3 = pCoef[ia3 * 2u];
mbed_official 3:7a284390b0ce 255 si3 = pCoef[(ia3 * 2u) + 1u];
emilmont 1:fdd22bb7aa52 256
mbed_official 3:7a284390b0ce 257 /* Twiddle coefficients index modifier */
mbed_official 3:7a284390b0ce 258 ia1 += twidCoefModifier;
mbed_official 3:7a284390b0ce 259
mbed_official 3:7a284390b0ce 260 i0 = j;
mbed_official 3:7a284390b0ce 261 do
mbed_official 3:7a284390b0ce 262 {
mbed_official 3:7a284390b0ce 263 /* index calculation for the input as, */
mbed_official 3:7a284390b0ce 264 /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */
mbed_official 3:7a284390b0ce 265 i1 = i0 + n2;
mbed_official 3:7a284390b0ce 266 i2 = i1 + n2;
mbed_official 3:7a284390b0ce 267 i3 = i2 + n2;
mbed_official 3:7a284390b0ce 268
mbed_official 3:7a284390b0ce 269 xaIn = pSrc[(2u * i0)];
mbed_official 3:7a284390b0ce 270 yaIn = pSrc[(2u * i0) + 1u];
mbed_official 3:7a284390b0ce 271
mbed_official 3:7a284390b0ce 272 xbIn = pSrc[(2u * i1)];
mbed_official 3:7a284390b0ce 273 ybIn = pSrc[(2u * i1) + 1u];
mbed_official 3:7a284390b0ce 274
mbed_official 3:7a284390b0ce 275 xcIn = pSrc[(2u * i2)];
mbed_official 3:7a284390b0ce 276 ycIn = pSrc[(2u * i2) + 1u];
emilmont 1:fdd22bb7aa52 277
mbed_official 3:7a284390b0ce 278 xdIn = pSrc[(2u * i3)];
mbed_official 3:7a284390b0ce 279 ydIn = pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 280
mbed_official 3:7a284390b0ce 281 /* xa - xc */
mbed_official 3:7a284390b0ce 282 Xaminusc = xaIn - xcIn;
mbed_official 3:7a284390b0ce 283 /* (xb - xd) */
mbed_official 3:7a284390b0ce 284 Xbminusd = xbIn - xdIn;
mbed_official 3:7a284390b0ce 285 /* ya - yc */
mbed_official 3:7a284390b0ce 286 Yaminusc = yaIn - ycIn;
mbed_official 3:7a284390b0ce 287 /* (yb - yd) */
mbed_official 3:7a284390b0ce 288 Ybminusd = ybIn - ydIn;
emilmont 1:fdd22bb7aa52 289
mbed_official 3:7a284390b0ce 290 /* xa + xc */
mbed_official 3:7a284390b0ce 291 Xaplusc = xaIn + xcIn;
mbed_official 3:7a284390b0ce 292 /* xb + xd */
mbed_official 3:7a284390b0ce 293 Xbplusd = xbIn + xdIn;
mbed_official 3:7a284390b0ce 294 /* ya + yc */
mbed_official 3:7a284390b0ce 295 Yaplusc = yaIn + ycIn;
mbed_official 3:7a284390b0ce 296 /* yb + yd */
mbed_official 3:7a284390b0ce 297 Ybplusd = ybIn + ydIn;
emilmont 1:fdd22bb7aa52 298
mbed_official 3:7a284390b0ce 299 /* (xa - xc) + (yb - yd) */
mbed_official 3:7a284390b0ce 300 Xb12C_out = (Xaminusc + Ybminusd);
mbed_official 3:7a284390b0ce 301 /* (ya - yc) - (xb - xd) */
mbed_official 3:7a284390b0ce 302 Yb12C_out = (Yaminusc - Xbminusd);
mbed_official 3:7a284390b0ce 303 /* xa + xc -(xb + xd) */
mbed_official 3:7a284390b0ce 304 Xc12C_out = (Xaplusc - Xbplusd);
mbed_official 3:7a284390b0ce 305 /* (ya + yc) - (yb + yd) */
mbed_official 3:7a284390b0ce 306 Yc12C_out = (Yaplusc - Ybplusd);
mbed_official 3:7a284390b0ce 307 /* (xa - xc) - (yb - yd) */
mbed_official 3:7a284390b0ce 308 Xd12C_out = (Xaminusc - Ybminusd);
mbed_official 3:7a284390b0ce 309 /* (ya - yc) + (xb - xd) */
mbed_official 3:7a284390b0ce 310 Yd12C_out = (Xbminusd + Yaminusc);
emilmont 1:fdd22bb7aa52 311
mbed_official 3:7a284390b0ce 312 pSrc[(2u * i0)] = Xaplusc + Xbplusd;
mbed_official 3:7a284390b0ce 313 pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd;
emilmont 1:fdd22bb7aa52 314
mbed_official 3:7a284390b0ce 315 Xb12_out = Xb12C_out * co1;
mbed_official 3:7a284390b0ce 316 Yb12_out = Yb12C_out * co1;
mbed_official 3:7a284390b0ce 317 Xc12_out = Xc12C_out * co2;
mbed_official 3:7a284390b0ce 318 Yc12_out = Yc12C_out * co2;
mbed_official 3:7a284390b0ce 319 Xd12_out = Xd12C_out * co3;
mbed_official 3:7a284390b0ce 320 Yd12_out = Yd12C_out * co3;
mbed_official 3:7a284390b0ce 321
mbed_official 3:7a284390b0ce 322 /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 323 //Xb12_out -= Yb12C_out * si1;
mbed_official 3:7a284390b0ce 324 p0 = Yb12C_out * si1;
mbed_official 3:7a284390b0ce 325 /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 326 //Yb12_out += Xb12C_out * si1;
mbed_official 3:7a284390b0ce 327 p1 = Xb12C_out * si1;
mbed_official 3:7a284390b0ce 328 /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 329 //Xc12_out -= Yc12C_out * si2;
mbed_official 3:7a284390b0ce 330 p2 = Yc12C_out * si2;
mbed_official 3:7a284390b0ce 331 /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 332 //Yc12_out += Xc12C_out * si2;
mbed_official 3:7a284390b0ce 333 p3 = Xc12C_out * si2;
mbed_official 3:7a284390b0ce 334 /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 335 //Xd12_out -= Yd12C_out * si3;
mbed_official 3:7a284390b0ce 336 p4 = Yd12C_out * si3;
mbed_official 3:7a284390b0ce 337 /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 338 //Yd12_out += Xd12C_out * si3;
mbed_official 3:7a284390b0ce 339 p5 = Xd12C_out * si3;
mbed_official 3:7a284390b0ce 340
mbed_official 3:7a284390b0ce 341 Xb12_out += p0;
mbed_official 3:7a284390b0ce 342 Yb12_out -= p1;
mbed_official 3:7a284390b0ce 343 Xc12_out += p2;
mbed_official 3:7a284390b0ce 344 Yc12_out -= p3;
mbed_official 3:7a284390b0ce 345 Xd12_out += p4;
mbed_official 3:7a284390b0ce 346 Yd12_out -= p5;
emilmont 1:fdd22bb7aa52 347
mbed_official 3:7a284390b0ce 348 /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 349 pSrc[2u * i1] = Xc12_out;
emilmont 1:fdd22bb7aa52 350
mbed_official 3:7a284390b0ce 351 /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 352 pSrc[(2u * i1) + 1u] = Yc12_out;
mbed_official 3:7a284390b0ce 353
mbed_official 3:7a284390b0ce 354 /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 355 pSrc[2u * i2] = Xb12_out;
emilmont 1:fdd22bb7aa52 356
mbed_official 3:7a284390b0ce 357 /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 358 pSrc[(2u * i2) + 1u] = Yb12_out;
emilmont 1:fdd22bb7aa52 359
mbed_official 3:7a284390b0ce 360 /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 361 pSrc[2u * i3] = Xd12_out;
emilmont 1:fdd22bb7aa52 362
mbed_official 3:7a284390b0ce 363 /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 364 pSrc[(2u * i3) + 1u] = Yd12_out;
emilmont 1:fdd22bb7aa52 365
mbed_official 3:7a284390b0ce 366 i0 += n1;
mbed_official 3:7a284390b0ce 367 } while(i0 < fftLen);
mbed_official 3:7a284390b0ce 368 j++;
mbed_official 3:7a284390b0ce 369 } while(j <= (n2 - 1u));
mbed_official 3:7a284390b0ce 370 twidCoefModifier <<= 2u;
mbed_official 3:7a284390b0ce 371 }
emilmont 1:fdd22bb7aa52 372
mbed_official 3:7a284390b0ce 373 j = fftLen >> 2;
mbed_official 3:7a284390b0ce 374 ptr1 = &pSrc[0];
emilmont 1:fdd22bb7aa52 375
mbed_official 3:7a284390b0ce 376 /* Calculations of last stage */
mbed_official 3:7a284390b0ce 377 do
mbed_official 3:7a284390b0ce 378 {
mbed_official 3:7a284390b0ce 379 xaIn = ptr1[0];
mbed_official 3:7a284390b0ce 380 yaIn = ptr1[1];
mbed_official 3:7a284390b0ce 381 xbIn = ptr1[2];
mbed_official 3:7a284390b0ce 382 ybIn = ptr1[3];
mbed_official 3:7a284390b0ce 383 xcIn = ptr1[4];
mbed_official 3:7a284390b0ce 384 ycIn = ptr1[5];
mbed_official 3:7a284390b0ce 385 xdIn = ptr1[6];
mbed_official 3:7a284390b0ce 386 ydIn = ptr1[7];
emilmont 1:fdd22bb7aa52 387
mbed_official 3:7a284390b0ce 388 /* xa + xc */
mbed_official 3:7a284390b0ce 389 Xaplusc = xaIn + xcIn;
mbed_official 3:7a284390b0ce 390
mbed_official 3:7a284390b0ce 391 /* xa - xc */
mbed_official 3:7a284390b0ce 392 Xaminusc = xaIn - xcIn;
emilmont 1:fdd22bb7aa52 393
mbed_official 3:7a284390b0ce 394 /* ya + yc */
mbed_official 3:7a284390b0ce 395 Yaplusc = yaIn + ycIn;
mbed_official 3:7a284390b0ce 396
mbed_official 3:7a284390b0ce 397 /* ya - yc */
mbed_official 3:7a284390b0ce 398 Yaminusc = yaIn - ycIn;
mbed_official 3:7a284390b0ce 399
mbed_official 3:7a284390b0ce 400 /* xb + xd */
mbed_official 3:7a284390b0ce 401 Xbplusd = xbIn + xdIn;
emilmont 1:fdd22bb7aa52 402
mbed_official 3:7a284390b0ce 403 /* yb + yd */
mbed_official 3:7a284390b0ce 404 Ybplusd = ybIn + ydIn;
emilmont 1:fdd22bb7aa52 405
mbed_official 3:7a284390b0ce 406 /* (xb-xd) */
mbed_official 3:7a284390b0ce 407 Xbminusd = xbIn - xdIn;
mbed_official 3:7a284390b0ce 408
mbed_official 3:7a284390b0ce 409 /* (yb-yd) */
mbed_official 3:7a284390b0ce 410 Ybminusd = ybIn - ydIn;
emilmont 1:fdd22bb7aa52 411
mbed_official 3:7a284390b0ce 412 /* xa' = xa + xb + xc + xd */
mbed_official 3:7a284390b0ce 413 a0 = (Xaplusc + Xbplusd);
mbed_official 3:7a284390b0ce 414 /* ya' = ya + yb + yc + yd */
mbed_official 3:7a284390b0ce 415 a1 = (Yaplusc + Ybplusd);
mbed_official 3:7a284390b0ce 416 /* xc' = (xa-xb+xc-xd) */
mbed_official 3:7a284390b0ce 417 a2 = (Xaplusc - Xbplusd);
mbed_official 3:7a284390b0ce 418 /* yc' = (ya-yb+yc-yd) */
mbed_official 3:7a284390b0ce 419 a3 = (Yaplusc - Ybplusd);
mbed_official 3:7a284390b0ce 420 /* xb' = (xa+yb-xc-yd) */
mbed_official 3:7a284390b0ce 421 a4 = (Xaminusc + Ybminusd);
mbed_official 3:7a284390b0ce 422 /* yb' = (ya-xb-yc+xd) */
mbed_official 3:7a284390b0ce 423 a5 = (Yaminusc - Xbminusd);
mbed_official 3:7a284390b0ce 424 /* xd' = (xa-yb-xc+yd)) */
mbed_official 3:7a284390b0ce 425 a6 = (Xaminusc - Ybminusd);
mbed_official 3:7a284390b0ce 426 /* yd' = (ya+xb-yc-xd) */
mbed_official 3:7a284390b0ce 427 a7 = (Xbminusd + Yaminusc);
mbed_official 3:7a284390b0ce 428
mbed_official 3:7a284390b0ce 429 ptr1[0] = a0;
mbed_official 3:7a284390b0ce 430 ptr1[1] = a1;
mbed_official 3:7a284390b0ce 431 ptr1[2] = a2;
mbed_official 3:7a284390b0ce 432 ptr1[3] = a3;
mbed_official 3:7a284390b0ce 433 ptr1[4] = a4;
mbed_official 3:7a284390b0ce 434 ptr1[5] = a5;
mbed_official 3:7a284390b0ce 435 ptr1[6] = a6;
mbed_official 3:7a284390b0ce 436 ptr1[7] = a7;
emilmont 1:fdd22bb7aa52 437
mbed_official 3:7a284390b0ce 438 /* increment pointer by 8 */
mbed_official 3:7a284390b0ce 439 ptr1 += 8u;
mbed_official 3:7a284390b0ce 440 } while(--j);
emilmont 1:fdd22bb7aa52 441
emilmont 1:fdd22bb7aa52 442 #else
emilmont 1:fdd22bb7aa52 443
mbed_official 3:7a284390b0ce 444 float32_t t1, t2, r1, r2, s1, s2;
emilmont 1:fdd22bb7aa52 445
mbed_official 3:7a284390b0ce 446 /* Run the below code for Cortex-M0 */
emilmont 1:fdd22bb7aa52 447
mbed_official 3:7a284390b0ce 448 /* Initializations for the fft calculation */
mbed_official 3:7a284390b0ce 449 n2 = fftLen;
mbed_official 3:7a284390b0ce 450 n1 = n2;
mbed_official 3:7a284390b0ce 451 for (k = fftLen; k > 1u; k >>= 2u)
mbed_official 3:7a284390b0ce 452 {
mbed_official 3:7a284390b0ce 453 /* Initializations for the fft calculation */
mbed_official 3:7a284390b0ce 454 n1 = n2;
mbed_official 3:7a284390b0ce 455 n2 >>= 2u;
mbed_official 3:7a284390b0ce 456 ia1 = 0u;
emilmont 1:fdd22bb7aa52 457
mbed_official 3:7a284390b0ce 458 /* FFT Calculation */
mbed_official 3:7a284390b0ce 459 j = 0;
mbed_official 3:7a284390b0ce 460 do
emilmont 1:fdd22bb7aa52 461 {
mbed_official 3:7a284390b0ce 462 /* index calculation for the coefficients */
mbed_official 3:7a284390b0ce 463 ia2 = ia1 + ia1;
mbed_official 3:7a284390b0ce 464 ia3 = ia2 + ia1;
mbed_official 3:7a284390b0ce 465 co1 = pCoef[ia1 * 2u];
mbed_official 3:7a284390b0ce 466 si1 = pCoef[(ia1 * 2u) + 1u];
mbed_official 3:7a284390b0ce 467 co2 = pCoef[ia2 * 2u];
mbed_official 3:7a284390b0ce 468 si2 = pCoef[(ia2 * 2u) + 1u];
mbed_official 3:7a284390b0ce 469 co3 = pCoef[ia3 * 2u];
mbed_official 3:7a284390b0ce 470 si3 = pCoef[(ia3 * 2u) + 1u];
emilmont 1:fdd22bb7aa52 471
mbed_official 3:7a284390b0ce 472 /* Twiddle coefficients index modifier */
mbed_official 3:7a284390b0ce 473 ia1 = ia1 + twidCoefModifier;
emilmont 1:fdd22bb7aa52 474
mbed_official 3:7a284390b0ce 475 i0 = j;
mbed_official 3:7a284390b0ce 476 do
mbed_official 3:7a284390b0ce 477 {
mbed_official 3:7a284390b0ce 478 /* index calculation for the input as, */
mbed_official 3:7a284390b0ce 479 /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */
mbed_official 3:7a284390b0ce 480 i1 = i0 + n2;
mbed_official 3:7a284390b0ce 481 i2 = i1 + n2;
mbed_official 3:7a284390b0ce 482 i3 = i2 + n2;
emilmont 1:fdd22bb7aa52 483
mbed_official 3:7a284390b0ce 484 /* xa + xc */
mbed_official 3:7a284390b0ce 485 r1 = pSrc[(2u * i0)] + pSrc[(2u * i2)];
emilmont 1:fdd22bb7aa52 486
mbed_official 3:7a284390b0ce 487 /* xa - xc */
mbed_official 3:7a284390b0ce 488 r2 = pSrc[(2u * i0)] - pSrc[(2u * i2)];
mbed_official 3:7a284390b0ce 489
mbed_official 3:7a284390b0ce 490 /* ya + yc */
mbed_official 3:7a284390b0ce 491 s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u];
emilmont 1:fdd22bb7aa52 492
mbed_official 3:7a284390b0ce 493 /* ya - yc */
mbed_official 3:7a284390b0ce 494 s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u];
mbed_official 3:7a284390b0ce 495
mbed_official 3:7a284390b0ce 496 /* xb + xd */
mbed_official 3:7a284390b0ce 497 t1 = pSrc[2u * i1] + pSrc[2u * i3];
emilmont 1:fdd22bb7aa52 498
mbed_official 3:7a284390b0ce 499 /* xa' = xa + xb + xc + xd */
mbed_official 3:7a284390b0ce 500 pSrc[2u * i0] = r1 + t1;
emilmont 1:fdd22bb7aa52 501
mbed_official 3:7a284390b0ce 502 /* xa + xc -(xb + xd) */
mbed_official 3:7a284390b0ce 503 r1 = r1 - t1;
emilmont 1:fdd22bb7aa52 504
mbed_official 3:7a284390b0ce 505 /* yb + yd */
mbed_official 3:7a284390b0ce 506 t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 507
mbed_official 3:7a284390b0ce 508 /* ya' = ya + yb + yc + yd */
mbed_official 3:7a284390b0ce 509 pSrc[(2u * i0) + 1u] = s1 + t2;
mbed_official 3:7a284390b0ce 510
mbed_official 3:7a284390b0ce 511 /* (ya + yc) - (yb + yd) */
mbed_official 3:7a284390b0ce 512 s1 = s1 - t2;
emilmont 1:fdd22bb7aa52 513
mbed_official 3:7a284390b0ce 514 /* (yb - yd) */
mbed_official 3:7a284390b0ce 515 t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 516
mbed_official 3:7a284390b0ce 517 /* (xb - xd) */
mbed_official 3:7a284390b0ce 518 t2 = pSrc[2u * i1] - pSrc[2u * i3];
emilmont 1:fdd22bb7aa52 519
mbed_official 3:7a284390b0ce 520 /* xc' = (xa-xb+xc-xd)co2 + (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 521 pSrc[2u * i1] = (r1 * co2) + (s1 * si2);
emilmont 1:fdd22bb7aa52 522
mbed_official 3:7a284390b0ce 523 /* yc' = (ya-yb+yc-yd)co2 - (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 524 pSrc[(2u * i1) + 1u] = (s1 * co2) - (r1 * si2);
emilmont 1:fdd22bb7aa52 525
mbed_official 3:7a284390b0ce 526 /* (xa - xc) + (yb - yd) */
mbed_official 3:7a284390b0ce 527 r1 = r2 + t1;
emilmont 1:fdd22bb7aa52 528
mbed_official 3:7a284390b0ce 529 /* (xa - xc) - (yb - yd) */
mbed_official 3:7a284390b0ce 530 r2 = r2 - t1;
emilmont 1:fdd22bb7aa52 531
mbed_official 3:7a284390b0ce 532 /* (ya - yc) - (xb - xd) */
mbed_official 3:7a284390b0ce 533 s1 = s2 - t2;
emilmont 1:fdd22bb7aa52 534
mbed_official 3:7a284390b0ce 535 /* (ya - yc) + (xb - xd) */
mbed_official 3:7a284390b0ce 536 s2 = s2 + t2;
emilmont 1:fdd22bb7aa52 537
mbed_official 3:7a284390b0ce 538 /* xb' = (xa+yb-xc-yd)co1 + (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 539 pSrc[2u * i2] = (r1 * co1) + (s1 * si1);
emilmont 1:fdd22bb7aa52 540
mbed_official 3:7a284390b0ce 541 /* yb' = (ya-xb-yc+xd)co1 - (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 542 pSrc[(2u * i2) + 1u] = (s1 * co1) - (r1 * si1);
emilmont 1:fdd22bb7aa52 543
mbed_official 3:7a284390b0ce 544 /* xd' = (xa-yb-xc+yd)co3 + (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 545 pSrc[2u * i3] = (r2 * co3) + (s2 * si3);
emilmont 1:fdd22bb7aa52 546
mbed_official 3:7a284390b0ce 547 /* yd' = (ya+xb-yc-xd)co3 - (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 548 pSrc[(2u * i3) + 1u] = (s2 * co3) - (r2 * si3);
mbed_official 3:7a284390b0ce 549
mbed_official 3:7a284390b0ce 550 i0 += n1;
mbed_official 3:7a284390b0ce 551 } while( i0 < fftLen);
mbed_official 3:7a284390b0ce 552 j++;
mbed_official 3:7a284390b0ce 553 } while(j <= (n2 - 1u));
mbed_official 3:7a284390b0ce 554 twidCoefModifier <<= 2u;
mbed_official 3:7a284390b0ce 555 }
emilmont 1:fdd22bb7aa52 556
mbed_official 3:7a284390b0ce 557 #endif /* #ifndef ARM_MATH_CM0_FAMILY_FAMILY */
emilmont 1:fdd22bb7aa52 558
emilmont 1:fdd22bb7aa52 559 }
emilmont 1:fdd22bb7aa52 560
emilmont 1:fdd22bb7aa52 561 /*
mbed_official 3:7a284390b0ce 562 * @brief Core function for the floating-point CIFFT butterfly process.
mbed_official 3:7a284390b0ce 563 * @param[in, out] *pSrc points to the in-place buffer of floating-point data type.
mbed_official 3:7a284390b0ce 564 * @param[in] fftLen length of the FFT.
mbed_official 3:7a284390b0ce 565 * @param[in] *pCoef points to twiddle coefficient buffer.
mbed_official 3:7a284390b0ce 566 * @param[in] twidCoefModifier twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table.
mbed_official 3:7a284390b0ce 567 * @param[in] onebyfftLen value of 1/fftLen.
mbed_official 3:7a284390b0ce 568 * @return none.
mbed_official 3:7a284390b0ce 569 */
emilmont 1:fdd22bb7aa52 570
emilmont 1:fdd22bb7aa52 571 void arm_radix4_butterfly_inverse_f32(
mbed_official 3:7a284390b0ce 572 float32_t * pSrc,
mbed_official 3:7a284390b0ce 573 uint16_t fftLen,
mbed_official 3:7a284390b0ce 574 float32_t * pCoef,
mbed_official 3:7a284390b0ce 575 uint16_t twidCoefModifier,
mbed_official 3:7a284390b0ce 576 float32_t onebyfftLen)
emilmont 1:fdd22bb7aa52 577 {
mbed_official 3:7a284390b0ce 578 float32_t co1, co2, co3, si1, si2, si3;
mbed_official 3:7a284390b0ce 579 uint32_t ia1, ia2, ia3;
mbed_official 3:7a284390b0ce 580 uint32_t i0, i1, i2, i3;
mbed_official 3:7a284390b0ce 581 uint32_t n1, n2, j, k;
emilmont 1:fdd22bb7aa52 582
mbed_official 3:7a284390b0ce 583 #ifndef ARM_MATH_CM0_FAMILY_FAMILY
emilmont 1:fdd22bb7aa52 584
mbed_official 3:7a284390b0ce 585 float32_t xaIn, yaIn, xbIn, ybIn, xcIn, ycIn, xdIn, ydIn;
mbed_official 3:7a284390b0ce 586 float32_t Xaplusc, Xbplusd, Yaplusc, Ybplusd, Xaminusc, Xbminusd, Yaminusc,
mbed_official 3:7a284390b0ce 587 Ybminusd;
mbed_official 3:7a284390b0ce 588 float32_t Xb12C_out, Yb12C_out, Xc12C_out, Yc12C_out, Xd12C_out, Yd12C_out;
mbed_official 3:7a284390b0ce 589 float32_t Xb12_out, Yb12_out, Xc12_out, Yc12_out, Xd12_out, Yd12_out;
mbed_official 3:7a284390b0ce 590 float32_t *ptr1;
mbed_official 3:7a284390b0ce 591 float32_t p0,p1,p2,p3,p4,p5,p6,p7;
mbed_official 3:7a284390b0ce 592 float32_t a0,a1,a2,a3,a4,a5,a6,a7;
emilmont 1:fdd22bb7aa52 593
emilmont 1:fdd22bb7aa52 594
mbed_official 3:7a284390b0ce 595 /* Initializations for the first stage */
mbed_official 3:7a284390b0ce 596 n2 = fftLen;
mbed_official 3:7a284390b0ce 597 n1 = n2;
emilmont 1:fdd22bb7aa52 598
mbed_official 3:7a284390b0ce 599 /* n2 = fftLen/4 */
mbed_official 3:7a284390b0ce 600 n2 >>= 2u;
mbed_official 3:7a284390b0ce 601 i0 = 0u;
mbed_official 3:7a284390b0ce 602 ia1 = 0u;
emilmont 1:fdd22bb7aa52 603
mbed_official 3:7a284390b0ce 604 j = n2;
emilmont 1:fdd22bb7aa52 605
mbed_official 3:7a284390b0ce 606 /* Calculation of first stage */
mbed_official 3:7a284390b0ce 607 do
mbed_official 3:7a284390b0ce 608 {
mbed_official 3:7a284390b0ce 609 /* index calculation for the input as, */
mbed_official 3:7a284390b0ce 610 /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */
mbed_official 3:7a284390b0ce 611 i1 = i0 + n2;
mbed_official 3:7a284390b0ce 612 i2 = i1 + n2;
mbed_official 3:7a284390b0ce 613 i3 = i2 + n2;
emilmont 1:fdd22bb7aa52 614
mbed_official 3:7a284390b0ce 615 /* Butterfly implementation */
mbed_official 3:7a284390b0ce 616 xaIn = pSrc[(2u * i0)];
mbed_official 3:7a284390b0ce 617 yaIn = pSrc[(2u * i0) + 1u];
emilmont 1:fdd22bb7aa52 618
mbed_official 3:7a284390b0ce 619 xcIn = pSrc[(2u * i2)];
mbed_official 3:7a284390b0ce 620 ycIn = pSrc[(2u * i2) + 1u];
emilmont 1:fdd22bb7aa52 621
mbed_official 3:7a284390b0ce 622 xbIn = pSrc[(2u * i1)];
mbed_official 3:7a284390b0ce 623 ybIn = pSrc[(2u * i1) + 1u];
emilmont 1:fdd22bb7aa52 624
mbed_official 3:7a284390b0ce 625 xdIn = pSrc[(2u * i3)];
mbed_official 3:7a284390b0ce 626 ydIn = pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 627
mbed_official 3:7a284390b0ce 628 /* xa + xc */
mbed_official 3:7a284390b0ce 629 Xaplusc = xaIn + xcIn;
mbed_official 3:7a284390b0ce 630 /* xb + xd */
mbed_official 3:7a284390b0ce 631 Xbplusd = xbIn + xdIn;
mbed_official 3:7a284390b0ce 632 /* ya + yc */
mbed_official 3:7a284390b0ce 633 Yaplusc = yaIn + ycIn;
mbed_official 3:7a284390b0ce 634 /* yb + yd */
mbed_official 3:7a284390b0ce 635 Ybplusd = ybIn + ydIn;
emilmont 1:fdd22bb7aa52 636
emilmont 1:fdd22bb7aa52 637 /* index calculation for the coefficients */
emilmont 1:fdd22bb7aa52 638 ia2 = ia1 + ia1;
mbed_official 3:7a284390b0ce 639 co2 = pCoef[ia2 * 2u];
mbed_official 3:7a284390b0ce 640 si2 = pCoef[(ia2 * 2u) + 1u];
mbed_official 3:7a284390b0ce 641
mbed_official 3:7a284390b0ce 642 /* xa - xc */
mbed_official 3:7a284390b0ce 643 Xaminusc = xaIn - xcIn;
mbed_official 3:7a284390b0ce 644 /* xb - xd */
mbed_official 3:7a284390b0ce 645 Xbminusd = xbIn - xdIn;
mbed_official 3:7a284390b0ce 646 /* ya - yc */
mbed_official 3:7a284390b0ce 647 Yaminusc = yaIn - ycIn;
mbed_official 3:7a284390b0ce 648 /* yb - yd */
mbed_official 3:7a284390b0ce 649 Ybminusd = ybIn - ydIn;
mbed_official 3:7a284390b0ce 650
mbed_official 3:7a284390b0ce 651 /* xa' = xa + xb + xc + xd */
mbed_official 3:7a284390b0ce 652 pSrc[(2u * i0)] = Xaplusc + Xbplusd;
mbed_official 3:7a284390b0ce 653
mbed_official 3:7a284390b0ce 654 /* ya' = ya + yb + yc + yd */
mbed_official 3:7a284390b0ce 655 pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd;
mbed_official 3:7a284390b0ce 656
mbed_official 3:7a284390b0ce 657 /* (xa - xc) - (yb - yd) */
mbed_official 3:7a284390b0ce 658 Xb12C_out = (Xaminusc - Ybminusd);
mbed_official 3:7a284390b0ce 659 /* (ya - yc) + (xb - xd) */
mbed_official 3:7a284390b0ce 660 Yb12C_out = (Yaminusc + Xbminusd);
mbed_official 3:7a284390b0ce 661 /* (xa + xc) - (xb + xd) */
mbed_official 3:7a284390b0ce 662 Xc12C_out = (Xaplusc - Xbplusd);
mbed_official 3:7a284390b0ce 663 /* (ya + yc) - (yb + yd) */
mbed_official 3:7a284390b0ce 664 Yc12C_out = (Yaplusc - Ybplusd);
mbed_official 3:7a284390b0ce 665 /* (xa - xc) + (yb - yd) */
mbed_official 3:7a284390b0ce 666 Xd12C_out = (Xaminusc + Ybminusd);
mbed_official 3:7a284390b0ce 667 /* (ya - yc) - (xb - xd) */
mbed_official 3:7a284390b0ce 668 Yd12C_out = (Yaminusc - Xbminusd);
mbed_official 3:7a284390b0ce 669
emilmont 1:fdd22bb7aa52 670 co1 = pCoef[ia1 * 2u];
emilmont 1:fdd22bb7aa52 671 si1 = pCoef[(ia1 * 2u) + 1u];
mbed_official 3:7a284390b0ce 672
mbed_official 3:7a284390b0ce 673 /* index calculation for the coefficients */
mbed_official 3:7a284390b0ce 674 ia3 = ia2 + ia1;
emilmont 1:fdd22bb7aa52 675 co3 = pCoef[ia3 * 2u];
emilmont 1:fdd22bb7aa52 676 si3 = pCoef[(ia3 * 2u) + 1u];
emilmont 1:fdd22bb7aa52 677
mbed_official 3:7a284390b0ce 678 Xb12_out = Xb12C_out * co1;
mbed_official 3:7a284390b0ce 679 Yb12_out = Yb12C_out * co1;
mbed_official 3:7a284390b0ce 680 Xc12_out = Xc12C_out * co2;
mbed_official 3:7a284390b0ce 681 Yc12_out = Yc12C_out * co2;
mbed_official 3:7a284390b0ce 682 Xd12_out = Xd12C_out * co3;
mbed_official 3:7a284390b0ce 683 Yd12_out = Yd12C_out * co3;
mbed_official 3:7a284390b0ce 684
mbed_official 3:7a284390b0ce 685 /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 686 //Xb12_out -= Yb12C_out * si1;
mbed_official 3:7a284390b0ce 687 p0 = Yb12C_out * si1;
mbed_official 3:7a284390b0ce 688 /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 689 //Yb12_out += Xb12C_out * si1;
mbed_official 3:7a284390b0ce 690 p1 = Xb12C_out * si1;
mbed_official 3:7a284390b0ce 691 /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 692 //Xc12_out -= Yc12C_out * si2;
mbed_official 3:7a284390b0ce 693 p2 = Yc12C_out * si2;
mbed_official 3:7a284390b0ce 694 /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 695 //Yc12_out += Xc12C_out * si2;
mbed_official 3:7a284390b0ce 696 p3 = Xc12C_out * si2;
mbed_official 3:7a284390b0ce 697 /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 698 //Xd12_out -= Yd12C_out * si3;
mbed_official 3:7a284390b0ce 699 p4 = Yd12C_out * si3;
mbed_official 3:7a284390b0ce 700 /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 701 //Yd12_out += Xd12C_out * si3;
mbed_official 3:7a284390b0ce 702 p5 = Xd12C_out * si3;
mbed_official 3:7a284390b0ce 703
mbed_official 3:7a284390b0ce 704 Xb12_out -= p0;
mbed_official 3:7a284390b0ce 705 Yb12_out += p1;
mbed_official 3:7a284390b0ce 706 Xc12_out -= p2;
mbed_official 3:7a284390b0ce 707 Yc12_out += p3;
mbed_official 3:7a284390b0ce 708 Xd12_out -= p4;
mbed_official 3:7a284390b0ce 709 Yd12_out += p5;
mbed_official 3:7a284390b0ce 710
mbed_official 3:7a284390b0ce 711 /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 712 pSrc[2u * i1] = Xc12_out;
mbed_official 3:7a284390b0ce 713
mbed_official 3:7a284390b0ce 714 /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 715 pSrc[(2u * i1) + 1u] = Yc12_out;
mbed_official 3:7a284390b0ce 716
mbed_official 3:7a284390b0ce 717 /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 718 pSrc[2u * i2] = Xb12_out;
mbed_official 3:7a284390b0ce 719
mbed_official 3:7a284390b0ce 720 /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 721 pSrc[(2u * i2) + 1u] = Yb12_out;
mbed_official 3:7a284390b0ce 722
mbed_official 3:7a284390b0ce 723 /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 724 pSrc[2u * i3] = Xd12_out;
mbed_official 3:7a284390b0ce 725
mbed_official 3:7a284390b0ce 726 /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 727 pSrc[(2u * i3) + 1u] = Yd12_out;
mbed_official 3:7a284390b0ce 728
emilmont 1:fdd22bb7aa52 729 /* Twiddle coefficients index modifier */
emilmont 1:fdd22bb7aa52 730 ia1 = ia1 + twidCoefModifier;
emilmont 1:fdd22bb7aa52 731
mbed_official 3:7a284390b0ce 732 /* Updating input index */
mbed_official 3:7a284390b0ce 733 i0 = i0 + 1u;
mbed_official 3:7a284390b0ce 734
mbed_official 3:7a284390b0ce 735 } while(--j);
mbed_official 3:7a284390b0ce 736
mbed_official 3:7a284390b0ce 737 twidCoefModifier <<= 2u;
emilmont 1:fdd22bb7aa52 738
mbed_official 3:7a284390b0ce 739 /* Calculation of second stage to excluding last stage */
mbed_official 3:7a284390b0ce 740 for (k = fftLen >> 2u; k > 4u; k >>= 2u)
mbed_official 3:7a284390b0ce 741 {
mbed_official 3:7a284390b0ce 742 /* Initializations for the first stage */
mbed_official 3:7a284390b0ce 743 n1 = n2;
mbed_official 3:7a284390b0ce 744 n2 >>= 2u;
mbed_official 3:7a284390b0ce 745 ia1 = 0u;
emilmont 1:fdd22bb7aa52 746
mbed_official 3:7a284390b0ce 747 /* Calculation of first stage */
mbed_official 3:7a284390b0ce 748 j = 0;
mbed_official 3:7a284390b0ce 749 do
mbed_official 3:7a284390b0ce 750 {
mbed_official 3:7a284390b0ce 751 /* index calculation for the coefficients */
mbed_official 3:7a284390b0ce 752 ia2 = ia1 + ia1;
mbed_official 3:7a284390b0ce 753 ia3 = ia2 + ia1;
mbed_official 3:7a284390b0ce 754 co1 = pCoef[ia1 * 2u];
mbed_official 3:7a284390b0ce 755 si1 = pCoef[(ia1 * 2u) + 1u];
mbed_official 3:7a284390b0ce 756 co2 = pCoef[ia2 * 2u];
mbed_official 3:7a284390b0ce 757 si2 = pCoef[(ia2 * 2u) + 1u];
mbed_official 3:7a284390b0ce 758 co3 = pCoef[ia3 * 2u];
mbed_official 3:7a284390b0ce 759 si3 = pCoef[(ia3 * 2u) + 1u];
emilmont 1:fdd22bb7aa52 760
mbed_official 3:7a284390b0ce 761 /* Twiddle coefficients index modifier */
mbed_official 3:7a284390b0ce 762 ia1 = ia1 + twidCoefModifier;
emilmont 1:fdd22bb7aa52 763
mbed_official 3:7a284390b0ce 764 i0 = j;
mbed_official 3:7a284390b0ce 765 do
mbed_official 3:7a284390b0ce 766 {
mbed_official 3:7a284390b0ce 767 /* index calculation for the input as, */
mbed_official 3:7a284390b0ce 768 /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */
mbed_official 3:7a284390b0ce 769 i1 = i0 + n2;
mbed_official 3:7a284390b0ce 770 i2 = i1 + n2;
mbed_official 3:7a284390b0ce 771 i3 = i2 + n2;
mbed_official 3:7a284390b0ce 772
mbed_official 3:7a284390b0ce 773 xaIn = pSrc[(2u * i0)];
mbed_official 3:7a284390b0ce 774 yaIn = pSrc[(2u * i0) + 1u];
mbed_official 3:7a284390b0ce 775
mbed_official 3:7a284390b0ce 776 xbIn = pSrc[(2u * i1)];
mbed_official 3:7a284390b0ce 777 ybIn = pSrc[(2u * i1) + 1u];
emilmont 1:fdd22bb7aa52 778
mbed_official 3:7a284390b0ce 779 xcIn = pSrc[(2u * i2)];
mbed_official 3:7a284390b0ce 780 ycIn = pSrc[(2u * i2) + 1u];
mbed_official 3:7a284390b0ce 781
mbed_official 3:7a284390b0ce 782 xdIn = pSrc[(2u * i3)];
mbed_official 3:7a284390b0ce 783 ydIn = pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 784
mbed_official 3:7a284390b0ce 785 /* xa - xc */
mbed_official 3:7a284390b0ce 786 Xaminusc = xaIn - xcIn;
mbed_official 3:7a284390b0ce 787 /* (xb - xd) */
mbed_official 3:7a284390b0ce 788 Xbminusd = xbIn - xdIn;
mbed_official 3:7a284390b0ce 789 /* ya - yc */
mbed_official 3:7a284390b0ce 790 Yaminusc = yaIn - ycIn;
mbed_official 3:7a284390b0ce 791 /* (yb - yd) */
mbed_official 3:7a284390b0ce 792 Ybminusd = ybIn - ydIn;
emilmont 1:fdd22bb7aa52 793
mbed_official 3:7a284390b0ce 794 /* xa + xc */
mbed_official 3:7a284390b0ce 795 Xaplusc = xaIn + xcIn;
mbed_official 3:7a284390b0ce 796 /* xb + xd */
mbed_official 3:7a284390b0ce 797 Xbplusd = xbIn + xdIn;
mbed_official 3:7a284390b0ce 798 /* ya + yc */
mbed_official 3:7a284390b0ce 799 Yaplusc = yaIn + ycIn;
mbed_official 3:7a284390b0ce 800 /* yb + yd */
mbed_official 3:7a284390b0ce 801 Ybplusd = ybIn + ydIn;
emilmont 1:fdd22bb7aa52 802
mbed_official 3:7a284390b0ce 803 /* (xa - xc) - (yb - yd) */
mbed_official 3:7a284390b0ce 804 Xb12C_out = (Xaminusc - Ybminusd);
mbed_official 3:7a284390b0ce 805 /* (ya - yc) + (xb - xd) */
mbed_official 3:7a284390b0ce 806 Yb12C_out = (Yaminusc + Xbminusd);
mbed_official 3:7a284390b0ce 807 /* xa + xc -(xb + xd) */
mbed_official 3:7a284390b0ce 808 Xc12C_out = (Xaplusc - Xbplusd);
mbed_official 3:7a284390b0ce 809 /* (ya + yc) - (yb + yd) */
mbed_official 3:7a284390b0ce 810 Yc12C_out = (Yaplusc - Ybplusd);
mbed_official 3:7a284390b0ce 811 /* (xa - xc) + (yb - yd) */
mbed_official 3:7a284390b0ce 812 Xd12C_out = (Xaminusc + Ybminusd);
mbed_official 3:7a284390b0ce 813 /* (ya - yc) - (xb - xd) */
mbed_official 3:7a284390b0ce 814 Yd12C_out = (Yaminusc - Xbminusd);
emilmont 1:fdd22bb7aa52 815
mbed_official 3:7a284390b0ce 816 pSrc[(2u * i0)] = Xaplusc + Xbplusd;
mbed_official 3:7a284390b0ce 817 pSrc[(2u * i0) + 1u] = Yaplusc + Ybplusd;
emilmont 1:fdd22bb7aa52 818
mbed_official 3:7a284390b0ce 819 Xb12_out = Xb12C_out * co1;
mbed_official 3:7a284390b0ce 820 Yb12_out = Yb12C_out * co1;
mbed_official 3:7a284390b0ce 821 Xc12_out = Xc12C_out * co2;
mbed_official 3:7a284390b0ce 822 Yc12_out = Yc12C_out * co2;
mbed_official 3:7a284390b0ce 823 Xd12_out = Xd12C_out * co3;
mbed_official 3:7a284390b0ce 824 Yd12_out = Yd12C_out * co3;
emilmont 1:fdd22bb7aa52 825
mbed_official 3:7a284390b0ce 826 /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 827 //Xb12_out -= Yb12C_out * si1;
mbed_official 3:7a284390b0ce 828 p0 = Yb12C_out * si1;
mbed_official 3:7a284390b0ce 829 /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 830 //Yb12_out += Xb12C_out * si1;
mbed_official 3:7a284390b0ce 831 p1 = Xb12C_out * si1;
mbed_official 3:7a284390b0ce 832 /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 833 //Xc12_out -= Yc12C_out * si2;
mbed_official 3:7a284390b0ce 834 p2 = Yc12C_out * si2;
mbed_official 3:7a284390b0ce 835 /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 836 //Yc12_out += Xc12C_out * si2;
mbed_official 3:7a284390b0ce 837 p3 = Xc12C_out * si2;
mbed_official 3:7a284390b0ce 838 /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 839 //Xd12_out -= Yd12C_out * si3;
mbed_official 3:7a284390b0ce 840 p4 = Yd12C_out * si3;
mbed_official 3:7a284390b0ce 841 /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 842 //Yd12_out += Xd12C_out * si3;
mbed_official 3:7a284390b0ce 843 p5 = Xd12C_out * si3;
mbed_official 3:7a284390b0ce 844
mbed_official 3:7a284390b0ce 845 Xb12_out -= p0;
mbed_official 3:7a284390b0ce 846 Yb12_out += p1;
mbed_official 3:7a284390b0ce 847 Xc12_out -= p2;
mbed_official 3:7a284390b0ce 848 Yc12_out += p3;
mbed_official 3:7a284390b0ce 849 Xd12_out -= p4;
mbed_official 3:7a284390b0ce 850 Yd12_out += p5;
emilmont 1:fdd22bb7aa52 851
mbed_official 3:7a284390b0ce 852 /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 853 pSrc[2u * i1] = Xc12_out;
emilmont 1:fdd22bb7aa52 854
mbed_official 3:7a284390b0ce 855 /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 856 pSrc[(2u * i1) + 1u] = Yc12_out;
emilmont 1:fdd22bb7aa52 857
mbed_official 3:7a284390b0ce 858 /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 859 pSrc[2u * i2] = Xb12_out;
mbed_official 3:7a284390b0ce 860
mbed_official 3:7a284390b0ce 861 /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 862 pSrc[(2u * i2) + 1u] = Yb12_out;
emilmont 1:fdd22bb7aa52 863
mbed_official 3:7a284390b0ce 864 /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 865 pSrc[2u * i3] = Xd12_out;
emilmont 1:fdd22bb7aa52 866
mbed_official 3:7a284390b0ce 867 /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 868 pSrc[(2u * i3) + 1u] = Yd12_out;
emilmont 1:fdd22bb7aa52 869
mbed_official 3:7a284390b0ce 870 i0 += n1;
mbed_official 3:7a284390b0ce 871 } while(i0 < fftLen);
mbed_official 3:7a284390b0ce 872 j++;
mbed_official 3:7a284390b0ce 873 } while(j <= (n2 - 1u));
mbed_official 3:7a284390b0ce 874 twidCoefModifier <<= 2u;
mbed_official 3:7a284390b0ce 875 }
mbed_official 3:7a284390b0ce 876 /* Initializations of last stage */
emilmont 1:fdd22bb7aa52 877
mbed_official 3:7a284390b0ce 878 j = fftLen >> 2;
mbed_official 3:7a284390b0ce 879 ptr1 = &pSrc[0];
emilmont 1:fdd22bb7aa52 880
mbed_official 3:7a284390b0ce 881 /* Calculations of last stage */
mbed_official 3:7a284390b0ce 882 do
mbed_official 3:7a284390b0ce 883 {
mbed_official 3:7a284390b0ce 884 xaIn = ptr1[0];
mbed_official 3:7a284390b0ce 885 yaIn = ptr1[1];
mbed_official 3:7a284390b0ce 886 xbIn = ptr1[2];
mbed_official 3:7a284390b0ce 887 ybIn = ptr1[3];
mbed_official 3:7a284390b0ce 888 xcIn = ptr1[4];
mbed_official 3:7a284390b0ce 889 ycIn = ptr1[5];
mbed_official 3:7a284390b0ce 890 xdIn = ptr1[6];
mbed_official 3:7a284390b0ce 891 ydIn = ptr1[7];
emilmont 1:fdd22bb7aa52 892
mbed_official 3:7a284390b0ce 893 /* Butterfly implementation */
mbed_official 3:7a284390b0ce 894 /* xa + xc */
mbed_official 3:7a284390b0ce 895 Xaplusc = xaIn + xcIn;
emilmont 1:fdd22bb7aa52 896
mbed_official 3:7a284390b0ce 897 /* xa - xc */
mbed_official 3:7a284390b0ce 898 Xaminusc = xaIn - xcIn;
emilmont 1:fdd22bb7aa52 899
mbed_official 3:7a284390b0ce 900 /* ya + yc */
mbed_official 3:7a284390b0ce 901 Yaplusc = yaIn + ycIn;
emilmont 1:fdd22bb7aa52 902
mbed_official 3:7a284390b0ce 903 /* ya - yc */
mbed_official 3:7a284390b0ce 904 Yaminusc = yaIn - ycIn;
emilmont 1:fdd22bb7aa52 905
mbed_official 3:7a284390b0ce 906 /* xb + xd */
mbed_official 3:7a284390b0ce 907 Xbplusd = xbIn + xdIn;
emilmont 1:fdd22bb7aa52 908
mbed_official 3:7a284390b0ce 909 /* yb + yd */
mbed_official 3:7a284390b0ce 910 Ybplusd = ybIn + ydIn;
emilmont 1:fdd22bb7aa52 911
mbed_official 3:7a284390b0ce 912 /* (xb-xd) */
mbed_official 3:7a284390b0ce 913 Xbminusd = xbIn - xdIn;
emilmont 1:fdd22bb7aa52 914
mbed_official 3:7a284390b0ce 915 /* (yb-yd) */
mbed_official 3:7a284390b0ce 916 Ybminusd = ybIn - ydIn;
mbed_official 3:7a284390b0ce 917
mbed_official 3:7a284390b0ce 918 /* xa' = (xa+xb+xc+xd) * onebyfftLen */
mbed_official 3:7a284390b0ce 919 a0 = (Xaplusc + Xbplusd);
mbed_official 3:7a284390b0ce 920 /* ya' = (ya+yb+yc+yd) * onebyfftLen */
mbed_official 3:7a284390b0ce 921 a1 = (Yaplusc + Ybplusd);
mbed_official 3:7a284390b0ce 922 /* xc' = (xa-xb+xc-xd) * onebyfftLen */
mbed_official 3:7a284390b0ce 923 a2 = (Xaplusc - Xbplusd);
mbed_official 3:7a284390b0ce 924 /* yc' = (ya-yb+yc-yd) * onebyfftLen */
mbed_official 3:7a284390b0ce 925 a3 = (Yaplusc - Ybplusd);
mbed_official 3:7a284390b0ce 926 /* xb' = (xa-yb-xc+yd) * onebyfftLen */
mbed_official 3:7a284390b0ce 927 a4 = (Xaminusc - Ybminusd);
mbed_official 3:7a284390b0ce 928 /* yb' = (ya+xb-yc-xd) * onebyfftLen */
mbed_official 3:7a284390b0ce 929 a5 = (Yaminusc + Xbminusd);
mbed_official 3:7a284390b0ce 930 /* xd' = (xa-yb-xc+yd) * onebyfftLen */
mbed_official 3:7a284390b0ce 931 a6 = (Xaminusc + Ybminusd);
mbed_official 3:7a284390b0ce 932 /* yd' = (ya-xb-yc+xd) * onebyfftLen */
mbed_official 3:7a284390b0ce 933 a7 = (Yaminusc - Xbminusd);
mbed_official 3:7a284390b0ce 934
mbed_official 3:7a284390b0ce 935 p0 = a0 * onebyfftLen;
mbed_official 3:7a284390b0ce 936 p1 = a1 * onebyfftLen;
mbed_official 3:7a284390b0ce 937 p2 = a2 * onebyfftLen;
mbed_official 3:7a284390b0ce 938 p3 = a3 * onebyfftLen;
mbed_official 3:7a284390b0ce 939 p4 = a4 * onebyfftLen;
mbed_official 3:7a284390b0ce 940 p5 = a5 * onebyfftLen;
mbed_official 3:7a284390b0ce 941 p6 = a6 * onebyfftLen;
mbed_official 3:7a284390b0ce 942 p7 = a7 * onebyfftLen;
mbed_official 3:7a284390b0ce 943
mbed_official 3:7a284390b0ce 944 /* xa' = (xa+xb+xc+xd) * onebyfftLen */
mbed_official 3:7a284390b0ce 945 ptr1[0] = p0;
mbed_official 3:7a284390b0ce 946 /* ya' = (ya+yb+yc+yd) * onebyfftLen */
mbed_official 3:7a284390b0ce 947 ptr1[1] = p1;
mbed_official 3:7a284390b0ce 948 /* xc' = (xa-xb+xc-xd) * onebyfftLen */
mbed_official 3:7a284390b0ce 949 ptr1[2] = p2;
mbed_official 3:7a284390b0ce 950 /* yc' = (ya-yb+yc-yd) * onebyfftLen */
mbed_official 3:7a284390b0ce 951 ptr1[3] = p3;
mbed_official 3:7a284390b0ce 952 /* xb' = (xa-yb-xc+yd) * onebyfftLen */
mbed_official 3:7a284390b0ce 953 ptr1[4] = p4;
mbed_official 3:7a284390b0ce 954 /* yb' = (ya+xb-yc-xd) * onebyfftLen */
mbed_official 3:7a284390b0ce 955 ptr1[5] = p5;
mbed_official 3:7a284390b0ce 956 /* xd' = (xa-yb-xc+yd) * onebyfftLen */
mbed_official 3:7a284390b0ce 957 ptr1[6] = p6;
mbed_official 3:7a284390b0ce 958 /* yd' = (ya-xb-yc+xd) * onebyfftLen */
mbed_official 3:7a284390b0ce 959 ptr1[7] = p7;
emilmont 1:fdd22bb7aa52 960
mbed_official 3:7a284390b0ce 961 /* increment source pointer by 8 for next calculations */
mbed_official 3:7a284390b0ce 962 ptr1 = ptr1 + 8u;
emilmont 1:fdd22bb7aa52 963
mbed_official 3:7a284390b0ce 964 } while(--j);
emilmont 1:fdd22bb7aa52 965
emilmont 1:fdd22bb7aa52 966 #else
emilmont 1:fdd22bb7aa52 967
mbed_official 3:7a284390b0ce 968 float32_t t1, t2, r1, r2, s1, s2;
emilmont 1:fdd22bb7aa52 969
mbed_official 3:7a284390b0ce 970 /* Run the below code for Cortex-M0 */
emilmont 1:fdd22bb7aa52 971
mbed_official 3:7a284390b0ce 972 /* Initializations for the first stage */
mbed_official 3:7a284390b0ce 973 n2 = fftLen;
mbed_official 3:7a284390b0ce 974 n1 = n2;
emilmont 1:fdd22bb7aa52 975
mbed_official 3:7a284390b0ce 976 /* Calculation of first stage */
mbed_official 3:7a284390b0ce 977 for (k = fftLen; k > 4u; k >>= 2u)
mbed_official 3:7a284390b0ce 978 {
mbed_official 3:7a284390b0ce 979 /* Initializations for the first stage */
mbed_official 3:7a284390b0ce 980 n1 = n2;
mbed_official 3:7a284390b0ce 981 n2 >>= 2u;
mbed_official 3:7a284390b0ce 982 ia1 = 0u;
emilmont 1:fdd22bb7aa52 983
mbed_official 3:7a284390b0ce 984 /* Calculation of first stage */
mbed_official 3:7a284390b0ce 985 j = 0;
mbed_official 3:7a284390b0ce 986 do
mbed_official 3:7a284390b0ce 987 {
mbed_official 3:7a284390b0ce 988 /* index calculation for the coefficients */
mbed_official 3:7a284390b0ce 989 ia2 = ia1 + ia1;
mbed_official 3:7a284390b0ce 990 ia3 = ia2 + ia1;
mbed_official 3:7a284390b0ce 991 co1 = pCoef[ia1 * 2u];
mbed_official 3:7a284390b0ce 992 si1 = pCoef[(ia1 * 2u) + 1u];
mbed_official 3:7a284390b0ce 993 co2 = pCoef[ia2 * 2u];
mbed_official 3:7a284390b0ce 994 si2 = pCoef[(ia2 * 2u) + 1u];
mbed_official 3:7a284390b0ce 995 co3 = pCoef[ia3 * 2u];
mbed_official 3:7a284390b0ce 996 si3 = pCoef[(ia3 * 2u) + 1u];
mbed_official 3:7a284390b0ce 997
mbed_official 3:7a284390b0ce 998 /* Twiddle coefficients index modifier */
mbed_official 3:7a284390b0ce 999 ia1 = ia1 + twidCoefModifier;
emilmont 1:fdd22bb7aa52 1000
mbed_official 3:7a284390b0ce 1001 i0 = j;
mbed_official 3:7a284390b0ce 1002 do
mbed_official 3:7a284390b0ce 1003 {
mbed_official 3:7a284390b0ce 1004 /* index calculation for the input as, */
mbed_official 3:7a284390b0ce 1005 /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */
mbed_official 3:7a284390b0ce 1006 i1 = i0 + n2;
mbed_official 3:7a284390b0ce 1007 i2 = i1 + n2;
mbed_official 3:7a284390b0ce 1008 i3 = i2 + n2;
mbed_official 3:7a284390b0ce 1009
mbed_official 3:7a284390b0ce 1010 /* xa + xc */
mbed_official 3:7a284390b0ce 1011 r1 = pSrc[(2u * i0)] + pSrc[(2u * i2)];
emilmont 1:fdd22bb7aa52 1012
mbed_official 3:7a284390b0ce 1013 /* xa - xc */
mbed_official 3:7a284390b0ce 1014 r2 = pSrc[(2u * i0)] - pSrc[(2u * i2)];
mbed_official 3:7a284390b0ce 1015
mbed_official 3:7a284390b0ce 1016 /* ya + yc */
mbed_official 3:7a284390b0ce 1017 s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u];
emilmont 1:fdd22bb7aa52 1018
mbed_official 3:7a284390b0ce 1019 /* ya - yc */
mbed_official 3:7a284390b0ce 1020 s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u];
emilmont 1:fdd22bb7aa52 1021
mbed_official 3:7a284390b0ce 1022 /* xb + xd */
mbed_official 3:7a284390b0ce 1023 t1 = pSrc[2u * i1] + pSrc[2u * i3];
emilmont 1:fdd22bb7aa52 1024
mbed_official 3:7a284390b0ce 1025 /* xa' = xa + xb + xc + xd */
mbed_official 3:7a284390b0ce 1026 pSrc[2u * i0] = r1 + t1;
emilmont 1:fdd22bb7aa52 1027
mbed_official 3:7a284390b0ce 1028 /* xa + xc -(xb + xd) */
mbed_official 3:7a284390b0ce 1029 r1 = r1 - t1;
emilmont 1:fdd22bb7aa52 1030
mbed_official 3:7a284390b0ce 1031 /* yb + yd */
mbed_official 3:7a284390b0ce 1032 t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 1033
mbed_official 3:7a284390b0ce 1034 /* ya' = ya + yb + yc + yd */
mbed_official 3:7a284390b0ce 1035 pSrc[(2u * i0) + 1u] = s1 + t2;
mbed_official 3:7a284390b0ce 1036
mbed_official 3:7a284390b0ce 1037 /* (ya + yc) - (yb + yd) */
mbed_official 3:7a284390b0ce 1038 s1 = s1 - t2;
emilmont 1:fdd22bb7aa52 1039
mbed_official 3:7a284390b0ce 1040 /* (yb - yd) */
mbed_official 3:7a284390b0ce 1041 t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 1042
mbed_official 3:7a284390b0ce 1043 /* (xb - xd) */
mbed_official 3:7a284390b0ce 1044 t2 = pSrc[2u * i1] - pSrc[2u * i3];
emilmont 1:fdd22bb7aa52 1045
mbed_official 3:7a284390b0ce 1046 /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 1047 pSrc[2u * i1] = (r1 * co2) - (s1 * si2);
emilmont 1:fdd22bb7aa52 1048
mbed_official 3:7a284390b0ce 1049 /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 1050 pSrc[(2u * i1) + 1u] = (s1 * co2) + (r1 * si2);
mbed_official 3:7a284390b0ce 1051
mbed_official 3:7a284390b0ce 1052 /* (xa - xc) - (yb - yd) */
mbed_official 3:7a284390b0ce 1053 r1 = r2 - t1;
emilmont 1:fdd22bb7aa52 1054
mbed_official 3:7a284390b0ce 1055 /* (xa - xc) + (yb - yd) */
mbed_official 3:7a284390b0ce 1056 r2 = r2 + t1;
emilmont 1:fdd22bb7aa52 1057
mbed_official 3:7a284390b0ce 1058 /* (ya - yc) + (xb - xd) */
mbed_official 3:7a284390b0ce 1059 s1 = s2 + t2;
emilmont 1:fdd22bb7aa52 1060
mbed_official 3:7a284390b0ce 1061 /* (ya - yc) - (xb - xd) */
mbed_official 3:7a284390b0ce 1062 s2 = s2 - t2;
emilmont 1:fdd22bb7aa52 1063
mbed_official 3:7a284390b0ce 1064 /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 1065 pSrc[2u * i2] = (r1 * co1) - (s1 * si1);
mbed_official 3:7a284390b0ce 1066
mbed_official 3:7a284390b0ce 1067 /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 1068 pSrc[(2u * i2) + 1u] = (s1 * co1) + (r1 * si1);
emilmont 1:fdd22bb7aa52 1069
mbed_official 3:7a284390b0ce 1070 /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 1071 pSrc[2u * i3] = (r2 * co3) - (s2 * si3);
emilmont 1:fdd22bb7aa52 1072
mbed_official 3:7a284390b0ce 1073 /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 1074 pSrc[(2u * i3) + 1u] = (s2 * co3) + (r2 * si3);
mbed_official 3:7a284390b0ce 1075
mbed_official 3:7a284390b0ce 1076 i0 += n1;
mbed_official 3:7a284390b0ce 1077 } while( i0 < fftLen);
mbed_official 3:7a284390b0ce 1078 j++;
mbed_official 3:7a284390b0ce 1079 } while(j <= (n2 - 1u));
mbed_official 3:7a284390b0ce 1080 twidCoefModifier <<= 2u;
mbed_official 3:7a284390b0ce 1081 }
mbed_official 3:7a284390b0ce 1082 /* Initializations of last stage */
mbed_official 3:7a284390b0ce 1083 n1 = n2;
mbed_official 3:7a284390b0ce 1084 n2 >>= 2u;
emilmont 1:fdd22bb7aa52 1085
mbed_official 3:7a284390b0ce 1086 /* Calculations of last stage */
mbed_official 3:7a284390b0ce 1087 for (i0 = 0u; i0 <= (fftLen - n1); i0 += n1)
mbed_official 3:7a284390b0ce 1088 {
mbed_official 3:7a284390b0ce 1089 /* index calculation for the input as, */
mbed_official 3:7a284390b0ce 1090 /* pSrc[i0 + 0], pSrc[i0 + fftLen/4], pSrc[i0 + fftLen/2], pSrc[i0 + 3fftLen/4] */
mbed_official 3:7a284390b0ce 1091 i1 = i0 + n2;
mbed_official 3:7a284390b0ce 1092 i2 = i1 + n2;
mbed_official 3:7a284390b0ce 1093 i3 = i2 + n2;
emilmont 1:fdd22bb7aa52 1094
mbed_official 3:7a284390b0ce 1095 /* Butterfly implementation */
mbed_official 3:7a284390b0ce 1096 /* xa + xc */
mbed_official 3:7a284390b0ce 1097 r1 = pSrc[2u * i0] + pSrc[2u * i2];
emilmont 1:fdd22bb7aa52 1098
mbed_official 3:7a284390b0ce 1099 /* xa - xc */
mbed_official 3:7a284390b0ce 1100 r2 = pSrc[2u * i0] - pSrc[2u * i2];
mbed_official 3:7a284390b0ce 1101
mbed_official 3:7a284390b0ce 1102 /* ya + yc */
mbed_official 3:7a284390b0ce 1103 s1 = pSrc[(2u * i0) + 1u] + pSrc[(2u * i2) + 1u];
mbed_official 3:7a284390b0ce 1104
mbed_official 3:7a284390b0ce 1105 /* ya - yc */
mbed_official 3:7a284390b0ce 1106 s2 = pSrc[(2u * i0) + 1u] - pSrc[(2u * i2) + 1u];
mbed_official 3:7a284390b0ce 1107
mbed_official 3:7a284390b0ce 1108 /* xc + xd */
mbed_official 3:7a284390b0ce 1109 t1 = pSrc[2u * i1] + pSrc[2u * i3];
mbed_official 3:7a284390b0ce 1110
mbed_official 3:7a284390b0ce 1111 /* xa' = xa + xb + xc + xd */
mbed_official 3:7a284390b0ce 1112 pSrc[2u * i0] = (r1 + t1) * onebyfftLen;
emilmont 1:fdd22bb7aa52 1113
mbed_official 3:7a284390b0ce 1114 /* (xa + xb) - (xc + xd) */
mbed_official 3:7a284390b0ce 1115 r1 = r1 - t1;
mbed_official 3:7a284390b0ce 1116
mbed_official 3:7a284390b0ce 1117 /* yb + yd */
mbed_official 3:7a284390b0ce 1118 t2 = pSrc[(2u * i1) + 1u] + pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 1119
mbed_official 3:7a284390b0ce 1120 /* ya' = ya + yb + yc + yd */
mbed_official 3:7a284390b0ce 1121 pSrc[(2u * i0) + 1u] = (s1 + t2) * onebyfftLen;
mbed_official 3:7a284390b0ce 1122
mbed_official 3:7a284390b0ce 1123 /* (ya + yc) - (yb + yd) */
mbed_official 3:7a284390b0ce 1124 s1 = s1 - t2;
mbed_official 3:7a284390b0ce 1125
mbed_official 3:7a284390b0ce 1126 /* (yb-yd) */
mbed_official 3:7a284390b0ce 1127 t1 = pSrc[(2u * i1) + 1u] - pSrc[(2u * i3) + 1u];
emilmont 1:fdd22bb7aa52 1128
mbed_official 3:7a284390b0ce 1129 /* (xb-xd) */
mbed_official 3:7a284390b0ce 1130 t2 = pSrc[2u * i1] - pSrc[2u * i3];
emilmont 1:fdd22bb7aa52 1131
mbed_official 3:7a284390b0ce 1132 /* xc' = (xa-xb+xc-xd)co2 - (ya-yb+yc-yd)(si2) */
mbed_official 3:7a284390b0ce 1133 pSrc[2u * i1] = r1 * onebyfftLen;
emilmont 1:fdd22bb7aa52 1134
mbed_official 3:7a284390b0ce 1135 /* yc' = (ya-yb+yc-yd)co2 + (xa-xb+xc-xd)(si2) */
mbed_official 3:7a284390b0ce 1136 pSrc[(2u * i1) + 1u] = s1 * onebyfftLen;
emilmont 1:fdd22bb7aa52 1137
mbed_official 3:7a284390b0ce 1138 /* (xa - xc) - (yb-yd) */
mbed_official 3:7a284390b0ce 1139 r1 = r2 - t1;
emilmont 1:fdd22bb7aa52 1140
mbed_official 3:7a284390b0ce 1141 /* (xa - xc) + (yb-yd) */
mbed_official 3:7a284390b0ce 1142 r2 = r2 + t1;
emilmont 1:fdd22bb7aa52 1143
mbed_official 3:7a284390b0ce 1144 /* (ya - yc) + (xb-xd) */
mbed_official 3:7a284390b0ce 1145 s1 = s2 + t2;
emilmont 1:fdd22bb7aa52 1146
mbed_official 3:7a284390b0ce 1147 /* (ya - yc) - (xb-xd) */
mbed_official 3:7a284390b0ce 1148 s2 = s2 - t2;
emilmont 1:fdd22bb7aa52 1149
mbed_official 3:7a284390b0ce 1150 /* xb' = (xa+yb-xc-yd)co1 - (ya-xb-yc+xd)(si1) */
mbed_official 3:7a284390b0ce 1151 pSrc[2u * i2] = r1 * onebyfftLen;
emilmont 1:fdd22bb7aa52 1152
mbed_official 3:7a284390b0ce 1153 /* yb' = (ya-xb-yc+xd)co1 + (xa+yb-xc-yd)(si1) */
mbed_official 3:7a284390b0ce 1154 pSrc[(2u * i2) + 1u] = s1 * onebyfftLen;
emilmont 1:fdd22bb7aa52 1155
mbed_official 3:7a284390b0ce 1156 /* xd' = (xa-yb-xc+yd)co3 - (ya+xb-yc-xd)(si3) */
mbed_official 3:7a284390b0ce 1157 pSrc[2u * i3] = r2 * onebyfftLen;
emilmont 1:fdd22bb7aa52 1158
mbed_official 3:7a284390b0ce 1159 /* yd' = (ya+xb-yc-xd)co3 + (xa-yb-xc+yd)(si3) */
mbed_official 3:7a284390b0ce 1160 pSrc[(2u * i3) + 1u] = s2 * onebyfftLen;
mbed_official 3:7a284390b0ce 1161 }
emilmont 1:fdd22bb7aa52 1162
mbed_official 3:7a284390b0ce 1163 #endif /* #ifndef ARM_MATH_CM0_FAMILY_FAMILY */
mbed_official 3:7a284390b0ce 1164 }
emilmont 1:fdd22bb7aa52 1165
mbed_official 3:7a284390b0ce 1166 /**
mbed_official 3:7a284390b0ce 1167 * @addtogroup ComplexFFT
mbed_official 3:7a284390b0ce 1168 * @{
mbed_official 3:7a284390b0ce 1169 */
emilmont 1:fdd22bb7aa52 1170
mbed_official 3:7a284390b0ce 1171 /**
mbed_official 3:7a284390b0ce 1172 * @details
mbed_official 3:7a284390b0ce 1173 * @brief Processing function for the floating-point Radix-4 CFFT/CIFFT.
mbed_official 3:7a284390b0ce 1174 * @deprecated Do not use this function. It has been superceded by \ref arm_cfft_f32 and will be removed
mbed_official 3:7a284390b0ce 1175 * in the future.
mbed_official 3:7a284390b0ce 1176 * @param[in] *S points to an instance of the floating-point Radix-4 CFFT/CIFFT structure.
mbed_official 3:7a284390b0ce 1177 * @param[in, out] *pSrc points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place.
mbed_official 3:7a284390b0ce 1178 * @return none.
mbed_official 3:7a284390b0ce 1179 */
emilmont 1:fdd22bb7aa52 1180
mbed_official 3:7a284390b0ce 1181 void arm_cfft_radix4_f32(
mbed_official 3:7a284390b0ce 1182 const arm_cfft_radix4_instance_f32 * S,
mbed_official 3:7a284390b0ce 1183 float32_t * pSrc)
mbed_official 3:7a284390b0ce 1184 {
emilmont 1:fdd22bb7aa52 1185
mbed_official 3:7a284390b0ce 1186 if(S->ifftFlag == 1u)
mbed_official 3:7a284390b0ce 1187 {
mbed_official 3:7a284390b0ce 1188 /* Complex IFFT radix-4 */
mbed_official 3:7a284390b0ce 1189 arm_radix4_butterfly_inverse_f32(pSrc, S->fftLen, S->pTwiddle,
mbed_official 3:7a284390b0ce 1190 S->twidCoefModifier, S->onebyfftLen);
mbed_official 3:7a284390b0ce 1191 }
mbed_official 3:7a284390b0ce 1192 else
mbed_official 3:7a284390b0ce 1193 {
mbed_official 3:7a284390b0ce 1194 /* Complex FFT radix-4 */
mbed_official 3:7a284390b0ce 1195 arm_radix4_butterfly_f32(pSrc, S->fftLen, S->pTwiddle,
mbed_official 3:7a284390b0ce 1196 S->twidCoefModifier);
mbed_official 3:7a284390b0ce 1197 }
emilmont 1:fdd22bb7aa52 1198
mbed_official 3:7a284390b0ce 1199 if(S->bitReverseFlag == 1u)
mbed_official 3:7a284390b0ce 1200 {
mbed_official 3:7a284390b0ce 1201 /* Bit Reversal */
mbed_official 3:7a284390b0ce 1202 arm_bitreversal_f32(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable);
mbed_official 3:7a284390b0ce 1203 }
emilmont 1:fdd22bb7aa52 1204
emilmont 1:fdd22bb7aa52 1205 }
mbed_official 3:7a284390b0ce 1206
mbed_official 3:7a284390b0ce 1207 /**
mbed_official 3:7a284390b0ce 1208 * @} end of ComplexFFT group
mbed_official 3:7a284390b0ce 1209 */
mbed_official 3:7a284390b0ce 1210