arm_cfft_init_q31.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. /* ----------------------------------------------------------------------
  2. * Project: CMSIS DSP Library
  3. * Title: arm_cfft_init_q31.c
  4. * Description: Initialization function for cfft q31 instance
  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. #define FFTINIT(EXT,SIZE) \
  29. S->bitRevLength = arm_cfft_sR_##EXT##_len##SIZE.bitRevLength; \
  30. S->pBitRevTable = arm_cfft_sR_##EXT##_len##SIZE.pBitRevTable; \
  31. S->pTwiddle = arm_cfft_sR_##EXT##_len##SIZE.pTwiddle;
  32. /**
  33. @addtogroup ComplexFFT
  34. @{
  35. */
  36. /**
  37. @brief Initialization function for the cfft q31 function
  38. @param[in,out] S points to an instance of the floating-point CFFT structure
  39. @param[in] fftLen fft length (number of complex samples)
  40. @return execution status
  41. - \ref ARM_MATH_SUCCESS : Operation successful
  42. - \ref ARM_MATH_ARGUMENT_ERROR : an error is detected
  43. @par Use of this function is mandatory only for the MVE version of the FFT.
  44. Other versions can still initialize directly the data structure using
  45. variables declared in arm_const_structs.h
  46. */
  47. #include "dsp/transform_functions.h"
  48. #include "arm_common_tables.h"
  49. #include "arm_const_structs.h"
  50. #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
  51. #include "arm_vec_fft.h"
  52. #include "arm_mve_tables.h"
  53. arm_status arm_cfft_radix4by2_rearrange_twiddles_q31(arm_cfft_instance_q31 *S, int twidCoefModifier)
  54. {
  55. switch (S->fftLen >> (twidCoefModifier - 1)) {
  56. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_4096) && defined(ARM_TABLE_TWIDDLECOEF_Q31_4096))
  57. case 4096U:
  58. S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_4096_q31;
  59. S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_4096_q31;
  60. S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_4096_q31;
  61. S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_4096_q31;
  62. S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_4096_q31;
  63. S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_4096_q31;
  64. break;
  65. #endif
  66. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_1024) && defined(ARM_TABLE_TWIDDLECOEF_Q31_1024)) || (defined(ARM_TABLE_BITREVIDX_FXT_2048) && defined(ARM_TABLE_TWIDDLECOEF_Q31_2048))
  67. case 1024U:
  68. S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_1024_q31;
  69. S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_1024_q31;
  70. S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_1024_q31;
  71. S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_1024_q31;
  72. S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_1024_q31;
  73. S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_1024_q31;
  74. break;
  75. #endif
  76. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_256) && defined(ARM_TABLE_TWIDDLECOEF_Q31_256)) || (defined(ARM_TABLE_BITREVIDX_FXT_512) && defined(ARM_TABLE_TWIDDLECOEF_Q31_512))
  77. case 256U:
  78. S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_256_q31;
  79. S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_256_q31;
  80. S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_256_q31;
  81. S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_256_q31;
  82. S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_256_q31;
  83. S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_256_q31;
  84. break;
  85. #endif
  86. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_64) && defined(ARM_TABLE_TWIDDLECOEF_Q31_64)) || (defined(ARM_TABLE_BITREVIDX_FXT_128) && defined(ARM_TABLE_TWIDDLECOEF_Q31_128))
  87. case 64U:
  88. S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_64_q31;
  89. S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_64_q31;
  90. S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_64_q31;
  91. S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_64_q31;
  92. S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_64_q31;
  93. S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_64_q31;
  94. break;
  95. #endif
  96. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_16) && defined(ARM_TABLE_TWIDDLECOEF_Q31_16)) || (defined(ARM_TABLE_BITREVIDX_FXT_32) && defined(ARM_TABLE_TWIDDLECOEF_Q31_32))
  97. case 16U:
  98. S->rearranged_twiddle_tab_stride1_arr = rearranged_twiddle_tab_stride1_arr_16_q31;
  99. S->rearranged_twiddle_stride1 = rearranged_twiddle_stride1_16_q31;
  100. S->rearranged_twiddle_tab_stride2_arr = rearranged_twiddle_tab_stride2_arr_16_q31;
  101. S->rearranged_twiddle_stride2 = rearranged_twiddle_stride2_16_q31;
  102. S->rearranged_twiddle_tab_stride3_arr = rearranged_twiddle_tab_stride3_arr_16_q31;
  103. S->rearranged_twiddle_stride3 = rearranged_twiddle_stride3_16_q31;
  104. break;
  105. #endif
  106. default:
  107. return(ARM_MATH_ARGUMENT_ERROR);
  108. break;
  109. /* invalid sizes already filtered */
  110. }
  111. return(ARM_MATH_SUCCESS);
  112. }
  113. arm_status arm_cfft_init_q31(
  114. arm_cfft_instance_q31 * S,
  115. uint16_t fftLen)
  116. {
  117. /* Initialise the default arm status */
  118. arm_status status = ARM_MATH_SUCCESS;
  119. /* Initialise the FFT length */
  120. S->fftLen = fftLen;
  121. /* Initialise the Twiddle coefficient pointer */
  122. S->pTwiddle = NULL;
  123. /* Initializations of Instance structure depending on the FFT length */
  124. switch (S->fftLen) {
  125. /* Initializations of structure parameters for 4096 point FFT */
  126. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_4096) && defined(ARM_TABLE_TWIDDLECOEF_Q31_4096))
  127. case 4096U:
  128. /* Initialise the bit reversal table modifier */
  129. S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH;
  130. S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_4096;
  131. S->pTwiddle = (q31_t *)twiddleCoef_4096_q31;
  132. status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);
  133. break;
  134. #endif
  135. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_2048) && defined(ARM_TABLE_TWIDDLECOEF_Q31_2048))
  136. /* Initializations of structure parameters for 2048 point FFT */
  137. case 2048U:
  138. /* Initialise the bit reversal table modifier */
  139. S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH;
  140. S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_2048;
  141. S->pTwiddle = (q31_t *)twiddleCoef_2048_q31;
  142. status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 2);
  143. break;
  144. #endif
  145. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_1024) && defined(ARM_TABLE_TWIDDLECOEF_Q31_1024))
  146. /* Initializations of structure parameters for 1024 point FFT */
  147. case 1024U:
  148. /* Initialise the bit reversal table modifier */
  149. S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH;
  150. S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_1024;
  151. S->pTwiddle = (q31_t *)twiddleCoef_1024_q31;
  152. status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);
  153. break;
  154. #endif
  155. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_512) && defined(ARM_TABLE_TWIDDLECOEF_Q31_512))
  156. /* Initializations of structure parameters for 512 point FFT */
  157. case 512U:
  158. /* Initialise the bit reversal table modifier */
  159. S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH;
  160. S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_512;
  161. S->pTwiddle = (q31_t *)twiddleCoef_512_q31;
  162. status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 2);
  163. break;
  164. #endif
  165. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_256) && defined(ARM_TABLE_TWIDDLECOEF_Q31_256))
  166. case 256U:
  167. S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH;
  168. S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_256;
  169. S->pTwiddle = (q31_t *)twiddleCoef_256_q31;
  170. status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);
  171. break;
  172. #endif
  173. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_128) && defined(ARM_TABLE_TWIDDLECOEF_Q31_128))
  174. case 128U:
  175. S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH;
  176. S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_128;
  177. S->pTwiddle = (q31_t *)twiddleCoef_128_q31;
  178. status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 2);
  179. break;
  180. #endif
  181. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_64) && defined(ARM_TABLE_TWIDDLECOEF_Q31_64))
  182. case 64U:
  183. S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH;
  184. S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_64;
  185. S->pTwiddle = (q31_t *)twiddleCoef_64_q31;
  186. status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);
  187. break;
  188. #endif
  189. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_32) && defined(ARM_TABLE_TWIDDLECOEF_Q31_32))
  190. case 32U:
  191. S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH;
  192. S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_32;
  193. S->pTwiddle = (q31_t *)twiddleCoef_32_q31;
  194. status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 2);
  195. break;
  196. #endif
  197. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_BITREVIDX_FXT_16) && defined(ARM_TABLE_TWIDDLECOEF_Q31_16))
  198. case 16U:
  199. /* Initializations of structure parameters for 16 point FFT */
  200. S->bitRevLength = ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH;
  201. S->pBitRevTable = (uint16_t *)armBitRevIndexTable_fixed_16;
  202. S->pTwiddle = (q31_t *)twiddleCoef_16_q31;
  203. status=arm_cfft_radix4by2_rearrange_twiddles_q31(S, 1);
  204. break;
  205. #endif
  206. default:
  207. /* Reporting argument error if fftSize is not valid value */
  208. status = ARM_MATH_ARGUMENT_ERROR;
  209. break;
  210. }
  211. return (status);
  212. }
  213. #else
  214. arm_status arm_cfft_init_q31(
  215. arm_cfft_instance_q31 * S,
  216. uint16_t fftLen)
  217. {
  218. /* Initialise the default arm status */
  219. arm_status status = ARM_MATH_SUCCESS;
  220. /* Initialise the FFT length */
  221. S->fftLen = fftLen;
  222. /* Initialise the Twiddle coefficient pointer */
  223. S->pTwiddle = NULL;
  224. /* Initializations of Instance structure depending on the FFT length */
  225. switch (S->fftLen) {
  226. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) && defined(ARM_TABLE_BITREVIDX_FXT_4096))
  227. /* Initializations of structure parameters for 4096 point FFT */
  228. case 4096U:
  229. /* Initialise the bit reversal table modifier */
  230. FFTINIT(q31,4096);
  231. break;
  232. #endif
  233. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) && defined(ARM_TABLE_BITREVIDX_FXT_2048))
  234. /* Initializations of structure parameters for 2048 point FFT */
  235. case 2048U:
  236. /* Initialise the bit reversal table modifier */
  237. FFTINIT(q31,2048);
  238. break;
  239. #endif
  240. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) && defined(ARM_TABLE_BITREVIDX_FXT_1024))
  241. /* Initializations of structure parameters for 1024 point FFT */
  242. case 1024U:
  243. /* Initialise the bit reversal table modifier */
  244. FFTINIT(q31,1024);
  245. break;
  246. #endif
  247. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_512) && defined(ARM_TABLE_BITREVIDX_FXT_512))
  248. /* Initializations of structure parameters for 512 point FFT */
  249. case 512U:
  250. /* Initialise the bit reversal table modifier */
  251. FFTINIT(q31,512);
  252. break;
  253. #endif
  254. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_256) && defined(ARM_TABLE_BITREVIDX_FXT_256))
  255. case 256U:
  256. FFTINIT(q31,256);
  257. break;
  258. #endif
  259. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_128) && defined(ARM_TABLE_BITREVIDX_FXT_128))
  260. case 128U:
  261. FFTINIT(q31,128);
  262. break;
  263. #endif
  264. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_64) && defined(ARM_TABLE_BITREVIDX_FXT_64))
  265. case 64U:
  266. FFTINIT(q31,64);
  267. break;
  268. #endif
  269. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_32) && defined(ARM_TABLE_BITREVIDX_FXT_32))
  270. case 32U:
  271. FFTINIT(q31,32);
  272. break;
  273. #endif
  274. #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_Q31_16) && defined(ARM_TABLE_BITREVIDX_FXT_16))
  275. case 16U:
  276. /* Initializations of structure parameters for 16 point FFT */
  277. FFTINIT(q31,16);
  278. break;
  279. #endif
  280. default:
  281. /* Reporting argument error if fftSize is not valid value */
  282. status = ARM_MATH_ARGUMENT_ERROR;
  283. break;
  284. }
  285. return (status);
  286. }
  287. #endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */
  288. /**
  289. @} end of ComplexFFT group
  290. */