Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Generated on Tue Jul 12 2022 16:46:22 by
