1 /****************************************************************************** 2 * @file transform_functions_f16.h 3 * @brief Public header file for CMSIS DSP Library 4 * @version V1.10.0 5 * @date 08 July 2021 6 * Target Processor: Cortex-M and Cortex-A cores 7 ******************************************************************************/ 8 /* 9 * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. 10 * 11 * SPDX-License-Identifier: Apache-2.0 12 * 13 * Licensed under the Apache License, Version 2.0 (the License); you may 14 * not use this file except in compliance with the License. 15 * You may obtain a copy of the License at 16 * 17 * www.apache.org/licenses/LICENSE-2.0 18 * 19 * Unless required by applicable law or agreed to in writing, software 20 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 22 * See the License for the specific language governing permissions and 23 * limitations under the License. 24 */ 25 26 27 #ifndef TRANSFORM_FUNCTIONS_F16_H_ 28 #define TRANSFORM_FUNCTIONS_F16_H_ 29 30 #include "arm_math_types_f16.h" 31 #include "arm_math_memory.h" 32 33 #include "dsp/none.h" 34 #include "dsp/utils.h" 35 36 #ifdef __cplusplus 37 extern "C" 38 { 39 #endif 40 41 42 43 #if defined(ARM_FLOAT16_SUPPORTED) 44 45 46 /** 47 * @brief Instance structure for the floating-point CFFT/CIFFT function. 48 */ 49 typedef struct 50 { 51 uint16_t fftLen; /**< length of the FFT. */ 52 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ 53 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ 54 const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ 55 const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 56 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 57 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ 58 float16_t onebyfftLen; /**< value of 1/fftLen. */ 59 } arm_cfft_radix2_instance_f16; 60 61 /** 62 * @brief Instance structure for the floating-point CFFT/CIFFT function. 63 */ 64 typedef struct 65 { 66 uint16_t fftLen; /**< length of the FFT. */ 67 uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ 68 uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ 69 const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ 70 const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 71 uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ 72 uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ 73 float16_t onebyfftLen; /**< value of 1/fftLen. */ 74 } arm_cfft_radix4_instance_f16; 75 76 /** 77 * @brief Instance structure for the floating-point CFFT/CIFFT function. 78 */ 79 typedef struct 80 { 81 uint16_t fftLen; /**< length of the FFT. */ 82 const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ 83 const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ 84 uint16_t bitRevLength; /**< bit reversal table length. */ 85 #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) 86 const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ 87 const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ 88 const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ 89 const float16_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ 90 const float16_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ 91 const float16_t *rearranged_twiddle_stride3; 92 #endif 93 } arm_cfft_instance_f16; 94 95 96 arm_status arm_cfft_init_4096_f16(arm_cfft_instance_f16 * S); 97 arm_status arm_cfft_init_2048_f16(arm_cfft_instance_f16 * S); 98 arm_status arm_cfft_init_1024_f16(arm_cfft_instance_f16 * S); 99 arm_status arm_cfft_init_512_f16(arm_cfft_instance_f16 * S); 100 arm_status arm_cfft_init_256_f16(arm_cfft_instance_f16 * S); 101 arm_status arm_cfft_init_128_f16(arm_cfft_instance_f16 * S); 102 arm_status arm_cfft_init_64_f16(arm_cfft_instance_f16 * S); 103 arm_status arm_cfft_init_32_f16(arm_cfft_instance_f16 * S); 104 arm_status arm_cfft_init_16_f16(arm_cfft_instance_f16 * S); 105 106 107 arm_status arm_cfft_init_f16( 108 arm_cfft_instance_f16 * S, 109 uint16_t fftLen); 110 111 void arm_cfft_f16( 112 const arm_cfft_instance_f16 * S, 113 float16_t * p1, 114 uint8_t ifftFlag, 115 uint8_t bitReverseFlag); 116 117 /** 118 * @brief Instance structure for the floating-point RFFT/RIFFT function. 119 */ 120 typedef struct 121 { 122 arm_cfft_instance_f16 Sint; /**< Internal CFFT structure. */ 123 uint16_t fftLenRFFT; /**< length of the real sequence */ 124 const float16_t * pTwiddleRFFT; /**< Twiddle factors real stage */ 125 } arm_rfft_fast_instance_f16 ; 126 127 arm_status arm_rfft_fast_init_32_f16( arm_rfft_fast_instance_f16 * S ); 128 arm_status arm_rfft_fast_init_64_f16( arm_rfft_fast_instance_f16 * S ); 129 arm_status arm_rfft_fast_init_128_f16( arm_rfft_fast_instance_f16 * S ); 130 arm_status arm_rfft_fast_init_256_f16( arm_rfft_fast_instance_f16 * S ); 131 arm_status arm_rfft_fast_init_512_f16( arm_rfft_fast_instance_f16 * S ); 132 arm_status arm_rfft_fast_init_1024_f16( arm_rfft_fast_instance_f16 * S ); 133 arm_status arm_rfft_fast_init_2048_f16( arm_rfft_fast_instance_f16 * S ); 134 arm_status arm_rfft_fast_init_4096_f16( arm_rfft_fast_instance_f16 * S ); 135 136 arm_status arm_rfft_fast_init_f16 ( 137 arm_rfft_fast_instance_f16 * S, 138 uint16_t fftLen); 139 140 141 void arm_rfft_fast_f16( 142 const arm_rfft_fast_instance_f16 * S, 143 float16_t * p, float16_t * pOut, 144 uint8_t ifftFlag); 145 146 /* Deprecated */ 147 arm_status arm_cfft_radix4_init_f16( 148 arm_cfft_radix4_instance_f16 * S, 149 uint16_t fftLen, 150 uint8_t ifftFlag, 151 uint8_t bitReverseFlag); 152 153 /* Deprecated */ 154 void arm_cfft_radix4_f16( 155 const arm_cfft_radix4_instance_f16 * S, 156 float16_t * pSrc); 157 158 159 /* Deprecated */ 160 arm_status arm_cfft_radix2_init_f16( 161 arm_cfft_radix2_instance_f16 * S, 162 uint16_t fftLen, 163 uint8_t ifftFlag, 164 uint8_t bitReverseFlag); 165 166 /* Deprecated */ 167 void arm_cfft_radix2_f16( 168 const arm_cfft_radix2_instance_f16 * S, 169 float16_t * pSrc); 170 171 /** 172 * @brief Instance structure for the Floating-point MFCC function. 173 */ 174 typedef struct 175 { 176 const float16_t *dctCoefs; /**< Internal DCT coefficients */ 177 const float16_t *filterCoefs; /**< Internal Mel filter coefficients */ 178 const float16_t *windowCoefs; /**< Windowing coefficients */ 179 const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ 180 const uint32_t *filterLengths; /**< Internal Mel filter lengths */ 181 uint32_t fftLen; /**< FFT length */ 182 uint32_t nbMelFilters; /**< Number of Mel filters */ 183 uint32_t nbDctOutputs; /**< Number of DCT outputs */ 184 #if defined(ARM_MFCC_CFFT_BASED) 185 /* Implementation of the MFCC is using a CFFT */ 186 arm_cfft_instance_f16 cfft; /**< Internal CFFT instance */ 187 #else 188 /* Implementation of the MFCC is using a RFFT (default) */ 189 arm_rfft_fast_instance_f16 rfft; 190 #endif 191 } arm_mfcc_instance_f16 ; 192 193 arm_status arm_mfcc_init_32_f16( 194 arm_mfcc_instance_f16 * S, 195 uint32_t nbMelFilters, 196 uint32_t nbDctOutputs, 197 const float16_t *dctCoefs, 198 const uint32_t *filterPos, 199 const uint32_t *filterLengths, 200 const float16_t *filterCoefs, 201 const float16_t *windowCoefs 202 ); 203 204 arm_status arm_mfcc_init_64_f16( 205 arm_mfcc_instance_f16 * S, 206 uint32_t nbMelFilters, 207 uint32_t nbDctOutputs, 208 const float16_t *dctCoefs, 209 const uint32_t *filterPos, 210 const uint32_t *filterLengths, 211 const float16_t *filterCoefs, 212 const float16_t *windowCoefs 213 ); 214 215 arm_status arm_mfcc_init_128_f16( 216 arm_mfcc_instance_f16 * S, 217 uint32_t nbMelFilters, 218 uint32_t nbDctOutputs, 219 const float16_t *dctCoefs, 220 const uint32_t *filterPos, 221 const uint32_t *filterLengths, 222 const float16_t *filterCoefs, 223 const float16_t *windowCoefs 224 ); 225 226 arm_status arm_mfcc_init_256_f16( 227 arm_mfcc_instance_f16 * S, 228 uint32_t nbMelFilters, 229 uint32_t nbDctOutputs, 230 const float16_t *dctCoefs, 231 const uint32_t *filterPos, 232 const uint32_t *filterLengths, 233 const float16_t *filterCoefs, 234 const float16_t *windowCoefs 235 ); 236 237 arm_status arm_mfcc_init_512_f16( 238 arm_mfcc_instance_f16 * S, 239 uint32_t nbMelFilters, 240 uint32_t nbDctOutputs, 241 const float16_t *dctCoefs, 242 const uint32_t *filterPos, 243 const uint32_t *filterLengths, 244 const float16_t *filterCoefs, 245 const float16_t *windowCoefs 246 ); 247 248 arm_status arm_mfcc_init_1024_f16( 249 arm_mfcc_instance_f16 * S, 250 uint32_t nbMelFilters, 251 uint32_t nbDctOutputs, 252 const float16_t *dctCoefs, 253 const uint32_t *filterPos, 254 const uint32_t *filterLengths, 255 const float16_t *filterCoefs, 256 const float16_t *windowCoefs 257 ); 258 259 arm_status arm_mfcc_init_2048_f16( 260 arm_mfcc_instance_f16 * S, 261 uint32_t nbMelFilters, 262 uint32_t nbDctOutputs, 263 const float16_t *dctCoefs, 264 const uint32_t *filterPos, 265 const uint32_t *filterLengths, 266 const float16_t *filterCoefs, 267 const float16_t *windowCoefs 268 ); 269 270 arm_status arm_mfcc_init_4096_f16( 271 arm_mfcc_instance_f16 * S, 272 uint32_t nbMelFilters, 273 uint32_t nbDctOutputs, 274 const float16_t *dctCoefs, 275 const uint32_t *filterPos, 276 const uint32_t *filterLengths, 277 const float16_t *filterCoefs, 278 const float16_t *windowCoefs 279 ); 280 281 arm_status arm_mfcc_init_f16( 282 arm_mfcc_instance_f16 * S, 283 uint32_t fftLen, 284 uint32_t nbMelFilters, 285 uint32_t nbDctOutputs, 286 const float16_t *dctCoefs, 287 const uint32_t *filterPos, 288 const uint32_t *filterLengths, 289 const float16_t *filterCoefs, 290 const float16_t *windowCoefs 291 ); 292 293 294 295 /** 296 @brief MFCC F16 297 @param[in] S points to the mfcc instance structure 298 @param[in] pSrc points to the input samples 299 @param[out] pDst points to the output MFCC values 300 @param[inout] pTmp points to a temporary buffer of complex 301 */ 302 void arm_mfcc_f16( 303 const arm_mfcc_instance_f16 * S, 304 float16_t *pSrc, 305 float16_t *pDst, 306 float16_t *pTmp 307 ); 308 309 310 #endif /* defined(ARM_FLOAT16_SUPPORTED)*/ 311 312 #ifdef __cplusplus 313 } 314 #endif 315 316 #endif /* ifndef _TRANSFORM_FUNCTIONS_F16_H_ */ 317