Robert Lopez / CMSIS5
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers arm_cfft_radix2_q15.c Source File

arm_cfft_radix2_q15.c

00001 /* ----------------------------------------------------------------------
00002  * Project:      CMSIS DSP Library
00003  * Title:        arm_cfft_radix2_q15.c
00004  * Description:  Radix-2 Decimation in Frequency CFFT & CIFFT Fixed point processing function
00005  *
00006  * $Date:        27. January 2017
00007  * $Revision:    V.1.5.1
00008  *
00009  * Target Processor: Cortex-M cores
00010  * -------------------------------------------------------------------- */
00011 /*
00012  * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved.
00013  *
00014  * SPDX-License-Identifier: Apache-2.0
00015  *
00016  * Licensed under the Apache License, Version 2.0 (the License); you may
00017  * not use this file except in compliance with the License.
00018  * You may obtain a copy of the License at
00019  *
00020  * www.apache.org/licenses/LICENSE-2.0
00021  *
00022  * Unless required by applicable law or agreed to in writing, software
00023  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
00024  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00025  * See the License for the specific language governing permissions and
00026  * limitations under the License.
00027  */
00028 
00029 #include "arm_math.h"
00030 
00031 void arm_radix2_butterfly_q15(
00032   q15_t * pSrc,
00033   uint32_t fftLen,
00034   q15_t * pCoef,
00035   uint16_t twidCoefModifier);
00036 
00037 void arm_radix2_butterfly_inverse_q15(
00038   q15_t * pSrc,
00039   uint32_t fftLen,
00040   q15_t * pCoef,
00041   uint16_t twidCoefModifier);
00042 
00043 void arm_bitreversal_q15(
00044   q15_t * pSrc,
00045   uint32_t fftLen,
00046   uint16_t bitRevFactor,
00047   uint16_t * pBitRevTab);
00048 
00049 /**
00050  * @ingroup groupTransforms
00051  */
00052 
00053 /**
00054  * @addtogroup ComplexFFT
00055  * @{
00056  */
00057 
00058 /**
00059  * @details
00060  * @brief Processing function for the fixed-point CFFT/CIFFT.
00061  * @deprecated Do not use this function.  It has been superseded by \ref arm_cfft_q15 and will be removed
00062  * @param[in]      *S    points to an instance of the fixed-point CFFT/CIFFT structure.
00063  * @param[in, out] *pSrc points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place.
00064  * @return none.
00065  */
00066 
00067 void arm_cfft_radix2_q15(
00068   const arm_cfft_radix2_instance_q15 * S,
00069   q15_t * pSrc)
00070 {
00071 
00072   if (S->ifftFlag == 1U)
00073   {
00074     arm_radix2_butterfly_inverse_q15(pSrc, S->fftLen,
00075                                      S->pTwiddle, S->twidCoefModifier);
00076   }
00077   else
00078   {
00079     arm_radix2_butterfly_q15(pSrc, S->fftLen,
00080                              S->pTwiddle, S->twidCoefModifier);
00081   }
00082 
00083   arm_bitreversal_q15(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable);
00084 }
00085 
00086 /**
00087  * @} end of ComplexFFT group
00088  */
00089 
00090 void arm_radix2_butterfly_q15(
00091   q15_t * pSrc,
00092   uint32_t fftLen,
00093   q15_t * pCoef,
00094   uint16_t twidCoefModifier)
00095 {
00096 #if defined (ARM_MATH_DSP)
00097 
00098   unsigned i, j, k, l;
00099   unsigned n1, n2, ia;
00100   q15_t in;
00101   q31_t T, S, R;
00102   q31_t coeff, out1, out2;
00103 
00104   //N = fftLen;
00105   n2 = fftLen;
00106 
00107   n1 = n2;
00108   n2 = n2 >> 1;
00109   ia = 0;
00110 
00111   // loop for groups
00112   for (i = 0; i < n2; i++)
00113   {
00114     coeff = _SIMD32_OFFSET(pCoef + (ia * 2U));
00115 
00116     ia = ia + twidCoefModifier;
00117 
00118     l = i + n2;
00119 
00120     T = _SIMD32_OFFSET(pSrc + (2 * i));
00121     in = ((int16_t) (T & 0xFFFF)) >> 1;
00122     T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
00123 
00124     S = _SIMD32_OFFSET(pSrc + (2 * l));
00125     in = ((int16_t) (S & 0xFFFF)) >> 1;
00126     S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
00127 
00128     R = __QSUB16(T, S);
00129 
00130     _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
00131 
00132 #ifndef ARM_MATH_BIG_ENDIAN
00133 
00134     out1 = __SMUAD(coeff, R) >> 16;
00135     out2 = __SMUSDX(coeff, R);
00136 
00137 #else
00138 
00139     out1 = __SMUSDX(R, coeff) >> 16U;
00140     out2 = __SMUAD(coeff, R);
00141 
00142 #endif //     #ifndef ARM_MATH_BIG_ENDIAN
00143 
00144     _SIMD32_OFFSET(pSrc + (2U * l)) =
00145       (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
00146 
00147     coeff = _SIMD32_OFFSET(pCoef + (ia * 2U));
00148 
00149     ia = ia + twidCoefModifier;
00150 
00151     // loop for butterfly
00152     i++;
00153     l++;
00154 
00155     T = _SIMD32_OFFSET(pSrc + (2 * i));
00156     in = ((int16_t) (T & 0xFFFF)) >> 1;
00157     T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
00158 
00159     S = _SIMD32_OFFSET(pSrc + (2 * l));
00160     in = ((int16_t) (S & 0xFFFF)) >> 1;
00161     S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
00162 
00163     R = __QSUB16(T, S);
00164 
00165     _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
00166 
00167 #ifndef ARM_MATH_BIG_ENDIAN
00168 
00169     out1 = __SMUAD(coeff, R) >> 16;
00170     out2 = __SMUSDX(coeff, R);
00171 
00172 #else
00173 
00174     out1 = __SMUSDX(R, coeff) >> 16U;
00175     out2 = __SMUAD(coeff, R);
00176 
00177 #endif //     #ifndef ARM_MATH_BIG_ENDIAN
00178 
00179     _SIMD32_OFFSET(pSrc + (2U * l)) =
00180       (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
00181 
00182   }                             // groups loop end
00183 
00184   twidCoefModifier = twidCoefModifier << 1U;
00185 
00186   // loop for stage
00187   for (k = fftLen / 2; k > 2; k = k >> 1)
00188   {
00189     n1 = n2;
00190     n2 = n2 >> 1;
00191     ia = 0;
00192 
00193     // loop for groups
00194     for (j = 0; j < n2; j++)
00195     {
00196       coeff = _SIMD32_OFFSET(pCoef + (ia * 2U));
00197 
00198       ia = ia + twidCoefModifier;
00199 
00200       // loop for butterfly
00201       for (i = j; i < fftLen; i += n1)
00202       {
00203         l = i + n2;
00204 
00205         T = _SIMD32_OFFSET(pSrc + (2 * i));
00206 
00207         S = _SIMD32_OFFSET(pSrc + (2 * l));
00208 
00209         R = __QSUB16(T, S);
00210 
00211         _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
00212 
00213 #ifndef ARM_MATH_BIG_ENDIAN
00214 
00215         out1 = __SMUAD(coeff, R) >> 16;
00216         out2 = __SMUSDX(coeff, R);
00217 
00218 #else
00219 
00220         out1 = __SMUSDX(R, coeff) >> 16U;
00221         out2 = __SMUAD(coeff, R);
00222 
00223 #endif //     #ifndef ARM_MATH_BIG_ENDIAN
00224 
00225         _SIMD32_OFFSET(pSrc + (2U * l)) =
00226           (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
00227 
00228         i += n1;
00229 
00230         l = i + n2;
00231 
00232         T = _SIMD32_OFFSET(pSrc + (2 * i));
00233 
00234         S = _SIMD32_OFFSET(pSrc + (2 * l));
00235 
00236         R = __QSUB16(T, S);
00237 
00238         _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
00239 
00240 #ifndef ARM_MATH_BIG_ENDIAN
00241 
00242         out1 = __SMUAD(coeff, R) >> 16;
00243         out2 = __SMUSDX(coeff, R);
00244 
00245 #else
00246 
00247         out1 = __SMUSDX(R, coeff) >> 16U;
00248         out2 = __SMUAD(coeff, R);
00249 
00250 #endif //     #ifndef ARM_MATH_BIG_ENDIAN
00251 
00252         _SIMD32_OFFSET(pSrc + (2U * l)) =
00253           (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
00254 
00255       }                         // butterfly loop end
00256 
00257     }                           // groups loop end
00258 
00259     twidCoefModifier = twidCoefModifier << 1U;
00260   }                             // stages loop end
00261 
00262   n1 = n2;
00263   n2 = n2 >> 1;
00264   ia = 0;
00265 
00266   coeff = _SIMD32_OFFSET(pCoef + (ia * 2U));
00267 
00268   ia = ia + twidCoefModifier;
00269 
00270   // loop for butterfly
00271   for (i = 0; i < fftLen; i += n1)
00272   {
00273     l = i + n2;
00274 
00275     T = _SIMD32_OFFSET(pSrc + (2 * i));
00276 
00277     S = _SIMD32_OFFSET(pSrc + (2 * l));
00278 
00279     R = __QSUB16(T, S);
00280 
00281     _SIMD32_OFFSET(pSrc + (2 * i)) = __QADD16(T, S);
00282 
00283     _SIMD32_OFFSET(pSrc + (2U * l)) = R;
00284 
00285     i += n1;
00286     l = i + n2;
00287 
00288     T = _SIMD32_OFFSET(pSrc + (2 * i));
00289 
00290     S = _SIMD32_OFFSET(pSrc + (2 * l));
00291 
00292     R = __QSUB16(T, S);
00293 
00294     _SIMD32_OFFSET(pSrc + (2 * i)) = __QADD16(T, S);
00295 
00296     _SIMD32_OFFSET(pSrc + (2U * l)) = R;
00297 
00298   }                             // groups loop end
00299 
00300 
00301 #else
00302 
00303   unsigned i, j, k, l;
00304   unsigned n1, n2, ia;
00305   q15_t xt, yt, cosVal, sinVal;
00306 
00307 
00308   //N = fftLen;
00309   n2 = fftLen;
00310 
00311   n1 = n2;
00312   n2 = n2 >> 1;
00313   ia = 0;
00314 
00315   // loop for groups
00316   for (j = 0; j < n2; j++)
00317   {
00318     cosVal = pCoef[ia * 2];
00319     sinVal = pCoef[(ia * 2) + 1];
00320     ia = ia + twidCoefModifier;
00321 
00322     // loop for butterfly
00323     for (i = j; i < fftLen; i += n1)
00324     {
00325       l = i + n2;
00326       xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U);
00327       pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U;
00328 
00329       yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U);
00330       pSrc[2 * i + 1] =
00331         ((pSrc[2 * l + 1] >> 1U) + (pSrc[2 * i + 1] >> 1U)) >> 1U;
00332 
00333       pSrc[2U * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) +
00334                       ((int16_t) (((q31_t) yt * sinVal) >> 16)));
00335 
00336       pSrc[2U * l + 1U] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) -
00337                            ((int16_t) (((q31_t) xt * sinVal) >> 16)));
00338 
00339     }                           // butterfly loop end
00340 
00341   }                             // groups loop end
00342 
00343   twidCoefModifier = twidCoefModifier << 1U;
00344 
00345   // loop for stage
00346   for (k = fftLen / 2; k > 2; k = k >> 1)
00347   {
00348     n1 = n2;
00349     n2 = n2 >> 1;
00350     ia = 0;
00351 
00352     // loop for groups
00353     for (j = 0; j < n2; j++)
00354     {
00355       cosVal = pCoef[ia * 2];
00356       sinVal = pCoef[(ia * 2) + 1];
00357       ia = ia + twidCoefModifier;
00358 
00359       // loop for butterfly
00360       for (i = j; i < fftLen; i += n1)
00361       {
00362         l = i + n2;
00363         xt = pSrc[2 * i] - pSrc[2 * l];
00364         pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U;
00365 
00366         yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
00367         pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U;
00368 
00369         pSrc[2U * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) +
00370                         ((int16_t) (((q31_t) yt * sinVal) >> 16)));
00371 
00372         pSrc[2U * l + 1U] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) -
00373                              ((int16_t) (((q31_t) xt * sinVal) >> 16)));
00374 
00375       }                         // butterfly loop end
00376 
00377     }                           // groups loop end
00378 
00379     twidCoefModifier = twidCoefModifier << 1U;
00380   }                             // stages loop end
00381 
00382   n1 = n2;
00383   n2 = n2 >> 1;
00384   ia = 0;
00385 
00386   // loop for groups
00387   for (j = 0; j < n2; j++)
00388   {
00389     cosVal = pCoef[ia * 2];
00390     sinVal = pCoef[(ia * 2) + 1];
00391 
00392     ia = ia + twidCoefModifier;
00393 
00394     // loop for butterfly
00395     for (i = j; i < fftLen; i += n1)
00396     {
00397       l = i + n2;
00398       xt = pSrc[2 * i] - pSrc[2 * l];
00399       pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
00400 
00401       yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
00402       pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
00403 
00404       pSrc[2U * l] = xt;
00405 
00406       pSrc[2U * l + 1U] = yt;
00407 
00408     }                           // butterfly loop end
00409 
00410   }                             // groups loop end
00411 
00412   twidCoefModifier = twidCoefModifier << 1U;
00413 
00414 #endif //             #if defined (ARM_MATH_DSP)
00415 
00416 }
00417 
00418 
00419 void arm_radix2_butterfly_inverse_q15(
00420   q15_t * pSrc,
00421   uint32_t fftLen,
00422   q15_t * pCoef,
00423   uint16_t twidCoefModifier)
00424 {
00425 #if defined (ARM_MATH_DSP)
00426 
00427   unsigned i, j, k, l;
00428   unsigned n1, n2, ia;
00429   q15_t in;
00430   q31_t T, S, R;
00431   q31_t coeff, out1, out2;
00432 
00433   //N = fftLen;
00434   n2 = fftLen;
00435 
00436   n1 = n2;
00437   n2 = n2 >> 1;
00438   ia = 0;
00439 
00440   // loop for groups
00441   for (i = 0; i < n2; i++)
00442   {
00443     coeff = _SIMD32_OFFSET(pCoef + (ia * 2U));
00444 
00445     ia = ia + twidCoefModifier;
00446 
00447     l = i + n2;
00448 
00449     T = _SIMD32_OFFSET(pSrc + (2 * i));
00450     in = ((int16_t) (T & 0xFFFF)) >> 1;
00451     T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
00452 
00453     S = _SIMD32_OFFSET(pSrc + (2 * l));
00454     in = ((int16_t) (S & 0xFFFF)) >> 1;
00455     S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
00456 
00457     R = __QSUB16(T, S);
00458 
00459     _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
00460 
00461 #ifndef ARM_MATH_BIG_ENDIAN
00462 
00463     out1 = __SMUSD(coeff, R) >> 16;
00464     out2 = __SMUADX(coeff, R);
00465 #else
00466 
00467     out1 = __SMUADX(R, coeff) >> 16U;
00468     out2 = __SMUSD(__QSUB(0, coeff), R);
00469 
00470 #endif //     #ifndef ARM_MATH_BIG_ENDIAN
00471 
00472     _SIMD32_OFFSET(pSrc + (2U * l)) =
00473       (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
00474 
00475     coeff = _SIMD32_OFFSET(pCoef + (ia * 2U));
00476 
00477     ia = ia + twidCoefModifier;
00478 
00479     // loop for butterfly
00480     i++;
00481     l++;
00482 
00483     T = _SIMD32_OFFSET(pSrc + (2 * i));
00484     in = ((int16_t) (T & 0xFFFF)) >> 1;
00485     T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
00486 
00487     S = _SIMD32_OFFSET(pSrc + (2 * l));
00488     in = ((int16_t) (S & 0xFFFF)) >> 1;
00489     S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
00490 
00491     R = __QSUB16(T, S);
00492 
00493     _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
00494 
00495 #ifndef ARM_MATH_BIG_ENDIAN
00496 
00497     out1 = __SMUSD(coeff, R) >> 16;
00498     out2 = __SMUADX(coeff, R);
00499 #else
00500 
00501     out1 = __SMUADX(R, coeff) >> 16U;
00502     out2 = __SMUSD(__QSUB(0, coeff), R);
00503 
00504 #endif //     #ifndef ARM_MATH_BIG_ENDIAN
00505 
00506     _SIMD32_OFFSET(pSrc + (2U * l)) =
00507       (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
00508 
00509   }                             // groups loop end
00510 
00511   twidCoefModifier = twidCoefModifier << 1U;
00512 
00513   // loop for stage
00514   for (k = fftLen / 2; k > 2; k = k >> 1)
00515   {
00516     n1 = n2;
00517     n2 = n2 >> 1;
00518     ia = 0;
00519 
00520     // loop for groups
00521     for (j = 0; j < n2; j++)
00522     {
00523       coeff = _SIMD32_OFFSET(pCoef + (ia * 2U));
00524 
00525       ia = ia + twidCoefModifier;
00526 
00527       // loop for butterfly
00528       for (i = j; i < fftLen; i += n1)
00529       {
00530         l = i + n2;
00531 
00532         T = _SIMD32_OFFSET(pSrc + (2 * i));
00533 
00534         S = _SIMD32_OFFSET(pSrc + (2 * l));
00535 
00536         R = __QSUB16(T, S);
00537 
00538         _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
00539 
00540 #ifndef ARM_MATH_BIG_ENDIAN
00541 
00542         out1 = __SMUSD(coeff, R) >> 16;
00543         out2 = __SMUADX(coeff, R);
00544 
00545 #else
00546 
00547         out1 = __SMUADX(R, coeff) >> 16U;
00548         out2 = __SMUSD(__QSUB(0, coeff), R);
00549 
00550 #endif //     #ifndef ARM_MATH_BIG_ENDIAN
00551 
00552         _SIMD32_OFFSET(pSrc + (2U * l)) =
00553           (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
00554 
00555         i += n1;
00556 
00557         l = i + n2;
00558 
00559         T = _SIMD32_OFFSET(pSrc + (2 * i));
00560 
00561         S = _SIMD32_OFFSET(pSrc + (2 * l));
00562 
00563         R = __QSUB16(T, S);
00564 
00565         _SIMD32_OFFSET(pSrc + (2 * i)) = __SHADD16(T, S);
00566 
00567 #ifndef ARM_MATH_BIG_ENDIAN
00568 
00569         out1 = __SMUSD(coeff, R) >> 16;
00570         out2 = __SMUADX(coeff, R);
00571 #else
00572 
00573         out1 = __SMUADX(R, coeff) >> 16U;
00574         out2 = __SMUSD(__QSUB(0, coeff), R);
00575 
00576 #endif //     #ifndef ARM_MATH_BIG_ENDIAN
00577 
00578         _SIMD32_OFFSET(pSrc + (2U * l)) =
00579           (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF);
00580 
00581       }                         // butterfly loop end
00582 
00583     }                           // groups loop end
00584 
00585     twidCoefModifier = twidCoefModifier << 1U;
00586   }                             // stages loop end
00587 
00588   n1 = n2;
00589   n2 = n2 >> 1;
00590   ia = 0;
00591 
00592   // loop for groups
00593   for (j = 0; j < n2; j++)
00594   {
00595     coeff = _SIMD32_OFFSET(pCoef + (ia * 2U));
00596 
00597     ia = ia + twidCoefModifier;
00598 
00599     // loop for butterfly
00600     for (i = j; i < fftLen; i += n1)
00601     {
00602       l = i + n2;
00603 
00604       T = _SIMD32_OFFSET(pSrc + (2 * i));
00605 
00606       S = _SIMD32_OFFSET(pSrc + (2 * l));
00607 
00608       R = __QSUB16(T, S);
00609 
00610       _SIMD32_OFFSET(pSrc + (2 * i)) = __QADD16(T, S);
00611 
00612       _SIMD32_OFFSET(pSrc + (2U * l)) = R;
00613 
00614     }                           // butterfly loop end
00615 
00616   }                             // groups loop end
00617 
00618   twidCoefModifier = twidCoefModifier << 1U;
00619 
00620 #else
00621 
00622 
00623   unsigned i, j, k, l;
00624   unsigned n1, n2, ia;
00625   q15_t xt, yt, cosVal, sinVal;
00626 
00627   //N = fftLen;
00628   n2 = fftLen;
00629 
00630   n1 = n2;
00631   n2 = n2 >> 1;
00632   ia = 0;
00633 
00634   // loop for groups
00635   for (j = 0; j < n2; j++)
00636   {
00637     cosVal = pCoef[ia * 2];
00638     sinVal = pCoef[(ia * 2) + 1];
00639     ia = ia + twidCoefModifier;
00640 
00641     // loop for butterfly
00642     for (i = j; i < fftLen; i += n1)
00643     {
00644       l = i + n2;
00645       xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U);
00646       pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U;
00647 
00648       yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U);
00649       pSrc[2 * i + 1] =
00650         ((pSrc[2 * l + 1] >> 1U) + (pSrc[2 * i + 1] >> 1U)) >> 1U;
00651 
00652       pSrc[2U * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) -
00653                       ((int16_t) (((q31_t) yt * sinVal) >> 16)));
00654 
00655       pSrc[2U * l + 1U] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) +
00656                            ((int16_t) (((q31_t) xt * sinVal) >> 16)));
00657 
00658     }                           // butterfly loop end
00659 
00660   }                             // groups loop end
00661 
00662   twidCoefModifier = twidCoefModifier << 1U;
00663 
00664   // loop for stage
00665   for (k = fftLen / 2; k > 2; k = k >> 1)
00666   {
00667     n1 = n2;
00668     n2 = n2 >> 1;
00669     ia = 0;
00670 
00671     // loop for groups
00672     for (j = 0; j < n2; j++)
00673     {
00674       cosVal = pCoef[ia * 2];
00675       sinVal = pCoef[(ia * 2) + 1];
00676       ia = ia + twidCoefModifier;
00677 
00678       // loop for butterfly
00679       for (i = j; i < fftLen; i += n1)
00680       {
00681         l = i + n2;
00682         xt = pSrc[2 * i] - pSrc[2 * l];
00683         pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U;
00684 
00685         yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
00686         pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U;
00687 
00688         pSrc[2U * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) -
00689                         ((int16_t) (((q31_t) yt * sinVal) >> 16)));
00690 
00691         pSrc[2U * l + 1U] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) +
00692                              ((int16_t) (((q31_t) xt * sinVal) >> 16)));
00693 
00694       }                         // butterfly loop end
00695 
00696     }                           // groups loop end
00697 
00698     twidCoefModifier = twidCoefModifier << 1U;
00699   }                             // stages loop end
00700 
00701   n1 = n2;
00702   n2 = n2 >> 1;
00703   ia = 0;
00704 
00705   cosVal = pCoef[ia * 2];
00706   sinVal = pCoef[(ia * 2) + 1];
00707 
00708   ia = ia + twidCoefModifier;
00709 
00710   // loop for butterfly
00711   for (i = 0; i < fftLen; i += n1)
00712   {
00713     l = i + n2;
00714     xt = pSrc[2 * i] - pSrc[2 * l];
00715     pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
00716 
00717     yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
00718     pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
00719 
00720     pSrc[2U * l] = xt;
00721 
00722     pSrc[2U * l + 1U] = yt;
00723 
00724   }                             // groups loop end
00725 
00726 
00727 #endif //             #if defined (ARM_MATH_DSP)
00728 
00729 }
00730