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