/ Drivers / CMSIS / DSP / Include / dsp / transform_functions.h
transform_functions.h
  1  /******************************************************************************
  2   * @file     transform_functions.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_H_
 28  #define _TRANSFORM_FUNCTIONS_H_
 29  
 30  #include "arm_math_types.h"
 31  #include "arm_math_memory.h"
 32  
 33  #include "dsp/none.h"
 34  #include "dsp/utils.h"
 35  
 36  #include "dsp/basic_math_functions.h"
 37  #include "dsp/complex_math_functions.h"
 38  
 39  #ifdef   __cplusplus
 40  extern "C"
 41  {
 42  #endif
 43  
 44  
 45  /**
 46   * @defgroup groupTransforms Transform Functions
 47   */
 48  
 49  
 50    /**
 51     * @brief Instance structure for the Q15 CFFT/CIFFT function.
 52     */
 53    typedef struct
 54    {
 55            uint16_t fftLen;                 /**< length of the FFT. */
 56            uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
 57            uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
 58      const q15_t *pTwiddle;                 /**< points to the Sin twiddle factor table. */
 59      const uint16_t *pBitRevTable;          /**< points to the bit reversal table. */
 60            uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
 61            uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
 62    } arm_cfft_radix2_instance_q15;
 63  
 64  /* Deprecated */
 65    arm_status arm_cfft_radix2_init_q15(
 66          arm_cfft_radix2_instance_q15 * S,
 67          uint16_t fftLen,
 68          uint8_t ifftFlag,
 69          uint8_t bitReverseFlag);
 70  
 71  /* Deprecated */
 72    void arm_cfft_radix2_q15(
 73    const arm_cfft_radix2_instance_q15 * S,
 74          q15_t * pSrc);
 75  
 76  
 77    /**
 78     * @brief Instance structure for the Q15 CFFT/CIFFT function.
 79     */
 80    typedef struct
 81    {
 82            uint16_t fftLen;                 /**< length of the FFT. */
 83            uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
 84            uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
 85      const q15_t *pTwiddle;                 /**< points to the twiddle factor table. */
 86      const uint16_t *pBitRevTable;          /**< points to the bit reversal table. */
 87            uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
 88            uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
 89    } arm_cfft_radix4_instance_q15;
 90  
 91  /* Deprecated */
 92    arm_status arm_cfft_radix4_init_q15(
 93          arm_cfft_radix4_instance_q15 * S,
 94          uint16_t fftLen,
 95          uint8_t ifftFlag,
 96          uint8_t bitReverseFlag);
 97  
 98  /* Deprecated */
 99    void arm_cfft_radix4_q15(
100    const arm_cfft_radix4_instance_q15 * S,
101          q15_t * pSrc);
102  
103    /**
104     * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function.
105     */
106    typedef struct
107    {
108            uint16_t fftLen;                 /**< length of the FFT. */
109            uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
110            uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
111      const q31_t *pTwiddle;                 /**< points to the Twiddle factor table. */
112      const uint16_t *pBitRevTable;          /**< points to the bit reversal table. */
113            uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
114            uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
115    } arm_cfft_radix2_instance_q31;
116  
117  /* Deprecated */
118    arm_status arm_cfft_radix2_init_q31(
119          arm_cfft_radix2_instance_q31 * S,
120          uint16_t fftLen,
121          uint8_t ifftFlag,
122          uint8_t bitReverseFlag);
123  
124  /* Deprecated */
125    void arm_cfft_radix2_q31(
126    const arm_cfft_radix2_instance_q31 * S,
127          q31_t * pSrc);
128  
129    /**
130     * @brief Instance structure for the Q31 CFFT/CIFFT function.
131     */
132    typedef struct
133    {
134            uint16_t fftLen;                 /**< length of the FFT. */
135            uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
136            uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
137      const q31_t *pTwiddle;                 /**< points to the twiddle factor table. */
138      const uint16_t *pBitRevTable;          /**< points to the bit reversal table. */
139            uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
140            uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
141    } arm_cfft_radix4_instance_q31;
142  
143  /* Deprecated */
144    void arm_cfft_radix4_q31(
145    const arm_cfft_radix4_instance_q31 * S,
146          q31_t * pSrc);
147  
148  /* Deprecated */
149    arm_status arm_cfft_radix4_init_q31(
150          arm_cfft_radix4_instance_q31 * S,
151          uint16_t fftLen,
152          uint8_t ifftFlag,
153          uint8_t bitReverseFlag);
154  
155    /**
156     * @brief Instance structure for the floating-point CFFT/CIFFT function.
157     */
158    typedef struct
159    {
160            uint16_t fftLen;                   /**< length of the FFT. */
161            uint8_t ifftFlag;                  /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
162            uint8_t bitReverseFlag;            /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
163      const float32_t *pTwiddle;               /**< points to the Twiddle factor table. */
164      const uint16_t *pBitRevTable;            /**< points to the bit reversal table. */
165            uint16_t twidCoefModifier;         /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
166            uint16_t bitRevFactor;             /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
167            float32_t onebyfftLen;             /**< value of 1/fftLen. */
168    } arm_cfft_radix2_instance_f32;
169  
170  
171  /* Deprecated */
172    arm_status arm_cfft_radix2_init_f32(
173          arm_cfft_radix2_instance_f32 * S,
174          uint16_t fftLen,
175          uint8_t ifftFlag,
176          uint8_t bitReverseFlag);
177  
178  /* Deprecated */
179    void arm_cfft_radix2_f32(
180    const arm_cfft_radix2_instance_f32 * S,
181          float32_t * pSrc);
182  
183    /**
184     * @brief Instance structure for the floating-point CFFT/CIFFT function.
185     */
186    typedef struct
187    {
188            uint16_t fftLen;                   /**< length of the FFT. */
189            uint8_t ifftFlag;                  /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */
190            uint8_t bitReverseFlag;            /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */
191      const float32_t *pTwiddle;               /**< points to the Twiddle factor table. */
192      const uint16_t *pBitRevTable;            /**< points to the bit reversal table. */
193            uint16_t twidCoefModifier;         /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
194            uint16_t bitRevFactor;             /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */
195            float32_t onebyfftLen;             /**< value of 1/fftLen. */
196    } arm_cfft_radix4_instance_f32;
197  
198  
199  
200  /* Deprecated */
201    arm_status arm_cfft_radix4_init_f32(
202          arm_cfft_radix4_instance_f32 * S,
203          uint16_t fftLen,
204          uint8_t ifftFlag,
205          uint8_t bitReverseFlag);
206  
207  /* Deprecated */
208    void arm_cfft_radix4_f32(
209    const arm_cfft_radix4_instance_f32 * S,
210          float32_t * pSrc);
211  
212    /**
213     * @brief Instance structure for the fixed-point CFFT/CIFFT function.
214     */
215    typedef struct
216    {
217            uint16_t fftLen;                   /**< length of the FFT. */
218      const q15_t *pTwiddle;             /**< points to the Twiddle factor table. */
219      const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */
220            uint16_t bitRevLength;             /**< bit reversal table length. */
221  #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
222     const uint32_t *rearranged_twiddle_tab_stride1_arr;        /**< Per stage reordered twiddle pointer (offset 1) */                                                       \
223     const uint32_t *rearranged_twiddle_tab_stride2_arr;        /**< Per stage reordered twiddle pointer (offset 2) */                                                       \
224     const uint32_t *rearranged_twiddle_tab_stride3_arr;        /**< Per stage reordered twiddle pointer (offset 3) */                                                       \
225     const q15_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */                                                                   \
226     const q15_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */                                                                   \
227     const q15_t *rearranged_twiddle_stride3;
228  #endif
229    } arm_cfft_instance_q15;
230  
231  arm_status arm_cfft_init_q15(
232    arm_cfft_instance_q15 * S,
233    uint16_t fftLen);
234  
235  void arm_cfft_q15(
236      const arm_cfft_instance_q15 * S,
237            q15_t * p1,
238            uint8_t ifftFlag,
239            uint8_t bitReverseFlag);
240  
241    /**
242     * @brief Instance structure for the fixed-point CFFT/CIFFT function.
243     */
244    typedef struct
245    {
246            uint16_t fftLen;                   /**< length of the FFT. */
247      const q31_t *pTwiddle;             /**< points to the Twiddle factor table. */
248      const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */
249            uint16_t bitRevLength;             /**< bit reversal table length. */
250  #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
251     const uint32_t *rearranged_twiddle_tab_stride1_arr;        /**< Per stage reordered twiddle pointer (offset 1) */                                                       \
252     const uint32_t *rearranged_twiddle_tab_stride2_arr;        /**< Per stage reordered twiddle pointer (offset 2) */                                                       \
253     const uint32_t *rearranged_twiddle_tab_stride3_arr;        /**< Per stage reordered twiddle pointer (offset 3) */                                                       \
254     const q31_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */                                                                   \
255     const q31_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */                                                                   \
256     const q31_t *rearranged_twiddle_stride3;
257  #endif
258    } arm_cfft_instance_q31;
259  
260  arm_status arm_cfft_init_q31(
261    arm_cfft_instance_q31 * S,
262    uint16_t fftLen);
263  
264  void arm_cfft_q31(
265      const arm_cfft_instance_q31 * S,
266            q31_t * p1,
267            uint8_t ifftFlag,
268            uint8_t bitReverseFlag);
269  
270    /**
271     * @brief Instance structure for the floating-point CFFT/CIFFT function.
272     */
273    typedef struct
274    {
275            uint16_t fftLen;                   /**< length of the FFT. */
276      const float32_t *pTwiddle;         /**< points to the Twiddle factor table. */
277      const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */
278            uint16_t bitRevLength;             /**< bit reversal table length. */
279  #if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)
280     const uint32_t *rearranged_twiddle_tab_stride1_arr;        /**< Per stage reordered twiddle pointer (offset 1) */                                                       \
281     const uint32_t *rearranged_twiddle_tab_stride2_arr;        /**< Per stage reordered twiddle pointer (offset 2) */                                                       \
282     const uint32_t *rearranged_twiddle_tab_stride3_arr;        /**< Per stage reordered twiddle pointer (offset 3) */                                                       \
283     const float32_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */                                                                   \
284     const float32_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */                                                                   \
285     const float32_t *rearranged_twiddle_stride3;
286  #endif
287    } arm_cfft_instance_f32;
288  
289  
290  
291    arm_status arm_cfft_init_f32(
292    arm_cfft_instance_f32 * S,
293    uint16_t fftLen);
294  
295    void arm_cfft_f32(
296    const arm_cfft_instance_f32 * S,
297          float32_t * p1,
298          uint8_t ifftFlag,
299          uint8_t bitReverseFlag);
300  
301  
302    /**
303     * @brief Instance structure for the Double Precision Floating-point CFFT/CIFFT function.
304     */
305    typedef struct
306    {
307            uint16_t fftLen;                   /**< length of the FFT. */
308      const float64_t *pTwiddle;         /**< points to the Twiddle factor table. */
309      const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */
310            uint16_t bitRevLength;             /**< bit reversal table length. */
311    } arm_cfft_instance_f64;
312  
313    arm_status arm_cfft_init_f64(
314    arm_cfft_instance_f64 * S,
315    uint16_t fftLen);
316    
317    void arm_cfft_f64(
318    const arm_cfft_instance_f64 * S,
319          float64_t * p1,
320          uint8_t ifftFlag,
321          uint8_t bitReverseFlag);
322  
323    /**
324     * @brief Instance structure for the Q15 RFFT/RIFFT function.
325     */
326    typedef struct
327    {
328            uint32_t fftLenReal;                      /**< length of the real FFT. */
329            uint8_t ifftFlagR;                        /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
330            uint8_t bitReverseFlagR;                  /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
331            uint32_t twidCoefRModifier;               /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
332      const q15_t *pTwiddleAReal;                     /**< points to the real twiddle factor table. */
333      const q15_t *pTwiddleBReal;                     /**< points to the imag twiddle factor table. */
334  #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
335      arm_cfft_instance_q15 cfftInst;
336  #else
337      const arm_cfft_instance_q15 *pCfft;       /**< points to the complex FFT instance. */
338  #endif
339    } arm_rfft_instance_q15;
340  
341    arm_status arm_rfft_init_q15(
342          arm_rfft_instance_q15 * S,
343          uint32_t fftLenReal,
344          uint32_t ifftFlagR,
345          uint32_t bitReverseFlag);
346  
347    void arm_rfft_q15(
348    const arm_rfft_instance_q15 * S,
349          q15_t * pSrc,
350          q15_t * pDst);
351  
352    /**
353     * @brief Instance structure for the Q31 RFFT/RIFFT function.
354     */
355    typedef struct
356    {
357            uint32_t fftLenReal;                        /**< length of the real FFT. */
358            uint8_t ifftFlagR;                          /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
359            uint8_t bitReverseFlagR;                    /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
360            uint32_t twidCoefRModifier;                 /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
361      const q31_t *pTwiddleAReal;                       /**< points to the real twiddle factor table. */
362      const q31_t *pTwiddleBReal;                       /**< points to the imag twiddle factor table. */
363  #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)
364      arm_cfft_instance_q31 cfftInst;
365  #else
366      const arm_cfft_instance_q31 *pCfft;         /**< points to the complex FFT instance. */
367  #endif
368    } arm_rfft_instance_q31;
369  
370    arm_status arm_rfft_init_q31(
371          arm_rfft_instance_q31 * S,
372          uint32_t fftLenReal,
373          uint32_t ifftFlagR,
374          uint32_t bitReverseFlag);
375  
376    void arm_rfft_q31(
377    const arm_rfft_instance_q31 * S,
378          q31_t * pSrc,
379          q31_t * pDst);
380  
381    /**
382     * @brief Instance structure for the floating-point RFFT/RIFFT function.
383     */
384    typedef struct
385    {
386            uint32_t fftLenReal;                        /**< length of the real FFT. */
387            uint16_t fftLenBy2;                         /**< length of the complex FFT. */
388            uint8_t ifftFlagR;                          /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */
389            uint8_t bitReverseFlagR;                    /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */
390            uint32_t twidCoefRModifier;                     /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */
391      const float32_t *pTwiddleAReal;                   /**< points to the real twiddle factor table. */
392      const float32_t *pTwiddleBReal;                   /**< points to the imag twiddle factor table. */
393            arm_cfft_radix4_instance_f32 *pCfft;        /**< points to the complex FFT instance. */
394    } arm_rfft_instance_f32;
395  
396    arm_status arm_rfft_init_f32(
397          arm_rfft_instance_f32 * S,
398          arm_cfft_radix4_instance_f32 * S_CFFT,
399          uint32_t fftLenReal,
400          uint32_t ifftFlagR,
401          uint32_t bitReverseFlag);
402  
403    void arm_rfft_f32(
404    const arm_rfft_instance_f32 * S,
405          float32_t * pSrc,
406          float32_t * pDst);
407  
408    /**
409     * @brief Instance structure for the Double Precision Floating-point RFFT/RIFFT function.
410     */
411  typedef struct
412    {
413            arm_cfft_instance_f64 Sint;      /**< Internal CFFT structure. */
414            uint16_t fftLenRFFT;             /**< length of the real sequence */
415      const float64_t * pTwiddleRFFT;        /**< Twiddle factors real stage  */
416    } arm_rfft_fast_instance_f64 ;
417  
418  arm_status arm_rfft_fast_init_f64 (
419           arm_rfft_fast_instance_f64 * S,
420           uint16_t fftLen);
421  
422  
423  void arm_rfft_fast_f64(
424      arm_rfft_fast_instance_f64 * S,
425      float64_t * p, float64_t * pOut,
426      uint8_t ifftFlag);
427  
428  
429    /**
430     * @brief Instance structure for the floating-point RFFT/RIFFT function.
431     */
432  typedef struct
433    {
434            arm_cfft_instance_f32 Sint;      /**< Internal CFFT structure. */
435            uint16_t fftLenRFFT;             /**< length of the real sequence */
436      const float32_t * pTwiddleRFFT;        /**< Twiddle factors real stage  */
437    } arm_rfft_fast_instance_f32 ;
438  
439  arm_status arm_rfft_fast_init_f32 (
440           arm_rfft_fast_instance_f32 * S,
441           uint16_t fftLen);
442  
443  
444    void arm_rfft_fast_f32(
445          const arm_rfft_fast_instance_f32 * S,
446          float32_t * p, float32_t * pOut,
447          uint8_t ifftFlag);
448  
449    /**
450     * @brief Instance structure for the floating-point DCT4/IDCT4 function.
451     */
452    typedef struct
453    {
454            uint16_t N;                          /**< length of the DCT4. */
455            uint16_t Nby2;                       /**< half of the length of the DCT4. */
456            float32_t normalize;                 /**< normalizing factor. */
457      const float32_t *pTwiddle;                 /**< points to the twiddle factor table. */
458      const float32_t *pCosFactor;               /**< points to the cosFactor table. */
459            arm_rfft_instance_f32 *pRfft;        /**< points to the real FFT instance. */
460            arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */
461    } arm_dct4_instance_f32;
462  
463  
464    /**
465     * @brief  Initialization function for the floating-point DCT4/IDCT4.
466     * @param[in,out] S          points to an instance of floating-point DCT4/IDCT4 structure.
467     * @param[in]     S_RFFT     points to an instance of floating-point RFFT/RIFFT structure.
468     * @param[in]     S_CFFT     points to an instance of floating-point CFFT/CIFFT structure.
469     * @param[in]     N          length of the DCT4.
470     * @param[in]     Nby2       half of the length of the DCT4.
471     * @param[in]     normalize  normalizing factor.
472     * @return      arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported transform length.
473     */
474    arm_status arm_dct4_init_f32(
475          arm_dct4_instance_f32 * S,
476          arm_rfft_instance_f32 * S_RFFT,
477          arm_cfft_radix4_instance_f32 * S_CFFT,
478          uint16_t N,
479          uint16_t Nby2,
480          float32_t normalize);
481  
482  
483    /**
484     * @brief Processing function for the floating-point DCT4/IDCT4.
485     * @param[in]     S              points to an instance of the floating-point DCT4/IDCT4 structure.
486     * @param[in]     pState         points to state buffer.
487     * @param[in,out] pInlineBuffer  points to the in-place input and output buffer.
488     */
489    void arm_dct4_f32(
490    const arm_dct4_instance_f32 * S,
491          float32_t * pState,
492          float32_t * pInlineBuffer);
493  
494  
495    /**
496     * @brief Instance structure for the Q31 DCT4/IDCT4 function.
497     */
498    typedef struct
499    {
500            uint16_t N;                          /**< length of the DCT4. */
501            uint16_t Nby2;                       /**< half of the length of the DCT4. */
502            q31_t normalize;                     /**< normalizing factor. */
503      const q31_t *pTwiddle;                     /**< points to the twiddle factor table. */
504      const q31_t *pCosFactor;                   /**< points to the cosFactor table. */
505            arm_rfft_instance_q31 *pRfft;        /**< points to the real FFT instance. */
506            arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */
507    } arm_dct4_instance_q31;
508  
509  
510    /**
511     * @brief  Initialization function for the Q31 DCT4/IDCT4.
512     * @param[in,out] S          points to an instance of Q31 DCT4/IDCT4 structure.
513     * @param[in]     S_RFFT     points to an instance of Q31 RFFT/RIFFT structure
514     * @param[in]     S_CFFT     points to an instance of Q31 CFFT/CIFFT structure
515     * @param[in]     N          length of the DCT4.
516     * @param[in]     Nby2       half of the length of the DCT4.
517     * @param[in]     normalize  normalizing factor.
518     * @return      arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.
519     */
520    arm_status arm_dct4_init_q31(
521          arm_dct4_instance_q31 * S,
522          arm_rfft_instance_q31 * S_RFFT,
523          arm_cfft_radix4_instance_q31 * S_CFFT,
524          uint16_t N,
525          uint16_t Nby2,
526          q31_t normalize);
527  
528  
529    /**
530     * @brief Processing function for the Q31 DCT4/IDCT4.
531     * @param[in]     S              points to an instance of the Q31 DCT4 structure.
532     * @param[in]     pState         points to state buffer.
533     * @param[in,out] pInlineBuffer  points to the in-place input and output buffer.
534     */
535    void arm_dct4_q31(
536    const arm_dct4_instance_q31 * S,
537          q31_t * pState,
538          q31_t * pInlineBuffer);
539  
540  
541    /**
542     * @brief Instance structure for the Q15 DCT4/IDCT4 function.
543     */
544    typedef struct
545    {
546            uint16_t N;                          /**< length of the DCT4. */
547            uint16_t Nby2;                       /**< half of the length of the DCT4. */
548            q15_t normalize;                     /**< normalizing factor. */
549      const q15_t *pTwiddle;                     /**< points to the twiddle factor table. */
550      const q15_t *pCosFactor;                   /**< points to the cosFactor table. */
551            arm_rfft_instance_q15 *pRfft;        /**< points to the real FFT instance. */
552            arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */
553    } arm_dct4_instance_q15;
554  
555  
556    /**
557     * @brief  Initialization function for the Q15 DCT4/IDCT4.
558     * @param[in,out] S          points to an instance of Q15 DCT4/IDCT4 structure.
559     * @param[in]     S_RFFT     points to an instance of Q15 RFFT/RIFFT structure.
560     * @param[in]     S_CFFT     points to an instance of Q15 CFFT/CIFFT structure.
561     * @param[in]     N          length of the DCT4.
562     * @param[in]     Nby2       half of the length of the DCT4.
563     * @param[in]     normalize  normalizing factor.
564     * @return      arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.
565     */
566    arm_status arm_dct4_init_q15(
567          arm_dct4_instance_q15 * S,
568          arm_rfft_instance_q15 * S_RFFT,
569          arm_cfft_radix4_instance_q15 * S_CFFT,
570          uint16_t N,
571          uint16_t Nby2,
572          q15_t normalize);
573  
574  
575    /**
576     * @brief Processing function for the Q15 DCT4/IDCT4.
577     * @param[in]     S              points to an instance of the Q15 DCT4 structure.
578     * @param[in]     pState         points to state buffer.
579     * @param[in,out] pInlineBuffer  points to the in-place input and output buffer.
580     */
581    void arm_dct4_q15(
582    const arm_dct4_instance_q15 * S,
583          q15_t * pState,
584          q15_t * pInlineBuffer);
585  
586    /**
587     * @brief Instance structure for the Floating-point MFCC function.
588     */
589  typedef struct
590    {
591       const float32_t *dctCoefs; /**< Internal DCT coefficients */
592       const float32_t *filterCoefs; /**< Internal Mel filter coefficients */ 
593       const float32_t *windowCoefs; /**< Windowing coefficients */ 
594       const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ 
595       const uint32_t *filterLengths; /**< Internal Mel filter  lengths */ 
596       uint32_t fftLen; /**< FFT length */
597       uint32_t nbMelFilters; /**< Number of Mel filters */
598       uint32_t nbDctOutputs; /**< Number of DCT outputs */
599  #if defined(ARM_MFCC_CFFT_BASED)
600       /* Implementation of the MFCC is using a CFFT */
601       arm_cfft_instance_f32 cfft; /**< Internal CFFT instance */
602  #else
603       /* Implementation of the MFCC is using a RFFT (default) */
604       arm_rfft_fast_instance_f32 rfft;
605  #endif
606    } arm_mfcc_instance_f32 ;
607  
608  arm_status arm_mfcc_init_f32(
609    arm_mfcc_instance_f32 * S,
610    uint32_t fftLen,
611    uint32_t nbMelFilters,
612    uint32_t nbDctOutputs,
613    const float32_t *dctCoefs,
614    const uint32_t *filterPos,
615    const uint32_t *filterLengths,
616    const float32_t *filterCoefs,
617    const float32_t *windowCoefs
618    );
619  
620  
621  /**
622    @brief         MFCC F32
623    @param[in]    S       points to the mfcc instance structure
624    @param[in]     pSrc points to the input samples
625    @param[out]     pDst  points to the output MFCC values
626    @param[inout]     pTmp  points to a temporary buffer of complex
627    @return        none
628   */
629    void arm_mfcc_f32(
630    const arm_mfcc_instance_f32 * S,
631    float32_t *pSrc,
632    float32_t *pDst,
633    float32_t *pTmp
634    );
635  
636  typedef struct
637    {
638       const q31_t *dctCoefs; /**< Internal DCT coefficients */
639       const q31_t *filterCoefs; /**< Internal Mel filter coefficients */ 
640       const q31_t *windowCoefs; /**< Windowing coefficients */ 
641       const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ 
642       const uint32_t *filterLengths; /**< Internal Mel filter  lengths */ 
643       uint32_t fftLen; /**< FFT length */
644       uint32_t nbMelFilters; /**< Number of Mel filters */
645       uint32_t nbDctOutputs; /**< Number of DCT outputs */
646  #if defined(ARM_MFCC_CFFT_BASED)
647       /* Implementation of the MFCC is using a CFFT */
648       arm_cfft_instance_q31 cfft; /**< Internal CFFT instance */
649  #else
650       /* Implementation of the MFCC is using a RFFT (default) */
651       arm_rfft_instance_q31 rfft;
652  #endif
653    } arm_mfcc_instance_q31 ;
654  
655  arm_status arm_mfcc_init_q31(
656    arm_mfcc_instance_q31 * S,
657    uint32_t fftLen,
658    uint32_t nbMelFilters,
659    uint32_t nbDctOutputs,
660    const q31_t *dctCoefs,
661    const uint32_t *filterPos,
662    const uint32_t *filterLengths,
663    const q31_t *filterCoefs,
664    const q31_t *windowCoefs
665    );
666  
667  
668  /**
669    @brief         MFCC Q31
670    @param[in]    S       points to the mfcc instance structure
671    @param[in]     pSrc points to the input samples
672    @param[out]     pDst  points to the output MFCC values
673    @param[inout]     pTmp  points to a temporary buffer of complex
674    @return        none
675   */
676    arm_status arm_mfcc_q31(
677    const arm_mfcc_instance_q31 * S,
678    q31_t *pSrc,
679    q31_t *pDst,
680    q31_t *pTmp
681    );
682  
683  typedef struct
684    {
685       const q15_t *dctCoefs; /**< Internal DCT coefficients */
686       const q15_t *filterCoefs; /**< Internal Mel filter coefficients */ 
687       const q15_t *windowCoefs; /**< Windowing coefficients */ 
688       const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ 
689       const uint32_t *filterLengths; /**< Internal Mel filter  lengths */ 
690       uint32_t fftLen; /**< FFT length */
691       uint32_t nbMelFilters; /**< Number of Mel filters */
692       uint32_t nbDctOutputs; /**< Number of DCT outputs */
693  #if defined(ARM_MFCC_CFFT_BASED)
694       /* Implementation of the MFCC is using a CFFT */
695       arm_cfft_instance_q15 cfft; /**< Internal CFFT instance */
696  #else
697       /* Implementation of the MFCC is using a RFFT (default) */
698       arm_rfft_instance_q15 rfft;
699  #endif
700    } arm_mfcc_instance_q15 ;
701  
702  arm_status arm_mfcc_init_q15(
703    arm_mfcc_instance_q15 * S,
704    uint32_t fftLen,
705    uint32_t nbMelFilters,
706    uint32_t nbDctOutputs,
707    const q15_t *dctCoefs,
708    const uint32_t *filterPos,
709    const uint32_t *filterLengths,
710    const q15_t *filterCoefs,
711    const q15_t *windowCoefs
712    );
713  
714  
715  /**
716    @brief         MFCC Q15
717    @param[in]    S       points to the mfcc instance structure
718    @param[in]     pSrc points to the input samples
719    @param[out]     pDst  points to the output MFCC values in q8.7 format
720    @param[inout]     pTmp  points to a temporary buffer of complex
721    @return        error status
722   */
723    arm_status arm_mfcc_q15(
724    const arm_mfcc_instance_q15 * S,
725    q15_t *pSrc,
726    q15_t *pDst,
727    q31_t *pTmp
728    );
729  
730  
731  #ifdef   __cplusplus
732  }
733  #endif
734  
735  #endif /* ifndef _TRANSFORM_FUNCTIONS_H_ */