transform_functions_f16.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /******************************************************************************
  2. * @file transform_functions_f16.h
  3. * @brief Public header file for NMSIS DSP Library
  4. * @version V1.10.0
  5. * @date 08 July 2021
  6. * Target Processor: RISC-V Cores
  7. ******************************************************************************/
  8. /*
  9. * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved.
  10. * Copyright (c) 2019 Nuclei Limited. All rights reserved.
  11. *
  12. * SPDX-License-Identifier: Apache-2.0
  13. *
  14. * Licensed under the Apache License, Version 2.0 (the License); you may
  15. * not use this file except in compliance with the License.
  16. * You may obtain a copy of the License at
  17. *
  18. * www.apache.org/licenses/LICENSE-2.0
  19. *
  20. * Unless required by applicable law or agreed to in writing, software
  21. * distributed under the License is distributed on an AS IS BASIS, WITHOUT
  22. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  23. * See the License for the specific language governing permissions and
  24. * limitations under the License.
  25. */
  26. #ifndef TRANSFORM_FUNCTIONS_F16_H_
  27. #define TRANSFORM_FUNCTIONS_F16_H_
  28. #include "riscv_math_types_f16.h"
  29. #include "riscv_math_memory.h"
  30. #include "dsp/none.h"
  31. #include "dsp/utils.h"
  32. #ifdef __cplusplus
  33. extern "C"
  34. {
  35. #endif
  36. #if defined(RISCV_FLOAT16_SUPPORTED)
  37. /**
  38. * @brief Instance structure for the floating-point CFFT/CIFFT function.
  39. */
  40. typedef struct
  41. {
  42. uint16_t fftLen; /**< length of the FFT. */
  43. uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
  44. uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
  45. const float16_t *pTwiddle; /**< points to the Twiddle factor table. */
  46. const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
  47. uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
  48. uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
  49. float16_t onebyfftLen; /**< value of 1/fftLen. */
  50. } riscv_cfft_radix2_instance_f16;
  51. /**
  52. * @brief Instance structure for the floating-point CFFT/CIFFT function.
  53. */
  54. typedef struct
  55. {
  56. uint16_t fftLen; /**< length of the FFT. */
  57. uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
  58. uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
  59. const float16_t *pTwiddle; /**< points to the Twiddle factor table. */
  60. const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
  61. uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
  62. uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
  63. float16_t onebyfftLen; /**< value of 1/fftLen. */
  64. } riscv_cfft_radix4_instance_f16;
  65. /**
  66. * @brief Instance structure for the floating-point CFFT/CIFFT function.
  67. */
  68. typedef struct
  69. {
  70. uint16_t fftLen; /**< length of the FFT. */
  71. const float16_t *pTwiddle; /**< points to the Twiddle factor table. */
  72. const uint16_t *pBitRevTable; /**< points to the bit reversal table. */
  73. uint16_t bitRevLength; /**< bit reversal table length. */
  74. } riscv_cfft_instance_f16;
  75. riscv_status riscv_cfft_init_4096_f16(riscv_cfft_instance_f16 * S);
  76. riscv_status riscv_cfft_init_2048_f16(riscv_cfft_instance_f16 * S);
  77. riscv_status riscv_cfft_init_1024_f16(riscv_cfft_instance_f16 * S);
  78. riscv_status riscv_cfft_init_512_f16(riscv_cfft_instance_f16 * S);
  79. riscv_status riscv_cfft_init_256_f16(riscv_cfft_instance_f16 * S);
  80. riscv_status riscv_cfft_init_128_f16(riscv_cfft_instance_f16 * S);
  81. riscv_status riscv_cfft_init_64_f16(riscv_cfft_instance_f16 * S);
  82. riscv_status riscv_cfft_init_32_f16(riscv_cfft_instance_f16 * S);
  83. riscv_status riscv_cfft_init_16_f16(riscv_cfft_instance_f16 * S);
  84. riscv_status riscv_cfft_init_f16(
  85. riscv_cfft_instance_f16 * S,
  86. uint16_t fftLen);
  87. void riscv_cfft_f16(
  88. const riscv_cfft_instance_f16 * S,
  89. float16_t * p1,
  90. uint8_t ifftFlag,
  91. uint8_t bitReverseFlag);
  92. /**
  93. * @brief Instance structure for the floating-point RFFT/RIFFT function.
  94. */
  95. typedef struct
  96. {
  97. riscv_cfft_instance_f16 Sint; /**< Internal CFFT structure. */
  98. uint16_t fftLenRFFT; /**< length of the real sequence */
  99. const float16_t * pTwiddleRFFT; /**< Twiddle factors real stage */
  100. } riscv_rfft_fast_instance_f16 ;
  101. riscv_status riscv_rfft_fast_init_32_f16( riscv_rfft_fast_instance_f16 * S );
  102. riscv_status riscv_rfft_fast_init_64_f16( riscv_rfft_fast_instance_f16 * S );
  103. riscv_status riscv_rfft_fast_init_128_f16( riscv_rfft_fast_instance_f16 * S );
  104. riscv_status riscv_rfft_fast_init_256_f16( riscv_rfft_fast_instance_f16 * S );
  105. riscv_status riscv_rfft_fast_init_512_f16( riscv_rfft_fast_instance_f16 * S );
  106. riscv_status riscv_rfft_fast_init_1024_f16( riscv_rfft_fast_instance_f16 * S );
  107. riscv_status riscv_rfft_fast_init_2048_f16( riscv_rfft_fast_instance_f16 * S );
  108. riscv_status riscv_rfft_fast_init_4096_f16( riscv_rfft_fast_instance_f16 * S );
  109. riscv_status riscv_rfft_fast_init_f16 (
  110. riscv_rfft_fast_instance_f16 * S,
  111. uint16_t fftLen);
  112. void riscv_rfft_fast_f16(
  113. const riscv_rfft_fast_instance_f16 * S,
  114. float16_t * p, float16_t * pOut,
  115. uint8_t ifftFlag);
  116. /* Deprecated */
  117. riscv_status riscv_cfft_radix4_init_f16(
  118. riscv_cfft_radix4_instance_f16 * S,
  119. uint16_t fftLen,
  120. uint8_t ifftFlag,
  121. uint8_t bitReverseFlag);
  122. /* Deprecated */
  123. void riscv_cfft_radix4_f16(
  124. const riscv_cfft_radix4_instance_f16 * S,
  125. float16_t * pSrc);
  126. /* Deprecated */
  127. riscv_status riscv_cfft_radix2_init_f16(
  128. riscv_cfft_radix2_instance_f16 * S,
  129. uint16_t fftLen,
  130. uint8_t ifftFlag,
  131. uint8_t bitReverseFlag);
  132. /* Deprecated */
  133. void riscv_cfft_radix2_f16(
  134. const riscv_cfft_radix2_instance_f16 * S,
  135. float16_t * pSrc);
  136. /**
  137. * @brief Instance structure for the Floating-point MFCC function.
  138. */
  139. typedef struct
  140. {
  141. const float16_t *dctCoefs; /**< Internal DCT coefficients */
  142. const float16_t *filterCoefs; /**< Internal Mel filter coefficients */
  143. const float16_t *windowCoefs; /**< Windowing coefficients */
  144. const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */
  145. const uint32_t *filterLengths; /**< Internal Mel filter lengths */
  146. uint32_t fftLen; /**< FFT length */
  147. uint32_t nbMelFilters; /**< Number of Mel filters */
  148. uint32_t nbDctOutputs; /**< Number of DCT outputs */
  149. #if defined(RISCV_MFCC_CFFT_BASED)
  150. /* Implementation of the MFCC is using a CFFT */
  151. riscv_cfft_instance_f16 cfft; /**< Internal CFFT instance */
  152. #else
  153. /* Implementation of the MFCC is using a RFFT (default) */
  154. riscv_rfft_fast_instance_f16 rfft;
  155. #endif
  156. } riscv_mfcc_instance_f16 ;
  157. riscv_status riscv_mfcc_init_32_f16(
  158. riscv_mfcc_instance_f16 * S,
  159. uint32_t nbMelFilters,
  160. uint32_t nbDctOutputs,
  161. const float16_t *dctCoefs,
  162. const uint32_t *filterPos,
  163. const uint32_t *filterLengths,
  164. const float16_t *filterCoefs,
  165. const float16_t *windowCoefs
  166. );
  167. riscv_status riscv_mfcc_init_64_f16(
  168. riscv_mfcc_instance_f16 * S,
  169. uint32_t nbMelFilters,
  170. uint32_t nbDctOutputs,
  171. const float16_t *dctCoefs,
  172. const uint32_t *filterPos,
  173. const uint32_t *filterLengths,
  174. const float16_t *filterCoefs,
  175. const float16_t *windowCoefs
  176. );
  177. riscv_status riscv_mfcc_init_128_f16(
  178. riscv_mfcc_instance_f16 * S,
  179. uint32_t nbMelFilters,
  180. uint32_t nbDctOutputs,
  181. const float16_t *dctCoefs,
  182. const uint32_t *filterPos,
  183. const uint32_t *filterLengths,
  184. const float16_t *filterCoefs,
  185. const float16_t *windowCoefs
  186. );
  187. riscv_status riscv_mfcc_init_256_f16(
  188. riscv_mfcc_instance_f16 * S,
  189. uint32_t nbMelFilters,
  190. uint32_t nbDctOutputs,
  191. const float16_t *dctCoefs,
  192. const uint32_t *filterPos,
  193. const uint32_t *filterLengths,
  194. const float16_t *filterCoefs,
  195. const float16_t *windowCoefs
  196. );
  197. riscv_status riscv_mfcc_init_512_f16(
  198. riscv_mfcc_instance_f16 * S,
  199. uint32_t nbMelFilters,
  200. uint32_t nbDctOutputs,
  201. const float16_t *dctCoefs,
  202. const uint32_t *filterPos,
  203. const uint32_t *filterLengths,
  204. const float16_t *filterCoefs,
  205. const float16_t *windowCoefs
  206. );
  207. riscv_status riscv_mfcc_init_1024_f16(
  208. riscv_mfcc_instance_f16 * S,
  209. uint32_t nbMelFilters,
  210. uint32_t nbDctOutputs,
  211. const float16_t *dctCoefs,
  212. const uint32_t *filterPos,
  213. const uint32_t *filterLengths,
  214. const float16_t *filterCoefs,
  215. const float16_t *windowCoefs
  216. );
  217. riscv_status riscv_mfcc_init_2048_f16(
  218. riscv_mfcc_instance_f16 * S,
  219. uint32_t nbMelFilters,
  220. uint32_t nbDctOutputs,
  221. const float16_t *dctCoefs,
  222. const uint32_t *filterPos,
  223. const uint32_t *filterLengths,
  224. const float16_t *filterCoefs,
  225. const float16_t *windowCoefs
  226. );
  227. riscv_status riscv_mfcc_init_4096_f16(
  228. riscv_mfcc_instance_f16 * S,
  229. uint32_t nbMelFilters,
  230. uint32_t nbDctOutputs,
  231. const float16_t *dctCoefs,
  232. const uint32_t *filterPos,
  233. const uint32_t *filterLengths,
  234. const float16_t *filterCoefs,
  235. const float16_t *windowCoefs
  236. );
  237. riscv_status riscv_mfcc_init_f16(
  238. riscv_mfcc_instance_f16 * S,
  239. uint32_t fftLen,
  240. uint32_t nbMelFilters,
  241. uint32_t nbDctOutputs,
  242. const float16_t *dctCoefs,
  243. const uint32_t *filterPos,
  244. const uint32_t *filterLengths,
  245. const float16_t *filterCoefs,
  246. const float16_t *windowCoefs
  247. );
  248. /**
  249. @brief MFCC F16
  250. @param[in] S points to the mfcc instance structure
  251. @param[in] pSrc points to the input samples
  252. @param[out] pDst points to the output MFCC values
  253. @param[inout] pTmp points to a temporary buffer of complex
  254. */
  255. void riscv_mfcc_f16(
  256. const riscv_mfcc_instance_f16 * S,
  257. float16_t *pSrc,
  258. float16_t *pDst,
  259. float16_t *pTmp
  260. );
  261. #endif /* defined(RISCV_FLOAT16_SUPPORTED)*/
  262. #ifdef __cplusplus
  263. }
  264. #endif
  265. #endif /* ifndef _TRANSFORM_FUNCTIONS_F16_H_ */