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
emilmont 1:fdd22bb7aa52 1 /* ----------------------------------------------------------------------
mbed_official 5:3762170b6d4d 2 * Copyright (C) 2010-2014 ARM Limited. All rights reserved.
emilmont 1:fdd22bb7aa52 3 *
mbed_official 5:3762170b6d4d 4 * $Date: 19. March 2015
mbed_official 5:3762170b6d4d 5 * $Revision: V.1.4.5
emilmont 1:fdd22bb7aa52 6 *
emilmont 2:da51fb522205 7 * Project: CMSIS DSP Library
emilmont 2:da51fb522205 8 * Title: arm_cfft_radix2_q31.c
emilmont 1:fdd22bb7aa52 9 *
emilmont 2:da51fb522205 10 * Description: Radix-2 Decimation in Frequency CFFT & CIFFT Fixed 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
emilmont 1:fdd22bb7aa52 44 void arm_radix2_butterfly_q31(
emilmont 1:fdd22bb7aa52 45 q31_t * pSrc,
emilmont 1:fdd22bb7aa52 46 uint32_t fftLen,
emilmont 1:fdd22bb7aa52 47 q31_t * pCoef,
mbed_official 3:7a284390b0ce 48 uint16_t twidCoefModifier);
mbed_official 3:7a284390b0ce 49
mbed_official 3:7a284390b0ce 50 void arm_radix2_butterfly_inverse_q31(
mbed_official 3:7a284390b0ce 51 q31_t * pSrc,
mbed_official 3:7a284390b0ce 52 uint32_t fftLen,
mbed_official 3:7a284390b0ce 53 q31_t * pCoef,
mbed_official 3:7a284390b0ce 54 uint16_t twidCoefModifier);
mbed_official 3:7a284390b0ce 55
mbed_official 3:7a284390b0ce 56 void arm_bitreversal_q31(
mbed_official 3:7a284390b0ce 57 q31_t * pSrc,
mbed_official 3:7a284390b0ce 58 uint32_t fftLen,
mbed_official 3:7a284390b0ce 59 uint16_t bitRevFactor,
mbed_official 3:7a284390b0ce 60 uint16_t * pBitRevTab);
mbed_official 3:7a284390b0ce 61
mbed_official 3:7a284390b0ce 62 /**
mbed_official 3:7a284390b0ce 63 * @ingroup groupTransforms
mbed_official 3:7a284390b0ce 64 */
mbed_official 3:7a284390b0ce 65
mbed_official 3:7a284390b0ce 66 /**
mbed_official 3:7a284390b0ce 67 * @addtogroup ComplexFFT
mbed_official 3:7a284390b0ce 68 * @{
mbed_official 3:7a284390b0ce 69 */
mbed_official 3:7a284390b0ce 70
mbed_official 3:7a284390b0ce 71 /**
mbed_official 3:7a284390b0ce 72 * @details
mbed_official 3:7a284390b0ce 73 * @brief Processing function for the fixed-point CFFT/CIFFT.
mbed_official 5:3762170b6d4d 74 * @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q31 and will be removed
mbed_official 3:7a284390b0ce 75 * @param[in] *S points to an instance of the fixed-point CFFT/CIFFT structure.
mbed_official 3:7a284390b0ce 76 * @param[in, out] *pSrc points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place.
mbed_official 3:7a284390b0ce 77 * @return none.
mbed_official 3:7a284390b0ce 78 */
mbed_official 3:7a284390b0ce 79
mbed_official 3:7a284390b0ce 80 void arm_cfft_radix2_q31(
mbed_official 3:7a284390b0ce 81 const arm_cfft_radix2_instance_q31 * S,
mbed_official 3:7a284390b0ce 82 q31_t * pSrc)
emilmont 1:fdd22bb7aa52 83 {
emilmont 1:fdd22bb7aa52 84
mbed_official 3:7a284390b0ce 85 if(S->ifftFlag == 1u)
mbed_official 3:7a284390b0ce 86 {
mbed_official 3:7a284390b0ce 87 arm_radix2_butterfly_inverse_q31(pSrc, S->fftLen,
mbed_official 3:7a284390b0ce 88 S->pTwiddle, S->twidCoefModifier);
mbed_official 3:7a284390b0ce 89 }
mbed_official 3:7a284390b0ce 90 else
mbed_official 3:7a284390b0ce 91 {
mbed_official 3:7a284390b0ce 92 arm_radix2_butterfly_q31(pSrc, S->fftLen,
mbed_official 3:7a284390b0ce 93 S->pTwiddle, S->twidCoefModifier);
mbed_official 3:7a284390b0ce 94 }
emilmont 1:fdd22bb7aa52 95
mbed_official 3:7a284390b0ce 96 arm_bitreversal_q31(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable);
mbed_official 3:7a284390b0ce 97 }
emilmont 1:fdd22bb7aa52 98
mbed_official 3:7a284390b0ce 99 /**
mbed_official 3:7a284390b0ce 100 * @} end of ComplexFFT group
mbed_official 3:7a284390b0ce 101 */
emilmont 1:fdd22bb7aa52 102
mbed_official 3:7a284390b0ce 103 void arm_radix2_butterfly_q31(
mbed_official 3:7a284390b0ce 104 q31_t * pSrc,
mbed_official 3:7a284390b0ce 105 uint32_t fftLen,
mbed_official 3:7a284390b0ce 106 q31_t * pCoef,
mbed_official 3:7a284390b0ce 107 uint16_t twidCoefModifier)
mbed_official 3:7a284390b0ce 108 {
emilmont 1:fdd22bb7aa52 109
mbed_official 3:7a284390b0ce 110 unsigned i, j, k, l, m;
mbed_official 3:7a284390b0ce 111 unsigned n1, n2, ia;
mbed_official 3:7a284390b0ce 112 q31_t xt, yt, cosVal, sinVal;
mbed_official 3:7a284390b0ce 113 q31_t p0, p1;
mbed_official 3:7a284390b0ce 114
mbed_official 3:7a284390b0ce 115 //N = fftLen;
mbed_official 3:7a284390b0ce 116 n2 = fftLen;
emilmont 1:fdd22bb7aa52 117
mbed_official 3:7a284390b0ce 118 n1 = n2;
mbed_official 3:7a284390b0ce 119 n2 = n2 >> 1;
mbed_official 3:7a284390b0ce 120 ia = 0;
emilmont 1:fdd22bb7aa52 121
mbed_official 3:7a284390b0ce 122 // loop for groups
mbed_official 3:7a284390b0ce 123 for (i = 0; i < n2; i++)
mbed_official 3:7a284390b0ce 124 {
emilmont 1:fdd22bb7aa52 125 cosVal = pCoef[ia * 2];
emilmont 1:fdd22bb7aa52 126 sinVal = pCoef[(ia * 2) + 1];
emilmont 1:fdd22bb7aa52 127 ia = ia + twidCoefModifier;
emilmont 1:fdd22bb7aa52 128
mbed_official 3:7a284390b0ce 129 l = i + n2;
mbed_official 5:3762170b6d4d 130 xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u);
mbed_official 5:3762170b6d4d 131 pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u;
mbed_official 3:7a284390b0ce 132
mbed_official 5:3762170b6d4d 133 yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u);
mbed_official 3:7a284390b0ce 134 pSrc[2 * i + 1] =
mbed_official 5:3762170b6d4d 135 ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u;
emilmont 1:fdd22bb7aa52 136
mbed_official 3:7a284390b0ce 137 mult_32x32_keep32_R(p0, xt, cosVal);
mbed_official 3:7a284390b0ce 138 mult_32x32_keep32_R(p1, yt, cosVal);
mbed_official 3:7a284390b0ce 139 multAcc_32x32_keep32_R(p0, yt, sinVal);
mbed_official 3:7a284390b0ce 140 multSub_32x32_keep32_R(p1, xt, sinVal);
mbed_official 3:7a284390b0ce 141
mbed_official 3:7a284390b0ce 142 pSrc[2u * l] = p0;
mbed_official 3:7a284390b0ce 143 pSrc[2u * l + 1u] = p1;
emilmont 1:fdd22bb7aa52 144
mbed_official 3:7a284390b0ce 145 } // groups loop end
mbed_official 3:7a284390b0ce 146
mbed_official 3:7a284390b0ce 147 twidCoefModifier <<= 1u;
emilmont 1:fdd22bb7aa52 148
mbed_official 3:7a284390b0ce 149 // loop for stage
mbed_official 3:7a284390b0ce 150 for (k = fftLen / 2; k > 2; k = k >> 1)
mbed_official 3:7a284390b0ce 151 {
mbed_official 3:7a284390b0ce 152 n1 = n2;
mbed_official 3:7a284390b0ce 153 n2 = n2 >> 1;
mbed_official 3:7a284390b0ce 154 ia = 0;
emilmont 1:fdd22bb7aa52 155
mbed_official 3:7a284390b0ce 156 // loop for groups
mbed_official 3:7a284390b0ce 157 for (j = 0; j < n2; j++)
mbed_official 3:7a284390b0ce 158 {
mbed_official 3:7a284390b0ce 159 cosVal = pCoef[ia * 2];
mbed_official 3:7a284390b0ce 160 sinVal = pCoef[(ia * 2) + 1];
mbed_official 3:7a284390b0ce 161 ia = ia + twidCoefModifier;
emilmont 1:fdd22bb7aa52 162
mbed_official 3:7a284390b0ce 163 // loop for butterfly
mbed_official 3:7a284390b0ce 164 i = j;
mbed_official 3:7a284390b0ce 165 m = fftLen / n1;
mbed_official 3:7a284390b0ce 166 do
mbed_official 3:7a284390b0ce 167 {
mbed_official 3:7a284390b0ce 168 l = i + n2;
mbed_official 3:7a284390b0ce 169 xt = pSrc[2 * i] - pSrc[2 * l];
mbed_official 3:7a284390b0ce 170 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1u;
mbed_official 3:7a284390b0ce 171
mbed_official 3:7a284390b0ce 172 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
mbed_official 3:7a284390b0ce 173 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1u;
emilmont 1:fdd22bb7aa52 174
mbed_official 3:7a284390b0ce 175 mult_32x32_keep32_R(p0, xt, cosVal);
mbed_official 3:7a284390b0ce 176 mult_32x32_keep32_R(p1, yt, cosVal);
mbed_official 3:7a284390b0ce 177 multAcc_32x32_keep32_R(p0, yt, sinVal);
mbed_official 3:7a284390b0ce 178 multSub_32x32_keep32_R(p1, xt, sinVal);
mbed_official 3:7a284390b0ce 179
mbed_official 3:7a284390b0ce 180 pSrc[2u * l] = p0;
mbed_official 3:7a284390b0ce 181 pSrc[2u * l + 1u] = p1;
mbed_official 3:7a284390b0ce 182 i += n1;
mbed_official 3:7a284390b0ce 183 m--;
mbed_official 3:7a284390b0ce 184 } while( m > 0); // butterfly loop end
emilmont 1:fdd22bb7aa52 185
mbed_official 3:7a284390b0ce 186 } // groups loop end
mbed_official 3:7a284390b0ce 187
mbed_official 3:7a284390b0ce 188 twidCoefModifier <<= 1u;
mbed_official 3:7a284390b0ce 189 } // stages loop end
emilmont 1:fdd22bb7aa52 190
mbed_official 3:7a284390b0ce 191 n1 = n2;
mbed_official 3:7a284390b0ce 192 n2 = n2 >> 1;
mbed_official 3:7a284390b0ce 193 ia = 0;
emilmont 1:fdd22bb7aa52 194
mbed_official 3:7a284390b0ce 195 cosVal = pCoef[ia * 2];
mbed_official 3:7a284390b0ce 196 sinVal = pCoef[(ia * 2) + 1];
mbed_official 3:7a284390b0ce 197 ia = ia + twidCoefModifier;
emilmont 1:fdd22bb7aa52 198
mbed_official 3:7a284390b0ce 199 // loop for butterfly
mbed_official 3:7a284390b0ce 200 for (i = 0; i < fftLen; i += n1)
mbed_official 3:7a284390b0ce 201 {
mbed_official 3:7a284390b0ce 202 l = i + n2;
mbed_official 3:7a284390b0ce 203 xt = pSrc[2 * i] - pSrc[2 * l];
mbed_official 3:7a284390b0ce 204 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
emilmont 1:fdd22bb7aa52 205
mbed_official 3:7a284390b0ce 206 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
mbed_official 3:7a284390b0ce 207 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
emilmont 1:fdd22bb7aa52 208
mbed_official 3:7a284390b0ce 209 pSrc[2u * l] = xt;
mbed_official 3:7a284390b0ce 210
mbed_official 3:7a284390b0ce 211 pSrc[2u * l + 1u] = yt;
emilmont 1:fdd22bb7aa52 212
mbed_official 3:7a284390b0ce 213 i += n1;
mbed_official 3:7a284390b0ce 214 l = i + n2;
mbed_official 3:7a284390b0ce 215
mbed_official 3:7a284390b0ce 216 xt = pSrc[2 * i] - pSrc[2 * l];
mbed_official 3:7a284390b0ce 217 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
emilmont 1:fdd22bb7aa52 218
mbed_official 3:7a284390b0ce 219 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
mbed_official 3:7a284390b0ce 220 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
emilmont 1:fdd22bb7aa52 221
mbed_official 3:7a284390b0ce 222 pSrc[2u * l] = xt;
emilmont 1:fdd22bb7aa52 223
mbed_official 3:7a284390b0ce 224 pSrc[2u * l + 1u] = yt;
mbed_official 3:7a284390b0ce 225
mbed_official 3:7a284390b0ce 226 } // butterfly loop end
emilmont 1:fdd22bb7aa52 227
emilmont 1:fdd22bb7aa52 228 }
emilmont 1:fdd22bb7aa52 229
emilmont 1:fdd22bb7aa52 230
emilmont 1:fdd22bb7aa52 231 void arm_radix2_butterfly_inverse_q31(
mbed_official 3:7a284390b0ce 232 q31_t * pSrc,
mbed_official 3:7a284390b0ce 233 uint32_t fftLen,
mbed_official 3:7a284390b0ce 234 q31_t * pCoef,
mbed_official 3:7a284390b0ce 235 uint16_t twidCoefModifier)
emilmont 1:fdd22bb7aa52 236 {
emilmont 1:fdd22bb7aa52 237
mbed_official 3:7a284390b0ce 238 unsigned i, j, k, l;
mbed_official 3:7a284390b0ce 239 unsigned n1, n2, ia;
mbed_official 3:7a284390b0ce 240 q31_t xt, yt, cosVal, sinVal;
mbed_official 3:7a284390b0ce 241 q31_t p0, p1;
emilmont 1:fdd22bb7aa52 242
mbed_official 3:7a284390b0ce 243 //N = fftLen;
mbed_official 3:7a284390b0ce 244 n2 = fftLen;
emilmont 1:fdd22bb7aa52 245
mbed_official 3:7a284390b0ce 246 n1 = n2;
mbed_official 3:7a284390b0ce 247 n2 = n2 >> 1;
mbed_official 3:7a284390b0ce 248 ia = 0;
emilmont 1:fdd22bb7aa52 249
mbed_official 3:7a284390b0ce 250 // loop for groups
mbed_official 3:7a284390b0ce 251 for (i = 0; i < n2; i++)
mbed_official 3:7a284390b0ce 252 {
emilmont 1:fdd22bb7aa52 253 cosVal = pCoef[ia * 2];
emilmont 1:fdd22bb7aa52 254 sinVal = pCoef[(ia * 2) + 1];
emilmont 1:fdd22bb7aa52 255 ia = ia + twidCoefModifier;
emilmont 1:fdd22bb7aa52 256
mbed_official 3:7a284390b0ce 257 l = i + n2;
mbed_official 5:3762170b6d4d 258 xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u);
mbed_official 5:3762170b6d4d 259 pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u;
mbed_official 3:7a284390b0ce 260
mbed_official 5:3762170b6d4d 261 yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u);
mbed_official 3:7a284390b0ce 262 pSrc[2 * i + 1] =
mbed_official 5:3762170b6d4d 263 ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u;
emilmont 1:fdd22bb7aa52 264
mbed_official 3:7a284390b0ce 265 mult_32x32_keep32_R(p0, xt, cosVal);
mbed_official 3:7a284390b0ce 266 mult_32x32_keep32_R(p1, yt, cosVal);
mbed_official 3:7a284390b0ce 267 multSub_32x32_keep32_R(p0, yt, sinVal);
mbed_official 3:7a284390b0ce 268 multAcc_32x32_keep32_R(p1, xt, sinVal);
mbed_official 3:7a284390b0ce 269
mbed_official 3:7a284390b0ce 270 pSrc[2u * l] = p0;
mbed_official 3:7a284390b0ce 271 pSrc[2u * l + 1u] = p1;
mbed_official 3:7a284390b0ce 272 } // groups loop end
emilmont 1:fdd22bb7aa52 273
mbed_official 3:7a284390b0ce 274 twidCoefModifier = twidCoefModifier << 1u;
emilmont 1:fdd22bb7aa52 275
mbed_official 3:7a284390b0ce 276 // loop for stage
mbed_official 3:7a284390b0ce 277 for (k = fftLen / 2; k > 2; k = k >> 1)
mbed_official 3:7a284390b0ce 278 {
mbed_official 3:7a284390b0ce 279 n1 = n2;
mbed_official 3:7a284390b0ce 280 n2 = n2 >> 1;
mbed_official 3:7a284390b0ce 281 ia = 0;
emilmont 1:fdd22bb7aa52 282
mbed_official 3:7a284390b0ce 283 // loop for groups
mbed_official 3:7a284390b0ce 284 for (j = 0; j < n2; j++)
mbed_official 3:7a284390b0ce 285 {
mbed_official 3:7a284390b0ce 286 cosVal = pCoef[ia * 2];
mbed_official 3:7a284390b0ce 287 sinVal = pCoef[(ia * 2) + 1];
mbed_official 3:7a284390b0ce 288 ia = ia + twidCoefModifier;
emilmont 1:fdd22bb7aa52 289
mbed_official 3:7a284390b0ce 290 // loop for butterfly
mbed_official 3:7a284390b0ce 291 for (i = j; i < fftLen; i += n1)
mbed_official 3:7a284390b0ce 292 {
mbed_official 3:7a284390b0ce 293 l = i + n2;
mbed_official 3:7a284390b0ce 294 xt = pSrc[2 * i] - pSrc[2 * l];
mbed_official 3:7a284390b0ce 295 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1u;
mbed_official 3:7a284390b0ce 296
mbed_official 3:7a284390b0ce 297 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
mbed_official 3:7a284390b0ce 298 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1u;
emilmont 1:fdd22bb7aa52 299
mbed_official 3:7a284390b0ce 300 mult_32x32_keep32_R(p0, xt, cosVal);
mbed_official 3:7a284390b0ce 301 mult_32x32_keep32_R(p1, yt, cosVal);
mbed_official 3:7a284390b0ce 302 multSub_32x32_keep32_R(p0, yt, sinVal);
mbed_official 3:7a284390b0ce 303 multAcc_32x32_keep32_R(p1, xt, sinVal);
mbed_official 3:7a284390b0ce 304
mbed_official 3:7a284390b0ce 305 pSrc[2u * l] = p0;
mbed_official 3:7a284390b0ce 306 pSrc[2u * l + 1u] = p1;
mbed_official 3:7a284390b0ce 307 } // butterfly loop end
mbed_official 3:7a284390b0ce 308
mbed_official 3:7a284390b0ce 309 } // groups loop end
emilmont 1:fdd22bb7aa52 310
mbed_official 3:7a284390b0ce 311 twidCoefModifier = twidCoefModifier << 1u;
mbed_official 3:7a284390b0ce 312 } // stages loop end
emilmont 1:fdd22bb7aa52 313
mbed_official 3:7a284390b0ce 314 n1 = n2;
mbed_official 3:7a284390b0ce 315 n2 = n2 >> 1;
mbed_official 3:7a284390b0ce 316 ia = 0;
emilmont 1:fdd22bb7aa52 317
mbed_official 3:7a284390b0ce 318 cosVal = pCoef[ia * 2];
mbed_official 3:7a284390b0ce 319 sinVal = pCoef[(ia * 2) + 1];
mbed_official 3:7a284390b0ce 320 ia = ia + twidCoefModifier;
emilmont 1:fdd22bb7aa52 321
mbed_official 3:7a284390b0ce 322 // loop for butterfly
mbed_official 3:7a284390b0ce 323 for (i = 0; i < fftLen; i += n1)
mbed_official 3:7a284390b0ce 324 {
mbed_official 3:7a284390b0ce 325 l = i + n2;
mbed_official 3:7a284390b0ce 326 xt = pSrc[2 * i] - pSrc[2 * l];
mbed_official 3:7a284390b0ce 327 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
emilmont 1:fdd22bb7aa52 328
mbed_official 3:7a284390b0ce 329 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
mbed_official 3:7a284390b0ce 330 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
emilmont 1:fdd22bb7aa52 331
mbed_official 3:7a284390b0ce 332 pSrc[2u * l] = xt;
mbed_official 3:7a284390b0ce 333
mbed_official 3:7a284390b0ce 334 pSrc[2u * l + 1u] = yt;
emilmont 1:fdd22bb7aa52 335
mbed_official 3:7a284390b0ce 336 i += n1;
mbed_official 3:7a284390b0ce 337 l = i + n2;
mbed_official 3:7a284390b0ce 338
mbed_official 3:7a284390b0ce 339 xt = pSrc[2 * i] - pSrc[2 * l];
mbed_official 3:7a284390b0ce 340 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
emilmont 1:fdd22bb7aa52 341
mbed_official 3:7a284390b0ce 342 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
mbed_official 3:7a284390b0ce 343 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
emilmont 1:fdd22bb7aa52 344
mbed_official 3:7a284390b0ce 345 pSrc[2u * l] = xt;
emilmont 1:fdd22bb7aa52 346
mbed_official 3:7a284390b0ce 347 pSrc[2u * l + 1u] = yt;
mbed_official 3:7a284390b0ce 348
mbed_official 3:7a284390b0ce 349 } // butterfly loop end
emilmont 1:fdd22bb7aa52 350
emilmont 1:fdd22bb7aa52 351 }