/**
\page ChangeLog_pg  Revision History of CMSIS-DSP

<table class="cmtable" summary="Revision History">
  <tr>
    <th>Version</th>
    <th>Description</th>
  </tr>
  <tr>
    <td>V1.10.0</td>
    <td>
      Float promotion issues:
      - Removed remaining issues of implicit float promotion (mainly in f16 code)

      Scalar versions of arm_vlog_q31 and arm_vlog_q15

      Synchronous Data Flow (scripts in github repository)

      Python wrapper available on official Python repository

      MFCC F32, F16, Q31 and Q15

      Typecasting functions for converting between f16 and s16 in scalar.

      More f64 functions

      arm_cmplx_mag_fast_q15:
      The original arm_cmplx_mag_q15 is now more accurate but slower.

      Added arm_mat_mult_opt_q31 for a faster version of arm_mat_mult_q31
      when using Helium (but requiring more storage for intermediate results).

      arm_(min|max)_no_idx_(q7|q15|q31|f16|f32|f64)
      
      arm_abs(min|max)_no_idx_(q7|q15|q31|f16|f32|f64)

      arm_mse_(q7|q15|q31|f16|f32|f64)

      Trigonometric functions:
      - atan2 in f32, f16, q31 and q15.
    </td>
  </tr>
  <tr>
    <td>V1.9.0</td>
    <td>
      Re-organization of arm_math.h

      Re-organization of interpolation functions:
      - New Interpolation folder

      New q7 functions:
      - arm_mat_mult_q7.c
      - arm_mat_trans_q7.c

      Matrix x vector multiply

      Complex Matrix Transpose

      Cholesky (LL^t and LDL^t decompositions)

      More support for f16 datatype:
      - arm_cfft_f16.c
      - arm_rfft_fast_f16.c
      - f16 basic Maths
      - f16 complex Maths
      - f16 filtering (FIR and BiQuad and correlate)
      - f16 matrix
      - f16 interpolation
      - f16 statistics
      - f16 support functions
      - f16 svm
      - f16 distances
      - f16 bayes

      Support for Quaternions

      Levinson Durbin algorithm

      Q15 scalar division

      New absmax and absmin functions

      GCC issues:
      Some functions have build issues when building Helium code with gcc. So
      they are replaced with a less efficient scalar version when built with gcc.
      - Scalar version of arm_mat_cmplx_mult_f16.c
      - Scalar version of arm_biquad_cascade_stereo_df2T_f16.c
      - Scalar version of arm_levinson_durbin_f32.c
      - Scalar version of arm_levinson_durbin_f16.c
      - Scalar version of arm_levinson_durbin_q31.c
      - Scalar version of arm_float_to_f16.c
      - Scalar version of arm_f16_to_float.c

      Important:
      - Initialization of FIRs has changed for the Helium version (state and coefs).
        Read the corresponding documentations.
      - Initialization of float biquad DF1 has changed for the Helium
        version (two init functions are required).
        Read the corresponding documentations.
      - The states of the vectorized filters are different from their scalar
        versions (which may break some algorithms which are working on the
        state of a filter like Goertzel)
      - For performance reasons, some vectorized algorithms may read one vector
        after the end of buffer (but the data read is not used).
        If the buffer is close to the end of a memory zone, it is advised
        to leave some free memory area between the end of the buffer and the end
        of the memory zone.

    </td>
  </tr>
  <tr>
    <td>V1.8.0</td>
    <td> 
      Helium implementation of lots of functions in the CMSIS-DSP.
      More will be added in future releases.
      - ARM_MATH_HELIUM, ARM_MATH_MVEF or ARM_MATH_MVEI must be defined.

      New folder SVMFunctions : Support vector machines.
      - Training must be done with scikit-learn. 
      - DSP/Examples/ARM/arm_svm_example is showing how to train with scikit-learn
      and dump the result for use with CMSIS-DSP

      New folder BayesFunctions : Functions related to Bayesian probability.
      In this version only a naive gaussian classifier.
      - Training must be done with scikit-learn. 
      - DSP/Examples/ARM/arm_bayes_example is showing how to train with scikit-learn
      and dump the result for use with CMSIS-DSP
      
      New folder DistanceFunctions: 
      - Distance functions for clustering algorithms.

      For the new functions in SVMFunctions, BayesFunctions and DistanceFunctions,
      <a href="https://developer.arm.com/solutions/machine-learning-on-arm/developer-material/how-to-guides/implement-classical-ml-with-arm-cmsis-dsp-libraries">a tutorial is available</a>.

      New BasicMathFunctions:
      - Elementwise bit operations.

      New support functions:
      - arm_barycenter_f32 and arm_weighted_sum_f32.
      - Sorting functions.
      - Spline interpolation.

      New statistics functions:
      - arm_entropy_f32, arm_kullback_leibler_f32, arm_logsumexp_f32
        and arm_logsumexp_dot_prod_f32

      New testing framework:
      - Developed for our internal needs. We have released it but won't give
        support for the first few releases since it is a work in progress.

      Improvements to the cmake build:
      - It is more easy to switch toolchains. CMAKE_PREFIX_PATH can be used.

    </td>
  </tr>
  <tr>
    <td>V1.7.0</td>
    <td>
      New Neon implementations of f32 functions
       - Can be enabled with macros ARM_MATH_NEON and ARM_MATH_NEON_EXPERIMENTAL
       
      Python wrapper compatible with Numpy
       - DSP/PythonWrapper/README.md is explaining how to build the wrapper

      Preliminary cmake build
       - DSP/README.md is explaining how to use it.
         This first version is restricted to AC6 toolchain and
         assume (hard coded path) that ArmDS is used.
         Future versions will make it easier to switch toolchains.

      Modified arm_math.h
       - Removed dependance on cores. It is no more testing for some
         specific cores but is now using features like ARM_MATH_LOOPUNROLL
         (see comments in arm_math.h)
       - Deprecated __SIMD32 and introduced new functions for
         SIMD accesses.

      Added compilation flags for FFT:
       - It is now possible to include only the tables required for FFTs.
         It is explained in DSP/README.md since it is simpler to use
         it from the cmake (which is defining the right macros). But
         the macros can also be defined without cmake.
 
    </td>
  </tr>
  <tr>
    <td>V1.6.0</td>
    <td>
      Reworked DSP library source files
       - added macro ARM_MATH_LOOPUNROLL
       - removed macro UNALIGNED_SUPPORT_DISABLE
       - added const-correctness
       - replaced SIMD pointer construct with memcopy solution
       - replaced macro combination "CMSIS_INLINE __STATIC_INLINE with "__STATIC_FORCEINLINE"

      Reworked DSP library documentation

      Changed DSP folder structure
       - moved DSP libraries to ./DSP/Lib
       
      ARM DSP Libraries are built with ARMCLANG
      
      Added DSP Libraries source variant
    </td>
  </tr>
  <tr>
    <td>V1.5.4</td>
    <td>
      Updated IAR projects

      Note: binaries NOT rebuild!
    </td>
  </tr>
  <tr>
    <td>V1.5.3</td>
    <td>
      Note: binaries NOT rebuild!

      Merged PullRequests
       - #439, #430, #369, #265, #166

      Modified arm_math.h
       - reworked macros ARM_MATH_CMx
       - removed macros __FPU_USED, __DSP_PRESENT
       - used different include files

      Modified source files (because of new arm_math.h)
       - FilteringFunctions\arm_biquad_cascade_df2T_f32.c
       - FilteringFunctions\arm_biquad_cascade_df2T_f64.c
       - FilteringFunctions\arm_biquad_cascade_stereo_df2T_f32.c
       - FilteringFunctions\arm_conv_partial_q15.c
       - FilteringFunctions\arm_correlate_q15.c
       - FilteringFunctions\arm_fir_f32.c
       - MatrixFunctions\arm_mat_scale_q31.c
       - StatisticsFunctions\arm_rms_q31.c
       - TransformFunctions\arm_bitreversal2.S
       - TransformFunctions\arm_cfft_radix4_q31.c
      Reworked DSP_Lib_TestSuite
    </td>
  </tr>
  <tr>
    <td>V1.5.2</td>
    <td>
      Modified arm_math.h
       - fixed GNU Compiler specific diagnostics.
       - moved __SSAT and __USAT to CMSIS-Core
    </td>
  </tr>
  <tr>
    <td>V1.5.1</td>
    <td>
      Changed copyright note.
      
      Added ARMv8M DSP libraries.
    </td>
  </tr>
  <tr>
    <td>V1.5.0</td>
    <td>
      Modified arm_math.h
      - removed macro TABLE_SIZE.
      - changed preprocessor conditions to select functions instead of SIMD instruction for Cortex-M3.
      
      Modified arm_const_structs.c
      - Added structure instances for the RFFT functions (equivalent to CFFT structures).
    </td>
  </tr>
  <tr>
    <td>V1.4.10 (no source code change [still labeled 1.4.5])</td>
    <td>
      Modified arm_sin_cos_f32.c
      - corrected \ref arm_sin_cos_f32() for negative numbers smaller than e-4f.
      
      Modified arm_var_f32.c
      - improved  numerical stability for \ref arm_var_f32().
    </td>
  </tr>
  <tr>
    <td>V1.4.9 (no source code change [still labeled 1.4.5]) 2016/09/26</td>
    <td>
      Modified arm_mat_mult_fast_q15.c, arm_mat_mult_fast_q31.c
      - performance optimizations for \ref arm_mat_mult_fast_q15() and \ref arm_mat_mult_fast_q31().
      
      Modified arm_conv_partial_q15.c
      - corrected \ref arm_conv_partial_q15() for Cortex-M7 based cores.
      
      Modified arm_conv_q15.c
      - corrected \ref arm_conv_q15() for Cortex-M7 based cores.
      
      Modified arm_correlate_q15.c
      - corrected \ref arm_correlate_q15() for Cortex-M7 based cores.
    </td>
  </tr>
  <tr>
    <td>V1.4.8 (no source code change [still labeled 1.4.5]) 2015/12/18</td>
    <td>
      Modified arm_math.h, arm_bitreversal2.S
      - corrected arm_sin_f32() for very small negative input values.
      
      Modified arm_sin_f32.c
      - Updated Texas Instruments Arm Compiler support.
      
      Updated documentation
      - function \ref arm_rfft_fast_f32.
    </td>
  </tr>
  <tr>
    <td>V1.4.7 (no source code change [still labeled 1.4.5]) 2015/10/20</td>
    <td>
      Modified arm_math.h
      - Added explicit type casts to remove compiler warnings.
      - Supressed irrelevant warnings for toolchain GCC.
      
      Updated documentation
      - functions \ref arm_cos_f32, \ref arm_sin_f32 use table lookup combined with linear interpolation (since V1.4.2). This is now documented.
    </td>
  </tr>
  <tr>
    <td>V1.4.6 (no source code change [still labeled 1.4.5]) 2015/08/26</td>
    <td>
      Modified arm_math.h
      - Updated function \ref arm_sqrt_f32 for use with IAR.
    </td>
  </tr>
  <tr>
    <td>V1.4.5 2015/03/19</td>
    <td>
      Added support for the Cortex-M7 processor
    
      Fixed bug in arm_mat_inverse_f32.c and arm_mat_inverse_f64.c.
      They weren't properly handling diagonal matrices.
    
      arm_cfft_f32.c - help documentation updated
    
      Updated documentation to show deprecated functions
    </td>
  </tr>
  <tr>
    <td>V1.4.4 2014/07/31</td>
    <td>
      Added the following new files:
      - arm_biquad_cascade_stereo_df2T_f32.c
      - arm_biquad_cascade_stereo_df2T_init_f32.c
      - arm_biquad_cascade_df2T_f64.c
      - arm_biquad_cascade_df2T_init_f64.c
      - arm_mat_inverse_f64.c
      - arm_cfft_q15.c
      - arm_cfft_q31.c
      
      Optimizations to the following files:
      - arm_biquad_cascade_df2T_f32.c
      - arm_fir_f32.c
      - arm_fir_fast_q31.c
      - arm_fir_q7.c
      - arm_cfft_f32.c
      - arm_cfft_radix4_q31.c
      - arm_cfft_radix4_q15.c
      - arm_rfft_q31.c
      - arm_rfft_q15.c
    </td>
  </tr>
  <tr>
    <td>V1.4.3 2014/03/12</td>
    <td>
      Undid changes to arm_biquad_cascade_df1_q31.c
    
      Added support for COSMIC
    
      Changed 'short' to 'q15_t' where appropriate
    
      Fixed arm_conv_partial_fast_q15.c for UNALIGNED_SUPPORT_DISABLE
    
      Fixed arm_mat_cmplx_mult_q15.c for UNALIGNED_SUPPORT_DISABLE
    
      Fixed arm_conv_partial_opt_q7.c for UNALIGNED_SUPPORT_DISABLE
    
      Restored the internal fftlen of 16 to arm_rfft_fast_init_f32.c
    
      Updated core_xxx.h files to newer versions from ARM
    </td>
  </tr>
  <tr>
    <td>V1.4.2 2013/10/16</td>
    <td>
      Moved const structures from arm_const_structs.h to arm_const_structs.c
    
      Rfft_fast_f32 no longer allows fft length of 16 as it wouldn't have worked anyways
    
      Partial convolution was producing the wrong results in some cases
    
      arm_lms_q31 and q15 now saturate the results in the M0 code to match the M3 &amp; M4 code
    
      Rfft_q15 and q31 had potential overflow issues resolved
    
      arm_biquad_cascade_df1_q31.c had a typo which resulted in incorrect outputs
    
      fast math sine and cosine now use linear interpolation
    
      controller sin/cos now uses a more accurate interpolation algorithm
    
      arm_mat_inverse was reading outside its input array
    
      arm_cmplx_dot_prod was incorrect
    
      switched some incorrect usages of __ssat to clip_q63_to_q31
    
      changed var &amp; std q31 to downshift input data by 8
    
      var q31 &amp; q15 no longer output larger data types
    
      arm_mat_cmplx_mult_q15.c was done incorrectly for big vs little endian
    
      arm_mat_mult_q31.c was inconsistent with the other multiplies, so added saturation
    
      arm_conv_partial_q15 had an incorrect comparison between signed &amp; unsigned values
    </td>
  </tr>
  <tr>
    <td>V1.4.1 2013/02/20</td>
    <td>
      Updated licenses in headers to 2013
    
      Fixed ALIGN4 macro in arm_math.h
    
      Added files to Cortex-M0 projects so that all projects have same file list
    
      Fixed bugs in
        - arm_biquad_cascade_d2fT_f32.c
        - arm_cfft_radix2_q31
        - arm_cfft_radix2_f32
        - arm_math.h (arm_pid functions)
        - arm_iir_lattice_q31.c
    </td>
  </tr>
  <tr>
    <td>V1.4.0 2013/01/09</td>
    <td>
      Updated with more optimizations, bug fixes and new license information in headers
    
      Optimized functions:
        - arm_biquad_cascade_df2T_f32
        - arm_biquad_cascade_df1_q31
        - arm_fir_f32
        - arm_fir_fast_q31
        - arm_cfft_f32
        - arm_cfft_radix2_q31
        - arm_rfft_fast_f32 (new function)
    
      Fixed compiler warnings in arm_math.h for comparing signed and unsigned ints
    
      Fixed a saturation bug in arm_rms_q15
    
      Simplified the code in arm_sin_cos_q31
    
      Added a preprocessor directive to treat the Cortex M0+ just like the Cortex M0
    
      The following functions were deprecated and will be removed in a future version
        - arm_cfft_radix2_f32
        - arm_cfft_radix2_init_f32
        - arm_cfft_radix4_f32
        - arm_cfft_radix4_init_f32
    </td>
  </tr>
  <tr>
    <td>V1.3.0</td>
    <td>
      Added CMSIS DSP Software Library
    
      The CMSIS DSP Software Library is a suite of common signal processing functions targeted to Cortex-M processor based microcontrollers.
      Even though the code has been specifically optimized towards using the extended DSP instruction set of the Cortex-M4 processor,
      the library can be compiled for any Cortex-M processor.
    
      For more information please see CMSIS DSP Library documentation.
      Added Cortex-M4 Core Support
    
      Additional folder CM4, containing the Cortex-M4 core support files, has been added.
          CM0
          CM3
          CM4
              CoreSupport
              DeviceSupport
    
      New naming for Core Support Files
    
      The new Core Support Files are:
          - core_cm#.h (# = 0, 3, 4)
          - core_cmFunc.h (Cortex-M Core Register access functions)
          - core_cmInstr.h (Cortex-M Core instructions)
          - core_cm4_simd.h (Cortex-M4 SIMD instructions)
    </td>
  </tr>
  <tr>
    <td>V1.2.0</td>
    <td>
      Removed CMSIS Middelware packages
    
      CMSIS Middleware is on hold from ARM side until a agreement between all CMSIS partners is found.
      SystemFrequency renamed to SystemCoreClock
    
      The variable name SystemCoreClock is more precise than SystemFrequency because the variable holds the clock value at which the core is running.
      Changed startup concept
    
      The old startup concept (calling SystemInit_ExtMemCtl from startup file and calling SystemInit from main)
      has the weakness that it does not work for controllers which need a already configuerd clock system to configure
      the external memory controller.
    
      Changed startup concept
        - SystemInit() is called from startup file before premain.
        - SystemInit() configures the clock system and also configures an existing external memory controller.
        - SystemInit() must not use global variables.
        - SystemCoreClock is initialized with a correct predefined value.
        - Additional function void SystemCoreClockUpdate (void) is provided.
        - SystemCoreClockUpdate() updates the variable SystemCoreClock and must be called whenever the core clock is changed.
        - SystemCoreClockUpdate() evaluates the clock register settings and calculates the current core clock.
    
      Advanced Debug Functions
    
      ITM communication channel is only capable for OUT direction.
      To allow also communication for IN direction a simple concept is provided.
        - Global variable volatile int ITM_RxBuffer used for IN data.
        - Function int ITM_CheckChar (void) checks if a new character is available.
        - Function int ITM_ReceiveChar (void) retrieves the new character.
    
      For detailed explanation see file CMSIS debug support.htm.
    
      Core Register Bit Definitions
    
      Files core_cm3.h and core_cm0.h contain now bit definitions for Core Registers. The name for the defines
      correspond with the Cortex-M Technical Reference Manual.
    
      e.g. SysTick structure with bit definitions
    
      \code
        /** @addtogroup CMSIS_CM3_SysTick CMSIS CM3 SysTick
          memory mapped structure for SysTick
          @{
        */
        typedef struct
        {
          __IO uint32_t CTRL;                         /*!&lt; Offset: 0x00  SysTick Control and Status Register */
          __IO uint32_t LOAD;                         /*!&lt; Offset: 0x04  SysTick Reload Value Register       */
          __IO uint32_t VAL;                          /*!&lt; Offset: 0x08  SysTick Current Value Register      */
          __I  uint32_t CALIB;                        /*!&lt; Offset: 0x0C  SysTick Calibration Register        */
        } SysTick_Type;
      
        /* SysTick Control / Status Register Definitions */
        #define SysTick_CTRL_COUNTFLAG_Pos     16                                      /*!&lt; SysTick CTRL: COUNTFLAG Position */
        #define SysTick_CTRL_COUNTFLAG_Msk    (1ul &lt;&lt; SysTick_CTRL_COUNTFLAG_Pos)      /*!&lt; SysTick CTRL: COUNTFLAG Mask */
      
        #define SysTick_CTRL_CLKSOURCE_Pos      2                                      /*!&lt; SysTick CTRL: CLKSOURCE Position */
        #define SysTick_CTRL_CLKSOURCE_Msk     (1ul &lt;&lt; SysTick_CTRL_CLKSOURCE_Pos)     /*!&lt; SysTick CTRL: CLKSOURCE Mask */
      
        #define SysTick_CTRL_TICKINT_Pos        1                                      /*!&lt; SysTick CTRL: TICKINT Position */
        #define SysTick_CTRL_TICKINT_Msk       (1ul &lt;&lt; SysTick_CTRL_TICKINT_Pos)       /*!&lt; SysTick CTRL: TICKINT Mask */
      
        #define SysTick_CTRL_ENABLE_Pos         0                                      /*!&lt; SysTick CTRL: ENABLE Position */
        #define SysTick_CTRL_ENABLE_Msk        (1ul &lt;&lt; SysTick_CTRL_ENABLE_Pos)        /*!&lt; SysTick CTRL: ENABLE Mask */
      
        /* SysTick Reload Register Definitions */
        #define SysTick_LOAD_RELOAD_Pos         0                                      /*!&lt; SysTick LOAD: RELOAD Position */
        #define SysTick_LOAD_RELOAD_Msk        (0xFFFFFFul &lt;&lt; SysTick_LOAD_RELOAD_Pos) /*!&lt; SysTick LOAD: RELOAD Mask */
      
        /* SysTick Current Register Definitions */
        #define SysTick_VAL_CURRENT_Pos         0                                      /*!&lt; SysTick VAL: CURRENT Position */
        #define SysTick_VAL_CURRENT_Msk        (0xFFFFFFul &lt;&lt; SysTick_VAL_CURRENT_Pos) /*!&lt; SysTick VAL: CURRENT Mask */
      
        /* SysTick Calibration Register Definitions */
        #define SysTick_CALIB_NOREF_Pos        31                                      /*!&lt; SysTick CALIB: NOREF Position */
        #define SysTick_CALIB_NOREF_Msk       (1ul &lt;&lt; SysTick_CALIB_NOREF_Pos)         /*!&lt; SysTick CALIB: NOREF Mask */
      
        #define SysTick_CALIB_SKEW_Pos         30                                      /*!&lt; SysTick CALIB: SKEW Position */
        #define SysTick_CALIB_SKEW_Msk        (1ul &lt;&lt; SysTick_CALIB_SKEW_Pos)          /*!&lt; SysTick CALIB: SKEW Mask */
      
        #define SysTick_CALIB_TENMS_Pos         0                                      /*!&lt; SysTick CALIB: TENMS Position */
        #define SysTick_CALIB_TENMS_Msk        (0xFFFFFFul &lt;&lt; SysTick_VAL_CURRENT_Pos) /*!&lt; SysTick CALIB: TENMS Mask */
        /*@}*/ /* end of group CMSIS_CM3_SysTick */
      \endcode
    
      DoxyGen Tags
    
      DoxyGen tags in files core_cm3.[c,h] and core_cm0.[c,h] are reworked to create proper documentation using DoxyGen.
      Folder Structure
    
      The folder structure is changed to differentiate the single support packages.
    
          CM0
          CM3
              CoreSupport
              DeviceSupport
                  Vendor
                      Device
                          Startup
                              Toolchain
                              Toolchain
                              ...
                      Device
                      ...
                  Vendor
                  ...
              Example (optional)
                  Toolchain
                      Device
                      Device
                      ...
                  Toolchain
                  ...
          Documentation
    </td>
  </tr>
  <tr>
    <td>V1.1.0 2012/02/15</td>
    <td>
      Updated with more optimizations, bug fixes and minor API changes.
    </td>
  </tr>
  <tr>
    <td>V1.0.11 2011/10/18</td>
    <td>
      Bug Fix in conv, correlation, partial convolution.
    </td>
  </tr>
  <tr>
    <td>V1.0.10 2011/7/15</td>
    <td>
      Big Endian support added and Merged M0 and M3/M4 Source code.
    </td>
  </tr>
  <tr>
    <td>V1.0.3 2010/11/29</td>
    <td>
      Re-organized the CMSIS folders and updated documentation.
    </td>
  </tr>
  <tr>
    <td>V1.0.2 2010/11/11</td>
    <td>
      Documentation updated.
    </td>
  </tr>
  <tr>
    <td>V1.0.1 2010/10/05</td>
    <td>
      Production release and review comments incorporated.
    </td>
  </tr>
  <tr>
    <td>V1.0.0 2010/09/20</td>
    <td>
      Production release and review comments incorporated.
    </td>
  </tr>
  <tr>
    <td>V0.0.9  2010/08/27</td>
    <td>
      Added files:
          - arm_biquad_cascade_df1_fast_q15.c
          - arm_biquad_cascade_df1_fast_q31.c
          - arm_fir_fast_q31.c
          - arm_fir_fast_q15.c
    </td>
  </tr>
  <tr>
    <td>V0.0.7  2010/06/10</td>
    <td>
      Misra-C changes done
    </td>
  </tr>
  <tr>
    <td>V0.0.5  2010/04/26</td>
    <td>
      incorporated review comments and updated with latest CMSIS layer
    </td>
  </tr>
  <tr>
    <td>V0.0.3  2010/03/10 DP</td>
    <td>
      Initial version
    </td>
  </tr>
</table>

*/
