arm_cfft_radix2_q15.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  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. #include "dsp/transform_functions.h"
  29. void arm_radix2_butterfly_q15(
  30. q15_t * pSrc,
  31. uint32_t fftLen,
  32. const q15_t * pCoef,
  33. uint16_t twidCoefModifier);
  34. void arm_radix2_butterfly_inverse_q15(
  35. q15_t * pSrc,
  36. uint32_t fftLen,
  37. const q15_t * pCoef,
  38. uint16_t twidCoefModifier);
  39. void arm_bitreversal_q15(
  40. q15_t * pSrc,
  41. uint32_t fftLen,
  42. uint16_t bitRevFactor,
  43. const uint16_t * pBitRevTab);
  44. /**
  45. @addtogroup ComplexFFTDeprecated
  46. @{
  47. */
  48. /**
  49. @brief Processing function for the fixed-point CFFT/CIFFT.
  50. @deprecated Do not use this function. It has been superseded by \ref arm_cfft_q15 and will be removed in the future.
  51. @param[in] S points to an instance of the fixed-point CFFT/CIFFT structure
  52. @param[in,out] pSrc points to the complex data buffer of size <code>2*fftLen</code>. Processing occurs in-place
  53. */
  54. void arm_cfft_radix2_q15(
  55. const arm_cfft_radix2_instance_q15 * S,
  56. q15_t * pSrc)
  57. {
  58. if (S->ifftFlag == 1U)
  59. {
  60. arm_radix2_butterfly_inverse_q15 (pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier);
  61. }
  62. else
  63. {
  64. arm_radix2_butterfly_q15 (pSrc, S->fftLen, S->pTwiddle, S->twidCoefModifier);
  65. }
  66. arm_bitreversal_q15(pSrc, S->fftLen, S->bitRevFactor, S->pBitRevTable);
  67. }
  68. /**
  69. @} end of ComplexFFTDeprecated group
  70. */
  71. void arm_radix2_butterfly_q15(
  72. q15_t * pSrc,
  73. uint32_t fftLen,
  74. const q15_t * pCoef,
  75. uint16_t twidCoefModifier)
  76. {
  77. #if defined (ARM_MATH_DSP)
  78. uint32_t i, j, k, l;
  79. uint32_t n1, n2, ia;
  80. q15_t in;
  81. q31_t T, S, R;
  82. q31_t coeff, out1, out2;
  83. //N = fftLen;
  84. n2 = fftLen;
  85. n1 = n2;
  86. n2 = n2 >> 1;
  87. ia = 0;
  88. // loop for groups
  89. for (i = 0; i < n2; i++)
  90. {
  91. coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
  92. ia = ia + twidCoefModifier;
  93. l = i + n2;
  94. T = read_q15x2 (pSrc + (2 * i));
  95. in = ((int16_t) (T & 0xFFFF)) >> 1;
  96. T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
  97. S = read_q15x2 (pSrc + (2 * l));
  98. in = ((int16_t) (S & 0xFFFF)) >> 1;
  99. S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
  100. R = __QSUB16(T, S);
  101. write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
  102. #ifndef ARM_MATH_BIG_ENDIAN
  103. out1 = __SMUAD(coeff, R) >> 16;
  104. out2 = __SMUSDX(coeff, R);
  105. #else
  106. out1 = __SMUSDX(R, coeff) >> 16U;
  107. out2 = __SMUAD(coeff, R);
  108. #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
  109. write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
  110. coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
  111. ia = ia + twidCoefModifier;
  112. /* loop for butterfly */
  113. i++;
  114. l++;
  115. T = read_q15x2 (pSrc + (2 * i));
  116. in = ((int16_t) (T & 0xFFFF)) >> 1;
  117. T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
  118. S = read_q15x2 (pSrc + (2 * l));
  119. in = ((int16_t) (S & 0xFFFF)) >> 1;
  120. S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
  121. R = __QSUB16(T, S);
  122. write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
  123. #ifndef ARM_MATH_BIG_ENDIAN
  124. out1 = __SMUAD(coeff, R) >> 16;
  125. out2 = __SMUSDX(coeff, R);
  126. #else
  127. out1 = __SMUSDX(R, coeff) >> 16U;
  128. out2 = __SMUAD(coeff, R);
  129. #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
  130. write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
  131. } /* groups loop end */
  132. twidCoefModifier = twidCoefModifier << 1U;
  133. /* loop for stage */
  134. for (k = fftLen / 2; k > 2; k = k >> 1)
  135. {
  136. n1 = n2;
  137. n2 = n2 >> 1;
  138. ia = 0;
  139. /* loop for groups */
  140. for (j = 0; j < n2; j++)
  141. {
  142. coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
  143. ia = ia + twidCoefModifier;
  144. /* loop for butterfly */
  145. for (i = j; i < fftLen; i += n1)
  146. {
  147. l = i + n2;
  148. T = read_q15x2 (pSrc + (2 * i));
  149. S = read_q15x2 (pSrc + (2 * l));
  150. R = __QSUB16(T, S);
  151. write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
  152. #ifndef ARM_MATH_BIG_ENDIAN
  153. out1 = __SMUAD(coeff, R) >> 16;
  154. out2 = __SMUSDX(coeff, R);
  155. #else
  156. out1 = __SMUSDX(R, coeff) >> 16U;
  157. out2 = __SMUAD(coeff, R);
  158. #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
  159. write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
  160. i += n1;
  161. l = i + n2;
  162. T = read_q15x2 (pSrc + (2 * i));
  163. S = read_q15x2 (pSrc + (2 * l));
  164. R = __QSUB16(T, S);
  165. write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
  166. #ifndef ARM_MATH_BIG_ENDIAN
  167. out1 = __SMUAD(coeff, R) >> 16;
  168. out2 = __SMUSDX(coeff, R);
  169. #else
  170. out1 = __SMUSDX(R, coeff) >> 16U;
  171. out2 = __SMUAD(coeff, R);
  172. #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
  173. write_q15x2 (pSrc + (2U * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
  174. } /* butterfly loop end */
  175. } /* groups loop end */
  176. twidCoefModifier = twidCoefModifier << 1U;
  177. } /* stages loop end */
  178. n1 = n2;
  179. n2 = n2 >> 1;
  180. ia = 0;
  181. coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
  182. ia = ia + twidCoefModifier;
  183. /* loop for butterfly */
  184. for (i = 0; i < fftLen; i += n1)
  185. {
  186. l = i + n2;
  187. T = read_q15x2 (pSrc + (2 * i));
  188. S = read_q15x2 (pSrc + (2 * l));
  189. R = __QSUB16(T, S);
  190. write_q15x2 (pSrc + (2 * i), __QADD16(T, S));
  191. write_q15x2 (pSrc + (2 * l), R);
  192. i += n1;
  193. l = i + n2;
  194. T = read_q15x2 (pSrc + (2 * i));
  195. S = read_q15x2 (pSrc + (2 * l));
  196. R = __QSUB16(T, S);
  197. write_q15x2 (pSrc + (2 * i), __QADD16(T, S));
  198. write_q15x2 (pSrc + (2 * l), R);
  199. } /* groups loop end */
  200. #else /* #if defined (ARM_MATH_DSP) */
  201. uint32_t i, j, k, l;
  202. uint32_t n1, n2, ia;
  203. q15_t xt, yt, cosVal, sinVal;
  204. // N = fftLen;
  205. n2 = fftLen;
  206. n1 = n2;
  207. n2 = n2 >> 1;
  208. ia = 0;
  209. /* loop for groups */
  210. for (j = 0; j < n2; j++)
  211. {
  212. cosVal = pCoef[(ia * 2)];
  213. sinVal = pCoef[(ia * 2) + 1];
  214. ia = ia + twidCoefModifier;
  215. /* loop for butterfly */
  216. for (i = j; i < fftLen; i += n1)
  217. {
  218. l = i + n2;
  219. xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U);
  220. pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U;
  221. yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U);
  222. pSrc[2 * i + 1] = ((pSrc[2 * l + 1] >> 1U) +
  223. (pSrc[2 * i + 1] >> 1U) ) >> 1U;
  224. pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) +
  225. ((int16_t) (((q31_t) yt * sinVal) >> 16)));
  226. pSrc[2U * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) -
  227. ((int16_t) (((q31_t) xt * sinVal) >> 16)));
  228. } /* butterfly loop end */
  229. } /* groups loop end */
  230. twidCoefModifier = twidCoefModifier << 1U;
  231. /* loop for stage */
  232. for (k = fftLen / 2; k > 2; k = k >> 1)
  233. {
  234. n1 = n2;
  235. n2 = n2 >> 1;
  236. ia = 0;
  237. /* loop for groups */
  238. for (j = 0; j < n2; j++)
  239. {
  240. cosVal = pCoef[ia * 2];
  241. sinVal = pCoef[(ia * 2) + 1];
  242. ia = ia + twidCoefModifier;
  243. /* loop for butterfly */
  244. for (i = j; i < fftLen; i += n1)
  245. {
  246. l = i + n2;
  247. xt = pSrc[2 * i] - pSrc[2 * l];
  248. pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U;
  249. yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
  250. pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U;
  251. pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) +
  252. ((int16_t) (((q31_t) yt * sinVal) >> 16)));
  253. pSrc[2U * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) -
  254. ((int16_t) (((q31_t) xt * sinVal) >> 16)));
  255. } /* butterfly loop end */
  256. } /* groups loop end */
  257. twidCoefModifier = twidCoefModifier << 1U;
  258. } /* stages loop end */
  259. n1 = n2;
  260. n2 = n2 >> 1;
  261. ia = 0;
  262. /* loop for groups */
  263. for (j = 0; j < n2; j++)
  264. {
  265. cosVal = pCoef[ia * 2];
  266. sinVal = pCoef[(ia * 2) + 1];
  267. ia = ia + twidCoefModifier;
  268. /* loop for butterfly */
  269. for (i = j; i < fftLen; i += n1)
  270. {
  271. l = i + n2;
  272. xt = pSrc[2 * i] - pSrc[2 * l];
  273. pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
  274. yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
  275. pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
  276. pSrc[2 * l] = xt;
  277. pSrc[2 * l + 1] = yt;
  278. } /* butterfly loop end */
  279. } /* groups loop end */
  280. twidCoefModifier = twidCoefModifier << 1U;
  281. #endif /* #if defined (ARM_MATH_DSP) */
  282. }
  283. void arm_radix2_butterfly_inverse_q15(
  284. q15_t * pSrc,
  285. uint32_t fftLen,
  286. const q15_t * pCoef,
  287. uint16_t twidCoefModifier)
  288. {
  289. #if defined (ARM_MATH_DSP)
  290. uint32_t i, j, k, l;
  291. uint32_t n1, n2, ia;
  292. q15_t in;
  293. q31_t T, S, R;
  294. q31_t coeff, out1, out2;
  295. // N = fftLen;
  296. n2 = fftLen;
  297. n1 = n2;
  298. n2 = n2 >> 1;
  299. ia = 0;
  300. /* loop for groups */
  301. for (i = 0; i < n2; i++)
  302. {
  303. coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
  304. ia = ia + twidCoefModifier;
  305. l = i + n2;
  306. T = read_q15x2 (pSrc + (2 * i));
  307. in = ((int16_t) (T & 0xFFFF)) >> 1;
  308. T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
  309. S = read_q15x2 (pSrc + (2 * l));
  310. in = ((int16_t) (S & 0xFFFF)) >> 1;
  311. S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
  312. R = __QSUB16(T, S);
  313. write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
  314. #ifndef ARM_MATH_BIG_ENDIAN
  315. out1 = __SMUSD(coeff, R) >> 16;
  316. out2 = __SMUADX(coeff, R);
  317. #else
  318. out1 = __SMUADX(R, coeff) >> 16U;
  319. out2 = __SMUSD(__QSUB(0, coeff), R);
  320. #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
  321. write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
  322. coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
  323. ia = ia + twidCoefModifier;
  324. /* loop for butterfly */
  325. i++;
  326. l++;
  327. T = read_q15x2 (pSrc + (2 * i));
  328. in = ((int16_t) (T & 0xFFFF)) >> 1;
  329. T = ((T >> 1) & 0xFFFF0000) | (in & 0xFFFF);
  330. S = read_q15x2 (pSrc + (2 * l));
  331. in = ((int16_t) (S & 0xFFFF)) >> 1;
  332. S = ((S >> 1) & 0xFFFF0000) | (in & 0xFFFF);
  333. R = __QSUB16(T, S);
  334. write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
  335. #ifndef ARM_MATH_BIG_ENDIAN
  336. out1 = __SMUSD(coeff, R) >> 16;
  337. out2 = __SMUADX(coeff, R);
  338. #else
  339. out1 = __SMUADX(R, coeff) >> 16U;
  340. out2 = __SMUSD(__QSUB(0, coeff), R);
  341. #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
  342. write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
  343. } /* groups loop end */
  344. twidCoefModifier = twidCoefModifier << 1U;
  345. /* loop for stage */
  346. for (k = fftLen / 2; k > 2; k = k >> 1)
  347. {
  348. n1 = n2;
  349. n2 = n2 >> 1;
  350. ia = 0;
  351. /* loop for groups */
  352. for (j = 0; j < n2; j++)
  353. {
  354. coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
  355. ia = ia + twidCoefModifier;
  356. /* loop for butterfly */
  357. for (i = j; i < fftLen; i += n1)
  358. {
  359. l = i + n2;
  360. T = read_q15x2 (pSrc + (2 * i));
  361. S = read_q15x2 (pSrc + (2 * l));
  362. R = __QSUB16(T, S);
  363. write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
  364. #ifndef ARM_MATH_BIG_ENDIAN
  365. out1 = __SMUSD(coeff, R) >> 16;
  366. out2 = __SMUADX(coeff, R);
  367. #else
  368. out1 = __SMUADX(R, coeff) >> 16U;
  369. out2 = __SMUSD(__QSUB(0, coeff), R);
  370. #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
  371. write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
  372. i += n1;
  373. l = i + n2;
  374. T = read_q15x2 (pSrc + (2 * i));
  375. S = read_q15x2 (pSrc + (2 * l));
  376. R = __QSUB16(T, S);
  377. write_q15x2 (pSrc + (2 * i), __SHADD16(T, S));
  378. #ifndef ARM_MATH_BIG_ENDIAN
  379. out1 = __SMUSD(coeff, R) >> 16;
  380. out2 = __SMUADX(coeff, R);
  381. #else
  382. out1 = __SMUADX(R, coeff) >> 16U;
  383. out2 = __SMUSD(__QSUB(0, coeff), R);
  384. #endif /* #ifndef ARM_MATH_BIG_ENDIAN */
  385. write_q15x2 (pSrc + (2 * l), (q31_t) ((out2) & 0xFFFF0000) | (out1 & 0x0000FFFF));
  386. } /* butterfly loop end */
  387. } /* groups loop end */
  388. twidCoefModifier = twidCoefModifier << 1U;
  389. } /* stages loop end */
  390. n1 = n2;
  391. n2 = n2 >> 1;
  392. ia = 0;
  393. /* loop for groups */
  394. for (j = 0; j < n2; j++)
  395. {
  396. coeff = read_q15x2 ((q15_t *)pCoef + (ia * 2U));
  397. ia = ia + twidCoefModifier;
  398. /* loop for butterfly */
  399. for (i = j; i < fftLen; i += n1)
  400. {
  401. l = i + n2;
  402. T = read_q15x2 (pSrc + (2 * i));
  403. S = read_q15x2 (pSrc + (2 * l));
  404. R = __QSUB16(T, S);
  405. write_q15x2 (pSrc + (2 * i), __QADD16(T, S));
  406. write_q15x2 (pSrc + (2 * l), R);
  407. } /* butterfly loop end */
  408. } /* groups loop end */
  409. twidCoefModifier = twidCoefModifier << 1U;
  410. #else /* #if defined (ARM_MATH_DSP) */
  411. uint32_t i, j, k, l;
  412. uint32_t n1, n2, ia;
  413. q15_t xt, yt, cosVal, sinVal;
  414. // N = fftLen;
  415. n2 = fftLen;
  416. n1 = n2;
  417. n2 = n2 >> 1;
  418. ia = 0;
  419. /* loop for groups */
  420. for (j = 0; j < n2; j++)
  421. {
  422. cosVal = pCoef[(ia * 2)];
  423. sinVal = pCoef[(ia * 2) + 1];
  424. ia = ia + twidCoefModifier;
  425. /* loop for butterfly */
  426. for (i = j; i < fftLen; i += n1)
  427. {
  428. l = i + n2;
  429. xt = (pSrc[2 * i] >> 1U) - (pSrc[2 * l] >> 1U);
  430. pSrc[2 * i] = ((pSrc[2 * i] >> 1U) + (pSrc[2 * l] >> 1U)) >> 1U;
  431. yt = (pSrc[2 * i + 1] >> 1U) - (pSrc[2 * l + 1] >> 1U);
  432. pSrc[2 * i + 1] = ((pSrc[2 * l + 1] >> 1U) +
  433. (pSrc[2 * i + 1] >> 1U) ) >> 1U;
  434. pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) -
  435. ((int16_t) (((q31_t) yt * sinVal) >> 16)));
  436. pSrc[2 * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) +
  437. ((int16_t) (((q31_t) xt * sinVal) >> 16)));
  438. } /* butterfly loop end */
  439. } /* groups loop end */
  440. twidCoefModifier = twidCoefModifier << 1U;
  441. /* loop for stage */
  442. for (k = fftLen / 2; k > 2; k = k >> 1)
  443. {
  444. n1 = n2;
  445. n2 = n2 >> 1;
  446. ia = 0;
  447. /* loop for groups */
  448. for (j = 0; j < n2; j++)
  449. {
  450. cosVal = pCoef[(ia * 2)];
  451. sinVal = pCoef[(ia * 2) + 1];
  452. ia = ia + twidCoefModifier;
  453. /* loop for butterfly */
  454. for (i = j; i < fftLen; i += n1)
  455. {
  456. l = i + n2;
  457. xt = pSrc[2 * i] - pSrc[2 * l];
  458. pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]) >> 1U;
  459. yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
  460. pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]) >> 1U;
  461. pSrc[2 * l] = (((int16_t) (((q31_t) xt * cosVal) >> 16)) -
  462. ((int16_t) (((q31_t) yt * sinVal) >> 16)) );
  463. pSrc[2 * l + 1] = (((int16_t) (((q31_t) yt * cosVal) >> 16)) +
  464. ((int16_t) (((q31_t) xt * sinVal) >> 16)) );
  465. } /* butterfly loop end */
  466. } /* groups loop end */
  467. twidCoefModifier = twidCoefModifier << 1U;
  468. } /* stages loop end */
  469. n1 = n2;
  470. n2 = n2 >> 1;
  471. ia = 0;
  472. cosVal = pCoef[(ia * 2)];
  473. sinVal = pCoef[(ia * 2) + 1];
  474. ia = ia + twidCoefModifier;
  475. /* loop for butterfly */
  476. for (i = 0; i < fftLen; i += n1)
  477. {
  478. l = i + n2;
  479. xt = pSrc[2 * i] - pSrc[2 * l];
  480. pSrc[2 * i] = (pSrc[2 * i] + pSrc[2 * l]);
  481. yt = pSrc[2 * i + 1] - pSrc[2 * l + 1];
  482. pSrc[2 * i + 1] = (pSrc[2 * l + 1] + pSrc[2 * i + 1]);
  483. pSrc[2 * l] = xt;
  484. pSrc[2 * l + 1] = yt;
  485. } /* groups loop end */
  486. #endif /* #if defined (ARM_MATH_DSP) */
  487. }