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_q15.c
emh203 0:3d9c67d97d6f 9 *
emh203 0:3d9c67d97d6f 10 * Description: Radix-2 Decimation in Frequency CFFT & CIFFT Fixed 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_q15(
emh203 0:3d9c67d97d6f 45 q15_t * pSrc,
emh203 0:3d9c67d97d6f 46 uint32_t fftLen,
emh203 0:3d9c67d97d6f 47 q15_t * pCoef,
emh203 0:3d9c67d97d6f 48 uint16_t twidCoefModifier);
emh203 0:3d9c67d97d6f 49
emh203 0:3d9c67d97d6f 50 void arm_radix2_butterfly_inverse_q15(
emh203 0:3d9c67d97d6f 51 q15_t * pSrc,
emh203 0:3d9c67d97d6f 52 uint32_t fftLen,
emh203 0:3d9c67d97d6f 53 q15_t * pCoef,
emh203 0:3d9c67d97d6f 54 uint16_t twidCoefModifier);
emh203 0:3d9c67d97d6f 55
emh203 0:3d9c67d97d6f 56 void arm_bitreversal_q15(
emh203 0:3d9c67d97d6f 57 q15_t * pSrc,
emh203 0:3d9c67d97d6f 58 uint32_t fftLen,
emh203 0:3d9c67d97d6f 59 uint16_t bitRevFactor,
emh203 0:3d9c67d97d6f 60 uint16_t * pBitRevTab);
emh203 0:3d9c67d97d6f 61
emh203 0:3d9c67d97d6f 62 /**
emh203 0:3d9c67d97d6f 63 * @ingroup groupTransforms
emh203 0:3d9c67d97d6f 64 */
emh203 0:3d9c67d97d6f 65
emh203 0:3d9c67d97d6f 66 /**
emh203 0:3d9c67d97d6f 67 * @addtogroup ComplexFFT
emh203 0:3d9c67d97d6f 68 * @{
emh203 0:3d9c67d97d6f 69 */
emh203 0:3d9c67d97d6f 70
emh203 0:3d9c67d97d6f 71 /**
emh203 0:3d9c67d97d6f 72 * @details
emh203 0:3d9c67d97d6f 73 * @brief Processing function for the fixed-point CFFT/CIFFT.
emh203 0:3d9c67d97d6f 74 * @param[in] *S points to an instance of the fixed-point CFFT/CIFFT structure.
emh203 0:3d9c67d97d6f 75 * @param[in, out] *pSrc points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place.
emh203 0:3d9c67d97d6f 76 * @return none.
emh203 0:3d9c67d97d6f 77 */
emh203 0:3d9c67d97d6f 78
emh203 0:3d9c67d97d6f 79 void arm_cfft_radix2_q15(
emh203 0:3d9c67d97d6f 80 const arm_cfft_radix2_instance_q15 * S,
emh203 0:3d9c67d97d6f 81 q15_t * pSrc)
emh203 0:3d9c67d97d6f 82 {
emh203 0:3d9c67d97d6f 83
emh203 0:3d9c67d97d6f 84 if(S->ifftFlag == 1u)
emh203 0:3d9c67d97d6f 85 {
emh203 0:3d9c67d97d6f 86 arm_radix2_butterfly_inverse_q15(pSrc, S->fftLen,
emh203 0:3d9c67d97d6f 87 S->pTwiddle, S->twidCoefModifier);
emh203 0:3d9c67d97d6f 88 }
emh203 0:3d9c67d97d6f 89 else
emh203 0:3d9c67d97d6f 90 {
emh203 0:3d9c67d97d6f 91 arm_radix2_butterfly_q15(pSrc, S->fftLen,
emh203 0:3d9c67d97d6f 92 S->pTwiddle, S->twidCoefModifier);
emh203 0:3d9c67d97d6f 93 }
emh203 0:3d9c67d97d6f 94
emh203 0:3d9c67d97d6f 95 arm_bitreversal_q15(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable);
emh203 0:3d9c67d97d6f 96 }
emh203 0:3d9c67d97d6f 97
emh203 0:3d9c67d97d6f 98 /**
emh203 0:3d9c67d97d6f 99 * @} end of ComplexFFT group
emh203 0:3d9c67d97d6f 100 */
emh203 0:3d9c67d97d6f 101
emh203 0:3d9c67d97d6f 102 void arm_radix2_butterfly_q15(
emh203 0:3d9c67d97d6f 103 q15_t * pSrc,
emh203 0:3d9c67d97d6f 104 uint32_t fftLen,
emh203 0:3d9c67d97d6f 105 q15_t * pCoef,
emh203 0:3d9c67d97d6f 106 uint16_t twidCoefModifier)
emh203 0:3d9c67d97d6f 107 {
emh203 0:3d9c67d97d6f 108 #ifndef ARM_MATH_CM0_FAMILY
emh203 0:3d9c67d97d6f 109
emh203 0:3d9c67d97d6f 110 unsigned i, j, k, l;
emh203 0:3d9c67d97d6f 111 unsigned n1, n2, ia;
emh203 0:3d9c67d97d6f 112 q15_t in;
emh203 0:3d9c67d97d6f 113 q31_t T, S, R;
emh203 0:3d9c67d97d6f 114 q31_t coeff, out1, out2;
emh203 0:3d9c67d97d6f 115
emh203 0:3d9c67d97d6f 116 //N = fftLen;
emh203 0:3d9c67d97d6f 117 n2 = fftLen;
emh203 0:3d9c67d97d6f 118
emh203 0:3d9c67d97d6f 119 n1 = n2;
emh203 0:3d9c67d97d6f 120 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 121 ia = 0;
emh203 0:3d9c67d97d6f 122
emh203 0:3d9c67d97d6f 123 // loop for groups
emh203 0:3d9c67d97d6f 124 for (i = 0; i < n2; i++)
emh203 0:3d9c67d97d6f 125 {
emh203 0:3d9c67d97d6f 126 coeff = _SIMD32_OFFSET(pCoef + (ia * 2u));
emh203 0:3d9c67d97d6f 127
emh203 0:3d9c67d97d6f 128 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 129
emh203 0:3d9c67d97d6f 130 l = i + n2;
emh203 0:3d9c67d97d6f 131
emh203 0:3d9c67d97d6f 132 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 133 in = ((int16_t) (T & 0xFFFF)) >> 1;
emh203 0:3d9c67d97d6f 134 T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
emh203 0:3d9c67d97d6f 135
emh203 0:3d9c67d97d6f 136 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 137 in = ((int16_t) (S & 0xFFFF)) >> 1;
emh203 0:3d9c67d97d6f 138 S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
emh203 0:3d9c67d97d6f 139
emh203 0:3d9c67d97d6f 140 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 141
emh203 0:3d9c67d97d6f 142 _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
emh203 0:3d9c67d97d6f 143
emh203 0:3d9c67d97d6f 144 #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 145
emh203 0:3d9c67d97d6f 146 out1 = __SMUAD(coeff, R) >> 16;
emh203 0:3d9c67d97d6f 147 out2 = __SMUSDX(coeff, R);
emh203 0:3d9c67d97d6f 148
emh203 0:3d9c67d97d6f 149 #else
emh203 0:3d9c67d97d6f 150
emh203 0:3d9c67d97d6f 151 out1 = __SMUSDX(R, coeff) >> 16u;
emh203 0:3d9c67d97d6f 152 out2 = __SMUAD(coeff, R);
emh203 0:3d9c67d97d6f 153
emh203 0:3d9c67d97d6f 154 #endif // #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 155
emh203 0:3d9c67d97d6f 156 _SIMD32_OFFSET(pSrc + (2u * l)) =
emh203 0:3d9c67d97d6f 157 (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
emh203 0:3d9c67d97d6f 158
emh203 0:3d9c67d97d6f 159 coeff = _SIMD32_OFFSET(pCoef + (ia * 2u));
emh203 0:3d9c67d97d6f 160
emh203 0:3d9c67d97d6f 161 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 162
emh203 0:3d9c67d97d6f 163 // loop for butterfly
emh203 0:3d9c67d97d6f 164 i++;
emh203 0:3d9c67d97d6f 165 l++;
emh203 0:3d9c67d97d6f 166
emh203 0:3d9c67d97d6f 167 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 168 in = ((int16_t) (T & 0xFFFF)) >> 1;
emh203 0:3d9c67d97d6f 169 T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
emh203 0:3d9c67d97d6f 170
emh203 0:3d9c67d97d6f 171 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 172 in = ((int16_t) (S & 0xFFFF)) >> 1;
emh203 0:3d9c67d97d6f 173 S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
emh203 0:3d9c67d97d6f 174
emh203 0:3d9c67d97d6f 175 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 176
emh203 0:3d9c67d97d6f 177 _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
emh203 0:3d9c67d97d6f 178
emh203 0:3d9c67d97d6f 179 #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 180
emh203 0:3d9c67d97d6f 181 out1 = __SMUAD(coeff, R) >> 16;
emh203 0:3d9c67d97d6f 182 out2 = __SMUSDX(coeff, R);
emh203 0:3d9c67d97d6f 183
emh203 0:3d9c67d97d6f 184 #else
emh203 0:3d9c67d97d6f 185
emh203 0:3d9c67d97d6f 186 out1 = __SMUSDX(R, coeff) >> 16u;
emh203 0:3d9c67d97d6f 187 out2 = __SMUAD(coeff, R);
emh203 0:3d9c67d97d6f 188
emh203 0:3d9c67d97d6f 189 #endif // #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 190
emh203 0:3d9c67d97d6f 191 _SIMD32_OFFSET(pSrc + (2u * l)) =
emh203 0:3d9c67d97d6f 192 (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
emh203 0:3d9c67d97d6f 193
emh203 0:3d9c67d97d6f 194 } // groups loop end
emh203 0:3d9c67d97d6f 195
emh203 0:3d9c67d97d6f 196 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 197
emh203 0:3d9c67d97d6f 198 // loop for stage
emh203 0:3d9c67d97d6f 199 for (k = fftLen / 2; k > 2; k = k >> 1)
emh203 0:3d9c67d97d6f 200 {
emh203 0:3d9c67d97d6f 201 n1 = n2;
emh203 0:3d9c67d97d6f 202 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 203 ia = 0;
emh203 0:3d9c67d97d6f 204
emh203 0:3d9c67d97d6f 205 // loop for groups
emh203 0:3d9c67d97d6f 206 for (j = 0; j < n2; j++)
emh203 0:3d9c67d97d6f 207 {
emh203 0:3d9c67d97d6f 208 coeff = _SIMD32_OFFSET(pCoef + (ia * 2u));
emh203 0:3d9c67d97d6f 209
emh203 0:3d9c67d97d6f 210 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 211
emh203 0:3d9c67d97d6f 212 // loop for butterfly
emh203 0:3d9c67d97d6f 213 for (i = j; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 214 {
emh203 0:3d9c67d97d6f 215 l = i + n2;
emh203 0:3d9c67d97d6f 216
emh203 0:3d9c67d97d6f 217 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 218
emh203 0:3d9c67d97d6f 219 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 220
emh203 0:3d9c67d97d6f 221 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 222
emh203 0:3d9c67d97d6f 223 _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
emh203 0:3d9c67d97d6f 224
emh203 0:3d9c67d97d6f 225 #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 226
emh203 0:3d9c67d97d6f 227 out1 = __SMUAD(coeff, R) >> 16;
emh203 0:3d9c67d97d6f 228 out2 = __SMUSDX(coeff, R);
emh203 0:3d9c67d97d6f 229
emh203 0:3d9c67d97d6f 230 #else
emh203 0:3d9c67d97d6f 231
emh203 0:3d9c67d97d6f 232 out1 = __SMUSDX(R, coeff) >> 16u;
emh203 0:3d9c67d97d6f 233 out2 = __SMUAD(coeff, R);
emh203 0:3d9c67d97d6f 234
emh203 0:3d9c67d97d6f 235 #endif // #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 236
emh203 0:3d9c67d97d6f 237 _SIMD32_OFFSET(pSrc + (2u * l)) =
emh203 0:3d9c67d97d6f 238 (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
emh203 0:3d9c67d97d6f 239
emh203 0:3d9c67d97d6f 240 i += n1;
emh203 0:3d9c67d97d6f 241
emh203 0:3d9c67d97d6f 242 l = i + n2;
emh203 0:3d9c67d97d6f 243
emh203 0:3d9c67d97d6f 244 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 245
emh203 0:3d9c67d97d6f 246 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 247
emh203 0:3d9c67d97d6f 248 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 249
emh203 0:3d9c67d97d6f 250 _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
emh203 0:3d9c67d97d6f 251
emh203 0:3d9c67d97d6f 252 #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 253
emh203 0:3d9c67d97d6f 254 out1 = __SMUAD(coeff, R) >> 16;
emh203 0:3d9c67d97d6f 255 out2 = __SMUSDX(coeff, R);
emh203 0:3d9c67d97d6f 256
emh203 0:3d9c67d97d6f 257 #else
emh203 0:3d9c67d97d6f 258
emh203 0:3d9c67d97d6f 259 out1 = __SMUSDX(R, coeff) >> 16u;
emh203 0:3d9c67d97d6f 260 out2 = __SMUAD(coeff, R);
emh203 0:3d9c67d97d6f 261
emh203 0:3d9c67d97d6f 262 #endif // #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 263
emh203 0:3d9c67d97d6f 264 _SIMD32_OFFSET(pSrc + (2u * l)) =
emh203 0:3d9c67d97d6f 265 (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
emh203 0:3d9c67d97d6f 266
emh203 0:3d9c67d97d6f 267 } // butterfly loop end
emh203 0:3d9c67d97d6f 268
emh203 0:3d9c67d97d6f 269 } // groups loop end
emh203 0:3d9c67d97d6f 270
emh203 0:3d9c67d97d6f 271 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 272 } // stages loop end
emh203 0:3d9c67d97d6f 273
emh203 0:3d9c67d97d6f 274 n1 = n2;
emh203 0:3d9c67d97d6f 275 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 276 ia = 0;
emh203 0:3d9c67d97d6f 277
emh203 0:3d9c67d97d6f 278 coeff = _SIMD32_OFFSET(pCoef + (ia * 2u));
emh203 0:3d9c67d97d6f 279
emh203 0:3d9c67d97d6f 280 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 281
emh203 0:3d9c67d97d6f 282 // loop for butterfly
emh203 0:3d9c67d97d6f 283 for (i = 0; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 284 {
emh203 0:3d9c67d97d6f 285 l = i + n2;
emh203 0:3d9c67d97d6f 286
emh203 0:3d9c67d97d6f 287 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 288
emh203 0:3d9c67d97d6f 289 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 290
emh203 0:3d9c67d97d6f 291 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 292
emh203 0:3d9c67d97d6f 293 _SIMD32_OFFSET(pSrc + (2 * i)) = __QADD16(T, S);
emh203 0:3d9c67d97d6f 294
emh203 0:3d9c67d97d6f 295 _SIMD32_OFFSET(pSrc + (2u * l)) = R;
emh203 0:3d9c67d97d6f 296
emh203 0:3d9c67d97d6f 297 i += n1;
emh203 0:3d9c67d97d6f 298 l = i + n2;
emh203 0:3d9c67d97d6f 299
emh203 0:3d9c67d97d6f 300 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 301
emh203 0:3d9c67d97d6f 302 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 303
emh203 0:3d9c67d97d6f 304 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 305
emh203 0:3d9c67d97d6f 306 _SIMD32_OFFSET(pSrc + (2 * i)) = __QADD16(T, S);
emh203 0:3d9c67d97d6f 307
emh203 0:3d9c67d97d6f 308 _SIMD32_OFFSET(pSrc + (2u * l)) = R;
emh203 0:3d9c67d97d6f 309
emh203 0:3d9c67d97d6f 310 } // groups loop end
emh203 0:3d9c67d97d6f 311
emh203 0:3d9c67d97d6f 312
emh203 0:3d9c67d97d6f 313 #else
emh203 0:3d9c67d97d6f 314
emh203 0:3d9c67d97d6f 315 unsigned i, j, k, l;
emh203 0:3d9c67d97d6f 316 unsigned n1, n2, ia;
emh203 0:3d9c67d97d6f 317 q15_t xt, yt, cosVal, sinVal;
emh203 0:3d9c67d97d6f 318
emh203 0:3d9c67d97d6f 319
emh203 0:3d9c67d97d6f 320 //N = fftLen;
emh203 0:3d9c67d97d6f 321 n2 = fftLen;
emh203 0:3d9c67d97d6f 322
emh203 0:3d9c67d97d6f 323 n1 = n2;
emh203 0:3d9c67d97d6f 324 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 325 ia = 0;
emh203 0:3d9c67d97d6f 326
emh203 0:3d9c67d97d6f 327 // loop for groups
emh203 0:3d9c67d97d6f 328 for (j = 0; j < n2; j++)
emh203 0:3d9c67d97d6f 329 {
emh203 0:3d9c67d97d6f 330 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 331 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 332 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 333
emh203 0:3d9c67d97d6f 334 // loop for butterfly
emh203 0:3d9c67d97d6f 335 for (i = j; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 336 {
emh203 0:3d9c67d97d6f 337 l = i + n2;
emh203 0:3d9c67d97d6f 338 xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u);
emh203 0:3d9c67d97d6f 339 pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u;
emh203 0:3d9c67d97d6f 340
emh203 0:3d9c67d97d6f 341 yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u);
emh203 0:3d9c67d97d6f 342 pSrc[2 * i + 1] =
emh203 0:3d9c67d97d6f 343 ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u;
emh203 0:3d9c67d97d6f 344
emh203 0:3d9c67d97d6f 345 pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) +
emh203 0:3d9c67d97d6f 346 ((int16_t) (((q31_t) yt * sinVal) >> 16)));
emh203 0:3d9c67d97d6f 347
emh203 0:3d9c67d97d6f 348 pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) -
emh203 0:3d9c67d97d6f 349 ((int16_t) (((q31_t) xt * sinVal) >> 16)));
emh203 0:3d9c67d97d6f 350
emh203 0:3d9c67d97d6f 351 } // butterfly loop end
emh203 0:3d9c67d97d6f 352
emh203 0:3d9c67d97d6f 353 } // groups loop end
emh203 0:3d9c67d97d6f 354
emh203 0:3d9c67d97d6f 355 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 356
emh203 0:3d9c67d97d6f 357 // loop for stage
emh203 0:3d9c67d97d6f 358 for (k = fftLen / 2; k > 2; k = k >> 1)
emh203 0:3d9c67d97d6f 359 {
emh203 0:3d9c67d97d6f 360 n1 = n2;
emh203 0:3d9c67d97d6f 361 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 362 ia = 0;
emh203 0:3d9c67d97d6f 363
emh203 0:3d9c67d97d6f 364 // loop for groups
emh203 0:3d9c67d97d6f 365 for (j = 0; j < n2; j++)
emh203 0:3d9c67d97d6f 366 {
emh203 0:3d9c67d97d6f 367 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 368 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 369 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 370
emh203 0:3d9c67d97d6f 371 // loop for butterfly
emh203 0:3d9c67d97d6f 372 for (i = j; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 373 {
emh203 0:3d9c67d97d6f 374 l = i + n2;
emh203 0:3d9c67d97d6f 375 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 376 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1u;
emh203 0:3d9c67d97d6f 377
emh203 0:3d9c67d97d6f 378 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 379 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1u;
emh203 0:3d9c67d97d6f 380
emh203 0:3d9c67d97d6f 381 pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) +
emh203 0:3d9c67d97d6f 382 ((int16_t) (((q31_t) yt * sinVal) >> 16)));
emh203 0:3d9c67d97d6f 383
emh203 0:3d9c67d97d6f 384 pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) -
emh203 0:3d9c67d97d6f 385 ((int16_t) (((q31_t) xt * sinVal) >> 16)));
emh203 0:3d9c67d97d6f 386
emh203 0:3d9c67d97d6f 387 } // butterfly loop end
emh203 0:3d9c67d97d6f 388
emh203 0:3d9c67d97d6f 389 } // groups loop end
emh203 0:3d9c67d97d6f 390
emh203 0:3d9c67d97d6f 391 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 392 } // stages loop end
emh203 0:3d9c67d97d6f 393
emh203 0:3d9c67d97d6f 394 n1 = n2;
emh203 0:3d9c67d97d6f 395 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 396 ia = 0;
emh203 0:3d9c67d97d6f 397
emh203 0:3d9c67d97d6f 398 // loop for groups
emh203 0:3d9c67d97d6f 399 for (j = 0; j < n2; j++)
emh203 0:3d9c67d97d6f 400 {
emh203 0:3d9c67d97d6f 401 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 402 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 403
emh203 0:3d9c67d97d6f 404 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 405
emh203 0:3d9c67d97d6f 406 // loop for butterfly
emh203 0:3d9c67d97d6f 407 for (i = j; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 408 {
emh203 0:3d9c67d97d6f 409 l = i + n2;
emh203 0:3d9c67d97d6f 410 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 411 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
emh203 0:3d9c67d97d6f 412
emh203 0:3d9c67d97d6f 413 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 414 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
emh203 0:3d9c67d97d6f 415
emh203 0:3d9c67d97d6f 416 pSrc[2u * l] = xt;
emh203 0:3d9c67d97d6f 417
emh203 0:3d9c67d97d6f 418 pSrc[2u * l + 1u] = yt;
emh203 0:3d9c67d97d6f 419
emh203 0:3d9c67d97d6f 420 } // butterfly loop end
emh203 0:3d9c67d97d6f 421
emh203 0:3d9c67d97d6f 422 } // groups loop end
emh203 0:3d9c67d97d6f 423
emh203 0:3d9c67d97d6f 424 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 425
emh203 0:3d9c67d97d6f 426 #endif // #ifndef ARM_MATH_CM0_FAMILY
emh203 0:3d9c67d97d6f 427
emh203 0:3d9c67d97d6f 428 }
emh203 0:3d9c67d97d6f 429
emh203 0:3d9c67d97d6f 430
emh203 0:3d9c67d97d6f 431 void arm_radix2_butterfly_inverse_q15(
emh203 0:3d9c67d97d6f 432 q15_t * pSrc,
emh203 0:3d9c67d97d6f 433 uint32_t fftLen,
emh203 0:3d9c67d97d6f 434 q15_t * pCoef,
emh203 0:3d9c67d97d6f 435 uint16_t twidCoefModifier)
emh203 0:3d9c67d97d6f 436 {
emh203 0:3d9c67d97d6f 437 #ifndef ARM_MATH_CM0_FAMILY
emh203 0:3d9c67d97d6f 438
emh203 0:3d9c67d97d6f 439 unsigned i, j, k, l;
emh203 0:3d9c67d97d6f 440 unsigned n1, n2, ia;
emh203 0:3d9c67d97d6f 441 q15_t in;
emh203 0:3d9c67d97d6f 442 q31_t T, S, R;
emh203 0:3d9c67d97d6f 443 q31_t coeff, out1, out2;
emh203 0:3d9c67d97d6f 444
emh203 0:3d9c67d97d6f 445 //N = fftLen;
emh203 0:3d9c67d97d6f 446 n2 = fftLen;
emh203 0:3d9c67d97d6f 447
emh203 0:3d9c67d97d6f 448 n1 = n2;
emh203 0:3d9c67d97d6f 449 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 450 ia = 0;
emh203 0:3d9c67d97d6f 451
emh203 0:3d9c67d97d6f 452 // loop for groups
emh203 0:3d9c67d97d6f 453 for (i = 0; i < n2; i++)
emh203 0:3d9c67d97d6f 454 {
emh203 0:3d9c67d97d6f 455 coeff = _SIMD32_OFFSET(pCoef + (ia * 2u));
emh203 0:3d9c67d97d6f 456
emh203 0:3d9c67d97d6f 457 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 458
emh203 0:3d9c67d97d6f 459 l = i + n2;
emh203 0:3d9c67d97d6f 460
emh203 0:3d9c67d97d6f 461 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 462 in = ((int16_t) (T & 0xFFFF)) >> 1;
emh203 0:3d9c67d97d6f 463 T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
emh203 0:3d9c67d97d6f 464
emh203 0:3d9c67d97d6f 465 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 466 in = ((int16_t) (S & 0xFFFF)) >> 1;
emh203 0:3d9c67d97d6f 467 S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
emh203 0:3d9c67d97d6f 468
emh203 0:3d9c67d97d6f 469 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 470
emh203 0:3d9c67d97d6f 471 _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
emh203 0:3d9c67d97d6f 472
emh203 0:3d9c67d97d6f 473 #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 474
emh203 0:3d9c67d97d6f 475 out1 = __SMUSD(coeff, R) >> 16;
emh203 0:3d9c67d97d6f 476 out2 = __SMUADX(coeff, R);
emh203 0:3d9c67d97d6f 477 #else
emh203 0:3d9c67d97d6f 478
emh203 0:3d9c67d97d6f 479 out1 = __SMUADX(R, coeff) >> 16u;
emh203 0:3d9c67d97d6f 480 out2 = __SMUSD(__QSUB(0, coeff), R);
emh203 0:3d9c67d97d6f 481
emh203 0:3d9c67d97d6f 482 #endif // #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 483
emh203 0:3d9c67d97d6f 484 _SIMD32_OFFSET(pSrc + (2u * l)) =
emh203 0:3d9c67d97d6f 485 (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
emh203 0:3d9c67d97d6f 486
emh203 0:3d9c67d97d6f 487 coeff = _SIMD32_OFFSET(pCoef + (ia * 2u));
emh203 0:3d9c67d97d6f 488
emh203 0:3d9c67d97d6f 489 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 490
emh203 0:3d9c67d97d6f 491 // loop for butterfly
emh203 0:3d9c67d97d6f 492 i++;
emh203 0:3d9c67d97d6f 493 l++;
emh203 0:3d9c67d97d6f 494
emh203 0:3d9c67d97d6f 495 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 496 in = ((int16_t) (T & 0xFFFF)) >> 1;
emh203 0:3d9c67d97d6f 497 T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
emh203 0:3d9c67d97d6f 498
emh203 0:3d9c67d97d6f 499 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 500 in = ((int16_t) (S & 0xFFFF)) >> 1;
emh203 0:3d9c67d97d6f 501 S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
emh203 0:3d9c67d97d6f 502
emh203 0:3d9c67d97d6f 503 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 504
emh203 0:3d9c67d97d6f 505 _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
emh203 0:3d9c67d97d6f 506
emh203 0:3d9c67d97d6f 507 #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 508
emh203 0:3d9c67d97d6f 509 out1 = __SMUSD(coeff, R) >> 16;
emh203 0:3d9c67d97d6f 510 out2 = __SMUADX(coeff, R);
emh203 0:3d9c67d97d6f 511 #else
emh203 0:3d9c67d97d6f 512
emh203 0:3d9c67d97d6f 513 out1 = __SMUADX(R, coeff) >> 16u;
emh203 0:3d9c67d97d6f 514 out2 = __SMUSD(__QSUB(0, coeff), R);
emh203 0:3d9c67d97d6f 515
emh203 0:3d9c67d97d6f 516 #endif // #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 517
emh203 0:3d9c67d97d6f 518 _SIMD32_OFFSET(pSrc + (2u * l)) =
emh203 0:3d9c67d97d6f 519 (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
emh203 0:3d9c67d97d6f 520
emh203 0:3d9c67d97d6f 521 } // groups loop end
emh203 0:3d9c67d97d6f 522
emh203 0:3d9c67d97d6f 523 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 524
emh203 0:3d9c67d97d6f 525 // loop for stage
emh203 0:3d9c67d97d6f 526 for (k = fftLen / 2; k > 2; k = k >> 1)
emh203 0:3d9c67d97d6f 527 {
emh203 0:3d9c67d97d6f 528 n1 = n2;
emh203 0:3d9c67d97d6f 529 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 530 ia = 0;
emh203 0:3d9c67d97d6f 531
emh203 0:3d9c67d97d6f 532 // loop for groups
emh203 0:3d9c67d97d6f 533 for (j = 0; j < n2; j++)
emh203 0:3d9c67d97d6f 534 {
emh203 0:3d9c67d97d6f 535 coeff = _SIMD32_OFFSET(pCoef + (ia * 2u));
emh203 0:3d9c67d97d6f 536
emh203 0:3d9c67d97d6f 537 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 538
emh203 0:3d9c67d97d6f 539 // loop for butterfly
emh203 0:3d9c67d97d6f 540 for (i = j; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 541 {
emh203 0:3d9c67d97d6f 542 l = i + n2;
emh203 0:3d9c67d97d6f 543
emh203 0:3d9c67d97d6f 544 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 545
emh203 0:3d9c67d97d6f 546 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 547
emh203 0:3d9c67d97d6f 548 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 549
emh203 0:3d9c67d97d6f 550 _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
emh203 0:3d9c67d97d6f 551
emh203 0:3d9c67d97d6f 552 #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 553
emh203 0:3d9c67d97d6f 554 out1 = __SMUSD(coeff, R) >> 16;
emh203 0:3d9c67d97d6f 555 out2 = __SMUADX(coeff, R);
emh203 0:3d9c67d97d6f 556
emh203 0:3d9c67d97d6f 557 #else
emh203 0:3d9c67d97d6f 558
emh203 0:3d9c67d97d6f 559 out1 = __SMUADX(R, coeff) >> 16u;
emh203 0:3d9c67d97d6f 560 out2 = __SMUSD(__QSUB(0, coeff), R);
emh203 0:3d9c67d97d6f 561
emh203 0:3d9c67d97d6f 562 #endif // #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 563
emh203 0:3d9c67d97d6f 564 _SIMD32_OFFSET(pSrc + (2u * l)) =
emh203 0:3d9c67d97d6f 565 (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
emh203 0:3d9c67d97d6f 566
emh203 0:3d9c67d97d6f 567 i += n1;
emh203 0:3d9c67d97d6f 568
emh203 0:3d9c67d97d6f 569 l = i + n2;
emh203 0:3d9c67d97d6f 570
emh203 0:3d9c67d97d6f 571 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 572
emh203 0:3d9c67d97d6f 573 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 574
emh203 0:3d9c67d97d6f 575 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 576
emh203 0:3d9c67d97d6f 577 _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
emh203 0:3d9c67d97d6f 578
emh203 0:3d9c67d97d6f 579 #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 580
emh203 0:3d9c67d97d6f 581 out1 = __SMUSD(coeff, R) >> 16;
emh203 0:3d9c67d97d6f 582 out2 = __SMUADX(coeff, R);
emh203 0:3d9c67d97d6f 583 #else
emh203 0:3d9c67d97d6f 584
emh203 0:3d9c67d97d6f 585 out1 = __SMUADX(R, coeff) >> 16u;
emh203 0:3d9c67d97d6f 586 out2 = __SMUSD(__QSUB(0, coeff), R);
emh203 0:3d9c67d97d6f 587
emh203 0:3d9c67d97d6f 588 #endif // #ifndef ARM_MATH_BIG_ENDIAN
emh203 0:3d9c67d97d6f 589
emh203 0:3d9c67d97d6f 590 _SIMD32_OFFSET(pSrc + (2u * l)) =
emh203 0:3d9c67d97d6f 591 (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
emh203 0:3d9c67d97d6f 592
emh203 0:3d9c67d97d6f 593 } // butterfly loop end
emh203 0:3d9c67d97d6f 594
emh203 0:3d9c67d97d6f 595 } // groups loop end
emh203 0:3d9c67d97d6f 596
emh203 0:3d9c67d97d6f 597 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 598 } // stages loop end
emh203 0:3d9c67d97d6f 599
emh203 0:3d9c67d97d6f 600 n1 = n2;
emh203 0:3d9c67d97d6f 601 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 602 ia = 0;
emh203 0:3d9c67d97d6f 603
emh203 0:3d9c67d97d6f 604 // loop for groups
emh203 0:3d9c67d97d6f 605 for (j = 0; j < n2; j++)
emh203 0:3d9c67d97d6f 606 {
emh203 0:3d9c67d97d6f 607 coeff = _SIMD32_OFFSET(pCoef + (ia * 2u));
emh203 0:3d9c67d97d6f 608
emh203 0:3d9c67d97d6f 609 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 610
emh203 0:3d9c67d97d6f 611 // loop for butterfly
emh203 0:3d9c67d97d6f 612 for (i = j; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 613 {
emh203 0:3d9c67d97d6f 614 l = i + n2;
emh203 0:3d9c67d97d6f 615
emh203 0:3d9c67d97d6f 616 T = _SIMD32_OFFSET(pSrc + (2 * i));
emh203 0:3d9c67d97d6f 617
emh203 0:3d9c67d97d6f 618 S = _SIMD32_OFFSET(pSrc + (2 * l));
emh203 0:3d9c67d97d6f 619
emh203 0:3d9c67d97d6f 620 R = __QSUB16(T, S);
emh203 0:3d9c67d97d6f 621
emh203 0:3d9c67d97d6f 622 _SIMD32_OFFSET(pSrc + (2 * i)) = __QADD16(T, S);
emh203 0:3d9c67d97d6f 623
emh203 0:3d9c67d97d6f 624 _SIMD32_OFFSET(pSrc + (2u * l)) = R;
emh203 0:3d9c67d97d6f 625
emh203 0:3d9c67d97d6f 626 } // butterfly loop end
emh203 0:3d9c67d97d6f 627
emh203 0:3d9c67d97d6f 628 } // groups loop end
emh203 0:3d9c67d97d6f 629
emh203 0:3d9c67d97d6f 630 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 631
emh203 0:3d9c67d97d6f 632 #else
emh203 0:3d9c67d97d6f 633
emh203 0:3d9c67d97d6f 634
emh203 0:3d9c67d97d6f 635 unsigned i, j, k, l;
emh203 0:3d9c67d97d6f 636 unsigned n1, n2, ia;
emh203 0:3d9c67d97d6f 637 q15_t xt, yt, cosVal, sinVal;
emh203 0:3d9c67d97d6f 638
emh203 0:3d9c67d97d6f 639 //N = fftLen;
emh203 0:3d9c67d97d6f 640 n2 = fftLen;
emh203 0:3d9c67d97d6f 641
emh203 0:3d9c67d97d6f 642 n1 = n2;
emh203 0:3d9c67d97d6f 643 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 644 ia = 0;
emh203 0:3d9c67d97d6f 645
emh203 0:3d9c67d97d6f 646 // loop for groups
emh203 0:3d9c67d97d6f 647 for (j = 0; j < n2; j++)
emh203 0:3d9c67d97d6f 648 {
emh203 0:3d9c67d97d6f 649 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 650 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 651 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 652
emh203 0:3d9c67d97d6f 653 // loop for butterfly
emh203 0:3d9c67d97d6f 654 for (i = j; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 655 {
emh203 0:3d9c67d97d6f 656 l = i + n2;
emh203 0:3d9c67d97d6f 657 xt = (pSrc[2 * i] >> 1u) - (pSrc[2 * l] >> 1u);
emh203 0:3d9c67d97d6f 658 pSrc[2 * i] = ((pSrc[2 * i] >> 1u) + (pSrc[2 * l] >> 1u)) >> 1u;
emh203 0:3d9c67d97d6f 659
emh203 0:3d9c67d97d6f 660 yt = (pSrc[2 * i + 1] >> 1u) - (pSrc[2 * l + 1] >> 1u);
emh203 0:3d9c67d97d6f 661 pSrc[2 * i + 1] =
emh203 0:3d9c67d97d6f 662 ((pSrc[2 * l + 1] >> 1u) + (pSrc[2 * i + 1] >> 1u)) >> 1u;
emh203 0:3d9c67d97d6f 663
emh203 0:3d9c67d97d6f 664 pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) -
emh203 0:3d9c67d97d6f 665 ((int16_t) (((q31_t) yt * sinVal) >> 16)));
emh203 0:3d9c67d97d6f 666
emh203 0:3d9c67d97d6f 667 pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) +
emh203 0:3d9c67d97d6f 668 ((int16_t) (((q31_t) xt * sinVal) >> 16)));
emh203 0:3d9c67d97d6f 669
emh203 0:3d9c67d97d6f 670 } // butterfly loop end
emh203 0:3d9c67d97d6f 671
emh203 0:3d9c67d97d6f 672 } // groups loop end
emh203 0:3d9c67d97d6f 673
emh203 0:3d9c67d97d6f 674 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 675
emh203 0:3d9c67d97d6f 676 // loop for stage
emh203 0:3d9c67d97d6f 677 for (k = fftLen / 2; k > 2; k = k >> 1)
emh203 0:3d9c67d97d6f 678 {
emh203 0:3d9c67d97d6f 679 n1 = n2;
emh203 0:3d9c67d97d6f 680 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 681 ia = 0;
emh203 0:3d9c67d97d6f 682
emh203 0:3d9c67d97d6f 683 // loop for groups
emh203 0:3d9c67d97d6f 684 for (j = 0; j < n2; j++)
emh203 0:3d9c67d97d6f 685 {
emh203 0:3d9c67d97d6f 686 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 687 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 688 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 689
emh203 0:3d9c67d97d6f 690 // loop for butterfly
emh203 0:3d9c67d97d6f 691 for (i = j; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 692 {
emh203 0:3d9c67d97d6f 693 l = i + n2;
emh203 0:3d9c67d97d6f 694 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 695 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1u;
emh203 0:3d9c67d97d6f 696
emh203 0:3d9c67d97d6f 697 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 698 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1u;
emh203 0:3d9c67d97d6f 699
emh203 0:3d9c67d97d6f 700 pSrc[2u * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) -
emh203 0:3d9c67d97d6f 701 ((int16_t) (((q31_t) yt * sinVal) >> 16)));
emh203 0:3d9c67d97d6f 702
emh203 0:3d9c67d97d6f 703 pSrc[2u * l + 1u] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) +
emh203 0:3d9c67d97d6f 704 ((int16_t) (((q31_t) xt * sinVal) >> 16)));
emh203 0:3d9c67d97d6f 705
emh203 0:3d9c67d97d6f 706 } // butterfly loop end
emh203 0:3d9c67d97d6f 707
emh203 0:3d9c67d97d6f 708 } // groups loop end
emh203 0:3d9c67d97d6f 709
emh203 0:3d9c67d97d6f 710 twidCoefModifier = twidCoefModifier << 1u;
emh203 0:3d9c67d97d6f 711 } // stages loop end
emh203 0:3d9c67d97d6f 712
emh203 0:3d9c67d97d6f 713 n1 = n2;
emh203 0:3d9c67d97d6f 714 n2 = n2 >> 1;
emh203 0:3d9c67d97d6f 715 ia = 0;
emh203 0:3d9c67d97d6f 716
emh203 0:3d9c67d97d6f 717 cosVal = pCoef[ia * 2];
emh203 0:3d9c67d97d6f 718 sinVal = pCoef[(ia * 2) + 1];
emh203 0:3d9c67d97d6f 719
emh203 0:3d9c67d97d6f 720 ia = ia + twidCoefModifier;
emh203 0:3d9c67d97d6f 721
emh203 0:3d9c67d97d6f 722 // loop for butterfly
emh203 0:3d9c67d97d6f 723 for (i = 0; i < fftLen; i += n1)
emh203 0:3d9c67d97d6f 724 {
emh203 0:3d9c67d97d6f 725 l = i + n2;
emh203 0:3d9c67d97d6f 726 xt = pSrc[2 * i] - pSrc[2 * l];
emh203 0:3d9c67d97d6f 727 pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
emh203 0:3d9c67d97d6f 728
emh203 0:3d9c67d97d6f 729 yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
emh203 0:3d9c67d97d6f 730 pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
emh203 0:3d9c67d97d6f 731
emh203 0:3d9c67d97d6f 732 pSrc[2u * l] = xt;
emh203 0:3d9c67d97d6f 733
emh203 0:3d9c67d97d6f 734 pSrc[2u * l + 1u] = yt;
emh203 0:3d9c67d97d6f 735
emh203 0:3d9c67d97d6f 736 } // groups loop end
emh203 0:3d9c67d97d6f 737
emh203 0:3d9c67d97d6f 738
emh203 0:3d9c67d97d6f 739 #endif // #ifndef ARM_MATH_CM0_FAMILY
emh203 0:3d9c67d97d6f 740
emh203 0:3d9c67d97d6f 741 }