• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ----------------------------------------------------------------------
2  * Project:      CMSIS DSP Library
3  * Title:        arm_cfft_radix2_q15.c
4  * Description:  Radix-2 Decimation in Frequency CFFT & CIFFT Fixed point processing function
5  *
6  * $Date:        23 April 2021
7  * $Revision:    V1.9.0
8  *
9  * Target Processor: Cortex-M and Cortex-A cores
10  * -------------------------------------------------------------------- */
11 /*
12  * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved.
13  *
14  * SPDX-License-Identifier: Apache-2.0
15  *
16  * Licensed under the Apache License, Version 2.0 (the License); you may
17  * not use this file except in compliance with the License.
18  * You may obtain a copy of the License at
19  *
20  * www.apache.org/licenses/LICENSE-2.0
21  *
22  * Unless required by applicable law or agreed to in writing, software
23  * distributed under the License is distributed on an AS IS BASIS, WITHOUT
24  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
25  * See the License for the specific language governing permissions and
26  * limitations under the License.
27  */
28 
29 #include "dsp/transform_functions.h"
30 
31 void arm_radix2_butterfly_q15(
32         q15_t * pSrc,
33         uint32_t fftLen,
34   const q15_t * pCoef,
35         uint16_t twidCoefModifier);
36 
37 void arm_radix2_butterfly_inverse_q15(
38         q15_t * pSrc,
39         uint32_t fftLen,
40   const q15_t * pCoef,
41         uint16_t twidCoefModifier);
42 
43 void arm_bitreversal_q15(
44         q15_t * pSrc,
45         uint32_t fftLen,
46         uint16_t bitRevFactor,
47   const uint16_t * pBitRevTab);
48 
49 /**
50   @ingroup groupTransforms
51  */
52 
53 /**
54   @addtogroup ComplexFFT
55   @{
56  */
57 
58 /**
59   @brief         Processing function for the fixed-point CFFT/CIFFT.
60   @deprecated    Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed in the future.
61   @param[in]     S    points to an instance of the fixed-point CFFT/CIFFT structure
62   @param[in,out] pSrc points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place
63   @return        none
64  */
65 
arm_cfft_radix2_q15(const arm_cfft_radix2_instance_q15 * S,q15_t * pSrc)66 void arm_cfft_radix2_q15(
67   const arm_cfft_radix2_instance_q15 * S,
68         q15_t * pSrc)
69 {
70 
71   if (S->ifftFlag == 1U)
72   {
73     arm_radix2_butterfly_inverse_q15 (pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier);
74   }
75   else
76   {
77     arm_radix2_butterfly_q15 (pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier);
78   }
79 
80   arm_bitreversal_q15(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable);
81 }
82 
83 /**
84   @} end of ComplexFFT group
85  */
86 
arm_radix2_butterfly_q15(q15_t * pSrc,uint32_t fftLen,const q15_t * pCoef,uint16_t twidCoefModifier)87 void arm_radix2_butterfly_q15(
88         q15_t * pSrc,
89         uint32_t fftLen,
90   const q15_t * pCoef,
91         uint16_t twidCoefModifier)
92 {
93 #if defined (ARM_MATH_DSP)
94 
95   uint32_t i, j, k, l;
96   uint32_t n1, n2, ia;
97   q15_t in;
98   q31_t T, S, R;
99   q31_t coeff, out1, out2;
100 
101   //N = fftLen;
102   n2 = fftLen;
103 
104   n1 = n2;
105   n2 = n2 >> 1;
106   ia = 0;
107 
108   // loop for groups
109   for (i = 0; i < n2; i++)
110   {
111     coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
112 
113     ia = ia + twidCoefModifier;
114 
115     l = i + n2;
116 
117     T = read_q15x2 (pSrc + (2 * i));
118     in = ((int16_t) (T & 0xFFFF)) >> 1;
119     T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
120 
121     S = read_q15x2 (pSrc + (2 * l));
122     in = ((int16_t) (S & 0xFFFF)) >> 1;
123     S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
124 
125     R = __QSUB16(T, S);
126 
127     write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
128 
129 #ifndef ARM_MATH_BIG_ENDIAN
130     out1 = __SMUAD(coeff, R) >> 16;
131     out2 = __SMUSDX(coeff, R);
132 #else
133     out1 = __SMUSDX(R, coeff) >> 16U;
134     out2 = __SMUAD(coeff, R);
135 #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
136 
137     write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
138 
139     coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
140 
141     ia = ia + twidCoefModifier;
142 
143     /* loop for butterfly */
144     i++;
145     l++;
146 
147     T = read_q15x2 (pSrc + (2 * i));
148     in = ((int16_t) (T & 0xFFFF)) >> 1;
149     T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
150 
151     S = read_q15x2 (pSrc + (2 * l));
152     in = ((int16_t) (S & 0xFFFF)) >> 1;
153     S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
154 
155     R = __QSUB16(T, S);
156 
157     write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
158 
159 #ifndef ARM_MATH_BIG_ENDIAN
160     out1 = __SMUAD(coeff, R) >> 16;
161     out2 = __SMUSDX(coeff, R);
162 #else
163 
164     out1 = __SMUSDX(R, coeff) >> 16U;
165     out2 = __SMUAD(coeff, R);
166 #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
167 
168     write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
169 
170   } /* groups loop end */
171 
172   twidCoefModifier = twidCoefModifier << 1U;
173 
174   /* loop for stage */
175   for (k = fftLen / 2; k > 2; k = k >> 1)
176   {
177     n1 = n2;
178     n2 = n2 >> 1;
179     ia = 0;
180 
181     /* loop for groups */
182     for (j = 0; j < n2; j++)
183     {
184       coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
185 
186       ia = ia + twidCoefModifier;
187 
188       /* loop for butterfly */
189       for (i = j; i < fftLen; i += n1)
190       {
191         l = i + n2;
192 
193         T = read_q15x2 (pSrc + (2 * i));
194 
195         S = read_q15x2 (pSrc + (2 * l));
196 
197         R = __QSUB16(T, S);
198 
199         write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
200 
201 #ifndef ARM_MATH_BIG_ENDIAN
202         out1 = __SMUAD(coeff, R) >> 16;
203         out2 = __SMUSDX(coeff, R);
204 #else
205         out1 = __SMUSDX(R, coeff) >> 16U;
206         out2 = __SMUAD(coeff, R);
207 #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
208 
209         write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
210 
211         i += n1;
212 
213         l = i + n2;
214 
215         T = read_q15x2 (pSrc + (2 * i));
216 
217         S = read_q15x2 (pSrc + (2 * l));
218 
219         R = __QSUB16(T, S);
220 
221         write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
222 
223 #ifndef ARM_MATH_BIG_ENDIAN
224         out1 = __SMUAD(coeff, R) >> 16;
225         out2 = __SMUSDX(coeff, R);
226 #else
227         out1 = __SMUSDX(R, coeff) >> 16U;
228         out2 = __SMUAD(coeff, R);
229 #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
230 
231         write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
232 
233       } /* butterfly loop end */
234 
235     } /* groups loop end */
236 
237     twidCoefModifier = twidCoefModifier << 1U;
238   } /* stages loop end */
239 
240   n1 = n2;
241   n2 = n2 >> 1;
242   ia = 0;
243 
244   coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
245 
246   ia = ia + twidCoefModifier;
247 
248   /* loop for butterfly */
249   for (i = 0; i < fftLen; i += n1)
250   {
251     l = i + n2;
252 
253     T = read_q15x2 (pSrc + (2 * i));
254 
255     S = read_q15x2 (pSrc + (2 * l));
256 
257     R = __QSUB16(T, S);
258 
259     write_q15x2 (pSrc + (2 * i), __QADD16(T, S));
260 
261     write_q15x2 (pSrc + (2 * l), R);
262 
263     i += n1;
264     l = i + n2;
265 
266     T = read_q15x2 (pSrc + (2 * i));
267 
268     S = read_q15x2 (pSrc + (2 * l));
269 
270     R = __QSUB16(T, S);
271 
272     write_q15x2 (pSrc + (2 * i), __QADD16(T, S));
273 
274     write_q15x2 (pSrc + (2 * l), R);
275 
276   } /* groups loop end */
277 
278 
279 #else /* #if defined (ARM_MATH_DSP) */
280 
281   uint32_t i, j, k, l;
282   uint32_t n1, n2, ia;
283   q15_t xt, yt, cosVal, sinVal;
284 
285 
286   // N = fftLen;
287   n2 = fftLen;
288 
289   n1 = n2;
290   n2 = n2 >> 1;
291   ia = 0;
292 
293   /* loop for groups */
294   for (j = 0; j < n2; j++)
295   {
296     cosVal = pCoef[(ia * 2)];
297     sinVal = pCoef[(ia * 2) + 1];
298     ia = ia + twidCoefModifier;
299 
300     /* loop for butterfly */
301     for (i = j; i < fftLen; i += n1)
302     {
303       l = i + n2;
304       xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U);
305       pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U;
306 
307       yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U);
308       pSrc[2 * i + 1] = ((pSrc[2 * l + 1] >> 1U) +
309                          (pSrc[2 * i + 1] >> 1U)  ) >> 1U;
310 
311       pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) +
312                      ((int16_t) (((q31_t) yt * sinVal) >> 16)));
313 
314       pSrc[2U * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) -
315                           ((int16_t) (((q31_t) xt * sinVal) >> 16)));
316 
317     } /* butterfly loop end */
318 
319   } /* groups loop end */
320 
321   twidCoefModifier = twidCoefModifier << 1U;
322 
323   /* loop for stage */
324   for (k = fftLen / 2; k > 2; k = k >> 1)
325   {
326     n1 = n2;
327     n2 = n2 >> 1;
328     ia = 0;
329 
330     /* loop for groups */
331     for (j = 0; j < n2; j++)
332     {
333       cosVal = pCoef[ia * 2];
334       sinVal = pCoef[(ia * 2) + 1];
335       ia = ia + twidCoefModifier;
336 
337       /* loop for butterfly */
338       for (i = j; i < fftLen; i += n1)
339       {
340         l = i + n2;
341         xt = pSrc[2 * i] - pSrc[2 * l];
342         pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U;
343 
344         yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
345         pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U;
346 
347         pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) +
348                        ((int16_t) (((q31_t) yt * sinVal) >> 16)));
349 
350         pSrc[2U * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) -
351                             ((int16_t) (((q31_t) xt * sinVal) >> 16)));
352 
353       } /* butterfly loop end */
354 
355     } /* groups loop end */
356 
357     twidCoefModifier = twidCoefModifier << 1U;
358   } /* stages loop end */
359 
360   n1 = n2;
361   n2 = n2 >> 1;
362   ia = 0;
363 
364   /* loop for groups */
365   for (j = 0; j < n2; j++)
366   {
367     cosVal = pCoef[ia * 2];
368     sinVal = pCoef[(ia * 2) + 1];
369 
370     ia = ia + twidCoefModifier;
371 
372     /* loop for butterfly */
373     for (i = j; i < fftLen; i += n1)
374     {
375       l = i + n2;
376       xt = pSrc[2 * i] - pSrc[2 * l];
377       pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
378 
379       yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
380       pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
381 
382       pSrc[2 * l] = xt;
383 
384       pSrc[2 * l + 1] = yt;
385 
386     } /* butterfly loop end */
387 
388   } /* groups loop end */
389 
390   twidCoefModifier = twidCoefModifier << 1U;
391 
392 #endif /* #if defined (ARM_MATH_DSP) */
393 
394 }
395 
396 
arm_radix2_butterfly_inverse_q15(q15_t * pSrc,uint32_t fftLen,const q15_t * pCoef,uint16_t twidCoefModifier)397 void arm_radix2_butterfly_inverse_q15(
398         q15_t * pSrc,
399         uint32_t fftLen,
400   const q15_t * pCoef,
401         uint16_t twidCoefModifier)
402 {
403 #if defined (ARM_MATH_DSP)
404 
405         uint32_t i, j, k, l;
406         uint32_t n1, n2, ia;
407         q15_t in;
408         q31_t T, S, R;
409         q31_t coeff, out1, out2;
410 
411   // N = fftLen;
412   n2 = fftLen;
413 
414   n1 = n2;
415   n2 = n2 >> 1;
416   ia = 0;
417 
418   /* loop for groups */
419   for (i = 0; i < n2; i++)
420   {
421     coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
422 
423     ia = ia + twidCoefModifier;
424 
425     l = i + n2;
426 
427     T = read_q15x2 (pSrc + (2 * i));
428     in = ((int16_t) (T & 0xFFFF)) >> 1;
429     T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
430 
431     S = read_q15x2 (pSrc + (2 * l));
432     in = ((int16_t) (S & 0xFFFF)) >> 1;
433     S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
434 
435     R = __QSUB16(T, S);
436 
437     write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
438 
439 #ifndef ARM_MATH_BIG_ENDIAN
440     out1 = __SMUSD(coeff, R) >> 16;
441     out2 = __SMUADX(coeff, R);
442 #else
443     out1 = __SMUADX(R, coeff) >> 16U;
444     out2 = __SMUSD(__QSUB(0, coeff), R);
445 #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
446 
447     write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
448 
449     coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
450 
451     ia = ia + twidCoefModifier;
452 
453     /* loop for butterfly */
454     i++;
455     l++;
456 
457     T = read_q15x2 (pSrc + (2 * i));
458     in = ((int16_t) (T & 0xFFFF)) >> 1;
459     T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
460 
461     S = read_q15x2 (pSrc + (2 * l));
462     in = ((int16_t) (S & 0xFFFF)) >> 1;
463     S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
464 
465     R = __QSUB16(T, S);
466 
467     write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
468 
469 #ifndef ARM_MATH_BIG_ENDIAN
470     out1 = __SMUSD(coeff, R) >> 16;
471     out2 = __SMUADX(coeff, R);
472 #else
473     out1 = __SMUADX(R, coeff) >> 16U;
474     out2 = __SMUSD(__QSUB(0, coeff), R);
475 #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
476 
477     write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
478 
479   } /* groups loop end */
480 
481   twidCoefModifier = twidCoefModifier << 1U;
482 
483   /* loop for stage */
484   for (k = fftLen / 2; k > 2; k = k >> 1)
485   {
486     n1 = n2;
487     n2 = n2 >> 1;
488     ia = 0;
489 
490     /* loop for groups */
491     for (j = 0; j < n2; j++)
492     {
493       coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
494 
495       ia = ia + twidCoefModifier;
496 
497       /* loop for butterfly */
498       for (i = j; i < fftLen; i += n1)
499       {
500         l = i + n2;
501 
502         T = read_q15x2 (pSrc + (2 * i));
503 
504         S = read_q15x2 (pSrc + (2 * l));
505 
506         R = __QSUB16(T, S);
507 
508         write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
509 
510 #ifndef ARM_MATH_BIG_ENDIAN
511         out1 = __SMUSD(coeff, R) >> 16;
512         out2 = __SMUADX(coeff, R);
513 #else
514         out1 = __SMUADX(R, coeff) >> 16U;
515         out2 = __SMUSD(__QSUB(0, coeff), R);
516 #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
517 
518         write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
519 
520         i += n1;
521 
522         l = i + n2;
523 
524         T = read_q15x2 (pSrc + (2 * i));
525 
526         S = read_q15x2 (pSrc + (2 * l));
527 
528         R = __QSUB16(T, S);
529 
530         write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
531 
532 #ifndef ARM_MATH_BIG_ENDIAN
533         out1 = __SMUSD(coeff, R) >> 16;
534         out2 = __SMUADX(coeff, R);
535 #else
536         out1 = __SMUADX(R, coeff) >> 16U;
537         out2 = __SMUSD(__QSUB(0, coeff), R);
538 #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
539 
540         write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
541 
542       } /* butterfly loop end */
543 
544     } /* groups loop end */
545 
546     twidCoefModifier = twidCoefModifier << 1U;
547   } /* stages loop end */
548 
549   n1 = n2;
550   n2 = n2 >> 1;
551   ia = 0;
552 
553   /* loop for groups */
554   for (j = 0; j < n2; j++)
555   {
556     coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
557 
558     ia = ia + twidCoefModifier;
559 
560     /* loop for butterfly */
561     for (i = j; i < fftLen; i += n1)
562     {
563       l = i + n2;
564 
565       T = read_q15x2 (pSrc + (2 * i));
566 
567       S = read_q15x2 (pSrc + (2 * l));
568 
569       R = __QSUB16(T, S);
570 
571       write_q15x2 (pSrc + (2 * i), __QADD16(T, S));
572 
573       write_q15x2 (pSrc + (2 * l), R);
574 
575     } /* butterfly loop end */
576 
577   } /* groups loop end */
578 
579   twidCoefModifier = twidCoefModifier << 1U;
580 
581 #else /* #if defined (ARM_MATH_DSP) */
582 
583         uint32_t i, j, k, l;
584         uint32_t n1, n2, ia;
585         q15_t xt, yt, cosVal, sinVal;
586 
587   // N = fftLen;
588   n2 = fftLen;
589 
590   n1 = n2;
591   n2 = n2 >> 1;
592   ia = 0;
593 
594   /* loop for groups */
595   for (j = 0; j < n2; j++)
596   {
597     cosVal = pCoef[(ia * 2)];
598     sinVal = pCoef[(ia * 2) + 1];
599     ia = ia + twidCoefModifier;
600 
601     /* loop for butterfly */
602     for (i = j; i < fftLen; i += n1)
603     {
604       l = i + n2;
605       xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U);
606       pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U;
607 
608       yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U);
609       pSrc[2 * i + 1] = ((pSrc[2 * l + 1] >> 1U) +
610                          (pSrc[2 * i + 1] >> 1U)  ) >> 1U;
611 
612       pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) -
613                      ((int16_t) (((q31_t) yt * sinVal) >> 16)));
614 
615       pSrc[2 * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) +
616                          ((int16_t) (((q31_t) xt * sinVal) >> 16)));
617 
618     } /* butterfly loop end */
619 
620   } /* groups loop end */
621 
622   twidCoefModifier = twidCoefModifier << 1U;
623 
624   /* loop for stage */
625   for (k = fftLen / 2; k > 2; k = k >> 1)
626   {
627     n1 = n2;
628     n2 = n2 >> 1;
629     ia = 0;
630 
631     /* loop for groups */
632     for (j = 0; j < n2; j++)
633     {
634       cosVal = pCoef[(ia * 2)];
635       sinVal = pCoef[(ia * 2) + 1];
636       ia = ia + twidCoefModifier;
637 
638       /* loop for butterfly */
639       for (i = j; i < fftLen; i += n1)
640       {
641         l = i + n2;
642         xt = pSrc[2 * i] - pSrc[2 * l];
643         pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U;
644 
645         yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
646         pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U;
647 
648         pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) -
649                        ((int16_t) (((q31_t) yt * sinVal) >> 16))  );
650 
651         pSrc[2 * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) +
652                            ((int16_t) (((q31_t) xt * sinVal) >> 16))  );
653 
654       } /* butterfly loop end */
655 
656     } /* groups loop end */
657 
658     twidCoefModifier = twidCoefModifier << 1U;
659   } /* stages loop end */
660 
661   n1 = n2;
662   n2 = n2 >> 1;
663   ia = 0;
664 
665   cosVal = pCoef[(ia * 2)];
666   sinVal = pCoef[(ia * 2) + 1];
667 
668   ia = ia + twidCoefModifier;
669 
670   /* loop for butterfly */
671   for (i = 0; i < fftLen; i += n1)
672   {
673     l = i + n2;
674     xt = pSrc[2 * i] - pSrc[2 * l];
675     pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
676 
677     yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
678     pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
679 
680     pSrc[2 * l] = xt;
681 
682     pSrc[2 * l + 1] = yt;
683 
684   } /* groups loop end */
685 
686 
687 #endif /* #if defined (ARM_MATH_DSP) */
688 
689 }
690