From 968a53648d04fa932f5f7fbc7dc5c9c738f78bc9 Mon Sep 17 00:00:00 2001 From: NeoZng Date: Tue, 27 Jun 2023 22:28:46 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86DSP1.14=E7=9A=84?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 5 +- .../ST/ARM/DSP/Include/arm_common_tables.h | 539 ++++ .../ARM/DSP/Include/arm_common_tables_f16.h | 132 + .../ST/ARM/DSP/Include/arm_const_structs.h | 86 + .../ARM/DSP/Include/arm_const_structs_f16.h | 77 + .../ST/ARM/DSP/Include/arm_helium_utils.h | 753 +++++ Middlewares/ST/ARM/DSP/Include/arm_math.h | 237 ++ Middlewares/ST/ARM/DSP/Include/arm_math_f16.h | 59 + .../ST/ARM/DSP/Include/arm_math_memory.h | 206 ++ .../ST/ARM/DSP/Include/arm_math_types.h | 616 ++++ .../ST/ARM/DSP/Include/arm_math_types_f16.h | 163 ++ .../ST/ARM/DSP/Include/arm_mve_tables.h | 231 ++ .../ST/ARM/DSP/Include/arm_mve_tables_f16.h | 109 + Middlewares/ST/ARM/DSP/Include/arm_vec_math.h | 373 +++ .../ST/ARM/DSP/Include/arm_vec_math_f16.h | 312 ++ .../DSP/Include/dsp/basic_math_functions.h | 880 ++++++ .../Include/dsp/basic_math_functions_f16.h | 167 ++ .../ST/ARM/DSP/Include/dsp/bayes_functions.h | 89 + .../ARM/DSP/Include/dsp/bayes_functions_f16.h | 80 + .../DSP/Include/dsp/complex_math_functions.h | 345 +++ .../Include/dsp/complex_math_functions_f16.h | 123 + .../DSP/Include/dsp/controller_functions.h | 793 ++++++ .../Include/dsp/controller_functions_f16.h | 41 + Middlewares/ST/ARM/DSP/Include/dsp/debug.h | 146 + .../ARM/DSP/Include/dsp/distance_functions.h | 387 +++ .../DSP/Include/dsp/distance_functions_f16.h | 180 ++ .../ARM/DSP/Include/dsp/fast_math_functions.h | 383 +++ .../DSP/Include/dsp/fast_math_functions_f16.h | 125 + .../ARM/DSP/Include/dsp/filtering_functions.h | 2529 +++++++++++++++++ .../DSP/Include/dsp/filtering_functions_f16.h | 237 ++ .../DSP/Include/dsp/interpolation_functions.h | 275 ++ .../Include/dsp/interpolation_functions_f16.h | 107 + .../ST/ARM/DSP/Include/dsp/matrix_functions.h | 856 ++++++ .../DSP/Include/dsp/matrix_functions_f16.h | 263 ++ .../ST/ARM/DSP/Include/dsp/matrix_utils.h | 640 +++++ Middlewares/ST/ARM/DSP/Include/dsp/none.h | 576 ++++ .../Include/dsp/quaternion_math_functions.h | 159 ++ .../DSP/Include/dsp/statistics_functions.h | 1003 +++++++ .../Include/dsp/statistics_functions_f16.h | 279 ++ .../ARM/DSP/Include/dsp/support_functions.h | 540 ++++ .../DSP/Include/dsp/support_functions_f16.h | 202 ++ .../ST/ARM/DSP/Include/dsp/svm_defines.h | 46 + .../ST/ARM/DSP/Include/dsp/svm_functions.h | 299 ++ .../ARM/DSP/Include/dsp/svm_functions_f16.h | 281 ++ .../ARM/DSP/Include/dsp/transform_functions.h | 735 +++++ .../DSP/Include/dsp/transform_functions_f16.h | 208 ++ Middlewares/ST/ARM/DSP/Include/dsp/utils.h | 257 ++ .../ST/ARM/DSP/Include/dsp/window_functions.h | 812 ++++++ Middlewares/ST/ARM/DSP/Lib/libCMSISDSP.a | Bin 0 -> 1145806 bytes bsp/bsp_init.c | 1 - 50 files changed, 17939 insertions(+), 3 deletions(-) create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_common_tables.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_common_tables_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_const_structs.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_const_structs_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_helium_utils.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_math.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_math_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_math_memory.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_math_types.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_math_types_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_mve_tables.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_mve_tables_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_vec_math.h create mode 100644 Middlewares/ST/ARM/DSP/Include/arm_vec_math_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/basic_math_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/basic_math_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/bayes_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/bayes_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/complex_math_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/complex_math_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/controller_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/controller_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/debug.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/distance_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/distance_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/fast_math_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/fast_math_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/filtering_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/filtering_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/interpolation_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/interpolation_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/matrix_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/matrix_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/matrix_utils.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/none.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/quaternion_math_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/statistics_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/statistics_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/support_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/support_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/svm_defines.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/svm_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/svm_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/transform_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/transform_functions_f16.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/utils.h create mode 100644 Middlewares/ST/ARM/DSP/Include/dsp/window_functions.h create mode 100644 Middlewares/ST/ARM/DSP/Lib/libCMSISDSP.a diff --git a/Makefile b/Makefile index 96a72d2..327e6c7 100644 --- a/Makefile +++ b/Makefile @@ -227,7 +227,8 @@ C_INCLUDES = \ -IMiddlewares/ST/STM32_USB_Device_Library/Class/CDC/Inc \ -IDrivers/CMSIS/Device/ST/STM32F4xx/Include \ -IDrivers/CMSIS/Include \ --IMiddlewares/ST/ARM/DSP/Inc \ +-IMiddlewares/ST/ARM/DSP/Include/dsp \ +-IMiddlewares/ST/ARM/DSP/Include \ -IMiddlewares/Third_Party/SEGGER/RTT \ -IMiddlewares/Third_Party/SEGGER/Config \ -Iapplication/chassis \ @@ -292,7 +293,7 @@ LDSCRIPT = STM32F407IGHx_FLASH.ld # libraries LIBS = -lc -lm -lnosys \ --l:libarm_cortexM4lf_math.a +-l:libCMSISDSP.a LIBDIR = \ -LMiddlewares/ST/ARM/DSP/Lib LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections diff --git a/Middlewares/ST/ARM/DSP/Include/arm_common_tables.h b/Middlewares/ST/ARM/DSP/Include/arm_common_tables.h new file mode 100644 index 0000000..3e72c80 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_common_tables.h @@ -0,0 +1,539 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_common_tables.h + * Description: Extern declaration for common tables + * + * @version V1.10.0 + * @date 08 July 2021 + * + * Target Processor: Cortex-M and Cortex-A cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_COMMON_TABLES_H +#define _ARM_COMMON_TABLES_H + +#include "arm_math_types.h" +#include "dsp/fast_math_functions.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + /* Double Precision Float CFFT twiddles */ + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREV_1024) + extern const uint16_t armBitRevTable[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_16) + extern const uint64_t twiddleCoefF64_16[32]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_32) + extern const uint64_t twiddleCoefF64_32[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_64) + extern const uint64_t twiddleCoefF64_64[128]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_128) + extern const uint64_t twiddleCoefF64_128[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_256) + extern const uint64_t twiddleCoefF64_256[512]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_512) + extern const uint64_t twiddleCoefF64_512[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_1024) + extern const uint64_t twiddleCoefF64_1024[2048]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_2048) + extern const uint64_t twiddleCoefF64_2048[4096]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_4096) + extern const uint64_t twiddleCoefF64_4096[8192]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_16) + extern const float32_t twiddleCoef_16[32]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_32) + extern const float32_t twiddleCoef_32[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_64) + extern const float32_t twiddleCoef_64[128]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_128) + extern const float32_t twiddleCoef_128[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_256) + extern const float32_t twiddleCoef_256[512]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_512) + extern const float32_t twiddleCoef_512[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_1024) + extern const float32_t twiddleCoef_1024[2048]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048) + extern const float32_t twiddleCoef_2048[4096]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096) + extern const float32_t twiddleCoef_4096[8192]; + #define twiddleCoef twiddleCoef_4096 + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + /* Q31 */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_16) + extern const q31_t twiddleCoef_16_q31[24]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_32) + extern const q31_t twiddleCoef_32_q31[48]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_64) + extern const q31_t twiddleCoef_64_q31[96]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_128) + extern const q31_t twiddleCoef_128_q31[192]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_256) + extern const q31_t twiddleCoef_256_q31[384]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_512) + extern const q31_t twiddleCoef_512_q31[768]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) + extern const q31_t twiddleCoef_1024_q31[1536]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) + extern const q31_t twiddleCoef_2048_q31[3072]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) + extern const q31_t twiddleCoef_4096_q31[6144]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_16) + extern const q15_t twiddleCoef_16_q15[24]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_32) + extern const q15_t twiddleCoef_32_q15[48]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_64) + extern const q15_t twiddleCoef_64_q15[96]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_128) + extern const q15_t twiddleCoef_128_q15[192]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_256) + extern const q15_t twiddleCoef_256_q15[384]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_512) + extern const q15_t twiddleCoef_512_q15[768]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) + extern const q15_t twiddleCoef_1024_q15[1536]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) + extern const q15_t twiddleCoef_2048_q15[3072]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) + extern const q15_t twiddleCoef_4096_q15[6144]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + /* Double Precision Float RFFT twiddles */ + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_32) + extern const uint64_t twiddleCoefF64_rfft_32[32]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_64) + extern const uint64_t twiddleCoefF64_rfft_64[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_128) + extern const uint64_t twiddleCoefF64_rfft_128[128]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_256) + extern const uint64_t twiddleCoefF64_rfft_256[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_512) + extern const uint64_t twiddleCoefF64_rfft_512[512]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_1024) + extern const uint64_t twiddleCoefF64_rfft_1024[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_2048) + extern const uint64_t twiddleCoefF64_rfft_2048[2048]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_4096) + extern const uint64_t twiddleCoefF64_rfft_4096[4096]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32) + extern const float32_t twiddleCoef_rfft_32[32]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64) + extern const float32_t twiddleCoef_rfft_64[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128) + extern const float32_t twiddleCoef_rfft_128[128]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256) + extern const float32_t twiddleCoef_rfft_256[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512) + extern const float32_t twiddleCoef_rfft_512[512]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024) + extern const float32_t twiddleCoef_rfft_1024[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048) + extern const float32_t twiddleCoef_rfft_2048[2048]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096) + extern const float32_t twiddleCoef_rfft_4096[4096]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + + /* Double precision floating-point bit reversal tables */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_16) + #define ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH ((uint16_t)12) + extern const uint16_t armBitRevIndexTableF64_16[ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_32) + #define ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH ((uint16_t)24) + extern const uint16_t armBitRevIndexTableF64_32[ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_64) + #define ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH ((uint16_t)56) + extern const uint16_t armBitRevIndexTableF64_64[ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_128) + #define ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH ((uint16_t)112) + extern const uint16_t armBitRevIndexTableF64_128[ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_256) + #define ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH ((uint16_t)240) + extern const uint16_t armBitRevIndexTableF64_256[ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_512) + #define ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH ((uint16_t)480) + extern const uint16_t armBitRevIndexTableF64_512[ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_1024) + #define ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH ((uint16_t)992) + extern const uint16_t armBitRevIndexTableF64_1024[ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_2048) + #define ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH ((uint16_t)1984) + extern const uint16_t armBitRevIndexTableF64_2048[ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_4096) + #define ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH ((uint16_t)4032) + extern const uint16_t armBitRevIndexTableF64_4096[ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + /* floating-point bit reversal tables */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_16) + #define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20) + extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_32) + #define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48) + extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_64) + #define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56) + extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_128) + #define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208) + extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_256) + #define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440) + extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_512) + #define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448) + extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_1024) + #define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800) + extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_2048) + #define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808) + extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_4096) + #define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032) + extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + + /* fixed-point bit reversal tables */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_16) + #define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12) + extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_32) + #define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24) + extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_64) + #define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56) + extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_128) + #define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112) + extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_256) + #define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240) + extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_512) + #define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480) + extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_1024) + #define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992) + extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_2048) + #define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) + extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_4096) + #define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) + extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_F32) + extern const float32_t realCoefA[8192]; + extern const float32_t realCoefB[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q31) + extern const q31_t realCoefAQ31[8192]; + extern const q31_t realCoefBQ31[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q15) + extern const q15_t realCoefAQ15[8192]; + extern const q15_t realCoefBQ15[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_128) + extern const float32_t Weights_128[256]; + extern const float32_t cos_factors_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_512) + extern const float32_t Weights_512[1024]; + extern const float32_t cos_factors_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_2048) + extern const float32_t Weights_2048[4096]; + extern const float32_t cos_factors_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_8192) + extern const float32_t Weights_8192[16384]; + extern const float32_t cos_factors_8192[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_128) + extern const q15_t WeightsQ15_128[256]; + extern const q15_t cos_factorsQ15_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_512) + extern const q15_t WeightsQ15_512[1024]; + extern const q15_t cos_factorsQ15_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_2048) + extern const q15_t WeightsQ15_2048[4096]; + extern const q15_t cos_factorsQ15_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_8192) + extern const q15_t WeightsQ15_8192[16384]; + extern const q15_t cos_factorsQ15_8192[8192]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_128) + extern const q31_t WeightsQ31_128[256]; + extern const q31_t cos_factorsQ31_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_512) + extern const q31_t WeightsQ31_512[1024]; + extern const q31_t cos_factorsQ31_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_2048) + extern const q31_t WeightsQ31_2048[4096]; + extern const q31_t cos_factorsQ31_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_8192) + extern const q31_t WeightsQ31_8192[16384]; + extern const q31_t cos_factorsQ31_8192[8192]; + #endif + +#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_TABLES) */ + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_ALLOW_TABLES) + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q15) + extern const q15_t armRecipTableQ15[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q31) + extern const q31_t armRecipTableQ31[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + /* Tables for Fast Math Sine and Cosine */ + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_F32) + extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q31) + extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q15) + extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + + /* Fast vector sqrt */ + #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q31_MVE) + extern const q31_t sqrtTable_Q31[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + #endif + + /* Accurate scalar sqrt */ + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SQRT_Q31) + extern const q31_t sqrt_initial_lut_q31[32]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SQRT_Q15) + extern const q15_t sqrt_initial_lut_q15[16]; + #endif + + #if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q15_MVE) + extern const q15_t sqrtTable_Q15[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ + #endif + +#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_TABLES) */ + +#if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) + extern const float32_t exp_tab[8]; + extern const float32_t __logf_lut_f32[8]; +#endif /* (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) */ + +#if (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) +extern const unsigned char hwLUT[256]; +#endif /* (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) */ + +#ifdef __cplusplus +} +#endif + +#endif /* ARM_COMMON_TABLES_H */ + diff --git a/Middlewares/ST/ARM/DSP/Include/arm_common_tables_f16.h b/Middlewares/ST/ARM/DSP/Include/arm_common_tables_f16.h new file mode 100644 index 0000000..f9a63fe --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_common_tables_f16.h @@ -0,0 +1,132 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_common_tables_f16.h + * Description: Extern declaration for common tables + * + * @version V1.10.0 + * @date 08 July 2021 + * + * Target Processor: Cortex-M and Cortex-A cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_COMMON_TABLES_F16_H +#define _ARM_COMMON_TABLES_F16_H + +#include "arm_math_types_f16.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + + /* F16 */ + #if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED) + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_16) + extern const float16_t twiddleCoefF16_16[32]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_32) + extern const float16_t twiddleCoefF16_32[64]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_64) + extern const float16_t twiddleCoefF16_64[128]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_128) + extern const float16_t twiddleCoefF16_128[256]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_256) + extern const float16_t twiddleCoefF16_256[512]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_512) + extern const float16_t twiddleCoefF16_512[1024]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_1024) + extern const float16_t twiddleCoefF16_1024[2048]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_2048) + extern const float16_t twiddleCoefF16_2048[4096]; + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_4096) + extern const float16_t twiddleCoefF16_4096[8192]; + #define twiddleCoefF16 twiddleCoefF16_4096 + #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ + + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_32) + extern const float16_t twiddleCoefF16_rfft_32[32]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_64) + extern const float16_t twiddleCoefF16_rfft_64[64]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_128) + extern const float16_t twiddleCoefF16_rfft_128[128]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_256) + extern const float16_t twiddleCoefF16_rfft_256[256]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_512) + extern const float16_t twiddleCoefF16_rfft_512[512]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_1024) + extern const float16_t twiddleCoefF16_rfft_1024[1024]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_2048) + extern const float16_t twiddleCoefF16_rfft_2048[2048]; + #endif + + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F16_4096) + extern const float16_t twiddleCoefF16_rfft_4096[4096]; + #endif + + #endif /* ARMAC5 */ + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */ + +#if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED) + +#if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) + extern const float16_t exp_tab_f16[8]; + extern const float16_t __logf_lut_f16[8]; +#endif /* (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) */ +#endif + + +#ifdef __cplusplus +} +#endif + +#endif /* _ARM_COMMON_TABLES_F16_H */ + + diff --git a/Middlewares/ST/ARM/DSP/Include/arm_const_structs.h b/Middlewares/ST/ARM/DSP/Include/arm_const_structs.h new file mode 100644 index 0000000..59026db --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_const_structs.h @@ -0,0 +1,86 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_const_structs.h + * Description: Constant structs that are initialized for user convenience. + * For example, some can be given as arguments to the arm_cfft_f32() function. + * + * @version V1.10.0 + * @date 08 July 2021 + * + * Target Processor: Cortex-M and Cortex-A cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_CONST_STRUCTS_H +#define _ARM_CONST_STRUCTS_H + +#include "arm_math_types.h" +#include "arm_common_tables.h" +#include "dsp/transform_functions.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len16; + extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len32; + extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len64; + extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len128; + extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len256; + extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len512; + extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len1024; + extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len2048; + extern const arm_cfft_instance_f64 arm_cfft_sR_f64_len4096; + + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048; + extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096; + + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048; + extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096; + + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048; + extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096; + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Middlewares/ST/ARM/DSP/Include/arm_const_structs_f16.h b/Middlewares/ST/ARM/DSP/Include/arm_const_structs_f16.h new file mode 100644 index 0000000..0984d74 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_const_structs_f16.h @@ -0,0 +1,77 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_const_structs_f16.h + * Description: Constant structs that are initialized for user convenience. + * For example, some can be given as arguments to the arm_cfft_f16() function. + * + * @version V1.10.0 + * @date 08 July 2021 + * + * Target Processor: Cortex-M and Cortex-A cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_CONST_STRUCTS_F16_H +#define _ARM_CONST_STRUCTS_F16_H + +#include "arm_math_types_f16.h" +#include "arm_common_tables.h" +#include "arm_common_tables_f16.h" +#include "dsp/transform_functions_f16.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined(__CC_ARM) && defined(ARM_FLOAT16_SUPPORTED) + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_16) && defined(ARM_TABLE_BITREVIDX_FLT_16)) + extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len16; + #endif + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_32) && defined(ARM_TABLE_BITREVIDX_FLT_32)) + extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len32; + #endif + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_64) && defined(ARM_TABLE_BITREVIDX_FLT_64)) + extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len64; + #endif + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_128) && defined(ARM_TABLE_BITREVIDX_FLT_128)) + extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len128; + #endif + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_256) && defined(ARM_TABLE_BITREVIDX_FLT_256)) + extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len256; + #endif + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_512) && defined(ARM_TABLE_BITREVIDX_FLT_512)) + extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len512; + #endif + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_1024) && defined(ARM_TABLE_BITREVIDX_FLT_1024)) + extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len1024; + #endif + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_2048) && defined(ARM_TABLE_BITREVIDX_FLT_2048)) + extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len2048; + #endif + #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || (defined(ARM_TABLE_TWIDDLECOEF_F16_4096) && defined(ARM_TABLE_BITREVIDX_FLT_4096)) + extern const arm_cfft_instance_f16 arm_cfft_sR_f16_len4096; + #endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Middlewares/ST/ARM/DSP/Include/arm_helium_utils.h b/Middlewares/ST/ARM/DSP/Include/arm_helium_utils.h new file mode 100644 index 0000000..ae9037c --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_helium_utils.h @@ -0,0 +1,753 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_helium_utils.h + * Description: Utility functions for Helium development + * + * @version V1.10.0 + * @date 08 July 2021 + * + * Target Processor: Cortex-M and Cortex-A cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_UTILS_HELIUM_H_ +#define _ARM_UTILS_HELIUM_H_ + + +#ifdef __cplusplus +extern "C" +{ +#endif +/*************************************** + +Definitions available for MVEF and MVEI + +***************************************/ +#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE) + +#define INACTIVELANE 0 /* inactive lane content */ + + +#endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI) */ + +/*************************************** + +Definitions available for MVEF only + +***************************************/ +#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF)) && !defined(ARM_MATH_AUTOVECTORIZE) + +__STATIC_FORCEINLINE float32_t vecAddAcrossF32Mve(float32x4_t in) +{ + float32_t acc; + + acc = vgetq_lane(in, 0) + vgetq_lane(in, 1) + + vgetq_lane(in, 2) + vgetq_lane(in, 3); + + return acc; +} + + + + +/* newton initial guess */ +#define INVSQRT_MAGIC_F32 0x5f3759df +#define INV_NEWTON_INIT_F32 0x7EF127EA + + +#define INVSQRT_NEWTON_MVE_F32(invSqrt, xHalf, xStart)\ +{ \ + float32x4_t tmp; \ + \ + /* tmp = xhalf * x * x */ \ + tmp = vmulq(xStart, xStart); \ + tmp = vmulq(tmp, xHalf); \ + /* (1.5f - xhalf * x * x) */ \ + tmp = vsubq(vdupq_n_f32(1.5f), tmp); \ + /* x = x*(1.5f-xhalf*x*x); */ \ + invSqrt = vmulq(tmp, xStart); \ +} +#endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) */ + + +/*************************************** + +Definitions available for f16 datatype with HW acceleration only + +***************************************/ +#if defined(ARM_FLOAT16_SUPPORTED) +#if defined (ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) + +__STATIC_FORCEINLINE float16_t vecAddAcrossF16Mve(float16x8_t in) +{ + float16x8_t tmpVec; + _Float16 acc; + + tmpVec = (float16x8_t) vrev32q_s16((int16x8_t) in); + in = vaddq_f16(tmpVec, in); + tmpVec = (float16x8_t) vrev64q_s32((int32x4_t) in); + in = vaddq_f16(tmpVec, in); + acc = (_Float16)vgetq_lane_f16(in, 0) + (_Float16)vgetq_lane_f16(in, 4); + + return acc; +} + +__STATIC_FORCEINLINE float16x8_t __mve_cmplx_sum_intra_vec_f16( + float16x8_t vecIn) +{ + float16x8_t vecTmp, vecOut; + uint32_t tmp; + + vecTmp = (float16x8_t) vrev64q_s32((int32x4_t) vecIn); + // TO TRACK : using canonical addition leads to unefficient code generation for f16 + // vecTmp = vecTmp + vecAccCpx0; + /* + * Compute + * re0+re1 | im0+im1 | re0+re1 | im0+im1 + * re2+re3 | im2+im3 | re2+re3 | im2+im3 + */ + vecTmp = vaddq_f16(vecTmp, vecIn); + vecOut = vecTmp; + /* + * shift left, random tmp insertion in bottom + */ + vecOut = vreinterpretq_f16_s32(vshlcq_s32(vreinterpretq_s32_f16(vecOut) , &tmp, 32)); + /* + * Compute: + * DONTCARE | DONTCARE | re0+re1+re0+re1 |im0+im1+im0+im1 + * re0+re1+re2+re3 | im0+im1+im2+im3 | re2+re3+re2+re3 |im2+im3+im2+im3 + */ + vecOut = vaddq_f16(vecOut, vecTmp); + /* + * Cmplx sum is in 4rd & 5th f16 elt + * return full vector + */ + return vecOut; +} + + +#define mve_cmplx_sum_intra_r_i_f16(vec, Re, Im) \ +{ \ + float16x8_t vecOut = __mve_cmplx_sum_intra_vec_f16(vec); \ + Re = vgetq_lane(vecOut, 4); \ + Im = vgetq_lane(vecOut, 5); \ +} + +__STATIC_FORCEINLINE void mve_cmplx_sum_intra_vec_f16( + float16x8_t vecIn, + float16_t *pOut) +{ + float16x8_t vecOut = __mve_cmplx_sum_intra_vec_f16(vecIn); + /* + * Cmplx sum is in 4rd & 5th f16 elt + * use 32-bit extraction + */ + *(float32_t *) pOut = ((float32x4_t) vecOut)[2]; +} + + +#define INVSQRT_MAGIC_F16 0x59ba /* ( 0x1ba = 0x3759df >> 13) */ + +/* canonical version of INVSQRT_NEWTON_MVE_F16 leads to bad performance */ +#define INVSQRT_NEWTON_MVE_F16(invSqrt, xHalf, xStart) \ +{ \ + float16x8_t tmp; \ + \ + /* tmp = xhalf * x * x */ \ + tmp = vmulq(xStart, xStart); \ + tmp = vmulq(tmp, xHalf); \ + /* (1.5f - xhalf * x * x) */ \ + tmp = vsubq(vdupq_n_f16((float16_t)1.5), tmp); \ + /* x = x*(1.5f-xhalf*x*x); */ \ + invSqrt = vmulq(tmp, xStart); \ +} + +#endif +#endif + +/*************************************** + +Definitions available for MVEI and MVEF only + +***************************************/ +#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE) +/* Following functions are used to transpose matrix in f32 and q31 cases */ +__STATIC_INLINE arm_status arm_mat_trans_32bit_2x2_mve( + uint32_t * pDataSrc, + uint32_t * pDataDest) +{ + static const uint32x4_t vecOffs = { 0, 2, 1, 3 }; + /* + * + * | 0 1 | => | 0 2 | + * | 2 3 | | 1 3 | + * + */ + uint32x4_t vecIn = vldrwq_u32((uint32_t const *)pDataSrc); + vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs, vecIn); + + return (ARM_MATH_SUCCESS); +} + +__STATIC_INLINE arm_status arm_mat_trans_32bit_3x3_mve( + uint32_t * pDataSrc, + uint32_t * pDataDest) +{ + const uint32x4_t vecOffs1 = { 0, 3, 6, 1}; + const uint32x4_t vecOffs2 = { 4, 7, 2, 5}; + /* + * + * | 0 1 2 | | 0 3 6 | 4 x 32 flattened version | 0 3 6 1 | + * | 3 4 5 | => | 1 4 7 | => | 4 7 2 5 | + * | 6 7 8 | | 2 5 8 | (row major) | 8 . . . | + * + */ + uint32x4_t vecIn1 = vldrwq_u32((uint32_t const *) pDataSrc); + uint32x4_t vecIn2 = vldrwq_u32((uint32_t const *) &pDataSrc[4]); + + vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs1, vecIn1); + vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs2, vecIn2); + + pDataDest[8] = pDataSrc[8]; + + return (ARM_MATH_SUCCESS); +} + +__STATIC_INLINE arm_status arm_mat_trans_32bit_4x4_mve(uint32_t * pDataSrc, uint32_t * pDataDest) +{ + /* + * 4x4 Matrix transposition + * is 4 x de-interleave operation + * + * 0 1 2 3 0 4 8 12 + * 4 5 6 7 1 5 9 13 + * 8 9 10 11 2 6 10 14 + * 12 13 14 15 3 7 11 15 + */ + + uint32x4x4_t vecIn; + + vecIn = vld4q((uint32_t const *) pDataSrc); + vstrwq(pDataDest, vecIn.val[0]); + pDataDest += 4; + vstrwq(pDataDest, vecIn.val[1]); + pDataDest += 4; + vstrwq(pDataDest, vecIn.val[2]); + pDataDest += 4; + vstrwq(pDataDest, vecIn.val[3]); + + return (ARM_MATH_SUCCESS); +} + + +__STATIC_INLINE arm_status arm_mat_trans_32bit_generic_mve( + uint16_t srcRows, + uint16_t srcCols, + uint32_t * pDataSrc, + uint32_t * pDataDest) +{ + uint32x4_t vecOffs; + uint32_t i; + uint32_t blkCnt; + uint32_t const *pDataC; + uint32_t *pDataDestR; + uint32x4_t vecIn; + + vecOffs = vidupq_u32((uint32_t)0, 1); + vecOffs = vecOffs * srcCols; + + i = srcCols; + do + { + pDataC = (uint32_t const *) pDataSrc; + pDataDestR = pDataDest; + + blkCnt = srcRows >> 2; + while (blkCnt > 0U) + { + vecIn = vldrwq_gather_shifted_offset_u32(pDataC, vecOffs); + vstrwq(pDataDestR, vecIn); + pDataDestR += 4; + pDataC = pDataC + srcCols * 4; + /* + * Decrement the blockSize loop counter + */ + blkCnt--; + } + + /* + * tail + */ + blkCnt = srcRows & 3; + if (blkCnt > 0U) + { + mve_pred16_t p0 = vctp32q(blkCnt); + vecIn = vldrwq_gather_shifted_offset_u32(pDataC, vecOffs); + vstrwq_p(pDataDestR, vecIn, p0); + } + + pDataSrc += 1; + pDataDest += srcRows; + } + while (--i); + + return (ARM_MATH_SUCCESS); +} + +__STATIC_INLINE arm_status arm_mat_cmplx_trans_32bit( + uint16_t srcRows, + uint16_t srcCols, + uint32_t *pDataSrc, + uint16_t dstRows, + uint16_t dstCols, + uint32_t *pDataDest) +{ + uint32_t i; + uint32_t const *pDataC; + uint32_t *pDataRow; + uint32_t *pDataDestR, *pDataDestRow; + uint32x4_t vecOffsRef, vecOffsCur; + uint32_t blkCnt; + uint32x4_t vecIn; + +#ifdef ARM_MATH_MATRIX_CHECK + /* + * Check for matrix mismatch condition + */ + if ((srcRows != dstCols) || (srcCols != dstRows)) + { + /* + * Set status as ARM_MATH_SIZE_MISMATCH + */ + return ARM_MATH_SIZE_MISMATCH; + } +#else + (void)dstRows; + (void)dstCols; +#endif + + /* 2x2, 3x3 and 4x4 specialization to be added */ + + vecOffsRef[0] = 0; + vecOffsRef[1] = 1; + vecOffsRef[2] = srcCols << 1; + vecOffsRef[3] = (srcCols << 1) + 1; + + pDataRow = pDataSrc; + pDataDestRow = pDataDest; + i = srcCols; + do + { + pDataC = (uint32_t const *) pDataRow; + pDataDestR = pDataDestRow; + vecOffsCur = vecOffsRef; + + blkCnt = (srcRows * CMPLX_DIM) >> 2; + while (blkCnt > 0U) + { + vecIn = vldrwq_gather_shifted_offset(pDataC, vecOffsCur); + vstrwq(pDataDestR, vecIn); + pDataDestR += 4; + vecOffsCur = vaddq(vecOffsCur, (srcCols << 2)); + /* + * Decrement the blockSize loop counter + */ + blkCnt--; + } + /* + * tail + * (will be merged thru tail predication) + */ + blkCnt = (srcRows * CMPLX_DIM) & 3; + if (blkCnt > 0U) + { + mve_pred16_t p0 = vctp32q(blkCnt); + vecIn = vldrwq_gather_shifted_offset(pDataC, vecOffsCur); + vstrwq_p(pDataDestR, vecIn, p0); + } + + pDataRow += CMPLX_DIM; + pDataDestRow += (srcRows * CMPLX_DIM); + } + while (--i); + + return (ARM_MATH_SUCCESS); +} + +__STATIC_INLINE arm_status arm_mat_trans_16bit_2x2(uint16_t * pDataSrc, uint16_t * pDataDest) +{ + pDataDest[0] = pDataSrc[0]; + pDataDest[3] = pDataSrc[3]; + pDataDest[2] = pDataSrc[1]; + pDataDest[1] = pDataSrc[2]; + + return (ARM_MATH_SUCCESS); +} + +__STATIC_INLINE arm_status arm_mat_trans_16bit_3x3_mve(uint16_t * pDataSrc, uint16_t * pDataDest) +{ + static const uint16_t stridesTr33[8] = { 0, 3, 6, 1, 4, 7, 2, 5 }; + uint16x8_t vecOffs1; + uint16x8_t vecIn1; + /* + * + * | 0 1 2 | | 0 3 6 | 8 x 16 flattened version | 0 3 6 1 4 7 2 5 | + * | 3 4 5 | => | 1 4 7 | => | 8 . . . . . . . | + * | 6 7 8 | | 2 5 8 | (row major) + * + */ + vecOffs1 = vldrhq_u16((uint16_t const *) stridesTr33); + vecIn1 = vldrhq_u16((uint16_t const *) pDataSrc); + + vstrhq_scatter_shifted_offset_u16(pDataDest, vecOffs1, vecIn1); + + pDataDest[8] = pDataSrc[8]; + + return (ARM_MATH_SUCCESS); +} + + +__STATIC_INLINE arm_status arm_mat_trans_16bit_4x4_mve(uint16_t * pDataSrc, uint16_t * pDataDest) +{ + static const uint16_t stridesTr44_1[8] = { 0, 4, 8, 12, 1, 5, 9, 13 }; + static const uint16_t stridesTr44_2[8] = { 2, 6, 10, 14, 3, 7, 11, 15 }; + uint16x8_t vecOffs1, vecOffs2; + uint16x8_t vecIn1, vecIn2; + uint16_t const * pDataSrcVec = (uint16_t const *) pDataSrc; + + /* + * 4x4 Matrix transposition + * + * | 0 1 2 3 | | 0 4 8 12 | 8 x 16 flattened version + * | 4 5 6 7 | => | 1 5 9 13 | => [0 4 8 12 1 5 9 13] + * | 8 9 10 11 | | 2 6 10 14 | [2 6 10 14 3 7 11 15] + * | 12 13 14 15 | | 3 7 11 15 | + */ + + vecOffs1 = vldrhq_u16((uint16_t const *) stridesTr44_1); + vecOffs2 = vldrhq_u16((uint16_t const *) stridesTr44_2); + vecIn1 = vldrhq_u16(pDataSrcVec); + pDataSrcVec += 8; + vecIn2 = vldrhq_u16(pDataSrcVec); + + vstrhq_scatter_shifted_offset_u16(pDataDest, vecOffs1, vecIn1); + vstrhq_scatter_shifted_offset_u16(pDataDest, vecOffs2, vecIn2); + + + return (ARM_MATH_SUCCESS); +} + + + +__STATIC_INLINE arm_status arm_mat_trans_16bit_generic( + uint16_t srcRows, + uint16_t srcCols, + uint16_t * pDataSrc, + uint16_t * pDataDest) +{ + uint16x8_t vecOffs; + uint32_t i; + uint32_t blkCnt; + uint16_t const *pDataC; + uint16_t *pDataDestR; + uint16x8_t vecIn; + + vecOffs = vidupq_u16((uint32_t)0, 1); + vecOffs = vecOffs * srcCols; + + i = srcCols; + while(i > 0U) + { + pDataC = (uint16_t const *) pDataSrc; + pDataDestR = pDataDest; + + blkCnt = srcRows >> 3; + while (blkCnt > 0U) + { + vecIn = vldrhq_gather_shifted_offset_u16(pDataC, vecOffs); + vstrhq_u16(pDataDestR, vecIn); + pDataDestR += 8; + pDataC = pDataC + srcCols * 8; + /* + * Decrement the blockSize loop counter + */ + blkCnt--; + } + + /* + * tail + */ + blkCnt = srcRows & 7; + if (blkCnt > 0U) + { + mve_pred16_t p0 = vctp16q(blkCnt); + vecIn = vldrhq_gather_shifted_offset_u16(pDataC, vecOffs); + vstrhq_p_u16(pDataDestR, vecIn, p0); + } + pDataSrc += 1; + pDataDest += srcRows; + i--; + } + + return (ARM_MATH_SUCCESS); +} + + +__STATIC_INLINE arm_status arm_mat_cmplx_trans_16bit( + uint16_t srcRows, + uint16_t srcCols, + uint16_t *pDataSrc, + uint16_t dstRows, + uint16_t dstCols, + uint16_t *pDataDest) +{ + static const uint16_t loadCmplxCol[8] = { 0, 0, 1, 1, 2, 2, 3, 3 }; + int i; + uint16x8_t vecOffsRef, vecOffsCur; + uint16_t const *pDataC; + uint16_t *pDataRow; + uint16_t *pDataDestR, *pDataDestRow; + uint32_t blkCnt; + uint16x8_t vecIn; + +#ifdef ARM_MATH_MATRIX_CHECK + /* + * Check for matrix mismatch condition + */ + if ((srcRows != dstCols) || (srcCols != dstRows)) + { + /* + * Set status as ARM_MATH_SIZE_MISMATCH + */ + return ARM_MATH_SIZE_MISMATCH; + } +#else + (void)dstRows; + (void)dstCols; +#endif + + /* + * 2x2, 3x3 and 4x4 specialization to be added + */ + + + /* + * build [0, 1, 2xcol, 2xcol+1, 4xcol, 4xcol+1, 6xcol, 6xcol+1] + */ + vecOffsRef = vldrhq_u16((uint16_t const *) loadCmplxCol); + vecOffsRef = vmulq(vecOffsRef, (uint16_t) (srcCols * CMPLX_DIM)) + + viwdupq_u16((uint32_t)0, (uint16_t) 2, 1); + + pDataRow = pDataSrc; + pDataDestRow = pDataDest; + i = srcCols; + do + { + pDataC = (uint16_t const *) pDataRow; + pDataDestR = pDataDestRow; + vecOffsCur = vecOffsRef; + + blkCnt = (srcRows * CMPLX_DIM) >> 3; + while (blkCnt > 0U) + { + vecIn = vldrhq_gather_shifted_offset(pDataC, vecOffsCur); + vstrhq(pDataDestR, vecIn); + pDataDestR+= 8; // VEC_LANES_U16 + vecOffsCur = vaddq(vecOffsCur, (srcCols << 3)); + /* + * Decrement the blockSize loop counter + */ + blkCnt--; + } + /* + * tail + * (will be merged thru tail predication) + */ + blkCnt = (srcRows * CMPLX_DIM) & 0x7; + if (blkCnt > 0U) + { + mve_pred16_t p0 = vctp16q(blkCnt); + vecIn = vldrhq_gather_shifted_offset(pDataC, vecOffsCur); + vstrhq_p(pDataDestR, vecIn, p0); + } + + pDataRow += CMPLX_DIM; + pDataDestRow += (srcRows * CMPLX_DIM); + } + while (--i); + + return (ARM_MATH_SUCCESS); +} +#endif /* MVEF and MVEI */ + +/*************************************** + +Definitions available for MVEI only + +***************************************/ +#if (defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEI)) && !defined(ARM_MATH_AUTOVECTORIZE) + +#include "arm_common_tables.h" + +#define MVE_ASRL_SAT16(acc, shift) ((sqrshrl_sat48(acc, -(32-shift)) >> 32) & 0xffffffff) +#define MVE_ASRL_SAT32(acc, shift) ((sqrshrl(acc, -(32-shift)) >> 32) & 0xffffffff) + + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q31_MVE) +__STATIC_INLINE q31x4_t FAST_VSQRT_Q31(q31x4_t vecIn) +{ + q63x2_t vecTmpLL; + q31x4_t vecTmp0, vecTmp1; + q31_t scale; + q63_t tmp64; + q31x4_t vecNrm, vecDst, vecIdx, vecSignBits; + + + vecSignBits = vclsq(vecIn); + vecSignBits = vbicq_n_s32(vecSignBits, 1); + /* + * in = in << no_of_sign_bits; + */ + vecNrm = vshlq(vecIn, vecSignBits); + /* + * index = in >> 24; + */ + vecIdx = vecNrm >> 24; + vecIdx = vecIdx << 1; + + vecTmp0 = vldrwq_gather_shifted_offset_s32(sqrtTable_Q31, (uint32x4_t)vecIdx); + + vecIdx = vecIdx + 1; + + vecTmp1 = vldrwq_gather_shifted_offset_s32(sqrtTable_Q31, (uint32x4_t)vecIdx); + + vecTmp1 = vqrdmulhq(vecTmp1, vecNrm); + vecTmp0 = vecTmp0 - vecTmp1; + vecTmp1 = vqrdmulhq(vecTmp0, vecTmp0); + vecTmp1 = vqrdmulhq(vecNrm, vecTmp1); + vecTmp1 = vdupq_n_s32(0x18000000) - vecTmp1; + vecTmp0 = vqrdmulhq(vecTmp0, vecTmp1); + vecTmpLL = vmullbq_int(vecNrm, vecTmp0); + + /* + * scale elements 0, 2 + */ + scale = 26 + (vecSignBits[0] >> 1); + tmp64 = asrl(vecTmpLL[0], scale); + vecDst[0] = (q31_t) tmp64; + + scale = 26 + (vecSignBits[2] >> 1); + tmp64 = asrl(vecTmpLL[1], scale); + vecDst[2] = (q31_t) tmp64; + + vecTmpLL = vmulltq_int(vecNrm, vecTmp0); + + /* + * scale elements 1, 3 + */ + scale = 26 + (vecSignBits[1] >> 1); + tmp64 = asrl(vecTmpLL[0], scale); + vecDst[1] = (q31_t) tmp64; + + scale = 26 + (vecSignBits[3] >> 1); + tmp64 = asrl(vecTmpLL[1], scale); + vecDst[3] = (q31_t) tmp64; + /* + * set negative values to 0 + */ + vecDst = vdupq_m(vecDst, 0, vcmpltq_n_s32(vecIn, 0)); + + return vecDst; +} +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q15_MVE) +__STATIC_INLINE q15x8_t FAST_VSQRT_Q15(q15x8_t vecIn) +{ + q31x4_t vecTmpLev, vecTmpLodd, vecSignL; + q15x8_t vecTmp0, vecTmp1; + q15x8_t vecNrm, vecDst, vecIdx, vecSignBits; + + vecDst = vuninitializedq_s16(); + + vecSignBits = vclsq(vecIn); + vecSignBits = vbicq_n_s16(vecSignBits, 1); + /* + * in = in << no_of_sign_bits; + */ + vecNrm = vshlq(vecIn, vecSignBits); + + vecIdx = vecNrm >> 8; + vecIdx = vecIdx << 1; + + vecTmp0 = vldrhq_gather_shifted_offset_s16(sqrtTable_Q15, (uint16x8_t)vecIdx); + + vecIdx = vecIdx + 1; + + vecTmp1 = vldrhq_gather_shifted_offset_s16(sqrtTable_Q15, (uint16x8_t)vecIdx); + + vecTmp1 = vqrdmulhq(vecTmp1, vecNrm); + vecTmp0 = vecTmp0 - vecTmp1; + vecTmp1 = vqrdmulhq(vecTmp0, vecTmp0); + vecTmp1 = vqrdmulhq(vecNrm, vecTmp1); + vecTmp1 = vdupq_n_s16(0x1800) - vecTmp1; + vecTmp0 = vqrdmulhq(vecTmp0, vecTmp1); + + vecSignBits = vecSignBits >> 1; + + vecTmpLev = vmullbq_int(vecNrm, vecTmp0); + vecTmpLodd = vmulltq_int(vecNrm, vecTmp0); + + vecTmp0 = vecSignBits + 10; + /* + * negate sign to apply register based vshl + */ + vecTmp0 = -vecTmp0; + + /* + * shift even elements + */ + vecSignL = vmovlbq(vecTmp0); + vecTmpLev = vshlq(vecTmpLev, vecSignL); + /* + * shift odd elements + */ + vecSignL = vmovltq(vecTmp0); + vecTmpLodd = vshlq(vecTmpLodd, vecSignL); + /* + * merge and narrow odd and even parts + */ + vecDst = vmovnbq_s32(vecDst, vecTmpLev); + vecDst = vmovntq_s32(vecDst, vecTmpLodd); + /* + * set negative values to 0 + */ + vecDst = vdupq_m(vecDst, 0, vcmpltq_n_s16(vecIn, 0)); + + return vecDst; +} +#endif + +#endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEI) */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Middlewares/ST/ARM/DSP/Include/arm_math.h b/Middlewares/ST/ARM/DSP/Include/arm_math.h new file mode 100644 index 0000000..59462c2 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_math.h @@ -0,0 +1,237 @@ +/****************************************************************************** + * @file arm_math.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + \mainpage CMSIS DSP Software Library + * + * \section intro Introduction + * + * This user manual describes the CMSIS DSP software library, + * a suite of common compute processing functions for use on Cortex-M and Cortex-A processor + * based devices. + * + * The library is divided into a number of functions each covering a specific category: + * - \ref groupMath "Basic math functions" + * - \ref groupFastMath "Fast math functions" + * - \ref groupCmplxMath "Complex math functions" + * - \ref groupFilters "Filtering functions" + * - \ref groupMatrix "Matrix functions" + * - \ref groupTransforms "Transform functions" + * - \ref groupController "Motor control functions" + * - \ref groupStats "Statistical functions" + * - \ref groupSupport "Support functions" + * - \ref groupInterpolation "Interpolation functions" + * - \ref groupSVM "Support Vector Machine functions (SVM)" + * - \ref groupBayes "Bayes classifier functions" + * - \ref groupDistance "Distance functions" + * - \ref groupQuaternionMath "Quaternion functions" + * - \ref groupWindow "Window functions" + * + * The library has generally separate functions for operating on 8-bit integers, 16-bit integers, + * 32-bit integer and 32-bit floating-point values and 64-bit floating-point values. + * + * The library is providing vectorized versions of most algorithms for Helium + * and of most f32 algorithms for Neon. + * + * When using a vectorized version, provide a little bit of padding after the end of + * a buffer (3 words) because the vectorized code may read a little bit after the end + * of a buffer. You don't have to modify your buffers but just ensure that the + * end of buffer + padding is not outside of a memory region. + * + * CMSIS-DSP pack is containing an optional project : The CMSIS-DSP + * Compute Graph. The documentation for this project is available + * on the CMSIS-DSP github repository. + * + * A Python wrapper is also available with a Python API as close as possible + * to the C one. It can be used to start developing and testing an algorithm with NumPy and + * SciPy before writing the C version. Is is available on PyPI.org. + * It can be installed with : pip install cmsisdsp + * + * + * \section using Using the Library + * + * The library is released in source form. It is strongly advised to compile the library using -Ofast to + * have the best performances. + * + * The library functions are declared in the public file `arm_math.h` which is placed in the `Include` folder. + * Simply include this file. If you don't want to include everything, you can also rely + * on headers in `Include/dsp` folder and use only what you need. + * + * \section example Examples + * + * The library ships with a number of examples which demonstrate how to use the library functions. Please refer to \ref groupExamples. + * + * \section toolchain Toolchain Support + * + * The library is now tested on Fast Models building with cmake. + * Core M0, M4, M7, M33, M55, A32 are tested. + * + * + * \section preprocessor Preprocessor Macros + * + * Each library project has different preprocessor macros. + * + * - `ARM_MATH_BIG_ENDIAN`: + * - Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. + * . + * - `ARM_MATH_MATRIX_CHECK`: + * - Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices + * . + * - `ARM_MATH_ROUNDING`: + * - Define macro ARM_MATH_ROUNDING for rounding on support functions + * . + * - `ARM_MATH_LOOPUNROLL`: + * - Define macro ARM_MATH_LOOPUNROLL to enable manual loop unrolling in DSP functions + * . + * - `ARM_MATH_NEON`: + * - Define macro ARM_MATH_NEON to enable Neon versions of the DSP functions. + * It is not enabled by default when Neon is available because performances are + * dependent on the compiler and target architecture. + * . + * - `ARM_MATH_NEON_EXPERIMENTAL`: + * - Define macro ARM_MATH_NEON_EXPERIMENTAL to enable experimental Neon versions of + * of some DSP functions. Experimental Neon versions currently do not have better + * performances than the scalar versions. + * . + * - `ARM_MATH_HELIUM`: + * - It implies the flags ARM_MATH_MVEF and ARM_MATH_MVEI and ARM_MATH_MVE_FLOAT16. + * . + * - `ARM_MATH_HELIUM_EXPERIMENTAL`: + * - Only taken into account when ARM_MATH_MVEF, ARM_MATH_MVEI or ARM_MATH_MVE_FLOAT16 are defined. + * Enable some vector versions which may have worse performance than scalar + * depending on the core / compiler configuration. + * . + * - `ARM_MATH_MVEF`: + * - Select Helium versions of the f32 algorithms. + * It implies ARM_MATH_FLOAT16 and ARM_MATH_MVEI. + * . + * - `ARM_MATH_MVEI`: + * - Select Helium versions of the int and fixed point algorithms. + * . + * - `ARM_MATH_MVE_FLOAT16`: + * - MVE Float16 implementations of some algorithms (Requires MVE extension). + * . + * - `DISABLEFLOAT16`: + * - Disable float16 algorithms when __fp16 is not supported for a + * specific compiler / core configuration. + * This is only valid for scalar. When vector architecture is + * supporting f16 then it can't be disabled. + * . + * - `ARM_MATH_AUTOVECTORIZE`: + * - With Helium or Neon, disable the use of vectorized code with C intrinsics + * and use pure C instead. The vectorization is then done by the compiler. + * + * \section pack CMSIS-DSP in ARM::CMSIS Pack + * + * The following files relevant to CMSIS-DSP are present in the ARM::CMSIS Pack directories: + * |File/Folder |Content | + * |---------------------------------|------------------------------------------------------------------------| + * |\b CMSIS\\Documentation\\DSP | This documentation | + * |\b CMSIS\\DSP\\Examples | Example projects demonstrating the usage of the library functions | + * |\b CMSIS\\DSP\\ComputeLibrary | Small Neon kernels when building on Cortex-A + * |\b CMSIS\\DSP\\Include | include files for using and building the lib + * |\b CMSIS\\DSP\\PrivateInclude | private include files for building the lib | + * |\b CMSIS\\DSP\\Source | source files | + * + * \section rev Revision History of CMSIS-DSP + * Please refer to \ref ChangeLog_pg. + * + * \section license License + * + * The CMSIS-DSP is provided free of charge under the Apache 2.0 License. + */ + + + + + + + + + + + +/** + * @defgroup groupExamples Examples + */ + + + + + +#ifndef _ARM_MATH_H +#define _ARM_MATH_H + + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/basic_math_functions.h" +#include "dsp/interpolation_functions.h" +#include "dsp/bayes_functions.h" +#include "dsp/matrix_functions.h" +#include "dsp/complex_math_functions.h" +#include "dsp/statistics_functions.h" +#include "dsp/controller_functions.h" +#include "dsp/support_functions.h" +#include "dsp/distance_functions.h" +#include "dsp/svm_functions.h" +#include "dsp/fast_math_functions.h" +#include "dsp/transform_functions.h" +#include "dsp/filtering_functions.h" +#include "dsp/quaternion_math_functions.h" +#include "dsp/window_functions.h" + + + +#ifdef __cplusplus +extern "C" +{ +#endif + + + + +//#define TABLE_SPACING_Q31 0x400000 +//#define TABLE_SPACING_Q15 0x80 + + + + + +#ifdef __cplusplus +} +#endif + + +#endif /* _ARM_MATH_H */ + +/** + * + * End of file. + */ diff --git a/Middlewares/ST/ARM/DSP/Include/arm_math_f16.h b/Middlewares/ST/ARM/DSP/Include/arm_math_f16.h new file mode 100644 index 0000000..daf0c53 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_math_f16.h @@ -0,0 +1,59 @@ +/****************************************************************************** + * @file arm_math_f16.h + * @brief Public header file for f16 function of the CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_MATH_F16_H +#define _ARM_MATH_F16_H + +#include "arm_math.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "arm_math_types_f16.h" +#include "dsp/none.h" +#include "dsp/utils.h" +#include "dsp/basic_math_functions_f16.h" +#include "dsp/interpolation_functions_f16.h" +#include "dsp/bayes_functions_f16.h" +#include "dsp/matrix_functions_f16.h" +#include "dsp/complex_math_functions_f16.h" +#include "dsp/statistics_functions_f16.h" +#include "dsp/controller_functions_f16.h" +#include "dsp/support_functions_f16.h" +#include "dsp/distance_functions_f16.h" +#include "dsp/svm_functions_f16.h" +#include "dsp/fast_math_functions_f16.h" +#include "dsp/transform_functions_f16.h" +#include "dsp/filtering_functions_f16.h" + +#ifdef __cplusplus +} +#endif + +#endif /* _ARM_MATH_F16_H */ + + diff --git a/Middlewares/ST/ARM/DSP/Include/arm_math_memory.h b/Middlewares/ST/ARM/DSP/Include/arm_math_memory.h new file mode 100644 index 0000000..7bd83dc --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_math_memory.h @@ -0,0 +1,206 @@ +/****************************************************************************** + * @file arm_math_memory.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_MATH_MEMORY_H_ + +#define _ARM_MATH_MEMORY_H_ + +#include "arm_math_types.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + @brief definition to read/write two 16 bit values. + @deprecated + */ +#if defined ( __CC_ARM ) + #define __SIMD32_TYPE int32_t __packed +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define __SIMD32_TYPE int32_t +#elif defined ( __GNUC__ ) + #define __SIMD32_TYPE int32_t +#elif defined ( __ICCARM__ ) + #define __SIMD32_TYPE int32_t __packed +#elif defined ( __TI_ARM__ ) + #define __SIMD32_TYPE int32_t +#elif defined ( __CSMC__ ) + #define __SIMD32_TYPE int32_t +#elif defined ( __TASKING__ ) + #define __SIMD32_TYPE __un(aligned) int32_t +#elif defined(_MSC_VER ) + #define __SIMD32_TYPE int32_t +#else + #error Unknown compiler +#endif + +#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) +#define __SIMD32_CONST(addr) ( (__SIMD32_TYPE * ) (addr)) +#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE * ) (addr)) +#define __SIMD64(addr) (*( int64_t **) & (addr)) + + +/* SIMD replacement */ + + +/** + @brief Read 2 Q15 from Q15 pointer. + @param[in] pQ15 points to input value + @return Q31 value + */ +__STATIC_FORCEINLINE q31_t read_q15x2 ( + q15_t const * pQ15) +{ + q31_t val; + +#ifdef __ARM_FEATURE_UNALIGNED + memcpy (&val, pQ15, 4); +#else + val = (pQ15[1] << 16) | (pQ15[0] & 0x0FFFF) ; +#endif + + return (val); +} + +/** + @brief Read 2 Q15 from Q15 pointer and increment pointer afterwards. + @param[in] pQ15 points to input value + @return Q31 value + */ +#define read_q15x2_ia(pQ15) read_q15x2((*(pQ15) += 2) - 2) + +/** + @brief Read 2 Q15 from Q15 pointer and decrement pointer afterwards. + @param[in] pQ15 points to input value + @return Q31 value + */ +#define read_q15x2_da(pQ15) read_q15x2((*(pQ15) -= 2) + 2) + +/** + @brief Write 2 Q15 to Q15 pointer and increment pointer afterwards. + @param[in] pQ15 points to input value + @param[in] value Q31 value + @return none + */ +__STATIC_FORCEINLINE void write_q15x2_ia ( + q15_t ** pQ15, + q31_t value) +{ + q31_t val = value; +#ifdef __ARM_FEATURE_UNALIGNED + memcpy (*pQ15, &val, 4); +#else + (*pQ15)[0] = (q15_t)(val & 0x0FFFF); + (*pQ15)[1] = (q15_t)((val >> 16) & 0x0FFFF); +#endif + + *pQ15 += 2; +} + +/** + @brief Write 2 Q15 to Q15 pointer. + @param[in] pQ15 points to input value + @param[in] value Q31 value + @return none + */ +__STATIC_FORCEINLINE void write_q15x2 ( + q15_t * pQ15, + q31_t value) +{ + q31_t val = value; + +#ifdef __ARM_FEATURE_UNALIGNED + memcpy (pQ15, &val, 4); +#else + pQ15[0] = (q15_t)(val & 0x0FFFF); + pQ15[1] = (q15_t)(val >> 16); +#endif +} + + +/** + @brief Read 4 Q7 from Q7 pointer + @param[in] pQ7 points to input value + @return Q31 value + */ +__STATIC_FORCEINLINE q31_t read_q7x4 ( + q7_t const * pQ7) +{ + q31_t val; + +#ifdef __ARM_FEATURE_UNALIGNED + memcpy (&val, pQ7, 4); +#else + val =((pQ7[3] & 0x0FF) << 24) | ((pQ7[2] & 0x0FF) << 16) | ((pQ7[1] & 0x0FF) << 8) | (pQ7[0] & 0x0FF); +#endif + return (val); +} + +/** + @brief Read 4 Q7 from Q7 pointer and increment pointer afterwards. + @param[in] pQ7 points to input value + @return Q31 value + */ +#define read_q7x4_ia(pQ7) read_q7x4((*(pQ7) += 4) - 4) + +/** + @brief Read 4 Q7 from Q7 pointer and decrement pointer afterwards. + @param[in] pQ7 points to input value + @return Q31 value + */ +#define read_q7x4_da(pQ7) read_q7x4((*(pQ7) -= 4) + 4) + +/** + @brief Write 4 Q7 to Q7 pointer and increment pointer afterwards. + @param[in] pQ7 points to input value + @param[in] value Q31 value + @return none + */ +__STATIC_FORCEINLINE void write_q7x4_ia ( + q7_t ** pQ7, + q31_t value) +{ + q31_t val = value; +#ifdef __ARM_FEATURE_UNALIGNED + memcpy (*pQ7, &val, 4); +#else + (*pQ7)[0] = (q7_t)(val & 0x0FF); + (*pQ7)[1] = (q7_t)((val >> 8) & 0x0FF); + (*pQ7)[2] = (q7_t)((val >> 16) & 0x0FF); + (*pQ7)[3] = (q7_t)((val >> 24) & 0x0FF); + +#endif + *pQ7 += 4; +} + + +#ifdef __cplusplus +} +#endif + +#endif /*ifndef _ARM_MATH_MEMORY_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/arm_math_types.h b/Middlewares/ST/ARM/DSP/Include/arm_math_types.h new file mode 100644 index 0000000..c615e66 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_math_types.h @@ -0,0 +1,616 @@ +/****************************************************************************** + * @file arm_math_types.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_MATH_TYPES_H_ + +#define _ARM_MATH_TYPES_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Compiler specific diagnostic adjustment */ +#if defined ( __CC_ARM ) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + +#elif defined ( __APPLE_CC__ ) + #pragma GCC diagnostic ignored "-Wold-style-cast" + +#elif defined ( __GNUC__ ) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wsign-conversion" + #pragma GCC diagnostic ignored "-Wconversion" + #pragma GCC diagnostic ignored "-Wunused-parameter" + +#elif defined ( __ICCARM__ ) + +#elif defined ( __TI_ARM__ ) + +#elif defined ( __CSMC__ ) + +#elif defined ( __TASKING__ ) + +#elif defined ( _MSC_VER ) + +#else + #error Unknown compiler +#endif + + +/* Included for instrinsics definitions */ +#if defined (_MSC_VER ) +#include +#define __STATIC_FORCEINLINE static __forceinline +#define __STATIC_INLINE static __inline +#define __ALIGNED(x) __declspec(align(x)) +#elif defined ( __APPLE_CC__ ) +#include +#define __ALIGNED(x) __attribute__((aligned(x))) +#define __STATIC_FORCEINLINE static inline __attribute__((always_inline)) +#define __STATIC_INLINE static inline +#elif defined (__GNUC_PYTHON__) +#include +#define __ALIGNED(x) __attribute__((aligned(x))) +#define __STATIC_FORCEINLINE static inline __attribute__((always_inline)) +#define __STATIC_INLINE static inline + +#else +#include "cmsis_compiler.h" +#endif + + + +#include +#include +#include +#include + +/* evaluate ARM DSP feature */ +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + #define ARM_MATH_DSP 1 +#endif + +#if defined(ARM_MATH_NEON) + #if defined(_MSC_VER) && defined(_M_ARM64EC) + #include + #else + #include + #endif + #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC) && __ARM_FEATURE_FP16_VECTOR_ARITHMETIC + #if !defined(ARM_MATH_NEON_FLOAT16) + #define ARM_MATH_NEON_FLOAT16 + #endif + #endif +#endif + +#if !defined(ARM_MATH_AUTOVECTORIZE) + + +#if defined(__ARM_FEATURE_MVE) +#if __ARM_FEATURE_MVE + #if !defined(ARM_MATH_MVEI) + #define ARM_MATH_MVEI + #endif +#endif + +#if (__ARM_FEATURE_MVE & 2) + #if !defined(ARM_MATH_MVEF) + #define ARM_MATH_MVEF + #endif + #if !defined(ARM_MATH_MVE_FLOAT16) + #define ARM_MATH_MVE_FLOAT16 + #endif +#endif + +#endif /*defined(__ARM_FEATURE_MVE)*/ +#endif /*!defined(ARM_MATH_AUTOVECTORIZE)*/ + + +#if defined (ARM_MATH_HELIUM) + #if !defined(ARM_MATH_MVEF) + #define ARM_MATH_MVEF + #endif + + #if !defined(ARM_MATH_MVEI) + #define ARM_MATH_MVEI + #endif + + #if !defined(ARM_MATH_MVE_FLOAT16) + #define ARM_MATH_MVE_FLOAT16 + #endif +#endif + + + +#if defined ( __CC_ARM ) + /* Enter low optimization region - place directly above function definition */ + #if defined( __ARM_ARCH_7EM__ ) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("push") \ + _Pragma ("O1") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #if defined ( __ARM_ARCH_7EM__ ) + #define LOW_OPTIMIZATION_EXIT \ + _Pragma ("pop") + #else + #define LOW_OPTIMIZATION_EXIT + #endif + + /* Enter low optimization region - place directly above function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __APPLE_CC__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __GNUC__ ) + #define LOW_OPTIMIZATION_ENTER \ + __attribute__(( optimize("-O1") )) + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __ICCARM__ ) + /* Enter low optimization region - place directly above function definition */ + #if defined ( __ARM_ARCH_7EM__ ) + #define LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define LOW_OPTIMIZATION_EXIT + + /* Enter low optimization region - place directly above function definition */ + #if defined ( __ARM_ARCH_7EM__ ) + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ + _Pragma ("optimize=low") + #else + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #endif + + /* Exit low optimization region - place directly after end of function definition */ + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TI_ARM__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __CSMC__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( __TASKING__ ) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT + +#elif defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) + #define LOW_OPTIMIZATION_ENTER + #define LOW_OPTIMIZATION_EXIT + #define IAR_ONLY_LOW_OPTIMIZATION_ENTER + #define IAR_ONLY_LOW_OPTIMIZATION_EXIT +#endif + + + +/* Compiler specific diagnostic adjustment */ +#if defined ( __CC_ARM ) + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + +#elif defined ( __APPLE_CC__ ) + +#elif defined ( __GNUC__ ) +#pragma GCC diagnostic pop + +#elif defined ( __ICCARM__ ) + +#elif defined ( __TI_ARM__ ) + +#elif defined ( __CSMC__ ) + +#elif defined ( __TASKING__ ) + +#elif defined ( _MSC_VER ) + +#else + #error Unknown compiler +#endif + +#ifdef __cplusplus +} +#endif + +#if defined(__ARM_FEATURE_MVE) && __ARM_FEATURE_MVE +#include +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * @brief 8-bit fractional data type in 1.7 format. + */ + typedef int8_t q7_t; + + /** + * @brief 16-bit fractional data type in 1.15 format. + */ + typedef int16_t q15_t; + + /** + * @brief 32-bit fractional data type in 1.31 format. + */ + typedef int32_t q31_t; + + /** + * @brief 64-bit fractional data type in 1.63 format. + */ + typedef int64_t q63_t; + + /** + * @brief 32-bit floating-point type definition. + */ +#if !defined(__ICCARM__) || !(__ARM_FEATURE_MVE & 2) + typedef float float32_t; +#endif + + /** + * @brief 64-bit floating-point type definition. + */ + typedef double float64_t; + + /** + * @brief vector types + */ +#if defined(ARM_MATH_NEON) || (defined (ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE)) + /** + * @brief 64-bit fractional 128-bit vector data type in 1.63 format + */ + typedef int64x2_t q63x2_t; + + /** + * @brief 32-bit fractional 128-bit vector data type in 1.31 format. + */ + typedef int32x4_t q31x4_t; + + /** + * @brief 16-bit fractional 128-bit vector data type with 16-bit alignment in 1.15 format. + */ + typedef __ALIGNED(2) int16x8_t q15x8_t; + + /** + * @brief 8-bit fractional 128-bit vector data type with 8-bit alignment in 1.7 format. + */ + typedef __ALIGNED(1) int8x16_t q7x16_t; + + /** + * @brief 32-bit fractional 128-bit vector pair data type in 1.31 format. + */ + typedef int32x4x2_t q31x4x2_t; + + /** + * @brief 32-bit fractional 128-bit vector quadruplet data type in 1.31 format. + */ + typedef int32x4x4_t q31x4x4_t; + + /** + * @brief 16-bit fractional 128-bit vector pair data type in 1.15 format. + */ + typedef int16x8x2_t q15x8x2_t; + + /** + * @brief 16-bit fractional 128-bit vector quadruplet data type in 1.15 format. + */ + typedef int16x8x4_t q15x8x4_t; + + /** + * @brief 8-bit fractional 128-bit vector pair data type in 1.7 format. + */ + typedef int8x16x2_t q7x16x2_t; + + /** + * @brief 8-bit fractional 128-bit vector quadruplet data type in 1.7 format. + */ + typedef int8x16x4_t q7x16x4_t; + + /** + * @brief 32-bit fractional data type in 9.23 format. + */ + typedef int32_t q23_t; + + /** + * @brief 32-bit fractional 128-bit vector data type in 9.23 format. + */ + typedef int32x4_t q23x4_t; + + /** + * @brief 64-bit status 128-bit vector data type. + */ + typedef int64x2_t status64x2_t; + + /** + * @brief 32-bit status 128-bit vector data type. + */ + typedef int32x4_t status32x4_t; + + /** + * @brief 16-bit status 128-bit vector data type. + */ + typedef int16x8_t status16x8_t; + + /** + * @brief 8-bit status 128-bit vector data type. + */ + typedef int8x16_t status8x16_t; + + +#endif + +#if defined(ARM_MATH_NEON) || (defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)) /* floating point vector*/ + /** + * @brief 32-bit floating-point 128-bit vector type + */ + typedef float32x4_t f32x4_t; + + /** + * @brief 32-bit floating-point 128-bit vector pair data type + */ + typedef float32x4x2_t f32x4x2_t; + + /** + * @brief 32-bit floating-point 128-bit vector quadruplet data type + */ + typedef float32x4x4_t f32x4x4_t; + + /** + * @brief 32-bit ubiquitous 128-bit vector data type + */ + typedef union _any32x4_t + { + float32x4_t f; + int32x4_t i; + } any32x4_t; + +#endif + +#if defined(ARM_MATH_NEON) + /** + * @brief 32-bit fractional 64-bit vector data type in 1.31 format. + */ + typedef int32x2_t q31x2_t; + + /** + * @brief 16-bit fractional 64-bit vector data type in 1.15 format. + */ + typedef __ALIGNED(2) int16x4_t q15x4_t; + + /** + * @brief 8-bit fractional 64-bit vector data type in 1.7 format. + */ + typedef __ALIGNED(1) int8x8_t q7x8_t; + + /** + * @brief 32-bit float 64-bit vector data type. + */ + typedef float32x2_t f32x2_t; + + /** + * @brief 32-bit floating-point 128-bit vector triplet data type + */ + typedef float32x4x3_t f32x4x3_t; + + + /** + * @brief 32-bit fractional 128-bit vector triplet data type in 1.31 format + */ + typedef int32x4x3_t q31x4x3_t; + + /** + * @brief 16-bit fractional 128-bit vector triplet data type in 1.15 format + */ + typedef int16x8x3_t q15x8x3_t; + + /** + * @brief 8-bit fractional 128-bit vector triplet data type in 1.7 format + */ + typedef int8x16x3_t q7x16x3_t; + + /** + * @brief 32-bit floating-point 64-bit vector pair data type + */ + typedef float32x2x2_t f32x2x2_t; + + /** + * @brief 32-bit floating-point 64-bit vector triplet data type + */ + typedef float32x2x3_t f32x2x3_t; + + /** + * @brief 32-bit floating-point 64-bit vector quadruplet data type + */ + typedef float32x2x4_t f32x2x4_t; + + + /** + * @brief 32-bit fractional 64-bit vector pair data type in 1.31 format + */ + typedef int32x2x2_t q31x2x2_t; + + /** + * @brief 32-bit fractional 64-bit vector triplet data type in 1.31 format + */ + typedef int32x2x3_t q31x2x3_t; + + /** + * @brief 32-bit fractional 64-bit vector quadruplet data type in 1.31 format + */ + typedef int32x4x3_t q31x2x4_t; + + /** + * @brief 16-bit fractional 64-bit vector pair data type in 1.15 format + */ + typedef int16x4x2_t q15x4x2_t; + + /** + * @brief 16-bit fractional 64-bit vector triplet data type in 1.15 format + */ + typedef int16x4x2_t q15x4x3_t; + + /** + * @brief 16-bit fractional 64-bit vector quadruplet data type in 1.15 format + */ + typedef int16x4x3_t q15x4x4_t; + + /** + * @brief 8-bit fractional 64-bit vector pair data type in 1.7 format + */ + typedef int8x8x2_t q7x8x2_t; + + /** + * @brief 8-bit fractional 64-bit vector triplet data type in 1.7 format + */ + typedef int8x8x3_t q7x8x3_t; + + /** + * @brief 8-bit fractional 64-bit vector quadruplet data type in 1.7 format + */ + typedef int8x8x4_t q7x8x4_t; + + /** + * @brief 32-bit ubiquitous 64-bit vector data type + */ + typedef union _any32x2_t + { + float32x2_t f; + int32x2_t i; + } any32x2_t; + + + /** + * @brief 32-bit status 64-bit vector data type. + */ + typedef int32x4_t status32x2_t; + + /** + * @brief 16-bit status 64-bit vector data type. + */ + typedef int16x8_t status16x4_t; + + /** + * @brief 8-bit status 64-bit vector data type. + */ + typedef int8x16_t status8x8_t; + +#endif + + + + + +#define F64_MAX ((float64_t)DBL_MAX) +#define F32_MAX ((float32_t)FLT_MAX) + + + +#define F64_MIN (-DBL_MAX) +#define F32_MIN (-FLT_MAX) + + + +#define F64_ABSMAX ((float64_t)DBL_MAX) +#define F32_ABSMAX ((float32_t)FLT_MAX) + + + +#define F64_ABSMIN ((float64_t)0.0) +#define F32_ABSMIN ((float32_t)0.0) + + +#define Q31_MAX ((q31_t)(0x7FFFFFFFL)) +#define Q15_MAX ((q15_t)(0x7FFF)) +#define Q7_MAX ((q7_t)(0x7F)) +#define Q31_MIN ((q31_t)(0x80000000L)) +#define Q15_MIN ((q15_t)(0x8000)) +#define Q7_MIN ((q7_t)(0x80)) + +#define Q31_ABSMAX ((q31_t)(0x7FFFFFFFL)) +#define Q15_ABSMAX ((q15_t)(0x7FFF)) +#define Q7_ABSMAX ((q7_t)(0x7F)) +#define Q31_ABSMIN ((q31_t)0) +#define Q15_ABSMIN ((q15_t)0) +#define Q7_ABSMIN ((q7_t)0) + + /* Dimension C vector space */ + #define CMPLX_DIM 2 + + /** + * @brief Error status returned by some functions in the library. + */ + + typedef enum + { + ARM_MATH_SUCCESS = 0, /**< No error */ + ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ + ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ + ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation */ + ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ + ARM_MATH_SINGULAR = -5, /**< Input matrix is singular and cannot be inverted */ + ARM_MATH_TEST_FAILURE = -6, /**< Test Failed */ + ARM_MATH_DECOMPOSITION_FAILURE = -7 /**< Decomposition Failed */ + } arm_status; + + +#ifdef __cplusplus +} +#endif + +#endif /*ifndef _ARM_MATH_TYPES_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/arm_math_types_f16.h b/Middlewares/ST/ARM/DSP/Include/arm_math_types_f16.h new file mode 100644 index 0000000..744dc38 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_math_types_f16.h @@ -0,0 +1,163 @@ +/****************************************************************************** + * @file arm_math_types_f16.h + * @brief Public header file for f16 function of the CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_MATH_TYPES_F16_H +#define _ARM_MATH_TYPES_F16_H + +#include "arm_math_types.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if !defined( __CC_ARM ) + +/** + * @brief 16-bit floating-point type definition. + * This is already defined in arm_mve.h + * + * This is not fully supported on ARM AC5. + */ + +/* + +Check if the type __fp16 is available. +If it is not available, f16 version of the kernels +won't be built. + +*/ +#if !(__ARM_FEATURE_MVE & 2) + #if !defined(DISABLEFLOAT16) + #if defined(__ARM_FP16_FORMAT_IEEE) || defined(__ARM_FP16_FORMAT_ALTERNATIVE) + typedef __fp16 float16_t; + #define ARM_FLOAT16_SUPPORTED + #endif + #endif +#else + /* When Vector float16, this flag is always defined and can't be disabled */ + #define ARM_FLOAT16_SUPPORTED +#endif + +#if defined(ARM_MATH_NEON) || (defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE)) /* floating point vector*/ + +#if defined(ARM_MATH_MVE_FLOAT16) || defined(ARM_MATH_NEON_FLOAT16) + + /** + * @brief 16-bit floating-point 128-bit vector data type + */ + typedef __ALIGNED(2) float16x8_t f16x8_t; + + /** + * @brief 16-bit floating-point 128-bit vector pair data type + */ + typedef float16x8x2_t f16x8x2_t; + + /** + * @brief 16-bit floating-point 128-bit vector quadruplet data type + */ + typedef float16x8x4_t f16x8x4_t; + + /** + * @brief 16-bit ubiquitous 128-bit vector data type + */ + typedef union _any16x8_t + { + float16x8_t f; + int16x8_t i; + } any16x8_t; +#endif + +#endif + +#if defined(ARM_MATH_NEON) + + +#if defined(ARM_MATH_NEON_FLOAT16) + /** + * @brief 16-bit float 64-bit vector data type. + */ + typedef __ALIGNED(2) float16x4_t f16x4_t; + + /** + * @brief 16-bit floating-point 128-bit vector triplet data type + */ + typedef float16x8x3_t f16x8x3_t; + + /** + * @brief 16-bit floating-point 64-bit vector pair data type + */ + typedef float16x4x2_t f16x4x2_t; + + /** + * @brief 16-bit floating-point 64-bit vector triplet data type + */ + typedef float16x4x3_t f16x4x3_t; + + /** + * @brief 16-bit floating-point 64-bit vector quadruplet data type + */ + typedef float16x4x4_t f16x4x4_t; + + /** + * @brief 16-bit ubiquitous 64-bit vector data type + */ + typedef union _any16x4_t + { + float16x4_t f; + int16x4_t i; + } any16x4_t; +#endif + +#endif + + + +#if defined(ARM_FLOAT16_SUPPORTED) + +#if defined(__ICCARM__) + +#define F16INFINITY ((float16_t) INFINITY) + +#else + +#define F16INFINITY ((float16_t)__builtin_inf()) + +#endif + +#define F16_MAX ((float16_t)__FLT16_MAX__) +#define F16_MIN (-(_Float16)__FLT16_MAX__) + +#define F16_ABSMAX ((float16_t)__FLT16_MAX__) +#define F16_ABSMIN ((float16_t)0.0f16) + +#endif /* ARM_FLOAT16_SUPPORTED*/ +#endif /* !defined( __CC_ARM ) */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ARM_MATH_F16_H */ diff --git a/Middlewares/ST/ARM/DSP/Include/arm_mve_tables.h b/Middlewares/ST/ARM/DSP/Include/arm_mve_tables.h new file mode 100644 index 0000000..24ef255 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_mve_tables.h @@ -0,0 +1,231 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mve_tables.h + * Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc + * used for MVE implementation only + * + * @version V1.10.0 + * @date 04 October 2021 + * + * Target Processor: Cortex-M and Cortex-A cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef _ARM_MVE_TABLES_H + #define _ARM_MVE_TABLES_H + +#include "arm_math_types.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + + + +#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_16) || defined(ARM_TABLE_TWIDDLECOEF_F32_32) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_16_f32[2]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_16_f32[2]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_16_f32[2]; +extern const float32_t rearranged_twiddle_stride1_16_f32[8]; +extern const float32_t rearranged_twiddle_stride2_16_f32[8]; +extern const float32_t rearranged_twiddle_stride3_16_f32[8]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_64) || defined(ARM_TABLE_TWIDDLECOEF_F32_128) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_64_f32[3]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_64_f32[3]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_64_f32[3]; +extern const float32_t rearranged_twiddle_stride1_64_f32[40]; +extern const float32_t rearranged_twiddle_stride2_64_f32[40]; +extern const float32_t rearranged_twiddle_stride3_64_f32[40]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_256) || defined(ARM_TABLE_TWIDDLECOEF_F32_512) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_256_f32[4]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_256_f32[4]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_256_f32[4]; +extern const float32_t rearranged_twiddle_stride1_256_f32[168]; +extern const float32_t rearranged_twiddle_stride2_256_f32[168]; +extern const float32_t rearranged_twiddle_stride3_256_f32[168]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_1024) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_1024_f32[5]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_1024_f32[5]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_1024_f32[5]; +extern const float32_t rearranged_twiddle_stride1_1024_f32[680]; +extern const float32_t rearranged_twiddle_stride2_1024_f32[680]; +extern const float32_t rearranged_twiddle_stride3_1024_f32[680]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096) || defined(ARM_TABLE_TWIDDLECOEF_F32_8192) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_4096_f32[6]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_4096_f32[6]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_4096_f32[6]; +extern const float32_t rearranged_twiddle_stride1_4096_f32[2728]; +extern const float32_t rearranged_twiddle_stride2_4096_f32[2728]; +extern const float32_t rearranged_twiddle_stride3_4096_f32[2728]; +#endif + + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */ + +#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */ + + + +#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_16) || defined(ARM_TABLE_TWIDDLECOEF_Q31_32) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_16_q31[2]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_16_q31[2]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_16_q31[2]; +extern const q31_t rearranged_twiddle_stride1_16_q31[8]; +extern const q31_t rearranged_twiddle_stride2_16_q31[8]; +extern const q31_t rearranged_twiddle_stride3_16_q31[8]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_64) || defined(ARM_TABLE_TWIDDLECOEF_Q31_128) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_64_q31[3]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_64_q31[3]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_64_q31[3]; +extern const q31_t rearranged_twiddle_stride1_64_q31[40]; +extern const q31_t rearranged_twiddle_stride2_64_q31[40]; +extern const q31_t rearranged_twiddle_stride3_64_q31[40]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_256) || defined(ARM_TABLE_TWIDDLECOEF_Q31_512) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_256_q31[4]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_256_q31[4]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_256_q31[4]; +extern const q31_t rearranged_twiddle_stride1_256_q31[168]; +extern const q31_t rearranged_twiddle_stride2_256_q31[168]; +extern const q31_t rearranged_twiddle_stride3_256_q31[168]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) || defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_1024_q31[5]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_1024_q31[5]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_1024_q31[5]; +extern const q31_t rearranged_twiddle_stride1_1024_q31[680]; +extern const q31_t rearranged_twiddle_stride2_1024_q31[680]; +extern const q31_t rearranged_twiddle_stride3_1024_q31[680]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) || defined(ARM_TABLE_TWIDDLECOEF_Q31_8192) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_4096_q31[6]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_4096_q31[6]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_4096_q31[6]; +extern const q31_t rearranged_twiddle_stride1_4096_q31[2728]; +extern const q31_t rearranged_twiddle_stride2_4096_q31[2728]; +extern const q31_t rearranged_twiddle_stride3_4096_q31[2728]; +#endif + + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */ + +#endif /* defined(ARM_MATH_MVEI) */ + + + +#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_16) || defined(ARM_TABLE_TWIDDLECOEF_Q15_32) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_16_q15[2]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_16_q15[2]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_16_q15[2]; +extern const q15_t rearranged_twiddle_stride1_16_q15[8]; +extern const q15_t rearranged_twiddle_stride2_16_q15[8]; +extern const q15_t rearranged_twiddle_stride3_16_q15[8]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_64) || defined(ARM_TABLE_TWIDDLECOEF_Q15_128) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_64_q15[3]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_64_q15[3]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_64_q15[3]; +extern const q15_t rearranged_twiddle_stride1_64_q15[40]; +extern const q15_t rearranged_twiddle_stride2_64_q15[40]; +extern const q15_t rearranged_twiddle_stride3_64_q15[40]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_256) || defined(ARM_TABLE_TWIDDLECOEF_Q15_512) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_256_q15[4]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_256_q15[4]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_256_q15[4]; +extern const q15_t rearranged_twiddle_stride1_256_q15[168]; +extern const q15_t rearranged_twiddle_stride2_256_q15[168]; +extern const q15_t rearranged_twiddle_stride3_256_q15[168]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) || defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_1024_q15[5]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_1024_q15[5]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_1024_q15[5]; +extern const q15_t rearranged_twiddle_stride1_1024_q15[680]; +extern const q15_t rearranged_twiddle_stride2_1024_q15[680]; +extern const q15_t rearranged_twiddle_stride3_1024_q15[680]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) || defined(ARM_TABLE_TWIDDLECOEF_Q15_8192) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_4096_q15[6]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_4096_q15[6]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_4096_q15[6]; +extern const q15_t rearranged_twiddle_stride1_4096_q15[2728]; +extern const q15_t rearranged_twiddle_stride2_4096_q15[2728]; +extern const q15_t rearranged_twiddle_stride3_4096_q15[2728]; +#endif + + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */ + +#endif /* defined(ARM_MATH_MVEI) */ + + + +#ifdef __cplusplus +} +#endif + +#endif /*_ARM_MVE_TABLES_H*/ + diff --git a/Middlewares/ST/ARM/DSP/Include/arm_mve_tables_f16.h b/Middlewares/ST/ARM/DSP/Include/arm_mve_tables_f16.h new file mode 100644 index 0000000..432ef2a --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_mve_tables_f16.h @@ -0,0 +1,109 @@ +/* ---------------------------------------------------------------------- + * Project: CMSIS DSP Library + * Title: arm_mve_tables_f16.h + * Description: common tables like fft twiddle factors, Bitreverse, reciprocal etc + * used for MVE implementation only + * + * @version V1.10.0 + * @date 04 October 2021 + * + * Target Processor: Cortex-M and Cortex-A cores + * -------------------------------------------------------------------- */ +/* + * Copyright (C) 2010-2021 ARM Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + #ifndef _ARM_MVE_TABLES_F16_H + #define _ARM_MVE_TABLES_F16_H + +#include "arm_math_types_f16.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + + + +#if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_16) || defined(ARM_TABLE_TWIDDLECOEF_F16_32) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_16_f16[2]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_16_f16[2]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_16_f16[2]; +extern const float16_t rearranged_twiddle_stride1_16_f16[8]; +extern const float16_t rearranged_twiddle_stride2_16_f16[8]; +extern const float16_t rearranged_twiddle_stride3_16_f16[8]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_64) || defined(ARM_TABLE_TWIDDLECOEF_F16_128) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_64_f16[3]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_64_f16[3]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_64_f16[3]; +extern const float16_t rearranged_twiddle_stride1_64_f16[40]; +extern const float16_t rearranged_twiddle_stride2_64_f16[40]; +extern const float16_t rearranged_twiddle_stride3_64_f16[40]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_256) || defined(ARM_TABLE_TWIDDLECOEF_F16_512) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_256_f16[4]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_256_f16[4]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_256_f16[4]; +extern const float16_t rearranged_twiddle_stride1_256_f16[168]; +extern const float16_t rearranged_twiddle_stride2_256_f16[168]; +extern const float16_t rearranged_twiddle_stride3_256_f16[168]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_1024) || defined(ARM_TABLE_TWIDDLECOEF_F16_2048) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_1024_f16[5]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_1024_f16[5]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_1024_f16[5]; +extern const float16_t rearranged_twiddle_stride1_1024_f16[680]; +extern const float16_t rearranged_twiddle_stride2_1024_f16[680]; +extern const float16_t rearranged_twiddle_stride3_1024_f16[680]; +#endif + +#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F16_4096) || defined(ARM_TABLE_TWIDDLECOEF_F16_8192) + +extern const uint32_t rearranged_twiddle_tab_stride1_arr_4096_f16[6]; +extern const uint32_t rearranged_twiddle_tab_stride2_arr_4096_f16[6]; +extern const uint32_t rearranged_twiddle_tab_stride3_arr_4096_f16[6]; +extern const float16_t rearranged_twiddle_stride1_4096_f16[2728]; +extern const float16_t rearranged_twiddle_stride2_4096_f16[2728]; +extern const float16_t rearranged_twiddle_stride3_4096_f16[2728]; +#endif + + +#endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) */ + +#endif /* defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) */ + + + +#ifdef __cplusplus +} +#endif + +#endif /*_ARM_MVE_TABLES_F16_H*/ + diff --git a/Middlewares/ST/ARM/DSP/Include/arm_vec_math.h b/Middlewares/ST/ARM/DSP/Include/arm_vec_math.h new file mode 100644 index 0000000..d9134c5 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_vec_math.h @@ -0,0 +1,373 @@ +/****************************************************************************** + * @file arm_vec_math.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_VEC_MATH_H +#define _ARM_VEC_MATH_H + +#include "arm_math_types.h" +#include "arm_common_tables.h" +#include "arm_helium_utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) + +#define INV_NEWTON_INIT_F32 0x7EF127EA + +static const float32_t __logf_rng_f32=0.693147180f; + + +/* fast inverse approximation (3x newton) */ +__STATIC_INLINE f32x4_t vrecip_medprec_f32( + f32x4_t x) +{ + q31x4_t m; + f32x4_t b; + any32x4_t xinv; + f32x4_t ax = vabsq(x); + + xinv.f = ax; + m = 0x3F800000 - (xinv.i & 0x7F800000); + xinv.i = xinv.i + m; + xinv.f = 1.41176471f - 0.47058824f * xinv.f; + xinv.i = xinv.i + m; + + b = 2.0f - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f - xinv.f * ax; + xinv.f = xinv.f * b; + + xinv.f = vdupq_m(xinv.f, INFINITY, vcmpeqq(x, 0.0f)); + /* + * restore sign + */ + xinv.f = vnegq_m(xinv.f, xinv.f, vcmpltq(x, 0.0f)); + + return xinv.f; +} + +/* fast inverse approximation (4x newton) */ +__STATIC_INLINE f32x4_t vrecip_hiprec_f32( + f32x4_t x) +{ + q31x4_t m; + f32x4_t b; + any32x4_t xinv; + f32x4_t ax = vabsq(x); + + xinv.f = ax; + + m = 0x3F800000 - (xinv.i & 0x7F800000); + xinv.i = xinv.i + m; + xinv.f = 1.41176471f - 0.47058824f * xinv.f; + xinv.i = xinv.i + m; + + b = 2.0f - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f - xinv.f * ax; + xinv.f = xinv.f * b; + + xinv.f = vdupq_m(xinv.f, INFINITY, vcmpeqq(x, 0.0f)); + /* + * restore sign + */ + xinv.f = vnegq_m(xinv.f, xinv.f, vcmpltq(x, 0.0f)); + + return xinv.f; +} + +__STATIC_INLINE f32x4_t vdiv_f32( + f32x4_t num, f32x4_t den) +{ + return vmulq(num, vrecip_hiprec_f32(den)); +} + +/** + @brief Single-precision taylor dev. + @param[in] x f32 quad vector input + @param[in] coeffs f32 quad vector coeffs + @return destination f32 quad vector + */ + +__STATIC_INLINE f32x4_t vtaylor_polyq_f32( + f32x4_t x, + const float32_t * coeffs) +{ + f32x4_t A = vfmasq(vdupq_n_f32(coeffs[4]), x, coeffs[0]); + f32x4_t B = vfmasq(vdupq_n_f32(coeffs[6]), x, coeffs[2]); + f32x4_t C = vfmasq(vdupq_n_f32(coeffs[5]), x, coeffs[1]); + f32x4_t D = vfmasq(vdupq_n_f32(coeffs[7]), x, coeffs[3]); + f32x4_t x2 = vmulq(x, x); + f32x4_t x4 = vmulq(x2, x2); + f32x4_t res = vfmaq(vfmaq_f32(A, B, x2), vfmaq_f32(C, D, x2), x4); + + return res; +} + +__STATIC_INLINE f32x4_t vmant_exp_f32( + f32x4_t x, + int32x4_t * e) +{ + any32x4_t r; + int32x4_t n; + + r.f = x; + n = r.i >> 23; + n = n - 127; + r.i = r.i - (n << 23); + + *e = n; + return r.f; +} + + +__STATIC_INLINE f32x4_t vlogq_f32(f32x4_t vecIn) +{ + q31x4_t vecExpUnBiased; + f32x4_t vecTmpFlt0, vecTmpFlt1; + f32x4_t vecAcc0, vecAcc1, vecAcc2, vecAcc3; + f32x4_t vecExpUnBiasedFlt; + + /* + * extract exponent + */ + vecTmpFlt1 = vmant_exp_f32(vecIn, &vecExpUnBiased); + + vecTmpFlt0 = vecTmpFlt1 * vecTmpFlt1; + /* + * a = (__logf_lut_f32[4] * r.f) + (__logf_lut_f32[0]); + */ + vecAcc0 = vdupq_n_f32(__logf_lut_f32[0]); + vecAcc0 = vfmaq(vecAcc0, vecTmpFlt1, __logf_lut_f32[4]); + /* + * b = (__logf_lut_f32[6] * r.f) + (__logf_lut_f32[2]); + */ + vecAcc1 = vdupq_n_f32(__logf_lut_f32[2]); + vecAcc1 = vfmaq(vecAcc1, vecTmpFlt1, __logf_lut_f32[6]); + /* + * c = (__logf_lut_f32[5] * r.f) + (__logf_lut_f32[1]); + */ + vecAcc2 = vdupq_n_f32(__logf_lut_f32[1]); + vecAcc2 = vfmaq(vecAcc2, vecTmpFlt1, __logf_lut_f32[5]); + /* + * d = (__logf_lut_f32[7] * r.f) + (__logf_lut_f32[3]); + */ + vecAcc3 = vdupq_n_f32(__logf_lut_f32[3]); + vecAcc3 = vfmaq(vecAcc3, vecTmpFlt1, __logf_lut_f32[7]); + /* + * a = a + b * xx; + */ + vecAcc0 = vfmaq(vecAcc0, vecAcc1, vecTmpFlt0); + /* + * c = c + d * xx; + */ + vecAcc2 = vfmaq(vecAcc2, vecAcc3, vecTmpFlt0); + /* + * xx = xx * xx; + */ + vecTmpFlt0 = vecTmpFlt0 * vecTmpFlt0; + vecExpUnBiasedFlt = vcvtq_f32_s32(vecExpUnBiased); + /* + * r.f = a + c * xx; + */ + vecAcc0 = vfmaq(vecAcc0, vecAcc2, vecTmpFlt0); + /* + * add exponent + * r.f = r.f + ((float32_t) m) * __logf_rng_f32; + */ + vecAcc0 = vfmaq(vecAcc0, vecExpUnBiasedFlt, __logf_rng_f32); + // set log0 down to -inf + vecAcc0 = vdupq_m(vecAcc0, -INFINITY, vcmpeqq(vecIn, 0.0f)); + return vecAcc0; +} + +__STATIC_INLINE f32x4_t vexpq_f32( + f32x4_t x) +{ + // Perform range reduction [-log(2),log(2)] + int32x4_t m = vcvtq_s32_f32(vmulq_n_f32(x, 1.4426950408f)); + f32x4_t val = vfmsq_f32(x, vcvtq_f32_s32(m), vdupq_n_f32(0.6931471805f)); + + // Polynomial Approximation + f32x4_t poly = vtaylor_polyq_f32(val, exp_tab); + + // Reconstruct + poly = (f32x4_t) (vqaddq_s32((q31x4_t) (poly), vqshlq_n_s32(m, 23))); + + poly = vdupq_m(poly, 0.0f, vcmpltq_n_s32(m, -126)); + return poly; +} + +__STATIC_INLINE f32x4_t arm_vec_exponent_f32(f32x4_t x, int32_t nb) +{ + f32x4_t r = x; + nb--; + while (nb > 0) { + r = vmulq(r, x); + nb--; + } + return (r); +} + +__STATIC_INLINE f32x4_t vrecip_f32(f32x4_t vecIn) +{ + f32x4_t vecSx, vecW, vecTmp; + any32x4_t v; + + vecSx = vabsq(vecIn); + + v.f = vecIn; + v.i = vsubq(vdupq_n_s32(INV_NEWTON_INIT_F32), v.i); + + vecW = vmulq(vecSx, v.f); + + // v.f = v.f * (8 + w * (-28 + w * (56 + w * (-70 + w *(56 + w * (-28 + w * (8 - w))))))); + vecTmp = vsubq(vdupq_n_f32(8.0f), vecW); + vecTmp = vfmasq(vecW, vecTmp, -28.0f); + vecTmp = vfmasq(vecW, vecTmp, 56.0f); + vecTmp = vfmasq(vecW, vecTmp, -70.0f); + vecTmp = vfmasq(vecW, vecTmp, 56.0f); + vecTmp = vfmasq(vecW, vecTmp, -28.0f); + vecTmp = vfmasq(vecW, vecTmp, 8.0f); + v.f = vmulq(v.f, vecTmp); + + v.f = vdupq_m(v.f, INFINITY, vcmpeqq(vecIn, 0.0f)); + /* + * restore sign + */ + v.f = vnegq_m(v.f, v.f, vcmpltq(vecIn, 0.0f)); + return v.f; +} + +__STATIC_INLINE f32x4_t vtanhq_f32( + f32x4_t val) +{ + f32x4_t x = + vminnmq_f32(vmaxnmq_f32(val, vdupq_n_f32(-10.f)), vdupq_n_f32(10.0f)); + f32x4_t exp2x = vexpq_f32(vmulq_n_f32(x, 2.f)); + f32x4_t num = vsubq_n_f32(exp2x, 1.f); + f32x4_t den = vaddq_n_f32(exp2x, 1.f); + f32x4_t tanh = vmulq_f32(num, vrecip_f32(den)); + return tanh; +} + +__STATIC_INLINE f32x4_t vpowq_f32( + f32x4_t val, + f32x4_t n) +{ + return vexpq_f32(vmulq_f32(n, vlogq_f32(val))); +} + +#endif /* (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE)*/ + +#if (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) +#endif /* (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) */ + +#if (defined(ARM_MATH_NEON) || defined(ARM_MATH_NEON_EXPERIMENTAL)) && !defined(ARM_MATH_AUTOVECTORIZE) + +#include "NEMath.h" +/** + * @brief Vectorized integer exponentiation + * @param[in] x value + * @param[in] nb integer exponent >= 1 + * @return x^nb + * + */ +__STATIC_INLINE float32x4_t arm_vec_exponent_f32(float32x4_t x, int32_t nb) +{ + float32x4_t r = x; + nb --; + while(nb > 0) + { + r = vmulq_f32(r , x); + nb--; + } + return(r); +} + + +__STATIC_INLINE float32x4_t __arm_vec_sqrt_f32_neon(float32x4_t x) +{ + float32x4_t x1 = vmaxq_f32(x, vdupq_n_f32(FLT_MIN)); + float32x4_t e = vrsqrteq_f32(x1); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e); + e = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x1, e), e), e); + return vmulq_f32(x, e); +} + +__STATIC_INLINE int16x8_t __arm_vec_sqrt_q15_neon(int16x8_t vec) +{ + float32x4_t tempF; + int32x4_t tempHI,tempLO; + + tempLO = vmovl_s16(vget_low_s16(vec)); + tempF = vcvtq_n_f32_s32(tempLO,15); + tempF = __arm_vec_sqrt_f32_neon(tempF); + tempLO = vcvtq_n_s32_f32(tempF,15); + + tempHI = vmovl_s16(vget_high_s16(vec)); + tempF = vcvtq_n_f32_s32(tempHI,15); + tempF = __arm_vec_sqrt_f32_neon(tempF); + tempHI = vcvtq_n_s32_f32(tempF,15); + + return(vcombine_s16(vqmovn_s32(tempLO),vqmovn_s32(tempHI))); +} + +__STATIC_INLINE int32x4_t __arm_vec_sqrt_q31_neon(int32x4_t vec) +{ + float32x4_t temp; + + temp = vcvtq_n_f32_s32(vec,31); + temp = __arm_vec_sqrt_f32_neon(temp); + return(vcvtq_n_s32_f32(temp,31)); +} + +#endif /* (defined(ARM_MATH_NEON) || defined(ARM_MATH_NEON_EXPERIMENTAL)) && !defined(ARM_MATH_AUTOVECTORIZE) */ + +#ifdef __cplusplus +} +#endif + + +#endif /* _ARM_VEC_MATH_H */ + +/** + * + * End of file. + */ diff --git a/Middlewares/ST/ARM/DSP/Include/arm_vec_math_f16.h b/Middlewares/ST/ARM/DSP/Include/arm_vec_math_f16.h new file mode 100644 index 0000000..91bd28a --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/arm_vec_math_f16.h @@ -0,0 +1,312 @@ +/****************************************************************************** + * @file arm_vec_math_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_VEC_MATH_F16_H +#define _ARM_VEC_MATH_F16_H + +#include "arm_math_types_f16.h" +#include "arm_common_tables_f16.h" +#include "arm_helium_utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + + +#if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) + + +static const float16_t __logf_rng_f16=0.693147180f16; + +/* fast inverse approximation (3x newton) */ +__STATIC_INLINE f16x8_t vrecip_medprec_f16( + f16x8_t x) +{ + q15x8_t m; + f16x8_t b; + any16x8_t xinv; + f16x8_t ax = vabsq(x); + + xinv.f = ax; + + m = 0x03c00 - (xinv.i & 0x07c00); + xinv.i = xinv.i + m; + xinv.f = 1.41176471f16 - 0.47058824f16 * xinv.f; + xinv.i = xinv.i + m; + + b = 2.0f16 - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f16 - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f16 - xinv.f * ax; + xinv.f = xinv.f * b; + + xinv.f = vdupq_m_n_f16(xinv.f, F16INFINITY, vcmpeqq_n_f16(x, 0.0f)); + /* + * restore sign + */ + xinv.f = vnegq_m(xinv.f, xinv.f, vcmpltq_n_f16(x, 0.0f)); + + return xinv.f; +} + +/* fast inverse approximation (4x newton) */ +__STATIC_INLINE f16x8_t vrecip_hiprec_f16( + f16x8_t x) +{ + q15x8_t m; + f16x8_t b; + any16x8_t xinv; + f16x8_t ax = vabsq(x); + + xinv.f = ax; + + m = 0x03c00 - (xinv.i & 0x07c00); + xinv.i = xinv.i + m; + xinv.f = 1.41176471f16 - 0.47058824f16 * xinv.f; + xinv.i = xinv.i + m; + + b = 2.0f16 - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f16 - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f16 - xinv.f * ax; + xinv.f = xinv.f * b; + + b = 2.0f16 - xinv.f * ax; + xinv.f = xinv.f * b; + + xinv.f = vdupq_m_n_f16(xinv.f, F16INFINITY, vcmpeqq_n_f16(x, 0.0f)); + /* + * restore sign + */ + xinv.f = vnegq_m(xinv.f, xinv.f, vcmpltq_n_f16(x, 0.0f)); + + return xinv.f; +} + +__STATIC_INLINE f16x8_t vdiv_f16( + f16x8_t num, f16x8_t den) +{ + return vmulq(num, vrecip_hiprec_f16(den)); +} + + +/** + @brief Single-precision taylor dev. + @param[in] x f16 vector input + @param[in] coeffs f16 vector coeffs + @return destination f16 vector + */ + +__STATIC_INLINE float16x8_t vtaylor_polyq_f16( + float16x8_t x, + const float16_t * coeffs) +{ + float16x8_t A = vfmasq(vdupq_n_f16(coeffs[4]), x, coeffs[0]); + float16x8_t B = vfmasq(vdupq_n_f16(coeffs[6]), x, coeffs[2]); + float16x8_t C = vfmasq(vdupq_n_f16(coeffs[5]), x, coeffs[1]); + float16x8_t D = vfmasq(vdupq_n_f16(coeffs[7]), x, coeffs[3]); + float16x8_t x2 = vmulq(x, x); + float16x8_t x4 = vmulq(x2, x2); + float16x8_t res = vfmaq(vfmaq_f16(A, B, x2), vfmaq_f16(C, D, x2), x4); + + return res; +} + +#define VMANT_EXP_F16(x) \ + any16x8_t r; \ + int16x8_t n; \ + \ + r.f = x; \ + n = r.i >> 10; \ + n = n - 15; \ + r.i = r.i - (n << 10);\ + \ + vecExpUnBiased = n; \ + vecTmpFlt1 = r.f; + +__STATIC_INLINE float16x8_t vlogq_f16(float16x8_t vecIn) +{ + q15x8_t vecExpUnBiased; + float16x8_t vecTmpFlt0, vecTmpFlt1; + float16x8_t vecAcc0, vecAcc1, vecAcc2, vecAcc3; + float16x8_t vecExpUnBiasedFlt; + + /* + * extract exponent + */ + VMANT_EXP_F16(vecIn); + + vecTmpFlt0 = vecTmpFlt1 * vecTmpFlt1; + /* + * a = (__logf_lut_f16[4] * r.f) + (__logf_lut_f16[0]); + */ + vecAcc0 = vdupq_n_f16(__logf_lut_f16[0]); + vecAcc0 = vfmaq(vecAcc0, vecTmpFlt1, __logf_lut_f16[4]); + /* + * b = (__logf_lut_f16[6] * r.f) + (__logf_lut_f16[2]); + */ + vecAcc1 = vdupq_n_f16(__logf_lut_f16[2]); + vecAcc1 = vfmaq(vecAcc1, vecTmpFlt1, __logf_lut_f16[6]); + /* + * c = (__logf_lut_f16[5] * r.f) + (__logf_lut_f16[1]); + */ + vecAcc2 = vdupq_n_f16(__logf_lut_f16[1]); + vecAcc2 = vfmaq(vecAcc2, vecTmpFlt1, __logf_lut_f16[5]); + /* + * d = (__logf_lut_f16[7] * r.f) + (__logf_lut_f16[3]); + */ + vecAcc3 = vdupq_n_f16(__logf_lut_f16[3]); + vecAcc3 = vfmaq(vecAcc3, vecTmpFlt1, __logf_lut_f16[7]); + /* + * a = a + b * xx; + */ + vecAcc0 = vfmaq(vecAcc0, vecAcc1, vecTmpFlt0); + /* + * c = c + d * xx; + */ + vecAcc2 = vfmaq(vecAcc2, vecAcc3, vecTmpFlt0); + /* + * xx = xx * xx; + */ + vecTmpFlt0 = vecTmpFlt0 * vecTmpFlt0; + vecExpUnBiasedFlt = vcvtq_f16_s16(vecExpUnBiased); + /* + * r.f = a + c * xx; + */ + vecAcc0 = vfmaq(vecAcc0, vecAcc2, vecTmpFlt0); + /* + * add exponent + * r.f = r.f + ((float32_t) m) * __logf_rng_f16; + */ + vecAcc0 = vfmaq(vecAcc0, vecExpUnBiasedFlt, __logf_rng_f16); + // set log0 down to -inf + vecAcc0 = vdupq_m_n_f16(vecAcc0, -(_Float16)F16INFINITY, vcmpeqq_n_f16(vecIn, 0.0f)); + return vecAcc0; +} + +__STATIC_INLINE float16x8_t vexpq_f16( + float16x8_t x) +{ + // Perform range reduction [-log(2),log(2)] + int16x8_t m = vcvtq_s16_f16(vmulq_n_f16(x, 1.4426950408f16)); + float16x8_t val = vfmsq_f16(x, vcvtq_f16_s16(m), vdupq_n_f16(0.6931471805f16)); + + // Polynomial Approximation + float16x8_t poly = vtaylor_polyq_f16(val, exp_tab_f16); + + // Reconstruct + poly = (float16x8_t) (vqaddq_s16((int16x8_t) (poly), vqshlq_n_s16(m, 10))); + + poly = vdupq_m_n_f16(poly, 0.0f16, vcmpltq_n_s16(m, -14)); + return poly; +} + +__STATIC_INLINE float16x8_t arm_vec_exponent_f16(float16x8_t x, int16_t nb) +{ + float16x8_t r = x; + nb--; + while (nb > 0) { + r = vmulq(r, x); + nb--; + } + return (r); +} + +__STATIC_INLINE f16x8_t vpowq_f16( + f16x8_t val, + f16x8_t n) +{ + return vexpq_f16(vmulq_f16(n, vlogq_f16(val))); +} + +#define INV_NEWTON_INIT_F16 0x7773 + +__STATIC_INLINE f16x8_t vrecip_f16(f16x8_t vecIn) +{ + f16x8_t vecSx, vecW, vecTmp; + any16x8_t v; + + vecSx = vabsq(vecIn); + + v.f = vecIn; + v.i = vsubq(vdupq_n_s16(INV_NEWTON_INIT_F16), v.i); + + vecW = vmulq(vecSx, v.f); + + // v.f = v.f * (8 + w * (-28 + w * (56 + w * (-70 + w *(56 + w * (-28 + w * (8 - w))))))); + vecTmp = vsubq(vdupq_n_f16(8.0f16), vecW); + vecTmp = vfmasq_n_f16(vecW, vecTmp, -28.0f16); + vecTmp = vfmasq_n_f16(vecW, vecTmp, 56.0f16); + vecTmp = vfmasq_n_f16(vecW, vecTmp, -70.0f16); + vecTmp = vfmasq_n_f16(vecW, vecTmp, 56.0f16); + vecTmp = vfmasq_n_f16(vecW, vecTmp, -28.0f16); + vecTmp = vfmasq_n_f16(vecW, vecTmp, 8.0f16); + v.f = vmulq(v.f, vecTmp); + + v.f = vdupq_m_n_f16(v.f, F16INFINITY, vcmpeqq_n_f16(vecIn, 0.0f)); + /* + * restore sign + */ + v.f = vnegq_m(v.f, v.f, vcmpltq_n_f16(vecIn, 0.0f)); + return v.f; +} + +__STATIC_INLINE f16x8_t vtanhq_f16( + f16x8_t val) +{ + f16x8_t x = + vminnmq_f16(vmaxnmq_f16(val, vdupq_n_f16(-10.f16)), vdupq_n_f16(10.0f16)); + f16x8_t exp2x = vexpq_f16(vmulq_n_f16(x, 2.f16)); + f16x8_t num = vsubq_n_f16(exp2x, 1.f16); + f16x8_t den = vaddq_n_f16(exp2x, 1.f16); + f16x8_t tanh = vmulq_f16(num, vrecip_f16(den)); + return tanh; +} + +#endif /* defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)*/ + + + +#ifdef __cplusplus +} +#endif + +#endif /* ARM FLOAT16 SUPPORTED */ + +#endif /* _ARM_VEC_MATH_F16_H */ + +/** + * + * End of file. + */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/basic_math_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/basic_math_functions.h new file mode 100644 index 0000000..dcc1f2a --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/basic_math_functions.h @@ -0,0 +1,880 @@ +/****************************************************************************** + * @file basic_math_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _BASIC_MATH_FUNCTIONS_H_ +#define _BASIC_MATH_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @defgroup groupMath Basic Math Functions + */ + + /** + * @brief Q7 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + +/** + * @brief Floating-point vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ +void arm_mult_f64( +const float64_t * pSrcA, +const float64_t * pSrcB, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Floating-point vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + +/** + * @brief Floating-point vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_f64( + const float64_t * pSrcA, + const float64_t * pSrcB, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Q7 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Floating-point vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_f64( + const float64_t * pSrcA, + const float64_t * pSrcB, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Q7 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q15 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a floating-point vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scale scale factor to be applied + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_f32( + const float32_t * pSrc, + float32_t scale, + float32_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Multiplies a floating-point vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scale scale factor to be applied + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_f64( + const float64_t * pSrc, + float64_t scale, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Multiplies a Q7 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q7( + const q7_t * pSrc, + q7_t scaleFract, + int8_t shift, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q15 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q15( + const q15_t * pSrc, + q15_t scaleFract, + int8_t shift, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Multiplies a Q31 vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scaleFract fractional portion of the scale value + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_q31( + const q31_t * pSrc, + q31_t scaleFract, + int8_t shift, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q7 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q7( + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Floating-point vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + +/** + * @brief Floating-point vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ +void arm_abs_f64( +const float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Q15 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Q31 vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Dot product of floating-point vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + uint32_t blockSize, + float32_t * result); + + + +/** + * @brief Dot product of floating-point vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ +void arm_dot_prod_f64( +const float64_t * pSrcA, +const float64_t * pSrcB, + uint32_t blockSize, + float64_t * result); + + + + /** + * @brief Dot product of Q7 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + uint32_t blockSize, + q31_t * result); + + + /** + * @brief Dot product of Q15 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + + /** + * @brief Dot product of Q31 vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + uint32_t blockSize, + q63_t * result); + + + /** + * @brief Shifts the elements of a Q7 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q7( + const q7_t * pSrc, + int8_t shiftBits, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Shifts the elements of a Q15 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q15( + const q15_t * pSrc, + int8_t shiftBits, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Shifts the elements of a Q31 vector a specified number of bits. + * @param[in] pSrc points to the input vector + * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_shift_q31( + const q31_t * pSrc, + int8_t shiftBits, + q31_t * pDst, + uint32_t blockSize); + + +/** + * @brief Adds a constant offset to a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_offset_f64( +const float64_t * pSrc, + float64_t offset, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Adds a constant offset to a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_f32( + const float32_t * pSrc, + float32_t offset, + float32_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Adds a constant offset to a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q7( + const q7_t * pSrc, + q7_t offset, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q15( + const q15_t * pSrc, + q15_t offset, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_q31( + const q31_t * pSrc, + q31_t offset, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + +/** + * @brief Negates the elements of a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ +void arm_negate_f64( +const float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Negates the elements of a Q7 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q7( + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q15 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Negates the elements of a Q31 vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +/** + * @brief Compute the logical bitwise AND of two fixed-point vectors. + * @param[in] pSrcA points to input vector A + * @param[in] pSrcB points to input vector B + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_and_u16( + const uint16_t * pSrcA, + const uint16_t * pSrcB, + uint16_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise AND of two fixed-point vectors. + * @param[in] pSrcA points to input vector A + * @param[in] pSrcB points to input vector B + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_and_u32( + const uint32_t * pSrcA, + const uint32_t * pSrcB, + uint32_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise AND of two fixed-point vectors. + * @param[in] pSrcA points to input vector A + * @param[in] pSrcB points to input vector B + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_and_u8( + const uint8_t * pSrcA, + const uint8_t * pSrcB, + uint8_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise OR of two fixed-point vectors. + * @param[in] pSrcA points to input vector A + * @param[in] pSrcB points to input vector B + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_or_u16( + const uint16_t * pSrcA, + const uint16_t * pSrcB, + uint16_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise OR of two fixed-point vectors. + * @param[in] pSrcA points to input vector A + * @param[in] pSrcB points to input vector B + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_or_u32( + const uint32_t * pSrcA, + const uint32_t * pSrcB, + uint32_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise OR of two fixed-point vectors. + * @param[in] pSrcA points to input vector A + * @param[in] pSrcB points to input vector B + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_or_u8( + const uint8_t * pSrcA, + const uint8_t * pSrcB, + uint8_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise NOT of a fixed-point vector. + * @param[in] pSrc points to input vector + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_not_u16( + const uint16_t * pSrc, + uint16_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise NOT of a fixed-point vector. + * @param[in] pSrc points to input vector + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_not_u32( + const uint32_t * pSrc, + uint32_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise NOT of a fixed-point vector. + * @param[in] pSrc points to input vector + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_not_u8( + const uint8_t * pSrc, + uint8_t * pDst, + uint32_t blockSize); + +/** + * @brief Compute the logical bitwise XOR of two fixed-point vectors. + * @param[in] pSrcA points to input vector A + * @param[in] pSrcB points to input vector B + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_xor_u16( + const uint16_t * pSrcA, + const uint16_t * pSrcB, + uint16_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise XOR of two fixed-point vectors. + * @param[in] pSrcA points to input vector A + * @param[in] pSrcB points to input vector B + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_xor_u32( + const uint32_t * pSrcA, + const uint32_t * pSrcB, + uint32_t * pDst, + uint32_t blockSize); + + /** + * @brief Compute the logical bitwise XOR of two fixed-point vectors. + * @param[in] pSrcA points to input vector A + * @param[in] pSrcB points to input vector B + * @param[out] pDst points to output vector + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_xor_u8( + const uint8_t * pSrcA, + const uint8_t * pSrcB, + uint8_t * pDst, + uint32_t blockSize); + + /** + @brief Elementwise floating-point clipping + @param[in] pSrc points to input values + @param[out] pDst points to output clipped values + @param[in] low lower bound + @param[in] high higher bound + @param[in] numSamples number of samples to clip + @return none + */ + +void arm_clip_f32(const float32_t * pSrc, + float32_t * pDst, + float32_t low, + float32_t high, + uint32_t numSamples); + + /** + @brief Elementwise fixed-point clipping + @param[in] pSrc points to input values + @param[out] pDst points to output clipped values + @param[in] low lower bound + @param[in] high higher bound + @param[in] numSamples number of samples to clip + @return none + */ + +void arm_clip_q31(const q31_t * pSrc, + q31_t * pDst, + q31_t low, + q31_t high, + uint32_t numSamples); + + /** + @brief Elementwise fixed-point clipping + @param[in] pSrc points to input values + @param[out] pDst points to output clipped values + @param[in] low lower bound + @param[in] high higher bound + @param[in] numSamples number of samples to clip + @return none + */ + +void arm_clip_q15(const q15_t * pSrc, + q15_t * pDst, + q15_t low, + q15_t high, + uint32_t numSamples); + + /** + @brief Elementwise fixed-point clipping + @param[in] pSrc points to input values + @param[out] pDst points to output clipped values + @param[in] low lower bound + @param[in] high higher bound + @param[in] numSamples number of samples to clip + @return none + */ + +void arm_clip_q7(const q7_t * pSrc, + q7_t * pDst, + q7_t low, + q7_t high, + uint32_t numSamples); + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _BASIC_MATH_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/basic_math_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/basic_math_functions_f16.h new file mode 100644 index 0000000..285e4a0 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/basic_math_functions_f16.h @@ -0,0 +1,167 @@ +/****************************************************************************** + * @file basic_math_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _BASIC_MATH_FUNCTIONS_F16_H_ +#define _BASIC_MATH_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + + + /** + * @brief Floating-point vector addition. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_add_f16( + const float16_t * pSrcA, + const float16_t * pSrcB, + float16_t * pDst, + uint32_t blockSize); + + /** + * @brief Floating-point vector subtraction. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_sub_f16( + const float16_t * pSrcA, + const float16_t * pSrcB, + float16_t * pDst, + uint32_t blockSize); + + /** + * @brief Multiplies a floating-point vector by a scalar. + * @param[in] pSrc points to the input vector + * @param[in] scale scale factor to be applied + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_scale_f16( + const float16_t * pSrc, + float16_t scale, + float16_t * pDst, + uint32_t blockSize); + + /** + * @brief Floating-point vector absolute value. + * @param[in] pSrc points to the input buffer + * @param[out] pDst points to the output buffer + * @param[in] blockSize number of samples in each vector + */ + void arm_abs_f16( + const float16_t * pSrc, + float16_t * pDst, + uint32_t blockSize); + + + /** + * @brief Adds a constant offset to a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[in] offset is the offset to be added + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_offset_f16( + const float16_t * pSrc, + float16_t offset, + float16_t * pDst, + uint32_t blockSize); + + /** + * @brief Dot product of floating-point vectors. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[out] result output result returned here + */ + void arm_dot_prod_f16( + const float16_t * pSrcA, + const float16_t * pSrcB, + uint32_t blockSize, + float16_t * result); + + /** + * @brief Floating-point vector multiplication. + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in each vector + */ + void arm_mult_f16( + const float16_t * pSrcA, + const float16_t * pSrcB, + float16_t * pDst, + uint32_t blockSize); + + /** + * @brief Negates the elements of a floating-point vector. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] blockSize number of samples in the vector + */ + void arm_negate_f16( + const float16_t * pSrc, + float16_t * pDst, + uint32_t blockSize); + + /** + @brief Elementwise floating-point clipping + @param[in] pSrc points to input values + @param[out] pDst points to output clipped values + @param[in] low lower bound + @param[in] high higher bound + @param[in] numSamples number of samples to clip + @return none + */ + +void arm_clip_f16(const float16_t * pSrc, + float16_t * pDst, + float16_t low, + float16_t high, + uint32_t numSamples); + +#endif /* defined(ARM_FLOAT16_SUPPORTED)*/ + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _BASIC_MATH_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/bayes_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/bayes_functions.h new file mode 100644 index 0000000..824c50e --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/bayes_functions.h @@ -0,0 +1,89 @@ +/****************************************************************************** + * @file bayes_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _BAYES_FUNCTIONS_H_ +#define _BAYES_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/statistics_functions.h" + +/** + * @defgroup groupBayes Bayesian estimators + * + * Implement the naive gaussian Bayes estimator. + * The training must be done from scikit-learn. + * + * The parameters can be easily + * generated from the scikit-learn object. Some examples are given in + * DSP/Testing/PatternGeneration/Bayes.py + */ + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @brief Instance structure for Naive Gaussian Bayesian estimator. + */ +typedef struct +{ + uint32_t vectorDimension; /**< Dimension of vector space */ + uint32_t numberOfClasses; /**< Number of different classes */ + const float32_t *theta; /**< Mean values for the Gaussians */ + const float32_t *sigma; /**< Variances for the Gaussians */ + const float32_t *classPriors; /**< Class prior probabilities */ + float32_t epsilon; /**< Additive value to variances */ +} arm_gaussian_naive_bayes_instance_f32; + +/** + * @brief Naive Gaussian Bayesian Estimator + * + * @param[in] S points to a naive bayes instance structure + * @param[in] in points to the elements of the input vector. + * @param[out] *pOutputProbabilities points to a buffer of length numberOfClasses containing estimated probabilities + * @param[out] *pBufferB points to a temporary buffer of length numberOfClasses + * @return The predicted class + * + */ + + +uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_instance_f32 *S, + const float32_t * in, + float32_t *pOutputProbabilities, + float32_t *pBufferB); + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _BAYES_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/bayes_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/bayes_functions_f16.h new file mode 100644 index 0000000..5c4ae42 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/bayes_functions_f16.h @@ -0,0 +1,80 @@ +/****************************************************************************** + * @file bayes_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _BAYES_FUNCTIONS_F16_H_ +#define _BAYES_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/statistics_functions_f16.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + +/** + * @brief Instance structure for Naive Gaussian Bayesian estimator. + */ +typedef struct +{ + uint32_t vectorDimension; /**< Dimension of vector space */ + uint32_t numberOfClasses; /**< Number of different classes */ + const float16_t *theta; /**< Mean values for the Gaussians */ + const float16_t *sigma; /**< Variances for the Gaussians */ + const float16_t *classPriors; /**< Class prior probabilities */ + float16_t epsilon; /**< Additive value to variances */ +} arm_gaussian_naive_bayes_instance_f16; + +/** + * @brief Naive Gaussian Bayesian Estimator + * + * @param[in] S points to a naive bayes instance structure + * @param[in] in points to the elements of the input vector. + * @param[out] *pOutputProbabilities points to a buffer of length numberOfClasses containing estimated probabilities + * @param[out] *pBufferB points to a temporary buffer of length numberOfClasses + * @return The predicted class + * + */ + + +uint32_t arm_gaussian_naive_bayes_predict_f16(const arm_gaussian_naive_bayes_instance_f16 *S, + const float16_t * in, + float16_t *pOutputProbabilities, + float16_t *pBufferB); + +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _BAYES_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/complex_math_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/complex_math_functions.h new file mode 100644 index 0000000..1339eba --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/complex_math_functions.h @@ -0,0 +1,345 @@ +/****************************************************************************** + * @file complex_math_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _COMPLEX_MATH_FUNCTIONS_H_ +#define _COMPLEX_MATH_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" +#include "dsp/fast_math_functions.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @defgroup groupCmplxMath Complex Math Functions + * This set of functions operates on complex data vectors. + * The data in the complex arrays is stored in an interleaved fashion + * (real, imag, real, imag, ...). + * In the API functions, the number of samples in a complex array refers + * to the number of complex values; the array contains twice this number of + * real values. + */ + + /** + * @brief Floating-point complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + /** + * @brief Q31 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_f64( + const float64_t * pSrc, + float64_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + +/** + * @brief Floating-point complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t numSamples); + + +/** + * @brief Floating-point complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_f64( + const float64_t * pSrc, + float64_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + /** + * @brief Q15 complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_fast_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q15 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + uint32_t numSamples, + q31_t * realResult, + q31_t * imagResult); + + + /** + * @brief Q31 complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + uint32_t numSamples, + q63_t * realResult, + q63_t * imagResult); + + + /** + * @brief Floating-point complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + uint32_t numSamples, + float32_t * realResult, + float32_t * imagResult); + + + /** + * @brief Q15 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_q15( + const q15_t * pSrcCmplx, + const q15_t * pSrcReal, + q15_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_q31( + const q31_t * pSrcCmplx, + const q31_t * pSrcReal, + q31_t * pCmplxDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_f32( + const float32_t * pSrcCmplx, + const float32_t * pSrcReal, + float32_t * pCmplxDst, + uint32_t numSamples); + + /** + * @brief Q15 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + q15_t * pDst, + uint32_t numSamples); + + + /** + * @brief Q31 complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + q31_t * pDst, + uint32_t numSamples); + + + /** + * @brief Floating-point complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + float32_t * pDst, + uint32_t numSamples); + + + +/** + * @brief Floating-point complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ +void arm_cmplx_mult_cmplx_f64( +const float64_t * pSrcA, +const float64_t * pSrcB, + float64_t * pDst, + uint32_t numSamples); + + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _COMPLEX_MATH_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/complex_math_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/complex_math_functions_f16.h new file mode 100644 index 0000000..b17f931 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/complex_math_functions_f16.h @@ -0,0 +1,123 @@ +/****************************************************************************** + * @file complex_math_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _COMPLEX_MATH_FUNCTIONS_F16_H_ +#define _COMPLEX_MATH_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" +#include "dsp/fast_math_functions_f16.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + + /** + * @brief Floating-point complex conjugate. + * @param[in] pSrc points to the input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_conj_f16( + const float16_t * pSrc, + float16_t * pDst, + uint32_t numSamples); + + /** + * @brief Floating-point complex magnitude squared + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_squared_f16( + const float16_t * pSrc, + float16_t * pDst, + uint32_t numSamples); + + /** + * @brief Floating-point complex magnitude + * @param[in] pSrc points to the complex input vector + * @param[out] pDst points to the real output vector + * @param[in] numSamples number of complex samples in the input vector + */ + void arm_cmplx_mag_f16( + const float16_t * pSrc, + float16_t * pDst, + uint32_t numSamples); + + /** + * @brief Floating-point complex dot product + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] numSamples number of complex samples in each vector + * @param[out] realResult real part of the result returned here + * @param[out] imagResult imaginary part of the result returned here + */ + void arm_cmplx_dot_prod_f16( + const float16_t * pSrcA, + const float16_t * pSrcB, + uint32_t numSamples, + float16_t * realResult, + float16_t * imagResult); + + /** + * @brief Floating-point complex-by-real multiplication + * @param[in] pSrcCmplx points to the complex input vector + * @param[in] pSrcReal points to the real input vector + * @param[out] pCmplxDst points to the complex output vector + * @param[in] numSamples number of samples in each vector + */ + void arm_cmplx_mult_real_f16( + const float16_t * pSrcCmplx, + const float16_t * pSrcReal, + float16_t * pCmplxDst, + uint32_t numSamples); + + /** + * @brief Floating-point complex-by-complex multiplication + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[out] pDst points to the output vector + * @param[in] numSamples number of complex samples in each vector + */ + void arm_cmplx_mult_cmplx_f16( + const float16_t * pSrcA, + const float16_t * pSrcB, + float16_t * pDst, + uint32_t numSamples); + +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _COMPLEX_MATH_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/controller_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/controller_functions.h new file mode 100644 index 0000000..667c40e --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/controller_functions.h @@ -0,0 +1,793 @@ +/****************************************************************************** + * @file controller_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _CONTROLLER_FUNCTIONS_H_ +#define _CONTROLLER_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * @brief Macros required for SINE and COSINE Controller functions + */ + +#define CONTROLLER_Q31_SHIFT (32 - 9) + /* 1.31(q31) Fixed value of 2/360 */ + /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ +#define INPUT_SPACING 0xB60B61 + +/** + * @defgroup groupController Controller Functions + */ + + +/** + @ingroup groupController + */ + +/** + @defgroup SinCos Sine Cosine + + Computes the trigonometric sine and cosine values using a combination of table lookup + and linear interpolation. + There are separate functions for Q31 and floating-point data types. + The input to the floating-point version is in degrees while the + fixed-point Q31 have a scaled input with the range + [-1 0.9999] mapping to [-180 +180] degrees. + + The floating point function also allows values that are out of the usual range. When this happens, the function will + take extra time to adjust the input value to the range of [-180 180]. + + The result is accurate to 5 digits after the decimal point. + + The implementation is based on table lookup using 360 values together with linear interpolation. + The steps used are: + -# Calculation of the nearest integer table index. + -# Compute the fractional portion (fract) of the input. + -# Fetch the value corresponding to \c index from sine table to \c y0 and also value from \c index+1 to \c y1. + -# Sine value is computed as *psinVal = y0 + (fract * (y1 - y0)). + -# Fetch the value corresponding to \c index from cosine table to \c y0 and also value from \c index+1 to \c y1. + -# Cosine value is computed as *pcosVal = y0 + (fract * (y1 - y0)). + */ + +/** + * @brief Floating-point sin_cos function. + * @param[in] theta input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cos output. + */ + void arm_sin_cos_f32( + float32_t theta, + float32_t * pSinVal, + float32_t * pCosVal); + + + /** + * @brief Q31 sin_cos function. + * @param[in] theta scaled input value in degrees + * @param[out] pSinVal points to the processed sine output. + * @param[out] pCosVal points to the processed cosine output. + */ + void arm_sin_cos_q31( + q31_t theta, + q31_t * pSinVal, + q31_t * pCosVal); + + +/** + @ingroup groupController + */ + +/** + * @defgroup PID PID Motor Control + * + * A Proportional Integral Derivative (PID) controller is a generic feedback control + * loop mechanism widely used in industrial control systems. + * A PID controller is the most commonly used type of feedback controller. + * + * This set of functions implements (PID) controllers + * for Q15, Q31, and floating-point data types. The functions operate on a single sample + * of data and each call to the function returns a single processed value. + * S points to an instance of the PID control data structure. in + * is the input sample value. The functions return the output value. + * + * \par Algorithm: + *
+   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
+   *    A0 = Kp + Ki + Kd
+   *    A1 = (-Kp ) - (2 * Kd )
+   *    A2 = Kd
+   * 
+ * + * \par + * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant + * + * \par + * \image html PID.gif "Proportional Integral Derivative Controller" + * + * \par + * The PID controller calculates an "error" value as the difference between + * the measured output and the reference input. + * The controller attempts to minimize the error by adjusting the process control inputs. + * The proportional value determines the reaction to the current error, + * the integral value determines the reaction based on the sum of recent errors, + * and the derivative value determines the reaction based on the rate at which the error has been changing. + * + * \par Instance Structure + * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. + * A separate instance structure must be defined for each PID Controller. + * There are separate instance structure declarations for each of the 3 supported data types. + * + * \par Reset Functions + * There is also an associated reset function for each data type which clears the state array. + * + * \par Initialization Functions + * There is also an associated initialization function for each data type. + * The initialization function performs the following operations: + * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. + * - Zeros out the values in the state buffer. + * + * \par + * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. + * + * \par Fixed-Point Behavior + * Care must be taken when using the fixed-point versions of the PID Controller functions. + * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + + /** + * @ingroup PID + * @brief Instance structure for the Q15 PID Control. + */ + typedef struct + { + q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ +#if !defined (ARM_MATH_DSP) + q15_t A1; /**< The derived gain A1 = -Kp - 2Kd */ + q15_t A2; /**< The derived gain A1 = Kd. */ +#else + q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ +#endif + q15_t state[3]; /**< The state array of length 3. */ + q15_t Kp; /**< The proportional gain. */ + q15_t Ki; /**< The integral gain. */ + q15_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q15; + + /** + * @ingroup PID + * @brief Instance structure for the Q31 PID Control. + */ + typedef struct + { + q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + q31_t A2; /**< The derived gain, A2 = Kd . */ + q31_t state[3]; /**< The state array of length 3. */ + q31_t Kp; /**< The proportional gain. */ + q31_t Ki; /**< The integral gain. */ + q31_t Kd; /**< The derivative gain. */ + } arm_pid_instance_q31; + + /** + * @ingroup PID + * @brief Instance structure for the floating-point PID Control. + */ + typedef struct + { + float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ + float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ + float32_t A2; /**< The derived gain, A2 = Kd . */ + float32_t state[3]; /**< The state array of length 3. */ + float32_t Kp; /**< The proportional gain. */ + float32_t Ki; /**< The integral gain. */ + float32_t Kd; /**< The derivative gain. */ + } arm_pid_instance_f32; + + + + /** + * @brief Initialization function for the floating-point PID Control. + * @param[in,out] S points to an instance of the PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_f32( + arm_pid_instance_f32 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + */ + void arm_pid_reset_f32( + arm_pid_instance_f32 * S); + + + /** + * @brief Initialization function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_q31( + arm_pid_instance_q31 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q31 PID Control. + * @param[in,out] S points to an instance of the Q31 PID Control structure + */ + + void arm_pid_reset_q31( + arm_pid_instance_q31 * S); + + + /** + * @brief Initialization function for the Q15 PID Control. + * @param[in,out] S points to an instance of the Q15 PID structure. + * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. + */ + void arm_pid_init_q15( + arm_pid_instance_q15 * S, + int32_t resetStateFlag); + + + /** + * @brief Reset function for the Q15 PID Control. + * @param[in,out] S points to an instance of the q15 PID Control structure + */ + void arm_pid_reset_q15( + arm_pid_instance_q15 * S); + + + + + + /** + * @ingroup PID + * @brief Process function for the floating-point PID Control. + * @param[in,out] S is an instance of the floating-point PID Control structure + * @param[in] in input sample to process + * @return processed output sample. + */ + __STATIC_FORCEINLINE float32_t arm_pid_f32( + arm_pid_instance_f32 * S, + float32_t in) + { + float32_t out; + + /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ + out = (S->A0 * in) + + (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + + } + +/** + @ingroup PID + @brief Process function for the Q31 PID Control. + @param[in,out] S points to an instance of the Q31 PID Control structure + @param[in] in input sample to process + @return processed output sample. + + \par Scaling and Overflow Behavior + The function is implemented using an internal 64-bit accumulator. + The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. + Thus, if the accumulator result overflows it wraps around rather than clip. + In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. + After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. + */ +__STATIC_FORCEINLINE q31_t arm_pid_q31( + arm_pid_instance_q31 * S, + q31_t in) + { + q63_t acc; + q31_t out; + + /* acc = A0 * x[n] */ + acc = (q63_t) S->A0 * in; + + /* acc += A1 * x[n-1] */ + acc += (q63_t) S->A1 * S->state[0]; + + /* acc += A2 * x[n-2] */ + acc += (q63_t) S->A2 * S->state[1]; + + /* convert output to 1.31 format to add y[n-1] */ + out = (q31_t) (acc >> 31U); + + /* out += y[n-1] */ + out += S->state[2]; + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + } + + +/** + @ingroup PID + @brief Process function for the Q15 PID Control. + @param[in,out] S points to an instance of the Q15 PID Control structure + @param[in] in input sample to process + @return processed output sample. + + \par Scaling and Overflow Behavior + The function is implemented using a 64-bit internal accumulator. + Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. + The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. + There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. + After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. + Lastly, the accumulator is saturated to yield a result in 1.15 format. + */ +__STATIC_FORCEINLINE q15_t arm_pid_q15( + arm_pid_instance_q15 * S, + q15_t in) + { + q63_t acc; + q15_t out; + +#if defined (ARM_MATH_DSP) + /* Implementation of PID controller */ + + /* acc = A0 * x[n] */ + acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)read_q15x2 (S->state), (uint64_t)acc); +#else + /* acc = A0 * x[n] */ + acc = ((q31_t) S->A0) * in; + + /* acc += A1 * x[n-1] + A2 * x[n-2] */ + acc += (q31_t) S->A1 * S->state[0]; + acc += (q31_t) S->A2 * S->state[1]; +#endif + + /* acc += y[n-1] */ + acc += (q31_t) S->state[2] << 15; + + /* saturate the output */ + out = (q15_t) (__SSAT((q31_t)(acc >> 15), 16)); + + /* Update state */ + S->state[1] = S->state[0]; + S->state[0] = in; + S->state[2] = out; + + /* return to application */ + return (out); + } + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup park Vector Park Transform + * + * Forward Park transform converts the input two-coordinate vector to flux and torque components. + * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents + * from the stationary to the moving reference frame and control the spatial relationship between + * the stator vector current and rotor flux vector. + * If we consider the d axis aligned with the rotor flux, the diagram below shows the + * current vector and the relationship from the two reference frames: + * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkFormula.gif + * where Ialpha and Ibeta are the stator vector components, + * pId and pIq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + + + /** + * @ingroup park + * @brief Floating-point Park transform + * @param[in] Ialpha input two-phase vector coordinate alpha + * @param[in] Ibeta input two-phase vector coordinate beta + * @param[out] pId points to output rotor reference frame d + * @param[out] pIq points to output rotor reference frame q + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none + * + * The function implements the forward Park transform. + * + */ + __STATIC_FORCEINLINE void arm_park_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pId, + float32_t * pIq, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ + *pId = Ialpha * cosVal + Ibeta * sinVal; + + /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ + *pIq = -Ialpha * sinVal + Ibeta * cosVal; + } + + +/** + @ingroup park + @brief Park transform for Q31 version + @param[in] Ialpha input two-phase vector coordinate alpha + @param[in] Ibeta input two-phase vector coordinate beta + @param[out] pId points to output rotor reference frame d + @param[out] pIq points to output rotor reference frame q + @param[in] sinVal sine value of rotation angle theta + @param[in] cosVal cosine value of rotation angle theta + @return none + + \par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + There is saturation on the addition and subtraction, hence there is no risk of overflow. + */ +__STATIC_FORCEINLINE void arm_park_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pId, + q31_t * pIq, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Ialpha * cosVal) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * sinVal) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Ialpha * sinVal) */ + product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Ibeta * cosVal) */ + product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); + + /* Calculate pId by adding the two intermediate products 1 and 2 */ + *pId = __QADD(product1, product2); + + /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ + *pIq = __QSUB(product4, product3); + } + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_park Vector Inverse Park transform + * Inverse Park transform converts the input flux and torque components to two-coordinate vector. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html parkInvFormula.gif + * where pIalpha and pIbeta are the stator vector components, + * Id and Iq are rotor vector components and cosVal and sinVal are the + * cosine and sine values of theta (rotor flux position). + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Park transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + + + /** + * @ingroup inv_park + * @brief Floating-point Inverse Park transform + * @param[in] Id input coordinate of rotor reference frame d + * @param[in] Iq input coordinate of rotor reference frame q + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * @param[in] sinVal sine value of rotation angle theta + * @param[in] cosVal cosine value of rotation angle theta + * @return none + */ + __STATIC_FORCEINLINE void arm_inv_park_f32( + float32_t Id, + float32_t Iq, + float32_t * pIalpha, + float32_t * pIbeta, + float32_t sinVal, + float32_t cosVal) + { + /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ + *pIalpha = Id * cosVal - Iq * sinVal; + + /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ + *pIbeta = Id * sinVal + Iq * cosVal; + } + + +/** + @ingroup inv_park + @brief Inverse Park transform for Q31 version + @param[in] Id input coordinate of rotor reference frame d + @param[in] Iq input coordinate of rotor reference frame q + @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + @param[out] pIbeta points to output two-phase orthogonal vector axis beta + @param[in] sinVal sine value of rotation angle theta + @param[in] cosVal cosine value of rotation angle theta + @return none + + @par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + There is saturation on the addition, hence there is no risk of overflow. + */ +__STATIC_FORCEINLINE void arm_inv_park_q31( + q31_t Id, + q31_t Iq, + q31_t * pIalpha, + q31_t * pIbeta, + q31_t sinVal, + q31_t cosVal) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + q31_t product3, product4; /* Temporary variables used to store intermediate results */ + + /* Intermediate product is calculated by (Id * cosVal) */ + product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); + + /* Intermediate product is calculated by (Iq * sinVal) */ + product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); + + + /* Intermediate product is calculated by (Id * sinVal) */ + product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); + + /* Intermediate product is calculated by (Iq * cosVal) */ + product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); + + /* Calculate pIalpha by using the two intermediate products 1 and 2 */ + *pIalpha = __QSUB(product1, product2); + + /* Calculate pIbeta by using the two intermediate products 3 and 4 */ + *pIbeta = __QADD(product4, product3); + } + + +/** + * @ingroup groupController + */ + + /** + * @defgroup clarke Vector Clarke Transform + * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. + * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents + * in the two-phase orthogonal stator axis Ialpha and Ibeta. + * When Ialpha is superposed with Ia as shown in the figure below + * \image html clarke.gif Stator current space vector and its components in (a,b). + * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta + * can be calculated using only Ia and Ib. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeFormula.gif + * where Ia and Ib are the instantaneous stator phases and + * pIalpha and pIbeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + + /** + * + * @ingroup clarke + * @brief Floating-point Clarke transform + * @param[in] Ia input three-phase coordinate a + * @param[in] Ib input three-phase coordinate b + * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + * @param[out] pIbeta points to output two-phase orthogonal vector axis beta + * @return none + */ + __STATIC_FORCEINLINE void arm_clarke_f32( + float32_t Ia, + float32_t Ib, + float32_t * pIalpha, + float32_t * pIbeta) + { + /* Calculate pIalpha using the equation, pIalpha = Ia */ + *pIalpha = Ia; + + /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ + *pIbeta = (0.57735026919f * Ia + 1.15470053838f * Ib); + } + + +/** + @ingroup clarke + @brief Clarke transform for Q31 version + @param[in] Ia input three-phase coordinate a + @param[in] Ib input three-phase coordinate b + @param[out] pIalpha points to output two-phase orthogonal vector axis alpha + @param[out] pIbeta points to output two-phase orthogonal vector axis beta + @return none + + \par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + There is saturation on the addition, hence there is no risk of overflow. + */ +__STATIC_FORCEINLINE void arm_clarke_q31( + q31_t Ia, + q31_t Ib, + q31_t * pIalpha, + q31_t * pIbeta) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIalpha from Ia by equation pIalpha = Ia */ + *pIalpha = Ia; + + /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); + + /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ + product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); + + /* pIbeta is calculated by adding the intermediate products */ + *pIbeta = __QADD(product1, product2); + } + + + + /** + * @ingroup groupController + */ + + /** + * @defgroup inv_clarke Vector Inverse Clarke Transform + * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. + * + * The function operates on a single sample of data and each call to the function returns the processed output. + * The library provides separate functions for Q31 and floating-point data types. + * \par Algorithm + * \image html clarkeInvFormula.gif + * where pIa and pIb are the instantaneous stator phases and + * Ialpha and Ibeta are the two coordinates of time invariant vector. + * \par Fixed-Point Behavior + * Care must be taken when using the Q31 version of the Clarke transform. + * In particular, the overflow and saturation behavior of the accumulator used must be considered. + * Refer to the function specific documentation below for usage guidelines. + */ + + + + /** + * @ingroup inv_clarke + * @brief Floating-point Inverse Clarke transform + * @param[in] Ialpha input two-phase orthogonal vector axis alpha + * @param[in] Ibeta input two-phase orthogonal vector axis beta + * @param[out] pIa points to output three-phase coordinate a + * @param[out] pIb points to output three-phase coordinate b + * @return none + */ + __STATIC_FORCEINLINE void arm_inv_clarke_f32( + float32_t Ialpha, + float32_t Ibeta, + float32_t * pIa, + float32_t * pIb) + { + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ + *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; + } + + +/** + @ingroup inv_clarke + @brief Inverse Clarke transform for Q31 version + @param[in] Ialpha input two-phase orthogonal vector axis alpha + @param[in] Ibeta input two-phase orthogonal vector axis beta + @param[out] pIa points to output three-phase coordinate a + @param[out] pIb points to output three-phase coordinate b + @return none + + \par Scaling and Overflow Behavior + The function is implemented using an internal 32-bit accumulator. + The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. + There is saturation on the subtraction, hence there is no risk of overflow. + */ +__STATIC_FORCEINLINE void arm_inv_clarke_q31( + q31_t Ialpha, + q31_t Ibeta, + q31_t * pIa, + q31_t * pIb) + { + q31_t product1, product2; /* Temporary variables used to store intermediate results */ + + /* Calculating pIa from Ialpha by equation pIa = Ialpha */ + *pIa = Ialpha; + + /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ + product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); + + /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ + product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); + + /* pIb is calculated by subtracting the products */ + *pIb = __QSUB(product2, product1); + } + + + + + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _CONTROLLER_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/controller_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/controller_functions_f16.h new file mode 100644 index 0000000..8fae483 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/controller_functions_f16.h @@ -0,0 +1,41 @@ +/****************************************************************************** + * @file controller_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _CONTROLLER_FUNCTIONS_F16_H_ +#define _CONTROLLER_FUNCTIONS_F16_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _CONTROLLER_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/debug.h b/Middlewares/ST/ARM/DSP/Include/dsp/debug.h new file mode 100644 index 0000000..c95804c --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/debug.h @@ -0,0 +1,146 @@ +/****************************************************************************** + * @file basic_math_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _DEBUG_FUNCTIONS_H_ +#define _DEBUG_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/matrix_functions.h" +#include "dsp/matrix_functions_f16.h" + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) +#define PROW_f16(S,NB) \ +{ \ + printf("{%f",(double)(S)[0]); \ + for(unsigned int i=1;i<(NB) ;i++) \ + { \ + printf(",%f",(double)(S)[i]);\ + } \ + printf("}"); \ +}; + +#define PV_f16(S,V,NB)\ +{ \ + printf("%s=",(S)); \ + PROW_f16((V),(NB)); \ + printf(";\n"); \ +}; + +#define PM_f16(S,M) \ +{ \ + printf("%s={",(S)); \ + for(unsigned int row=0;row<(M)->numRows;row++) \ + { \ + if (row != 0) \ + { \ + printf("\n,"); \ + } \ + PROW_f16((M)->pData + row * (M)->numCols, (M)->numCols);\ + } \ + printf("};\n"); \ +} + +#endif + +#define PROW_f32(S,NB) \ +{ \ + printf("{%f",(double)(S)[0]); \ + for(unsigned int i=1;i<(NB) ;i++) \ + { \ + printf(",%f",(double)(S)[i]);\ + } \ + printf("}"); \ +}; + +#define PV_f32(S,V,NB)\ +{ \ + printf("%s=",(S)); \ + PROW_f32((V),(NB)); \ + printf(";\n"); \ +}; + +#define PM_f32(S,M) \ +{ \ + printf("%s={",(S)); \ + for(unsigned int row=0;row<(M)->numRows;row++) \ + { \ + if (row != 0) \ + { \ + printf("\n,"); \ + } \ + PROW_f32((M)->pData + row * (M)->numCols, (M)->numCols);\ + } \ + printf("};\n"); \ +} + +#define PROW_f64(S,NB) \ +{ \ + printf("{%.20g",(double)(S)[0]); \ + for(unsigned int i=1;i<(NB) ;i++) \ + { \ + printf(",%.20g",(double)(S)[i]);\ + } \ + printf("}"); \ +}; + +#define PV_f64(S,V,NB) \ +{ \ + printf("%s=",(S)); \ + PROW_f64((V),(NB));\ + printf(";\n"); \ +}; + +#define PM_f64(S,M) \ +{ \ + printf("%s={",(S)); \ + for(unsigned int row=0;row<(M)->numRows;row++) \ + { \ + if (row != 0) \ + { \ + printf("\n,"); \ + } \ + PROW_f64((M)->pData + row * (M)->numCols, (M)->numCols);\ + } \ + printf("};\n"); \ +} + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _DEBUG_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/distance_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/distance_functions.h new file mode 100644 index 0000000..135cba6 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/distance_functions.h @@ -0,0 +1,387 @@ +/****************************************************************************** + * @file distance_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _DISTANCE_FUNCTIONS_H_ +#define _DISTANCE_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/statistics_functions.h" +#include "dsp/basic_math_functions.h" +#include "dsp/fast_math_functions.h" +#include "dsp/matrix_functions.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * @defgroup groupDistance Distance functions + * + * Distance functions for use with clustering algorithms. + * There are distance functions for float vectors and boolean vectors. + * + */ + +/* 6.14 bug */ +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) && (__ARMCC_VERSION < 6150001) + +__attribute__((weak)) float __powisf2(float a, int b); + +#endif + +/** + * @brief Euclidean distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ + +float32_t arm_euclidean_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); + +/** + * @brief Euclidean distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ + +float64_t arm_euclidean_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize); + +/** + * @brief Bray-Curtis distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float32_t arm_braycurtis_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); + +/** + * @brief Canberra distance between two vectors + * + * This function may divide by zero when samples pA[i] and pB[i] are both zero. + * The result of the computation will be correct. So the division per zero may be + * ignored. + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float32_t arm_canberra_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); + + +/** + * @brief Chebyshev distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float32_t arm_chebyshev_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); + + +/** + * @brief Chebyshev distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float64_t arm_chebyshev_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize); + + +/** + * @brief Cityblock (Manhattan) distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float32_t arm_cityblock_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); + +/** + * @brief Cityblock (Manhattan) distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float64_t arm_cityblock_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize); + +/** + * @brief Correlation distance between two vectors + * + * The input vectors are modified in place ! + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float32_t arm_correlation_distance_f32(float32_t *pA,float32_t *pB, uint32_t blockSize); + +/** + * @brief Cosine distance between two vectors + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ + +float32_t arm_cosine_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); + +/** + * @brief Cosine distance between two vectors + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ + +float64_t arm_cosine_distance_f64(const float64_t *pA,const float64_t *pB, uint32_t blockSize); + +/** + * @brief Jensen-Shannon distance between two vectors + * + * This function is assuming that elements of second vector are > 0 + * and 0 only when the corresponding element of first vector is 0. + * Otherwise the result of the computation does not make sense + * and for speed reasons, the cases returning NaN or Infinity are not + * managed. + * + * When the function is computing x log (x / y) with x 0 and y 0, + * it will compute the right value (0) but a division per zero will occur + * and shoudl be ignored in client code. + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ + +float32_t arm_jensenshannon_distance_f32(const float32_t *pA,const float32_t *pB,uint32_t blockSize); + +/** + * @brief Minkowski distance between two vectors + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] n Norm order (>= 2) + * @param[in] blockSize vector length + * @return distance + * + */ + + + +float32_t arm_minkowski_distance_f32(const float32_t *pA,const float32_t *pB, int32_t order, uint32_t blockSize); + +/** + * @brief Dice distance between two vectors + * + * @param[in] pA First vector of packed booleans + * @param[in] pB Second vector of packed booleans + * @param[in] order Distance order + * @param[in] blockSize Number of samples + * @return distance + * + */ + + +float32_t arm_dice_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); + +/** + * @brief Hamming distance between two vectors + * + * @param[in] pA First vector of packed booleans + * @param[in] pB Second vector of packed booleans + * @param[in] numberOfBools Number of booleans + * @return distance + * + */ + +float32_t arm_hamming_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); + +/** + * @brief Jaccard distance between two vectors + * + * @param[in] pA First vector of packed booleans + * @param[in] pB Second vector of packed booleans + * @param[in] numberOfBools Number of booleans + * @return distance + * + */ + +float32_t arm_jaccard_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); + +/** + * @brief Kulsinski distance between two vectors + * + * @param[in] pA First vector of packed booleans + * @param[in] pB Second vector of packed booleans + * @param[in] numberOfBools Number of booleans + * @return distance + * + */ + +float32_t arm_kulsinski_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); + +/** + * @brief Roger Stanimoto distance between two vectors + * + * @param[in] pA First vector of packed booleans + * @param[in] pB Second vector of packed booleans + * @param[in] numberOfBools Number of booleans + * @return distance + * + */ + +float32_t arm_rogerstanimoto_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); + +/** + * @brief Russell-Rao distance between two vectors + * + * @param[in] pA First vector of packed booleans + * @param[in] pB Second vector of packed booleans + * @param[in] numberOfBools Number of booleans + * @return distance + * + */ + +float32_t arm_russellrao_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); + +/** + * @brief Sokal-Michener distance between two vectors + * + * @param[in] pA First vector of packed booleans + * @param[in] pB Second vector of packed booleans + * @param[in] numberOfBools Number of booleans + * @return distance + * + */ + +float32_t arm_sokalmichener_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); + +/** + * @brief Sokal-Sneath distance between two vectors + * + * @param[in] pA First vector of packed booleans + * @param[in] pB Second vector of packed booleans + * @param[in] numberOfBools Number of booleans + * @return distance + * + */ + +float32_t arm_sokalsneath_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); + +/** + * @brief Yule distance between two vectors + * + * @param[in] pA First vector of packed booleans + * @param[in] pB Second vector of packed booleans + * @param[in] numberOfBools Number of booleans + * @return distance + * + */ + +float32_t arm_yule_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); + +typedef enum + { + ARM_DTW_SAKOE_CHIBA_WINDOW = 1, + /*ARM_DTW_ITAKURA_WINDOW = 2,*/ + ARM_DTW_SLANTED_BAND_WINDOW = 3 + } arm_dtw_window; + +/** + * @brief Window for dynamic time warping computation + * @param[in] windowType Type of window + * @param[in] windowSize Window size + * @param[in,out] pWindow Window + * @return Error if window type not recognized + * + */ +arm_status arm_dtw_init_window_q7(const arm_dtw_window windowType, + const int32_t windowSize, + arm_matrix_instance_q7 *pWindow); + +/** + * @brief Dynamic Time Warping distance + * @param[in] pDistance Distance matrix (Query rows * Template columns) + * @param[in] pWindow Windowing (can be NULL if no windowing used) + * @param[out] pDTW Temporary cost buffer (same size) + * @param[out] distance Distance + * @return Error in case no path can be found with window constraint + * + */ + +arm_status arm_dtw_distance_f32(const arm_matrix_instance_f32 *pDistance, + const arm_matrix_instance_q7 *pWindow, + arm_matrix_instance_f32 *pDTW, + float32_t *distance); + + +/** + * @brief Mapping between query and template + * @param[in] pDTW Cost matrix (Query rows * Template columns) + * @param[out] pPath Warping path in cost matrix 2*(nb rows + nb columns) + * @param[out] pathLength Length of path in number of points + * @return none + * + */ + +void arm_dtw_path_f32(const arm_matrix_instance_f32 *pDTW, + int16_t *pPath, + uint32_t *pathLength); +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _DISTANCE_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/distance_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/distance_functions_f16.h new file mode 100644 index 0000000..a7ceb3c --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/distance_functions_f16.h @@ -0,0 +1,180 @@ +/****************************************************************************** + * @file distance_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _DISTANCE_FUNCTIONS_F16_H_ +#define _DISTANCE_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +/* 6.14 bug */ +#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) && (__ARMCC_VERSION < 6150001) +/* Defined in minkowski_f32 */ +__attribute__((weak)) float __powisf2(float a, int b); +#endif + +#include "dsp/statistics_functions_f16.h" +#include "dsp/basic_math_functions_f16.h" + +#include "dsp/fast_math_functions_f16.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + +/** + * @brief Euclidean distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ + +float16_t arm_euclidean_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); + +/** + * @brief Bray-Curtis distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float16_t arm_braycurtis_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); + +/** + * @brief Canberra distance between two vectors + * + * This function may divide by zero when samples pA[i] and pB[i] are both zero. + * The result of the computation will be correct. So the division per zero may be + * ignored. + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float16_t arm_canberra_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); + + +/** + * @brief Chebyshev distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float16_t arm_chebyshev_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); + + +/** + * @brief Cityblock (Manhattan) distance between two vectors + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float16_t arm_cityblock_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); + +/** + * @brief Correlation distance between two vectors + * + * The input vectors are modified in place ! + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ +float16_t arm_correlation_distance_f16(float16_t *pA,float16_t *pB, uint32_t blockSize); + +/** + * @brief Cosine distance between two vectors + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ + +float16_t arm_cosine_distance_f16(const float16_t *pA,const float16_t *pB, uint32_t blockSize); + +/** + * @brief Jensen-Shannon distance between two vectors + * + * This function is assuming that elements of second vector are > 0 + * and 0 only when the corresponding element of first vector is 0. + * Otherwise the result of the computation does not make sense + * and for speed reasons, the cases returning NaN or Infinity are not + * managed. + * + * When the function is computing x log (x / y) with x 0 and y 0, + * it will compute the right value (0) but a division per zero will occur + * and shoudl be ignored in client code. + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] blockSize vector length + * @return distance + * + */ + +float16_t arm_jensenshannon_distance_f16(const float16_t *pA,const float16_t *pB,uint32_t blockSize); + +/** + * @brief Minkowski distance between two vectors + * + * @param[in] pA First vector + * @param[in] pB Second vector + * @param[in] n Norm order (>= 2) + * @param[in] blockSize vector length + * @return distance + * + */ + + + +float16_t arm_minkowski_distance_f16(const float16_t *pA,const float16_t *pB, int32_t order, uint32_t blockSize); + + +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _DISTANCE_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/fast_math_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/fast_math_functions.h new file mode 100644 index 0000000..70ec1f4 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/fast_math_functions.h @@ -0,0 +1,383 @@ +/****************************************************************************** + * @file fast_math_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _FAST_MATH_FUNCTIONS_H_ +#define _FAST_MATH_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/basic_math_functions.h" + +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * @brief Macros required for SINE and COSINE Fast math approximations + */ + +#define FAST_MATH_TABLE_SIZE 512 +#define FAST_MATH_Q31_SHIFT (32 - 10) +#define FAST_MATH_Q15_SHIFT (16 - 10) + +#ifndef PI + #define PI 3.14159265358979f +#endif + +#ifndef PI_F64 + #define PI_F64 3.14159265358979323846 +#endif + + + +/** + * @defgroup groupFastMath Fast Math Functions + * This set of functions provides a fast approximation to sine, cosine, and square root. + * As compared to most of the other functions in the CMSIS math library, the fast math functions + * operate on individual values and not arrays. + * There are separate functions for Q15, Q31, and floating-point data. + * + */ + + + /** + * @brief Fast approximation to the trigonometric sine function for floating-point data. + * @param[in] x input value in radians. + * @return sin(x). + */ + float32_t arm_sin_f32( + float32_t x); + + + /** + * @brief Fast approximation to the trigonometric sine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + q31_t arm_sin_q31( + q31_t x); + + /** + * @brief Fast approximation to the trigonometric sine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return sin(x). + */ + q15_t arm_sin_q15( + q15_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for floating-point data. + * @param[in] x input value in radians. + * @return cos(x). + */ + float32_t arm_cos_f32( + float32_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for Q31 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + q31_t arm_cos_q31( + q31_t x); + + + /** + * @brief Fast approximation to the trigonometric cosine function for Q15 data. + * @param[in] x Scaled input value in radians. + * @return cos(x). + */ + q15_t arm_cos_q15( + q15_t x); + + +/** + @brief Floating-point vector of log values. + @param[in] pSrc points to the input vector + @param[out] pDst points to the output vector + @param[in] blockSize number of samples in each vector + @return none + */ + void arm_vlog_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + +/** + @brief Floating-point vector of log values. + @param[in] pSrc points to the input vector + @param[out] pDst points to the output vector + @param[in] blockSize number of samples in each vector + @return none + */ + void arm_vlog_f64( + const float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @brief q31 vector of log values. + * @param[in] pSrc points to the input vector in q31 + * @param[out] pDst points to the output vector in q5.26 + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_vlog_q31(const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief q15 vector of log values. + * @param[in] pSrc points to the input vector in q15 + * @param[out] pDst points to the output vector in q4.11 + * @param[in] blockSize number of samples in each vector + * @return none + */ + void arm_vlog_q15(const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + +/** + @brief Floating-point vector of exp values. + @param[in] pSrc points to the input vector + @param[out] pDst points to the output vector + @param[in] blockSize number of samples in each vector + @return none + */ + void arm_vexp_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + +/** + @brief Floating-point vector of exp values. + @param[in] pSrc points to the input vector + @param[out] pDst points to the output vector + @param[in] blockSize number of samples in each vector + @return none + */ + void arm_vexp_f64( + const float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @defgroup SQRT Square Root + * + * Computes the square root of a number. + * There are separate functions for Q15, Q31, and floating-point data types. + * The square root function is computed using the Newton-Raphson algorithm. + * This is an iterative algorithm of the form: + *
+   *      x1 = x0 - f(x0)/f'(x0)
+   * 
+ * where x1 is the current estimate, + * x0 is the previous estimate, and + * f'(x0) is the derivative of f() evaluated at x0. + * For the square root function, the algorithm reduces to: + *
+   *     x0 = in/2                         [initial guess]
+   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
+   * 
+ */ + + + /** + * @addtogroup SQRT + * @{ + */ + +/** + @brief Floating-point square root function. + @param[in] in input value + @param[out] pOut square root of input value + @return execution status + - \ref ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +__STATIC_FORCEINLINE arm_status arm_sqrt_f32( + const float32_t in, + float32_t * pOut) + { + if (in >= 0.0f) + { +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + *pOut = __sqrtf(in); + #else + *pOut = sqrtf(in); + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); + #else + *pOut = sqrtf(in); + #endif + +#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) + *pOut = _sqrtf(in); +#elif defined(__GNUC_PYTHON__) + *pOut = sqrtf(in); +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); + #else + *pOut = sqrtf(in); + #endif +#else + *pOut = sqrtf(in); +#endif + + return (ARM_MATH_SUCCESS); + } + else + { + *pOut = 0.0f; + return (ARM_MATH_ARGUMENT_ERROR); + } + } + + +/** + @brief Q31 square root function. + @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF + @param[out] pOut points to square root of input value + @return execution status + - \ref ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +arm_status arm_sqrt_q31( + q31_t in, + q31_t * pOut); + + +/** + @brief Q15 square root function. + @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF + @param[out] pOut points to square root of input value + @return execution status + - \ref ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +arm_status arm_sqrt_q15( + q15_t in, + q15_t * pOut); + + + + /** + * @} end of SQRT group + */ + + /** + @brief Fixed point division + @param[in] numerator Numerator + @param[in] denominator Denominator + @param[out] quotient Quotient value normalized between -1.0 and 1.0 + @param[out] shift Shift left value to get the unnormalized quotient + @return error status + + When dividing by 0, an error ARM_MATH_NANINF is returned. And the quotient is forced + to the saturated negative or positive value. + */ + +arm_status arm_divide_q15(q15_t numerator, + q15_t denominator, + q15_t *quotient, + int16_t *shift); + + /** + @brief Fixed point division + @param[in] numerator Numerator + @param[in] denominator Denominator + @param[out] quotient Quotient value normalized between -1.0 and 1.0 + @param[out] shift Shift left value to get the unnormalized quotient + @return error status + + When dividing by 0, an error ARM_MATH_NANINF is returned. And the quotient is forced + to the saturated negative or positive value. + */ + +arm_status arm_divide_q31(q31_t numerator, + q31_t denominator, + q31_t *quotient, + int16_t *shift); + + + + /** + @brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant. + @param[in] y y coordinate + @param[in] x x coordinate + @param[out] result Result + @return error status. + */ + arm_status arm_atan2_f32(float32_t y,float32_t x,float32_t *result); + + + /** + @brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant. + @param[in] y y coordinate + @param[in] x x coordinate + @param[out] result Result in Q2.29 + @return error status. + */ + arm_status arm_atan2_q31(q31_t y,q31_t x,q31_t *result); + + /** + @brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant. + @param[in] y y coordinate + @param[in] x x coordinate + @param[out] result Result in Q2.13 + @return error status. + */ + arm_status arm_atan2_q15(q15_t y,q15_t x,q15_t *result); + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _FAST_MATH_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/fast_math_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/fast_math_functions_f16.h new file mode 100644 index 0000000..46ae06d --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/fast_math_functions_f16.h @@ -0,0 +1,125 @@ +/****************************************************************************** + * @file fast_math_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _FAST_MATH_FUNCTIONS_F16_H_ +#define _FAST_MATH_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +/* For sqrt_f32 */ +#include "dsp/fast_math_functions.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + + /** + * @addtogroup SQRT + * @{ + */ + +/** + @brief Floating-point square root function. + @param[in] in input value + @param[out] pOut square root of input value + @return execution status + - \ref ARM_MATH_SUCCESS : input value is positive + - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 + */ +__STATIC_FORCEINLINE arm_status arm_sqrt_f16( + float16_t in, + float16_t * pOut) + { + float32_t r; + arm_status status; + status=arm_sqrt_f32((float32_t)in,&r); + *pOut=(float16_t)r; + return(status); + } + + +/** + @} end of SQRT group + */ + +/** + @brief Floating-point vector of log values. + @param[in] pSrc points to the input vector + @param[out] pDst points to the output vector + @param[in] blockSize number of samples in each vector + @return none + */ + void arm_vlog_f16( + const float16_t * pSrc, + float16_t * pDst, + uint32_t blockSize); + +/** + @brief Floating-point vector of exp values. + @param[in] pSrc points to the input vector + @param[out] pDst points to the output vector + @param[in] blockSize number of samples in each vector + @return none + */ + void arm_vexp_f16( + const float16_t * pSrc, + float16_t * pDst, + uint32_t blockSize); + + /** + @brief Floating-point vector of inverse values. + @param[in] pSrc points to the input vector + @param[out] pDst points to the output vector + @param[in] blockSize number of samples in each vector + @return none + */ + void arm_vinverse_f16( + const float16_t * pSrc, + float16_t * pDst, + uint32_t blockSize); + + /** + @brief Arc tangent in radian of y/x using sign of x and y to determine right quadrant. + @param[in] y y coordinate + @param[in] x x coordinate + @param[out] result Result + @return error status. + */ + arm_status arm_atan2_f16(float16_t y,float16_t x,float16_t *result); + +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _FAST_MATH_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/filtering_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/filtering_functions.h new file mode 100644 index 0000000..28a9568 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/filtering_functions.h @@ -0,0 +1,2529 @@ +/****************************************************************************** + * @file filtering_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _FILTERING_FUNCTIONS_H_ +#define _FILTERING_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/support_functions.h" +#include "dsp/fast_math_functions.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + + +#define DELTA_Q31 ((q31_t)(0x100)) +#define DELTA_Q15 ((q15_t)0x5) + +/** + * @defgroup groupFilters Filtering Functions + */ + + /** + * @brief Instance structure for the Q7 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q7; + + /** + * @brief Instance structure for the Q15 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + } arm_fir_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_f32; + + /** + * @brief Instance structure for the floating-point FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float64_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const float64_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_f64; + + /** + * @brief Processing function for the Q7 FIR filter. + * @param[in] S points to an instance of the Q7 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q7( + const arm_fir_instance_q7 * S, + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q7 FIR filter. + * @param[in,out] S points to an instance of the Q7 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed. + * + * For the MVE version, the coefficient length must be a multiple of 16. + * You can pad with zeros if you have less coefficients. + */ + void arm_fir_init_q7( + arm_fir_instance_q7 * S, + uint16_t numTaps, + const q7_t * pCoeffs, + q7_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q15 FIR filter. + * @param[in] S points to an instance of the Q15 FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q15( + const arm_fir_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the fast Q15 FIR filter (fast version). + * @param[in] S points to an instance of the Q15 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_fast_q15( + const arm_fir_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q15 FIR filter. + * @param[in,out] S points to an instance of the Q15 FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * @return The function returns either + * ARM_MATH_SUCCESS if initialization was successful or + * ARM_MATH_ARGUMENT_ERROR if numTaps is not a supported value. + * + * For the MVE version, the coefficient length must be a multiple of 8. + * You can pad with zeros if you have less coefficients. + * + */ + arm_status arm_fir_init_q15( + arm_fir_instance_q15 * S, + uint16_t numTaps, + const q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR filter. + * @param[in] S points to an instance of the Q31 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_q31( + const arm_fir_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the fast Q31 FIR filter (fast version). + * @param[in] S points to an instance of the Q31 FIR filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_fast_q31( + const arm_fir_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 FIR filter. + * @param[in,out] S points to an instance of the Q31 FIR structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + * + * For the MVE version, the coefficient length must be a multiple of 4. + * You can pad with zeros if you have less coefficients. + */ + void arm_fir_init_q31( + arm_fir_instance_q31 * S, + uint16_t numTaps, + const q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the floating-point FIR filter. + * @param[in] S points to an instance of the floating-point FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_f32( + const arm_fir_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the floating-point FIR filter. + * @param[in] S points to an instance of the floating-point FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_f64( + const arm_fir_instance_f64 * S, + const float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point FIR filter. + * @param[in,out] S points to an instance of the floating-point FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ + void arm_fir_init_f32( + arm_fir_instance_f32 * S, + uint16_t numTaps, + const float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point FIR filter. + * @param[in,out] S points to an instance of the floating-point FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ + void arm_fir_init_f64( + arm_fir_instance_f64 * S, + uint16_t numTaps, + const float64_t * pCoeffs, + float64_t * pState, + uint32_t blockSize); + + /** + * @brief Instance structure for the Q15 Biquad cascade filter. + */ + typedef struct + { + int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + } arm_biquad_casd_df1_inst_q15; + + /** + * @brief Instance structure for the Q31 Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ + } arm_biquad_casd_df1_inst_q31; + + /** + * @brief Instance structure for the floating-point Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_casd_df1_inst_f32; + +#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) + /** + * @brief Instance structure for the modified Biquad coefs required by vectorized code. + */ + typedef struct + { + float32_t coeffs[8][4]; /**< Points to the array of modified coefficients. The array is of length 32. There is one per stage */ + } arm_biquad_mod_coef_f32; +#endif + + /** + * @brief Processing function for the Q15 Biquad cascade filter. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_q15( + const arm_biquad_casd_df1_inst_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q15 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cascade_df1_init_q15( + arm_biquad_casd_df1_inst_q15 * S, + uint8_t numStages, + const q15_t * pCoeffs, + q15_t * pState, + int8_t postShift); + + /** + * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_fast_q15( + const arm_biquad_casd_df1_inst_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 Biquad cascade filter + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_q31( + const arm_biquad_casd_df1_inst_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_fast_q31( + const arm_biquad_casd_df1_inst_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the Q31 Biquad cascade filter. + * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cascade_df1_init_q31( + arm_biquad_casd_df1_inst_q31 * S, + uint8_t numStages, + const q31_t * pCoeffs, + q31_t * pState, + int8_t postShift); + + /** + * @brief Processing function for the floating-point Biquad cascade filter. + * @param[in] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_f32( + const arm_biquad_casd_df1_inst_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point Biquad cascade filter. + * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pCoeffsMod points to the modified filter coefficients (only MVE version). + * @param[in] pState points to the state buffer. + */ +#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) + void arm_biquad_cascade_df1_mve_init_f32( + arm_biquad_casd_df1_inst_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + arm_biquad_mod_coef_f32 * pCoeffsMod, + float32_t * pState); +#endif + + void arm_biquad_cascade_df1_init_f32( + arm_biquad_casd_df1_inst_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pState); + + +/** + * @brief Convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ + void arm_conv_f32( + const float32_t * pSrcA, + uint32_t srcALen, + const float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + + /** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ + void arm_conv_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + +/** + * @brief Convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. + */ + void arm_conv_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_fast_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + + /** + * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + */ + void arm_conv_fast_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_fast_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + */ + void arm_conv_opt_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. + */ + void arm_conv_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + + /** + * @brief Partial convolution of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_f32( + const float32_t * pSrcA, + uint32_t srcALen, + const float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Partial convolution of Q15 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Partial convolution of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_fast_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Partial convolution of Q7 sequences + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_opt_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints, + q15_t * pScratch1, + q15_t * pScratch2); + + +/** + * @brief Partial convolution of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data + * @param[in] firstIndex is the first output sample to start with. + * @param[in] numPoints is the number of output points to be computed. + * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. + */ + arm_status arm_conv_partial_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + uint32_t firstIndex, + uint32_t numPoints); + + + /** + * @brief Instance structure for the Q15 FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR decimator. + */ + typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_q31; + +/** + @brief Instance structure for floating-point FIR decimator. + */ +typedef struct + { + uint8_t M; /**< decimation factor. */ + uint16_t numTaps; /**< number of coefficients in the filter. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + } arm_fir_decimate_instance_f32; + + +/** + @brief Processing function for floating-point FIR decimator. + @param[in] S points to an instance of the floating-point FIR decimator structure + @param[in] pSrc points to the block of input data + @param[out] pDst points to the block of output data + @param[in] blockSize number of samples to process + */ +void arm_fir_decimate_f32( + const arm_fir_decimate_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + +/** + @brief Initialization function for the floating-point FIR decimator. + @param[in,out] S points to an instance of the floating-point FIR decimator structure + @param[in] numTaps number of coefficients in the filter + @param[in] M decimation factor + @param[in] pCoeffs points to the filter coefficients + @param[in] pState points to the state buffer + @param[in] blockSize number of input samples to process per call + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M + */ +arm_status arm_fir_decimate_init_f32( + arm_fir_decimate_instance_f32 * S, + uint16_t numTaps, + uint8_t M, + const float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR decimator. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_q15( + const arm_fir_decimate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q15 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_fast_q15( + const arm_fir_decimate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR decimator. + * @param[in,out] S points to an instance of the Q15 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q15( + arm_fir_decimate_instance_q15 * S, + uint16_t numTaps, + uint8_t M, + const q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR decimator. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_q31( + const arm_fir_decimate_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. + * @param[in] S points to an instance of the Q31 FIR decimator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_decimate_fast_q31( + const arm_fir_decimate_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR decimator. + * @param[in,out] S points to an instance of the Q31 FIR decimator structure. + * @param[in] numTaps number of coefficients in the filter. + * @param[in] M decimation factor. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * blockSize is not a multiple of M. + */ + arm_status arm_fir_decimate_init_q31( + arm_fir_decimate_instance_q31 * S, + uint16_t numTaps, + uint8_t M, + const q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ + } arm_fir_interpolate_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR interpolator. + */ + typedef struct + { + uint8_t L; /**< upsample factor. */ + uint16_t phaseLength; /**< length of each polyphase filter component. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ + float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ + } arm_fir_interpolate_instance_f32; + + + /** + * @brief Processing function for the Q15 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_q15( + const arm_fir_interpolate_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 FIR interpolator. + * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q15( + arm_fir_interpolate_instance_q15 * S, + uint8_t L, + uint16_t numTaps, + const q15_t * pCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 FIR interpolator. + * @param[in] S points to an instance of the Q15 FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_q31( + const arm_fir_interpolate_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR interpolator. + * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_q31( + arm_fir_interpolate_instance_q31 * S, + uint8_t L, + uint16_t numTaps, + const q31_t * pCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point FIR interpolator. + * @param[in] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_interpolate_f32( + const arm_fir_interpolate_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point FIR interpolator. + * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. + * @param[in] L upsample factor. + * @param[in] numTaps number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of input samples to process per call. + * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if + * the filter length numTaps is not a multiple of the interpolation factor L. + */ + arm_status arm_fir_interpolate_init_f32( + arm_fir_interpolate_instance_f32 * S, + uint8_t L, + uint16_t numTaps, + const float32_t * pCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the high precision Q31 Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + const q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ + } arm_biquad_cas_df1_32x64_ins_q31; + + + /** + * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cas_df1_32x64_q31( + const arm_biquad_cas_df1_32x64_ins_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format + */ + void arm_biquad_cas_df1_32x64_init_q31( + arm_biquad_cas_df1_32x64_ins_q31 * S, + uint8_t numStages, + const q31_t * pCoeffs, + q63_t * pState, + uint8_t postShift); + + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f32; + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_stereo_df2T_instance_f32; + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + const float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f64; + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df2T_f32( + const arm_biquad_cascade_df2T_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_stereo_df2T_f32( + const arm_biquad_cascade_stereo_df2T_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df2T_f64( + const arm_biquad_cascade_df2T_instance_f64 * S, + const float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + +#if defined(ARM_MATH_NEON) +/** + @brief Compute new coefficient arrays for use in vectorized filter (Neon only). + @param[in] numStages number of 2nd order stages in the filter. + @param[in] pCoeffs points to the original filter coefficients. + @param[in] pComputedCoeffs points to the new computed coefficients for the vectorized version. + @return none +*/ +void arm_biquad_cascade_df2T_compute_coefs_f32( + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pComputedCoeffs); +#endif + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df2T_init_f32( + arm_biquad_cascade_df2T_instance_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_stereo_df2T_init_f32( + arm_biquad_cascade_stereo_df2T_instance_f32 * S, + uint8_t numStages, + const float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df2T_init_f64( + arm_biquad_cascade_df2T_instance_f64 * S, + uint8_t numStages, + const float64_t * pCoeffs, + float64_t * pState); + + + /** + * @brief Instance structure for the Q15 FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point FIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of filter stages. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ + } arm_fir_lattice_instance_f32; + + + /** + * @brief Initialization function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_q15( + arm_fir_lattice_instance_q15 * S, + uint16_t numStages, + const q15_t * pCoeffs, + q15_t * pState); + + + /** + * @brief Processing function for the Q15 FIR lattice filter. + * @param[in] S points to an instance of the Q15 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_q15( + const arm_fir_lattice_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_q31( + arm_fir_lattice_instance_q31 * S, + uint16_t numStages, + const q31_t * pCoeffs, + q31_t * pState); + + + /** + * @brief Processing function for the Q31 FIR lattice filter. + * @param[in] S points to an instance of the Q31 FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_q31( + const arm_fir_lattice_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] numStages number of filter stages. + * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. + * @param[in] pState points to the state buffer. The array is of length numStages. + */ + void arm_fir_lattice_init_f32( + arm_fir_lattice_instance_f32 * S, + uint16_t numStages, + const float32_t * pCoeffs, + float32_t * pState); + + + /** + * @brief Processing function for the floating-point FIR lattice filter. + * @param[in] S points to an instance of the floating-point FIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_fir_lattice_f32( + const arm_fir_lattice_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q15; + + /** + * @brief Instance structure for the Q31 IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_q31; + + /** + * @brief Instance structure for the floating-point IIR lattice filter. + */ + typedef struct + { + uint16_t numStages; /**< number of stages in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ + float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ + float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ + } arm_iir_lattice_instance_f32; + + + /** + * @brief Processing function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_f32( + const arm_iir_lattice_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point IIR lattice filter. + * @param[in] S points to an instance of the floating-point IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_init_f32( + arm_iir_lattice_instance_f32 * S, + uint16_t numStages, + float32_t * pkCoeffs, + float32_t * pvCoeffs, + float32_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_q31( + const arm_iir_lattice_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 IIR lattice filter. + * @param[in] S points to an instance of the Q31 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_init_q31( + arm_iir_lattice_instance_q31 * S, + uint16_t numStages, + q31_t * pkCoeffs, + q31_t * pvCoeffs, + q31_t * pState, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the Q15 IIR lattice structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_iir_lattice_q15( + const arm_iir_lattice_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + +/** + * @brief Initialization function for the Q15 IIR lattice filter. + * @param[in] S points to an instance of the fixed-point Q15 IIR lattice structure. + * @param[in] numStages number of stages in the filter. + * @param[in] pkCoeffs points to reflection coefficient buffer. The array is of length numStages. + * @param[in] pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. + * @param[in] pState points to state buffer. The array is of length numStages+blockSize. + * @param[in] blockSize number of samples to process per call. + */ + void arm_iir_lattice_init_q15( + arm_iir_lattice_instance_q15 * S, + uint16_t numStages, + q15_t * pkCoeffs, + q15_t * pvCoeffs, + q15_t * pState, + uint32_t blockSize); + + + /** + * @brief Instance structure for the floating-point LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that controls filter coefficient updates. */ + } arm_lms_instance_f32; + + + /** + * @brief Processing function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_f32( + const arm_lms_instance_f32 * S, + const float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for floating-point LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_init_f32( + arm_lms_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q15 LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q15; + + + /** + * @brief Initialization function for the Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to the coefficient buffer. + * @param[in] pState points to the state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_init_q15( + arm_lms_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint32_t postShift); + + + /** + * @brief Processing function for Q15 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_q15( + const arm_lms_instance_q15 * S, + const q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint32_t postShift; /**< bit shift applied to coefficients. */ + } arm_lms_instance_q31; + + + /** + * @brief Processing function for Q31 LMS filter. + * @param[in] S points to an instance of the Q15 LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_q31( + const arm_lms_instance_q31 * S, + const q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q31 LMS filter. + * @param[in] S points to an instance of the Q31 LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_init_q31( + arm_lms_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint32_t postShift); + + + /** + * @brief Instance structure for the floating-point normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + float32_t mu; /**< step size that control filter coefficient updates. */ + float32_t energy; /**< saves previous frame energy. */ + float32_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_f32; + + + /** + * @brief Processing function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_f32( + arm_lms_norm_instance_f32 * S, + const float32_t * pSrc, + float32_t * pRef, + float32_t * pOut, + float32_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for floating-point normalized LMS filter. + * @param[in] S points to an instance of the floating-point LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_init_f32( + arm_lms_norm_instance_f32 * S, + uint16_t numTaps, + float32_t * pCoeffs, + float32_t * pState, + float32_t mu, + uint32_t blockSize); + + + /** + * @brief Instance structure for the Q31 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q31_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + const q31_t *recipTable; /**< points to the reciprocal initial value table. */ + q31_t energy; /**< saves previous frame energy. */ + q31_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q31; + + + /** + * @brief Processing function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_q31( + arm_lms_norm_instance_q31 * S, + const q31_t * pSrc, + q31_t * pRef, + q31_t * pOut, + q31_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q31 normalized LMS filter. + * @param[in] S points to an instance of the Q31 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_norm_init_q31( + arm_lms_norm_instance_q31 * S, + uint16_t numTaps, + q31_t * pCoeffs, + q31_t * pState, + q31_t mu, + uint32_t blockSize, + uint8_t postShift); + + + /** + * @brief Instance structure for the Q15 normalized LMS filter. + */ + typedef struct + { + uint16_t numTaps; /**< Number of coefficients in the filter. */ + q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + q15_t mu; /**< step size that controls filter coefficient updates. */ + uint8_t postShift; /**< bit shift applied to coefficients. */ + const q15_t *recipTable; /**< Points to the reciprocal initial value table. */ + q15_t energy; /**< saves previous frame energy. */ + q15_t x0; /**< saves previous input sample. */ + } arm_lms_norm_instance_q15; + + + /** + * @brief Processing function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] pSrc points to the block of input data. + * @param[in] pRef points to the block of reference data. + * @param[out] pOut points to the block of output data. + * @param[out] pErr points to the block of error data. + * @param[in] blockSize number of samples to process. + */ + void arm_lms_norm_q15( + arm_lms_norm_instance_q15 * S, + const q15_t * pSrc, + q15_t * pRef, + q15_t * pOut, + q15_t * pErr, + uint32_t blockSize); + + + /** + * @brief Initialization function for Q15 normalized LMS filter. + * @param[in] S points to an instance of the Q15 normalized LMS filter structure. + * @param[in] numTaps number of filter coefficients. + * @param[in] pCoeffs points to coefficient buffer. + * @param[in] pState points to state buffer. + * @param[in] mu step size that controls filter coefficient updates. + * @param[in] blockSize number of samples to process. + * @param[in] postShift bit shift applied to coefficients. + */ + void arm_lms_norm_init_q15( + arm_lms_norm_instance_q15 * S, + uint16_t numTaps, + q15_t * pCoeffs, + q15_t * pState, + q15_t mu, + uint32_t blockSize, + uint8_t postShift); + + + /** + * @brief Correlation of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_f32( + const float32_t * pSrcA, + uint32_t srcALen, + const float32_t * pSrcB, + uint32_t srcBLen, + float32_t * pDst); + + + /** + * @brief Correlation of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_f64( + const float64_t * pSrcA, + uint32_t srcALen, + const float64_t * pSrcB, + uint32_t srcBLen, + float64_t * pDst); + + +/** + @brief Correlation of Q15 sequences + @param[in] pSrcA points to the first input sequence + @param[in] srcALen length of the first input sequence + @param[in] pSrcB points to the second input sequence + @param[in] srcBLen length of the second input sequence + @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. +*/ +void arm_correlate_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch); + + +/** + @brief Correlation of Q15 sequences. + @param[in] pSrcA points to the first input sequence + @param[in] srcALen length of the first input sequence + @param[in] pSrcB points to the second input sequence + @param[in] srcBLen length of the second input sequence + @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + +/** + @brief Correlation of Q15 sequences (fast version). + @param[in] pSrcA points to the first input sequence + @param[in] srcALen length of the first input sequence + @param[in] pSrcB points to the second input sequence + @param[in] srcBLen length of the second input sequence + @param[out] pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. + @return none + */ +void arm_correlate_fast_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst); + + +/** + @brief Correlation of Q15 sequences (fast version). + @param[in] pSrcA points to the first input sequence. + @param[in] srcALen length of the first input sequence. + @param[in] pSrcB points to the second input sequence. + @param[in] srcBLen length of the second input sequence. + @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + */ +void arm_correlate_fast_opt_q15( + const q15_t * pSrcA, + uint32_t srcALen, + const q15_t * pSrcB, + uint32_t srcBLen, + q15_t * pDst, + q15_t * pScratch); + + + /** + * @brief Correlation of Q31 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + +/** + @brief Correlation of Q31 sequences (fast version). + @param[in] pSrcA points to the first input sequence + @param[in] srcALen length of the first input sequence + @param[in] pSrcB points to the second input sequence + @param[in] srcBLen length of the second input sequence + @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ +void arm_correlate_fast_q31( + const q31_t * pSrcA, + uint32_t srcALen, + const q31_t * pSrcB, + uint32_t srcBLen, + q31_t * pDst); + + + /** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. + * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). + */ + void arm_correlate_opt_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst, + q15_t * pScratch1, + q15_t * pScratch2); + + + /** + * @brief Correlation of Q7 sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_q7( + const q7_t * pSrcA, + uint32_t srcALen, + const q7_t * pSrcB, + uint32_t srcBLen, + q7_t * pDst); + + + /** + * @brief Instance structure for the floating-point sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_f32; + + /** + * @brief Instance structure for the Q31 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q31; + + /** + * @brief Instance structure for the Q15 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q15; + + /** + * @brief Instance structure for the Q7 sparse FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of coefficients in the filter. */ + uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ + q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ + const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ + uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ + int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ + } arm_fir_sparse_instance_q7; + + + /** + * @brief Processing function for the floating-point sparse FIR filter. + * @param[in] S points to an instance of the floating-point sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_f32( + arm_fir_sparse_instance_f32 * S, + const float32_t * pSrc, + float32_t * pDst, + float32_t * pScratchIn, + uint32_t blockSize); + + + /** + * @brief Initialization function for the floating-point sparse FIR filter. + * @param[in,out] S points to an instance of the floating-point sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_f32( + arm_fir_sparse_instance_f32 * S, + uint16_t numTaps, + const float32_t * pCoeffs, + float32_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q31 sparse FIR filter. + * @param[in] S points to an instance of the Q31 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q31( + arm_fir_sparse_instance_q31 * S, + const q31_t * pSrc, + q31_t * pDst, + q31_t * pScratchIn, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q31 sparse FIR filter. + * @param[in,out] S points to an instance of the Q31 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q31( + arm_fir_sparse_instance_q31 * S, + uint16_t numTaps, + const q31_t * pCoeffs, + q31_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q15 sparse FIR filter. + * @param[in] S points to an instance of the Q15 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q15( + arm_fir_sparse_instance_q15 * S, + const q15_t * pSrc, + q15_t * pDst, + q15_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q15 sparse FIR filter. + * @param[in,out] S points to an instance of the Q15 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q15( + arm_fir_sparse_instance_q15 * S, + uint16_t numTaps, + const q15_t * pCoeffs, + q15_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + /** + * @brief Processing function for the Q7 sparse FIR filter. + * @param[in] S points to an instance of the Q7 sparse FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] pScratchIn points to a temporary buffer of size blockSize. + * @param[in] pScratchOut points to a temporary buffer of size blockSize. + * @param[in] blockSize number of input samples to process per call. + */ + void arm_fir_sparse_q7( + arm_fir_sparse_instance_q7 * S, + const q7_t * pSrc, + q7_t * pDst, + q7_t * pScratchIn, + q31_t * pScratchOut, + uint32_t blockSize); + + + /** + * @brief Initialization function for the Q7 sparse FIR filter. + * @param[in,out] S points to an instance of the Q7 sparse FIR structure. + * @param[in] numTaps number of nonzero coefficients in the filter. + * @param[in] pCoeffs points to the array of filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] pTapDelay points to the array of offset times. + * @param[in] maxDelay maximum offset time supported. + * @param[in] blockSize number of samples that will be processed per block. + */ + void arm_fir_sparse_init_q7( + arm_fir_sparse_instance_q7 * S, + uint16_t numTaps, + const q7_t * pCoeffs, + q7_t * pState, + int32_t * pTapDelay, + uint16_t maxDelay, + uint32_t blockSize); + + + + + + + /** + * @brief floating-point Circular write function. + */ + __STATIC_FORCEINLINE void arm_circularWrite_f32( + int32_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const int32_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + + /** + * @brief floating-point Circular Read function. + */ + __STATIC_FORCEINLINE void arm_circularRead_f32( + int32_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + int32_t * dst, + int32_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t rOffset; + int32_t* dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + dst_end = dst_base + dst_length; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q15 Circular write function. + */ + __STATIC_FORCEINLINE void arm_circularWrite_q15( + q15_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q15_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + /** + * @brief Q15 Circular Read function. + */ + __STATIC_FORCEINLINE void arm_circularRead_q15( + q15_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q15_t * dst, + q15_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset; + q15_t* dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = dst_base + dst_length; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == dst_end) + { + dst = dst_base; + } + + /* Circularly update wOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + + /** + * @brief Q7 Circular write function. + */ + __STATIC_FORCEINLINE void arm_circularWrite_q7( + q7_t * circBuffer, + int32_t L, + uint16_t * writeOffset, + int32_t bufferInc, + const q7_t * src, + int32_t srcInc, + uint32_t blockSize) + { + uint32_t i = 0U; + int32_t wOffset; + + /* Copy the value of Index pointer that points + * to the current location where the input samples to be copied */ + wOffset = *writeOffset; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the input sample to the circular buffer */ + circBuffer[wOffset] = *src; + + /* Update the input pointer */ + src += srcInc; + + /* Circularly update wOffset. Watch out for positive and negative value */ + wOffset += bufferInc; + if (wOffset >= L) + wOffset -= L; + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *writeOffset = (uint16_t)wOffset; + } + + + /** + * @brief Q7 Circular Read function. + */ + __STATIC_FORCEINLINE void arm_circularRead_q7( + q7_t * circBuffer, + int32_t L, + int32_t * readOffset, + int32_t bufferInc, + q7_t * dst, + q7_t * dst_base, + int32_t dst_length, + int32_t dstInc, + uint32_t blockSize) + { + uint32_t i = 0; + int32_t rOffset; + q7_t* dst_end; + + /* Copy the value of Index pointer that points + * to the current location from where the input samples to be read */ + rOffset = *readOffset; + + dst_end = dst_base + dst_length; + + /* Loop over the blockSize */ + i = blockSize; + + while (i > 0U) + { + /* copy the sample from the circular buffer to the destination buffer */ + *dst = circBuffer[rOffset]; + + /* Update the input pointer */ + dst += dstInc; + + if (dst == dst_end) + { + dst = dst_base; + } + + /* Circularly update rOffset. Watch out for positive and negative value */ + rOffset += bufferInc; + + if (rOffset >= L) + { + rOffset -= L; + } + + /* Decrement the loop counter */ + i--; + } + + /* Update the index pointer */ + *readOffset = rOffset; + } + + +/** + @brief Levinson Durbin + @param[in] phi autocovariance vector starting with lag 0 (length is nbCoefs + 1) + @param[out] a autoregressive coefficients + @param[out] err prediction error (variance) + @param[in] nbCoefs number of autoregressive coefficients + @return none + */ +void arm_levinson_durbin_f32(const float32_t *phi, + float32_t *a, + float32_t *err, + int nbCoefs); + + +/** + @brief Levinson Durbin + @param[in] phi autocovariance vector starting with lag 0 (length is nbCoefs + 1) + @param[out] a autoregressive coefficients + @param[out] err prediction error (variance) + @param[in] nbCoefs number of autoregressive coefficients + @return none + */ +void arm_levinson_durbin_q31(const q31_t *phi, + q31_t *a, + q31_t *err, + int nbCoefs); + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _FILTERING_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/filtering_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/filtering_functions_f16.h new file mode 100644 index 0000000..fd8b0bb --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/filtering_functions_f16.h @@ -0,0 +1,237 @@ +/****************************************************************************** + * @file filtering_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _FILTERING_FUNCTIONS_F16_H_ +#define _FILTERING_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + + /** + * @brief Instance structure for the floating-point FIR filter. + */ + typedef struct + { + uint16_t numTaps; /**< number of filter coefficients in the filter. */ + float16_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ + const float16_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ + } arm_fir_instance_f16; + + /** + * @brief Initialization function for the floating-point FIR filter. + * @param[in,out] S points to an instance of the floating-point FIR filter structure. + * @param[in] numTaps Number of filter coefficients in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + * @param[in] blockSize number of samples that are processed at a time. + */ + void arm_fir_init_f16( + arm_fir_instance_f16 * S, + uint16_t numTaps, + const float16_t * pCoeffs, + float16_t * pState, + uint32_t blockSize); + + /** + * @brief Processing function for the floating-point FIR filter. + * @param[in] S points to an instance of the floating-point FIR structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_fir_f16( + const arm_fir_instance_f16 * S, + const float16_t * pSrc, + float16_t * pDst, + uint32_t blockSize); + + + /** + * @brief Instance structure for the floating-point Biquad cascade filter. + */ + typedef struct + { + uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float16_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ + const float16_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_casd_df1_inst_f16; + +#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) + /** + * @brief Instance structure for the modified Biquad coefs required by vectorized code. + */ + typedef struct + { + float16_t coeffs[12][8]; /**< Points to the array of modified coefficients. The array is of length 32. There is one per stage */ + } arm_biquad_mod_coef_f16; +#endif + + /** + * @brief Processing function for the floating-point Biquad cascade filter. + * @param[in] S points to an instance of the floating-point Biquad cascade structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df1_f16( + const arm_biquad_casd_df1_inst_f16 * S, + const float16_t * pSrc, + float16_t * pDst, + uint32_t blockSize); + +#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) + void arm_biquad_cascade_df1_mve_init_f16( + arm_biquad_casd_df1_inst_f16 * S, + uint8_t numStages, + const float16_t * pCoeffs, + arm_biquad_mod_coef_f16 * pCoeffsMod, + float16_t * pState); +#endif + + void arm_biquad_cascade_df1_init_f16( + arm_biquad_casd_df1_inst_f16 * S, + uint8_t numStages, + const float16_t * pCoeffs, + float16_t * pState); + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float16_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ + const float16_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_df2T_instance_f16; + + /** + * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. + */ + typedef struct + { + uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ + float16_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ + const float16_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ + } arm_biquad_cascade_stereo_df2T_instance_f16; + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_df2T_f16( + const arm_biquad_cascade_df2T_instance_f16 * S, + const float16_t * pSrc, + float16_t * pDst, + uint32_t blockSize); + + /** + * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels + * @param[in] S points to an instance of the filter data structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_biquad_cascade_stereo_df2T_f16( + const arm_biquad_cascade_stereo_df2T_instance_f16 * S, + const float16_t * pSrc, + float16_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_df2T_init_f16( + arm_biquad_cascade_df2T_instance_f16 * S, + uint8_t numStages, + const float16_t * pCoeffs, + float16_t * pState); + + /** + * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. + * @param[in,out] S points to an instance of the filter data structure. + * @param[in] numStages number of 2nd order stages in the filter. + * @param[in] pCoeffs points to the filter coefficients. + * @param[in] pState points to the state buffer. + */ + void arm_biquad_cascade_stereo_df2T_init_f16( + arm_biquad_cascade_stereo_df2T_instance_f16 * S, + uint8_t numStages, + const float16_t * pCoeffs, + float16_t * pState); + + /** + * @brief Correlation of floating-point sequences. + * @param[in] pSrcA points to the first input sequence. + * @param[in] srcALen length of the first input sequence. + * @param[in] pSrcB points to the second input sequence. + * @param[in] srcBLen length of the second input sequence. + * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. + */ + void arm_correlate_f16( + const float16_t * pSrcA, + uint32_t srcALen, + const float16_t * pSrcB, + uint32_t srcBLen, + float16_t * pDst); + + +/** + @brief Levinson Durbin + @param[in] phi autocovariance vector starting with lag 0 (length is nbCoefs + 1) + @param[out] a autoregressive coefficients + @param[out] err prediction error (variance) + @param[in] nbCoefs number of autoregressive coefficients + @return none + */ +void arm_levinson_durbin_f16(const float16_t *phi, + float16_t *a, + float16_t *err, + int nbCoefs); + +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _FILTERING_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/interpolation_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/interpolation_functions.h new file mode 100644 index 0000000..dbea4eb --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/interpolation_functions.h @@ -0,0 +1,275 @@ +/****************************************************************************** + * @file interpolation_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _INTERPOLATION_FUNCTIONS_H_ +#define _INTERPOLATION_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * @defgroup groupInterpolation Interpolation Functions + * These functions perform 1- and 2-dimensional interpolation of data. + * Linear interpolation is used for 1-dimensional data and + * bilinear interpolation is used for 2-dimensional data. + */ + + + /** + * @brief Instance structure for the floating-point Linear Interpolate function. + */ + typedef struct + { + uint32_t nValues; /**< nValues */ + float32_t x1; /**< x1 */ + float32_t xSpacing; /**< xSpacing */ + const float32_t *pYData; /**< pointer to the table of Y values */ + } arm_linear_interp_instance_f32; + + /** + * @brief Instance structure for the floating-point bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + const float32_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_f32; + + /** + * @brief Instance structure for the Q31 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + const q31_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q31; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + const q15_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q15; + + /** + * @brief Instance structure for the Q15 bilinear interpolation function. + */ + typedef struct + { + uint16_t numRows; /**< number of rows in the data table. */ + uint16_t numCols; /**< number of columns in the data table. */ + const q7_t *pData; /**< points to the data table. */ + } arm_bilinear_interp_instance_q7; + + + /** + * @brief Struct for specifying cubic spline type + */ + typedef enum + { + ARM_SPLINE_NATURAL = 0, /**< Natural spline */ + ARM_SPLINE_PARABOLIC_RUNOUT = 1 /**< Parabolic runout spline */ + } arm_spline_type; + + /** + * @brief Instance structure for the floating-point cubic spline interpolation. + */ + typedef struct + { + arm_spline_type type; /**< Type (boundary conditions) */ + const float32_t * x; /**< x values */ + const float32_t * y; /**< y values */ + uint32_t n_x; /**< Number of known data points */ + float32_t * coeffs; /**< Coefficients buffer (b,c, and d) */ + } arm_spline_instance_f32; + + + /** + * @brief Processing function for the floating-point cubic spline interpolation. + * @param[in] S points to an instance of the floating-point spline structure. + * @param[in] xq points to the x values ot the interpolated data points. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples of output data. + */ + void arm_spline_f32( + arm_spline_instance_f32 * S, + const float32_t * xq, + float32_t * pDst, + uint32_t blockSize); + + /** + * @brief Initialization function for the floating-point cubic spline interpolation. + * @param[in,out] S points to an instance of the floating-point spline structure. + * @param[in] type type of cubic spline interpolation (boundary conditions) + * @param[in] x points to the x values of the known data points. + * @param[in] y points to the y values of the known data points. + * @param[in] n number of known data points. + * @param[in] coeffs coefficients array for b, c, and d + * @param[in] tempBuffer buffer array for internal computations + */ + void arm_spline_init_f32( + arm_spline_instance_f32 * S, + arm_spline_type type, + const float32_t * x, + const float32_t * y, + uint32_t n, + float32_t * coeffs, + float32_t * tempBuffer); + + + /** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ + float32_t arm_linear_interp_f32( + arm_linear_interp_instance_f32 * S, + float32_t x); + + /** + * + * @brief Process function for the Q31 Linear Interpolation Function. + * @param[in] pYData pointer to Q31 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + q31_t arm_linear_interp_q31( + const q31_t * pYData, + q31_t x, + uint32_t nValues); + + /** + * + * @brief Process function for the Q15 Linear Interpolation Function. + * @param[in] pYData pointer to Q15 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + * + */ + q15_t arm_linear_interp_q15( + const q15_t * pYData, + q31_t x, + uint32_t nValues); + + /** + * + * @brief Process function for the Q7 Linear Interpolation Function. + * @param[in] pYData pointer to Q7 Linear Interpolation table + * @param[in] x input sample to process + * @param[in] nValues number of table values + * @return y processed output sample. + * + * \par + * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. + * This function can support maximum of table size 2^12. + */ +q7_t arm_linear_interp_q7( + const q7_t * pYData, + q31_t x, + uint32_t nValues); + + /** + * @brief Floating-point bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate. + * @param[in] Y interpolation coordinate. + * @return out interpolated value. + */ + float32_t arm_bilinear_interp_f32( + const arm_bilinear_interp_instance_f32 * S, + float32_t X, + float32_t Y); + + /** + * @brief Q31 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + q31_t arm_bilinear_interp_q31( + arm_bilinear_interp_instance_q31 * S, + q31_t X, + q31_t Y); + + + /** + * @brief Q15 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + q15_t arm_bilinear_interp_q15( + arm_bilinear_interp_instance_q15 * S, + q31_t X, + q31_t Y); + + /** + * @brief Q7 bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate in 12.20 format. + * @param[in] Y interpolation coordinate in 12.20 format. + * @return out interpolated value. + */ + q7_t arm_bilinear_interp_q7( + arm_bilinear_interp_instance_q7 * S, + q31_t X, + q31_t Y); + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _INTERPOLATION_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/interpolation_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/interpolation_functions_f16.h new file mode 100644 index 0000000..7b88048 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/interpolation_functions_f16.h @@ -0,0 +1,107 @@ +/****************************************************************************** + * @file interpolation_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _INTERPOLATION_FUNCTIONS_F16_H_ +#define _INTERPOLATION_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + +typedef struct +{ + uint32_t nValues; /**< nValues */ + float16_t x1; /**< x1 */ + float16_t xSpacing; /**< xSpacing */ + const float16_t *pYData; /**< pointer to the table of Y values */ +} arm_linear_interp_instance_f16; + +/** + * @brief Instance structure for the floating-point bilinear interpolation function. + */ +typedef struct +{ + uint16_t numRows;/**< number of rows in the data table. */ + uint16_t numCols;/**< number of columns in the data table. */ + const float16_t *pData; /**< points to the data table. */ +} arm_bilinear_interp_instance_f16; + + /** + * @addtogroup LinearInterpolate + * @{ + */ + + /** + * @brief Process function for the floating-point Linear Interpolation Function. + * @param[in,out] S is an instance of the floating-point Linear Interpolation structure + * @param[in] x input sample to process + * @return y processed output sample. + * + */ + float16_t arm_linear_interp_f16( + arm_linear_interp_instance_f16 * S, + float16_t x); + + /** + * @} end of LinearInterpolate group + */ + +/** + * @addtogroup BilinearInterpolate + * @{ + */ + + /** + * @brief Floating-point bilinear interpolation. + * @param[in,out] S points to an instance of the interpolation structure. + * @param[in] X interpolation coordinate. + * @param[in] Y interpolation coordinate. + * @return out interpolated value. + */ + float16_t arm_bilinear_interp_f16( + const arm_bilinear_interp_instance_f16 * S, + float16_t X, + float16_t Y); + + + /** + * @} end of BilinearInterpolate group + */ +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _INTERPOLATION_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/matrix_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/matrix_functions.h new file mode 100644 index 0000000..6ebf720 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/matrix_functions.h @@ -0,0 +1,856 @@ +/****************************************************************************** + * @file matrix_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.1 + * @date 10 August 2022 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _MATRIX_FUNCTIONS_H_ +#define _MATRIX_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @defgroup groupMatrix Matrix Functions + * + * This set of functions provides basic matrix math operations. + * The functions operate on matrix data structures. For example, + * the type + * definition for the floating-point matrix structure is shown + * below: + *
+ *     typedef struct
+ *     {
+ *       uint16_t numRows;     // number of rows of the matrix.
+ *       uint16_t numCols;     // number of columns of the matrix.
+ *       float32_t *pData;     // points to the data of the matrix.
+ *     } arm_matrix_instance_f32;
+ * 
+ * There are similar definitions for Q15 and Q31 data types. + * + * The structure specifies the size of the matrix and then points to + * an array of data. The array is of size numRows X numCols + * and the values are arranged in row order. That is, the + * matrix element (i, j) is stored at: + *
+ *     pData[i*numCols + j]
+ * 
+ * + * \par Init Functions + * There is an associated initialization function for each type of matrix + * data structure. + * The initialization function sets the values of the internal structure fields. + * Refer to \ref arm_mat_init_f32(), \ref arm_mat_init_q31() and \ref arm_mat_init_q15() + * for floating-point, Q31 and Q15 types, respectively. + * + * \par + * Use of the initialization function is optional. However, if initialization function is used + * then the instance structure cannot be placed into a const data section. + * To place the instance structure in a const data + * section, manually initialize the data structure. For example: + *
+ * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
+ * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
+ * 
+ * where nRows specifies the number of rows, nColumns + * specifies the number of columns, and pData points to the + * data array. + * + * \par Size Checking + * By default all of the matrix functions perform size checking on the input and + * output matrices. For example, the matrix addition function verifies that the + * two input matrices and the output matrix all have the same number of rows and + * columns. If the size check fails the functions return: + *
+ *     ARM_MATH_SIZE_MISMATCH
+ * 
+ * Otherwise the functions return + *
+ *     ARM_MATH_SUCCESS
+ * 
+ * There is some overhead associated with this matrix size checking. + * The matrix size checking is enabled via the \#define + *
+ *     ARM_MATH_MATRIX_CHECK
+ * 
+ * within the library project settings. By default this macro is defined + * and size checking is enabled. By changing the project settings and + * undefining this macro size checking is eliminated and the functions + * run a bit faster. With size checking disabled the functions always + * return ARM_MATH_SUCCESS. + */ + + #define DEFAULT_HOUSEHOLDER_THRESHOLD_F64 (1.0e-16) + #define DEFAULT_HOUSEHOLDER_THRESHOLD_F32 (1.0e-12f) + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float32_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f32; + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float64_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f64; + + /** + * @brief Instance structure for the Q7 matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q7_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_q7; + + /** + * @brief Instance structure for the Q15 matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q15_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_q15; + + /** + * @brief Instance structure for the Q31 matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + q31_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_q31; + + /** + * @brief Floating-point matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pScratch); + + /** + * @brief Q31, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst); + +/** + * @brief Floating-point matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_f64( + const arm_matrix_instance_f64 * pSrc, + arm_matrix_instance_f64 * pDst); + + /** + * @brief Floating-point complex matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_trans_f32( + const arm_matrix_instance_f32 * pSrc, + arm_matrix_instance_f32 * pDst); + + + /** + * @brief Q15 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q15 complex matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_trans_q15( + const arm_matrix_instance_q15 * pSrc, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q7 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_q7( + const arm_matrix_instance_q7 * pSrc, + arm_matrix_instance_q7 * pDst); + + /** + * @brief Q31 matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Q31 complex matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_trans_q31( + const arm_matrix_instance_q31 * pSrc, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Floating-point matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_f64( + const arm_matrix_instance_f64 * pSrcA, + const arm_matrix_instance_f64 * pSrcB, + arm_matrix_instance_f64 * pDst); + + /** + * @brief Floating-point matrix and vector multiplication + * @param[in] pSrcMat points to the input matrix structure + * @param[in] pVec points to vector + * @param[out] pDst points to output vector + */ +void arm_mat_vec_mult_f32( + const arm_matrix_instance_f32 *pSrcMat, + const float32_t *pVec, + float32_t *pDst); + + /** + * @brief Q7 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_q7( + const arm_matrix_instance_q7 * pSrcA, + const arm_matrix_instance_q7 * pSrcB, + arm_matrix_instance_q7 * pDst, + q7_t * pState); + + /** + * @brief Q7 matrix and vector multiplication + * @param[in] pSrcMat points to the input matrix structure + * @param[in] pVec points to vector + * @param[out] pDst points to output vector + */ +void arm_mat_vec_mult_q7( + const arm_matrix_instance_q7 *pSrcMat, + const q7_t *pVec, + q7_t *pDst); + + /** + * @brief Q15 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @brief Q15 matrix and vector multiplication + * @param[in] pSrcMat points to the input matrix structure + * @param[in] pVec points to vector + * @param[out] pDst points to output vector + */ +void arm_mat_vec_mult_q15( + const arm_matrix_instance_q15 *pSrcMat, + const q15_t *pVec, + q15_t *pDst); + + /** + * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_fast_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst, + q15_t * pState); + + /** + * @brief Q31 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Q31 matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @param[in] pState points to the array for storing intermediate results + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_opt_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst, + q31_t *pState); + + /** + * @brief Q31 matrix and vector multiplication + * @param[in] pSrcMat points to the input matrix structure + * @param[in] pVec points to vector + * @param[out] pDst points to output vector + */ +void arm_mat_vec_mult_q31( + const arm_matrix_instance_q31 *pSrcMat, + const q31_t *pVec, + q31_t *pDst); + + /** + * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_fast_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_f32( + const arm_matrix_instance_f32 * pSrcA, + const arm_matrix_instance_f32 * pSrcB, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Floating-point matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_f64( + const arm_matrix_instance_f64 * pSrcA, + const arm_matrix_instance_f64 * pSrcB, + arm_matrix_instance_f64 * pDst); + + /** + * @brief Q15 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_q15( + const arm_matrix_instance_q15 * pSrcA, + const arm_matrix_instance_q15 * pSrcB, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_q31( + const arm_matrix_instance_q31 * pSrcA, + const arm_matrix_instance_q31 * pSrcB, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Floating-point matrix scaling. + * @param[in] pSrc points to the input matrix + * @param[in] scale scale factor + * @param[out] pDst points to the output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_f32( + const arm_matrix_instance_f32 * pSrc, + float32_t scale, + arm_matrix_instance_f32 * pDst); + + /** + * @brief Q15 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_q15( + const arm_matrix_instance_q15 * pSrc, + q15_t scaleFract, + int32_t shift, + arm_matrix_instance_q15 * pDst); + + /** + * @brief Q31 matrix scaling. + * @param[in] pSrc points to input matrix + * @param[in] scaleFract fractional portion of the scale factor + * @param[in] shift number of bits to shift the result by + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_q31( + const arm_matrix_instance_q31 * pSrc, + q31_t scaleFract, + int32_t shift, + arm_matrix_instance_q31 * pDst); + + /** + * @brief Q31 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_q31( + arm_matrix_instance_q31 * S, + uint16_t nRows, + uint16_t nColumns, + q31_t * pData); + + /** + * @brief Q15 matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_q15( + arm_matrix_instance_q15 * S, + uint16_t nRows, + uint16_t nColumns, + q15_t * pData); + + /** + * @brief Floating-point matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_f32( + arm_matrix_instance_f32 * S, + uint16_t nRows, + uint16_t nColumns, + float32_t * pData); + +/** + * @brief Floating-point matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_f64( + arm_matrix_instance_f64 * S, + uint16_t nRows, + uint16_t nColumns, + float64_t * pData); + + + + + /** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f32( + const arm_matrix_instance_f32 * src, + arm_matrix_instance_f32 * dst); + + + /** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f64( + const arm_matrix_instance_f64 * src, + arm_matrix_instance_f64 * dst); + + /** + * @brief Floating-point Cholesky decomposition of Symmetric Positive Definite Matrix. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE. + * If the matrix is ill conditioned or only semi-definite, then it is better using the LDL^t decomposition. + * The decomposition is returning a lower triangular matrix. + */ + arm_status arm_mat_cholesky_f64( + const arm_matrix_instance_f64 * src, + arm_matrix_instance_f64 * dst); + + /** + * @brief Floating-point Cholesky decomposition of Symmetric Positive Definite Matrix. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE. + * If the matrix is ill conditioned or only semi-definite, then it is better using the LDL^t decomposition. + * The decomposition is returning a lower triangular matrix. + */ + arm_status arm_mat_cholesky_f32( + const arm_matrix_instance_f32 * src, + arm_matrix_instance_f32 * dst); + + /** + * @brief Solve UT . X = A where UT is an upper triangular matrix + * @param[in] ut The upper triangular matrix + * @param[in] a The matrix a + * @param[out] dst The solution X of UT . X = A + * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. + */ + arm_status arm_mat_solve_upper_triangular_f32( + const arm_matrix_instance_f32 * ut, + const arm_matrix_instance_f32 * a, + arm_matrix_instance_f32 * dst); + + /** + * @brief Solve LT . X = A where LT is a lower triangular matrix + * @param[in] lt The lower triangular matrix + * @param[in] a The matrix a + * @param[out] dst The solution X of LT . X = A + * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. + */ + arm_status arm_mat_solve_lower_triangular_f32( + const arm_matrix_instance_f32 * lt, + const arm_matrix_instance_f32 * a, + arm_matrix_instance_f32 * dst); + + + /** + * @brief Solve UT . X = A where UT is an upper triangular matrix + * @param[in] ut The upper triangular matrix + * @param[in] a The matrix a + * @param[out] dst The solution X of UT . X = A + * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. + */ + arm_status arm_mat_solve_upper_triangular_f64( + const arm_matrix_instance_f64 * ut, + const arm_matrix_instance_f64 * a, + arm_matrix_instance_f64 * dst); + + /** + * @brief Solve LT . X = A where LT is a lower triangular matrix + * @param[in] lt The lower triangular matrix + * @param[in] a The matrix a + * @param[out] dst The solution X of LT . X = A + * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. + */ + arm_status arm_mat_solve_lower_triangular_f64( + const arm_matrix_instance_f64 * lt, + const arm_matrix_instance_f64 * a, + arm_matrix_instance_f64 * dst); + + + /** + * @brief Floating-point LDL decomposition of Symmetric Positive Semi-Definite Matrix. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] l points to the instance of the output floating-point triangular matrix structure. + * @param[out] d points to the instance of the output floating-point diagonal matrix structure. + * @param[out] p points to the instance of the output floating-point permutation vector. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE. + * The decomposition is returning a lower triangular matrix. + */ + arm_status arm_mat_ldlt_f32( + const arm_matrix_instance_f32 * src, + arm_matrix_instance_f32 * l, + arm_matrix_instance_f32 * d, + uint16_t * pp); + + /** + * @brief Floating-point LDL decomposition of Symmetric Positive Semi-Definite Matrix. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] l points to the instance of the output floating-point triangular matrix structure. + * @param[out] d points to the instance of the output floating-point diagonal matrix structure. + * @param[out] p points to the instance of the output floating-point permutation vector. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE. + * The decomposition is returning a lower triangular matrix. + */ + arm_status arm_mat_ldlt_f64( + const arm_matrix_instance_f64 * src, + arm_matrix_instance_f64 * l, + arm_matrix_instance_f64 * d, + uint16_t * pp); + +/** + @brief QR decomposition of a m x n floating point matrix with m >= n. + @param[in] pSrc points to input matrix structure. The source matrix is modified by the function. + @param[in] threshold norm2 threshold. + @param[out] pOutR points to output R matrix structure of dimension m x n + @param[out] pOutQ points to output Q matrix structure of dimension m x m + @param[out] pOutTau points to Householder scaling factors of dimension n + @param[inout] pTmpA points to a temporary vector of dimension m. + @param[inout] pTmpB points to a temporary vector of dimension n. + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + - \ref ARM_MATH_SINGULAR : Input matrix is found to be singular (non-invertible) + */ + +arm_status arm_mat_qr_f32( + const arm_matrix_instance_f32 * pSrc, + const float32_t threshold, + arm_matrix_instance_f32 * pOutR, + arm_matrix_instance_f32 * pOutQ, + float32_t * pOutTau, + float32_t *pTmpA, + float32_t *pTmpB + ); + +/** + @brief QR decomposition of a m x n floating point matrix with m >= n. + @param[in] pSrc points to input matrix structure. The source matrix is modified by the function. + @param[in] threshold norm2 threshold. + @param[out] pOutR points to output R matrix structure of dimension m x n + @param[out] pOutQ points to output Q matrix structure of dimension m x m + @param[out] pOutTau points to Householder scaling factors of dimension n + @param[inout] pTmpA points to a temporary vector of dimension m. + @param[inout] pTmpB points to a temporary vector of dimension n. + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + - \ref ARM_MATH_SINGULAR : Input matrix is found to be singular (non-invertible) + */ + +arm_status arm_mat_qr_f64( + const arm_matrix_instance_f64 * pSrc, + const float64_t threshold, + arm_matrix_instance_f64 * pOutR, + arm_matrix_instance_f64 * pOutQ, + float64_t * pOutTau, + float64_t *pTmpA, + float64_t *pTmpB + ); + +/** + @brief Householder transform of a floating point vector. + @param[in] pSrc points to the input vector. + @param[in] threshold norm2 threshold. + @param[in] blockSize dimension of the vector space. + @param[outQ] pOut points to the output vector. + @return beta return the scaling factor beta + */ + +float32_t arm_householder_f32( + const float32_t * pSrc, + const float32_t threshold, + uint32_t blockSize, + float32_t * pOut + ); + +/** + @brief Householder transform of a double floating point vector. + @param[in] pSrc points to the input vector. + @param[in] threshold norm2 threshold. + @param[in] blockSize dimension of the vector space. + @param[outQ] pOut points to the output vector. + @return beta return the scaling factor beta + */ + +float64_t arm_householder_f64( + const float64_t * pSrc, + const float64_t threshold, + uint32_t blockSize, + float64_t * pOut + ); + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _MATRIX_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/matrix_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/matrix_functions_f16.h new file mode 100644 index 0000000..8ce4bf2 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/matrix_functions_f16.h @@ -0,0 +1,263 @@ +/****************************************************************************** + * @file matrix_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _MATRIX_FUNCTIONS_F16_H_ +#define _MATRIX_FUNCTIONS_F16_H_ + +#ifdef __cplusplus +extern "C" +{ +#endif + + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#if defined(ARM_FLOAT16_SUPPORTED) + + #define DEFAULT_HOUSEHOLDER_THRESHOLD_F16 (1.0e-3f) + + /** + * @brief Instance structure for the floating-point matrix structure. + */ + typedef struct + { + uint16_t numRows; /**< number of rows of the matrix. */ + uint16_t numCols; /**< number of columns of the matrix. */ + float16_t *pData; /**< points to the data of the matrix. */ + } arm_matrix_instance_f16; + + /** + * @brief Floating-point matrix addition. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_add_f16( + const arm_matrix_instance_f16 * pSrcA, + const arm_matrix_instance_f16 * pSrcB, + arm_matrix_instance_f16 * pDst); + + /** + * @brief Floating-point, complex, matrix multiplication. + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_mult_f16( + const arm_matrix_instance_f16 * pSrcA, + const arm_matrix_instance_f16 * pSrcB, + arm_matrix_instance_f16 * pDst); + + /** + * @brief Floating-point matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_trans_f16( + const arm_matrix_instance_f16 * pSrc, + arm_matrix_instance_f16 * pDst); + + /** + * @brief Floating-point complex matrix transpose. + * @param[in] pSrc points to the input matrix + * @param[out] pDst points to the output matrix + * @return The function returns either ARM_MATH_SIZE_MISMATCH + * or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_cmplx_trans_f16( + const arm_matrix_instance_f16 * pSrc, + arm_matrix_instance_f16 * pDst); + + /** + * @brief Floating-point matrix multiplication + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_mult_f16( + const arm_matrix_instance_f16 * pSrcA, + const arm_matrix_instance_f16 * pSrcB, + arm_matrix_instance_f16 * pDst); + /** + * @brief Floating-point matrix and vector multiplication + * @param[in] pSrcMat points to the input matrix structure + * @param[in] pVec points to vector + * @param[out] pDst points to output vector + */ +void arm_mat_vec_mult_f16( + const arm_matrix_instance_f16 *pSrcMat, + const float16_t *pVec, + float16_t *pDst); + + /** + * @brief Floating-point matrix subtraction + * @param[in] pSrcA points to the first input matrix structure + * @param[in] pSrcB points to the second input matrix structure + * @param[out] pDst points to output matrix structure + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_sub_f16( + const arm_matrix_instance_f16 * pSrcA, + const arm_matrix_instance_f16 * pSrcB, + arm_matrix_instance_f16 * pDst); + + /** + * @brief Floating-point matrix scaling. + * @param[in] pSrc points to the input matrix + * @param[in] scale scale factor + * @param[out] pDst points to the output matrix + * @return The function returns either + * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. + */ +arm_status arm_mat_scale_f16( + const arm_matrix_instance_f16 * pSrc, + float16_t scale, + arm_matrix_instance_f16 * pDst); + + /** + * @brief Floating-point matrix initialization. + * @param[in,out] S points to an instance of the floating-point matrix structure. + * @param[in] nRows number of rows in the matrix. + * @param[in] nColumns number of columns in the matrix. + * @param[in] pData points to the matrix data array. + */ +void arm_mat_init_f16( + arm_matrix_instance_f16 * S, + uint16_t nRows, + uint16_t nColumns, + float16_t * pData); + + + /** + * @brief Floating-point matrix inverse. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. + */ + arm_status arm_mat_inverse_f16( + const arm_matrix_instance_f16 * src, + arm_matrix_instance_f16 * dst); + + + /** + * @brief Floating-point Cholesky decomposition of Symmetric Positive Definite Matrix. + * @param[in] src points to the instance of the input floating-point matrix structure. + * @param[out] dst points to the instance of the output floating-point matrix structure. + * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. + * If the input matrix does not have a decomposition, then the algorithm terminates and returns error status ARM_MATH_DECOMPOSITION_FAILURE. + * If the matrix is ill conditioned or only semi-definite, then it is better using the LDL^t decomposition. + * The decomposition is returning a lower triangular matrix. + */ + arm_status arm_mat_cholesky_f16( + const arm_matrix_instance_f16 * src, + arm_matrix_instance_f16 * dst); + + /** + * @brief Solve UT . X = A where UT is an upper triangular matrix + * @param[in] ut The upper triangular matrix + * @param[in] a The matrix a + * @param[out] dst The solution X of UT . X = A + * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. + */ + arm_status arm_mat_solve_upper_triangular_f16( + const arm_matrix_instance_f16 * ut, + const arm_matrix_instance_f16 * a, + arm_matrix_instance_f16 * dst); + + /** + * @brief Solve LT . X = A where LT is a lower triangular matrix + * @param[in] lt The lower triangular matrix + * @param[in] a The matrix a + * @param[out] dst The solution X of LT . X = A + * @return The function returns ARM_MATH_SINGULAR, if the system can't be solved. + */ + arm_status arm_mat_solve_lower_triangular_f16( + const arm_matrix_instance_f16 * lt, + const arm_matrix_instance_f16 * a, + arm_matrix_instance_f16 * dst); + + +/** + @brief QR decomposition of a m x n floating point matrix with m >= n. + @param[in] pSrc points to input matrix structure. The source matrix is modified by the function. + @param[in] threshold norm2 threshold. + @param[out] pOutR points to output R matrix structure of dimension m x n + @param[out] pOutQ points to output Q matrix structure of dimension m x m + @param[out] pOutTau points to Householder scaling factors of dimension n + @param[inout] pTmpA points to a temporary vector of dimension m. + @param[inout] pTmpB points to a temporary vector of dimension n. + @return execution status + - \ref ARM_MATH_SUCCESS : Operation successful + - \ref ARM_MATH_SIZE_MISMATCH : Matrix size check failed + - \ref ARM_MATH_SINGULAR : Input matrix is found to be singular (non-invertible) + */ + +arm_status arm_mat_qr_f16( + const arm_matrix_instance_f16 * pSrc, + const float16_t threshold, + arm_matrix_instance_f16 * pOutR, + arm_matrix_instance_f16 * pOutQ, + float16_t * pOutTau, + float16_t *pTmpA, + float16_t *pTmpB + ); + +/** + @brief Householder transform of a half floating point vector. + @param[in] pSrc points to the input vector. + @param[in] threshold norm2 threshold. + @param[in] blockSize dimension of the vector space. + @param[outQ] pOut points to the output vector. + @return beta return the scaling factor beta + */ + +float16_t arm_householder_f16( + const float16_t * pSrc, + const float16_t threshold, + uint32_t blockSize, + float16_t * pOut + ); + +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _MATRIX_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/matrix_utils.h b/Middlewares/ST/ARM/DSP/Include/dsp/matrix_utils.h new file mode 100644 index 0000000..92ed279 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/matrix_utils.h @@ -0,0 +1,640 @@ +/****************************************************************************** + * @file matrix_utils.h + * @brief Public header file for CMSIS DSP Library + * @version V1.11.0 + * @date 30 May 2022 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2022 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _MATRIX_UTILS_H_ +#define _MATRIX_UTILS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define ELEM(A,ROW,COL) &((A)->pData[(A)->numCols* (ROW) + (COL)]) + +#define SCALE_COL_T(T,CAST,A,ROW,v,i) \ +{ \ + int32_t w; \ + T *data = (A)->pData; \ + const int32_t numCols = (A)->numCols; \ + const int32_t nb = (A)->numRows - ROW;\ + \ + data += i + numCols * (ROW); \ + \ + for(w=0;w < nb; w++) \ + { \ + *data *= CAST v; \ + data += numCols; \ + } \ +} + +#define COPY_COL_T(T,A,ROW,COL,DST) \ +{ \ + uint32_t row; \ + T *pb=DST; \ + T *pa = (A)->pData + ROW * (A)->numCols + COL;\ + for(row = ROW; row < (A)->numRows; row ++) \ + { \ + *pb++ = *pa; \ + pa += (A)->numCols; \ + } \ +} + +#if defined(ARM_FLOAT16_SUPPORTED) +#if defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE) + +#define SWAP_ROWS_F16(A,COL,i,j) \ + { \ + int cnt = ((A)->numCols)-(COL); \ + int32_t w; \ + float16_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols; \ + \ + for(w=(COL);w < numCols; w+=8) \ + { \ + f16x8_t tmpa,tmpb; \ + mve_pred16_t p0 = vctp16q(cnt); \ + \ + tmpa=vldrhq_z_f16(&data[i*numCols + w],p0);\ + tmpb=vldrhq_z_f16(&data[j*numCols + w],p0);\ + \ + vstrhq_p(&data[i*numCols + w], tmpb, p0); \ + vstrhq_p(&data[j*numCols + w], tmpa, p0); \ + \ + cnt -= 8; \ + } \ + } + +#define SCALE_ROW_F16(A,COL,v,i) \ +{ \ + int cnt = ((A)->numCols)-(COL); \ + int32_t w; \ + float16_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols; \ + \ + for(w=(COL);w < numCols; w+=8) \ + { \ + f16x8_t tmpa; \ + mve_pred16_t p0 = vctp16q(cnt); \ + tmpa = vldrhq_z_f16(&data[i*numCols + w],p0);\ + tmpa = vmulq_n_f16(tmpa,(_Float16)v); \ + vstrhq_p(&data[i*numCols + w], tmpa, p0); \ + cnt -= 8; \ + } \ + \ +} + +#define MAC_ROW_F16(COL,A,i,v,B,j) \ +{ \ + int cnt = ((A)->numCols)-(COL); \ + int32_t w; \ + float16_t *dataA = (A)->pData; \ + float16_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols; \ + \ + for(w=(COL);w < numCols; w+=8) \ + { \ + f16x8_t tmpa,tmpb; \ + mve_pred16_t p0 = vctp16q(cnt); \ + tmpa = vldrhq_z_f16(&dataA[i*numCols + w],p0);\ + tmpb = vldrhq_z_f16(&dataB[j*numCols + w],p0);\ + tmpa = vfmaq_n_f16(tmpa,tmpb,v); \ + vstrhq_p(&dataA[i*numCols + w], tmpa, p0); \ + cnt -= 8; \ + } \ + \ +} + +#define MAS_ROW_F16(COL,A,i,v,B,j) \ +{ \ + int cnt = ((A)->numCols)-(COL); \ + int32_t w; \ + float16_t *dataA = (A)->pData; \ + float16_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols; \ + f16x8_t vec=vdupq_n_f16(v); \ + \ + for(w=(COL);w < numCols; w+=8) \ + { \ + f16x8_t tmpa,tmpb; \ + mve_pred16_t p0 = vctp16q(cnt); \ + tmpa = vldrhq_z_f16(&dataA[i*numCols + w],p0);\ + tmpb = vldrhq_z_f16(&dataB[j*numCols + w],p0);\ + tmpa = vfmsq_f16(tmpa,tmpb,vec); \ + vstrhq_p(&dataA[i*numCols + w], tmpa, p0); \ + cnt -= 8; \ + } \ + \ +} + +#else + + +#define SWAP_ROWS_F16(A,COL,i,j) \ +{ \ + int32_t w; \ + float16_t *dataI = (A)->pData; \ + float16_t *dataJ = (A)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols-(COL); \ + \ + dataI += i*numCols + (COL); \ + dataJ += j*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + float16_t tmp; \ + tmp = *dataI; \ + *dataI++ = *dataJ; \ + *dataJ++ = tmp; \ + } \ +} + +#define SCALE_ROW_F16(A,COL,v,i) \ +{ \ + int32_t w; \ + float16_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols-(COL); \ + \ + data += i*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + *data++ *= (_Float16)v; \ + } \ +} + + +#define MAC_ROW_F16(COL,A,i,v,B,j) \ +{ \ + int32_t w; \ + float16_t *dataA = (A)->pData; \ + float16_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols; \ + const int32_t nb = numCols-(COL); \ + \ + dataA += i*numCols + (COL); \ + dataB += j*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + *dataA++ += (_Float16)v * (_Float16)*dataB++;\ + } \ +} + +#define MAS_ROW_F16(COL,A,i,v,B,j) \ +{ \ + int32_t w; \ + float16_t *dataA = (A)->pData; \ + float16_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols; \ + const int32_t nb = numCols-(COL); \ + \ + dataA += i*numCols + (COL); \ + dataB += j*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + *dataA++ -= (_Float16)v * (_Float16)*dataB++;\ + } \ +} + +#endif /*defined(ARM_MATH_MVE_FLOAT16) && !defined(ARM_MATH_AUTOVECTORIZE)*/ + +/* Functions with only a scalar version */ +#define COPY_COL_F16(A,ROW,COL,DST) \ + COPY_COL_T(float16_t,A,ROW,COL,DST) + +#define SCALE_COL_F16(A,ROW,v,i) \ + SCALE_COL_T(float16_t,(_Float16),A,ROW,v,i) + +#endif /* defined(ARM_FLOAT16_SUPPORTED)*/ + +#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) + +#define SWAP_ROWS_F32(A,COL,i,j) \ + { \ + int cnt = ((A)->numCols)-(COL); \ + float32_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols; \ + int32_t w; \ + \ + for(w=(COL);w < numCols; w+=4) \ + { \ + f32x4_t tmpa,tmpb; \ + mve_pred16_t p0 = vctp32q(cnt); \ + \ + tmpa=vldrwq_z_f32(&data[i*numCols + w],p0);\ + tmpb=vldrwq_z_f32(&data[j*numCols + w],p0);\ + \ + vstrwq_p(&data[i*numCols + w], tmpb, p0); \ + vstrwq_p(&data[j*numCols + w], tmpa, p0); \ + \ + cnt -= 4; \ + } \ + } + +#define MAC_ROW_F32(COL,A,i,v,B,j) \ +{ \ + int cnt = ((A)->numCols)-(COL); \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols; \ + int32_t w; \ + \ + for(w=(COL);w < numCols; w+=4) \ + { \ + f32x4_t tmpa,tmpb; \ + mve_pred16_t p0 = vctp32q(cnt); \ + tmpa = vldrwq_z_f32(&dataA[i*numCols + w],p0);\ + tmpb = vldrwq_z_f32(&dataB[j*numCols + w],p0);\ + tmpa = vfmaq_n_f32(tmpa,tmpb,v); \ + vstrwq_p(&dataA[i*numCols + w], tmpa, p0); \ + cnt -= 4; \ + } \ + \ +} + +#define MAS_ROW_F32(COL,A,i,v,B,j) \ +{ \ + int cnt = ((A)->numCols)-(COL); \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols; \ + int32_t w; \ + f32x4_t vec=vdupq_n_f32(v); \ + \ + for(w=(COL);w < numCols; w+=4) \ + { \ + f32x4_t tmpa,tmpb; \ + mve_pred16_t p0 = vctp32q(cnt); \ + tmpa = vldrwq_z_f32(&dataA[i*numCols + w],p0);\ + tmpb = vldrwq_z_f32(&dataB[j*numCols + w],p0);\ + tmpa = vfmsq_f32(tmpa,tmpb,vec); \ + vstrwq_p(&dataA[i*numCols + w], tmpa, p0); \ + cnt -= 4; \ + } \ + \ +} + +#define SCALE_ROW_F32(A,COL,v,i) \ +{ \ + int cnt = ((A)->numCols)-(COL); \ + float32_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols; \ + int32_t w; \ + \ + for(w=(COL);w < numCols; w+=4) \ + { \ + f32x4_t tmpa; \ + mve_pred16_t p0 = vctp32q(cnt); \ + tmpa = vldrwq_z_f32(&data[i*numCols + w],p0);\ + tmpa = vmulq_n_f32(tmpa,v); \ + vstrwq_p(&data[i*numCols + w], tmpa, p0); \ + cnt -= 4; \ + } \ + \ +} + +#elif defined(ARM_MATH_NEON) && !defined(ARM_MATH_AUTOVECTORIZE) + +#define SWAP_ROWS_F32(A,COL,i,j) \ +{ \ + int32_t w; \ + float32_t *dataI = (A)->pData; \ + float32_t *dataJ = (A)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols - COL; \ + \ + dataI += i*numCols + (COL); \ + dataJ += j*numCols + (COL); \ + \ + float32_t tmp; \ + \ + for(w=0;w < nb; w++) \ + { \ + tmp = *dataI; \ + *dataI++ = *dataJ; \ + *dataJ++ = tmp; \ + } \ +} + +#define MAC_ROW_F32(COL,A,i,v,B,j) \ +{ \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols - (COL); \ + int32_t nbElems; \ + f32x4_t vec = vdupq_n_f32(v); \ + \ + nbElems = nb >> 2; \ + \ + dataA += i*numCols + (COL); \ + dataB += j*numCols + (COL); \ + \ + while(nbElems>0) \ + { \ + f32x4_t tmpa,tmpb; \ + tmpa = vld1q_f32(dataA,p0); \ + tmpb = vld1q_f32(dataB,p0); \ + tmpa = vmlaq_f32(tmpa,tmpb,vec);\ + vst1q_f32(dataA, tmpa, p0); \ + nbElems--; \ + dataA += 4; \ + dataB += 4; \ + } \ + \ + nbElems = nb & 3; \ + while(nbElems > 0) \ + { \ + *dataA++ += v* *dataB++; \ + nbElems--; \ + } \ +} + +#define MAS_ROW_F32(COL,A,i,v,B,j) \ +{ \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols - (COL); \ + int32_t nbElems; \ + f32x4_t vec = vdupq_n_f32(v); \ + \ + nbElems = nb >> 2; \ + \ + dataA += i*numCols + (COL); \ + dataB += j*numCols + (COL); \ + \ + while(nbElems>0) \ + { \ + f32x4_t tmpa,tmpb; \ + tmpa = vld1q_f32(dataA); \ + tmpb = vld1q_f32(dataB); \ + tmpa = vmlsq_f32(tmpa,tmpb,vec);\ + vst1q_f32(dataA, tmpa); \ + nbElems--; \ + dataA += 4; \ + dataB += 4; \ + } \ + \ + nbElems = nb & 3; \ + while(nbElems > 0) \ + { \ + *dataA++ -= v* *dataB++; \ + nbElems--; \ + } \ +} + +#define SCALE_ROW_F32(A,COL,v,i) \ +{ \ + float32_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols; \ + const int32_t nb = numCols - (COL); \ + int32_t nbElems; \ + f32x4_t vec = vdupq_n_f32(v); \ + \ + nbElems = nb >> 2; \ + \ + data += i*numCols + (COL); \ + while(nbElems>0) \ + { \ + f32x4_t tmpa; \ + tmpa = vld1q_f32(data); \ + tmpa = vmulq_f32(tmpa,vec); \ + vst1q_f32(data, tmpa); \ + data += 4; \ + nbElems --; \ + } \ + \ + nbElems = nb & 3; \ + while(nbElems > 0) \ + { \ + *data++ *= v; \ + nbElems--; \ + } \ + \ +} + +#else + +#define SWAP_ROWS_F32(A,COL,i,j) \ +{ \ + int32_t w; \ + float32_t tmp; \ + float32_t *dataI = (A)->pData; \ + float32_t *dataJ = (A)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols - COL; \ + \ + dataI += i*numCols + (COL); \ + dataJ += j*numCols + (COL); \ + \ + \ + for(w=0;w < nb; w++) \ + { \ + tmp = *dataI; \ + *dataI++ = *dataJ; \ + *dataJ++ = tmp; \ + } \ +} + +#define SCALE_ROW_F32(A,COL,v,i) \ +{ \ + int32_t w; \ + float32_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols - COL; \ + \ + data += i*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + *data++ *= v; \ + } \ +} + + +#define MAC_ROW_F32(COL,A,i,v,B,j) \ +{ \ + int32_t w; \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols-(COL); \ + \ + dataA = dataA + i*numCols + (COL); \ + dataB = dataB + j*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + *dataA++ += v* *dataB++; \ + } \ +} + +#define MAS_ROW_F32(COL,A,i,v,B,j) \ +{ \ + int32_t w; \ + float32_t *dataA = (A)->pData; \ + float32_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols-(COL); \ + \ + dataA = dataA + i*numCols + (COL); \ + dataB = dataB + j*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + *dataA++ -= v* *dataB++; \ + } \ +} + +#endif /* defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) */ + + +/* Functions with only a scalar version */ + +#define COPY_COL_F32(A,ROW,COL,DST) \ + COPY_COL_T(float32_t,A,ROW,COL,DST) + +#define COPY_COL_F64(A,ROW,COL,DST) \ + COPY_COL_T(float64_t,A,ROW,COL,DST) + +#define SWAP_COLS_F32(A,COL,i,j) \ +{ \ + int32_t w; \ + float32_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols; \ + for(w=(COL);w < numCols; w++) \ + { \ + float32_t tmp; \ + tmp = data[w*numCols + i]; \ + data[w*numCols + i] = data[w*numCols + j];\ + data[w*numCols + j] = tmp; \ + } \ +} + +#define SCALE_COL_F32(A,ROW,v,i) \ + SCALE_COL_T(float32_t,,A,ROW,v,i) + +#define SWAP_ROWS_F64(A,COL,i,j) \ +{ \ + int32_t w; \ + float64_t *dataI = (A)->pData; \ + float64_t *dataJ = (A)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols-(COL); \ + \ + dataI += i*numCols + (COL); \ + dataJ += j*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + float64_t tmp; \ + tmp = *dataI; \ + *dataI++ = *dataJ; \ + *dataJ++ = tmp; \ + } \ +} + +#define SWAP_COLS_F64(A,COL,i,j) \ +{ \ + int32_t w; \ + float64_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols; \ + for(w=(COL);w < numCols; w++) \ + { \ + float64_t tmp; \ + tmp = data[w*numCols + i]; \ + data[w*numCols + i] = data[w*numCols + j];\ + data[w*numCols + j] = tmp; \ + } \ +} + +#define SCALE_ROW_F64(A,COL,v,i) \ +{ \ + int32_t w; \ + float64_t *data = (A)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols-(COL); \ + \ + data += i*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + *data++ *= v; \ + } \ +} + +#define SCALE_COL_F64(A,ROW,v,i) \ + SCALE_COL_T(float64_t,,A,ROW,v,i) + +#define MAC_ROW_F64(COL,A,i,v,B,j) \ +{ \ + int32_t w; \ + float64_t *dataA = (A)->pData; \ + float64_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols-(COL); \ + \ + dataA += i*numCols + (COL); \ + dataB += j*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + *dataA++ += v* *dataB++; \ + } \ +} + +#define MAS_ROW_F64(COL,A,i,v,B,j) \ +{ \ + int32_t w; \ + float64_t *dataA = (A)->pData; \ + float64_t *dataB = (B)->pData; \ + const int32_t numCols = (A)->numCols;\ + const int32_t nb = numCols-(COL); \ + \ + dataA += i*numCols + (COL); \ + dataB += j*numCols + (COL); \ + \ + for(w=0;w < nb; w++) \ + { \ + *dataA++ -= v* *dataB++; \ + } \ +} + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _MATRIX_UTILS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/none.h b/Middlewares/ST/ARM/DSP/Include/dsp/none.h new file mode 100644 index 0000000..130386e --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/none.h @@ -0,0 +1,576 @@ +/****************************************************************************** + * @file none.h + * @brief Intrinsincs when no DSP extension available + * @version V1.9.0 + * @date 20. July 2020 + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + +Definitions in this file are allowing to reuse some versions of the +CMSIS-DSP to build on a core (M0 for instance) or a host where +DSP extension are not available. + +Ideally a pure C version should have been used instead. +But those are not always available or use a restricted set +of intrinsics. + +*/ + +#ifndef _NONE_H_ +#define _NONE_H_ + +#include "arm_math_types.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + + +/* + +Normally those kind of definitions are in a compiler file +in Core or Core_A. + +But for MSVC compiler it is a bit special. The goal is very specific +to CMSIS-DSP and only to allow the use of this library from other +systems like Python or Matlab. + +MSVC is not going to be used to cross-compile to ARM. So, having a MSVC +compiler file in Core or Core_A would not make sense. + +*/ +#if defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) || defined(__APPLE_CC__) + __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } + + /** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +#endif + +/** + * @brief Clips Q63 to Q31 values. + */ + __STATIC_FORCEINLINE q31_t clip_q63_to_q31( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; + } + + /** + * @brief Clips Q63 to Q15 values. + */ + __STATIC_FORCEINLINE q15_t clip_q63_to_q15( + q63_t x) + { + return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? + ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); + } + + /** + * @brief Clips Q31 to Q7 values. + */ + __STATIC_FORCEINLINE q7_t clip_q31_to_q7( + q31_t x) + { + return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? + ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; + } + + /** + * @brief Clips Q31 to Q15 values. + */ + __STATIC_FORCEINLINE q15_t clip_q31_to_q15( + q31_t x) + { + return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? + ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; + } + + /** + * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. + */ + __STATIC_FORCEINLINE q63_t mult32x64( + q63_t x, + q31_t y) + { + return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + + (((q63_t) (x >> 32) * y) ) ); + } + +/* SMMLAR */ +#define multAcc_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMLSR */ +#define multSub_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) + +/* SMMULR */ +#define mult_32x32_keep32_R(a, x, y) \ + a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) + +/* SMMLA */ +#define multAcc_32x32_keep32(a, x, y) \ + a += (q31_t) (((q63_t) x * y) >> 32) + +/* SMMLS */ +#define multSub_32x32_keep32(a, x, y) \ + a -= (q31_t) (((q63_t) x * y) >> 32) + +/* SMMUL */ +#define mult_32x32_keep32(a, x, y) \ + a = (q31_t) (((q63_t) x * y ) >> 32) + +#ifndef ARM_MATH_DSP + /** + * @brief definition to pack two 16 bit values. + */ + #define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ + (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) + #define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ + (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) +#endif + + /** + * @brief definition to pack four 8 bit values. + */ +#ifndef ARM_MATH_BIG_ENDIAN + #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) +#else + #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ + (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ + (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ + (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) +#endif + + + + +/* + * @brief C custom defined intrinsic functions + */ +#if !defined (ARM_MATH_DSP) + + + /* + * @brief C custom defined QADD8 + */ + __STATIC_FORCEINLINE uint32_t __QADD8( + uint32_t x, + uint32_t y) + { + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); + } + + + /* + * @brief C custom defined QSUB8 + */ + __STATIC_FORCEINLINE uint32_t __QSUB8( + uint32_t x, + uint32_t y) + { + q31_t r, s, t, u; + + r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; + s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; + t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; + u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; + + return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); + } + + + /* + * @brief C custom defined QADD16 + */ + __STATIC_FORCEINLINE uint32_t __QADD16( + uint32_t x, + uint32_t y) + { +/* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ + q31_t r = 0, s = 0; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHADD16 + */ + __STATIC_FORCEINLINE uint32_t __SHADD16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QSUB16 + */ + __STATIC_FORCEINLINE uint32_t __QSUB16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHSUB16 + */ + __STATIC_FORCEINLINE uint32_t __SHSUB16( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QASX + */ + __STATIC_FORCEINLINE uint32_t __QASX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHASX + */ + __STATIC_FORCEINLINE uint32_t __SHASX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined QSAX + */ + __STATIC_FORCEINLINE uint32_t __QSAX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; + s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SHSAX + */ + __STATIC_FORCEINLINE uint32_t __SHSAX( + uint32_t x, + uint32_t y) + { + q31_t r, s; + + r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; + s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; + + return ((uint32_t)((s << 16) | (r ))); + } + + + /* + * @brief C custom defined SMUSDX + */ + __STATIC_FORCEINLINE uint32_t __SMUSDX( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); + } + + /* + * @brief C custom defined SMUADX + */ + __STATIC_FORCEINLINE uint32_t __SMUADX( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); + } + + + /* + * @brief C custom defined QADD + */ + __STATIC_FORCEINLINE int32_t __QADD( + int32_t x, + int32_t y) + { + return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); + } + + + /* + * @brief C custom defined QSUB + */ + __STATIC_FORCEINLINE int32_t __QSUB( + int32_t x, + int32_t y) + { + return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); + } + + + /* + * @brief C custom defined SMLAD + */ + __STATIC_FORCEINLINE uint32_t __SMLAD( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLADX + */ + __STATIC_FORCEINLINE uint32_t __SMLADX( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLSDX + */ + __STATIC_FORCEINLINE uint32_t __SMLSDX( + uint32_t x, + uint32_t y, + uint32_t sum) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q31_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLALD + */ + __STATIC_FORCEINLINE uint64_t __SMLALD( + uint32_t x, + uint32_t y, + uint64_t sum) + { +/* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + + ( ((q63_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMLALDX + */ + __STATIC_FORCEINLINE uint64_t __SMLALDX( + uint32_t x, + uint32_t y, + uint64_t sum) + { +/* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ + return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + + ( ((q63_t)sum ) ) )); + } + + + /* + * @brief C custom defined SMUAD + */ + __STATIC_FORCEINLINE uint32_t __SMUAD( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); + } + + + /* + * @brief C custom defined SMUSD + */ + __STATIC_FORCEINLINE uint32_t __SMUSD( + uint32_t x, + uint32_t y) + { + return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - + ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); + } + + + /* + * @brief C custom defined SXTB16 + */ + __STATIC_FORCEINLINE uint32_t __SXTB16( + uint32_t x) + { + return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | + ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) )); + } + + /* + * @brief C custom defined SMMLA + */ + __STATIC_FORCEINLINE int32_t __SMMLA( + int32_t x, + int32_t y, + int32_t sum) + { + return (sum + (int32_t) (((int64_t) x * y) >> 32)); + } + +#endif /* !defined (ARM_MATH_DSP) */ + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _TRANSFORM_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/quaternion_math_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/quaternion_math_functions.h new file mode 100644 index 0000000..0c5d067 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/quaternion_math_functions.h @@ -0,0 +1,159 @@ +/****************************************************************************** + * @file quaternion_math_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2021 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _QUATERNION_MATH_FUNCTIONS_H_ +#define _QUATERNION_MATH_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @defgroup groupQuaternionMath Quaternion Math Functions + * Functions to operates on quaternions and convert between a + * rotation and quaternion representation. + */ + + +/** + @brief Floating-point quaternion Norm. + @param[in] pInputQuaternions points to the input vector of quaternions + @param[out] pNorms points to the output vector of norms + @param[in] nbQuaternions number of quaternions in each vector + @return none + */ + + + +void arm_quaternion_norm_f32(const float32_t *pInputQuaternions, + float32_t *pNorms, + uint32_t nbQuaternions); + + +/** + @brief Floating-point quaternion inverse. + @param[in] pInputQuaternions points to the input vector of quaternions + @param[out] pInverseQuaternions points to the output vector of inverse quaternions + @param[in] nbQuaternions number of quaternions in each vector + @return none + */ + +void arm_quaternion_inverse_f32(const float32_t *pInputQuaternions, + float32_t *pInverseQuaternions, + uint32_t nbQuaternions); + +/** + @brief Floating-point quaternion conjugates. + @param[in] pInputQuaternions points to the input vector of quaternions + @param[out] pConjugateQuaternions points to the output vector of conjugate quaternions + @param[in] nbQuaternions number of quaternions in each vector + @return none + */ +void arm_quaternion_conjugate_f32(const float32_t *inputQuaternions, + float32_t *pConjugateQuaternions, + uint32_t nbQuaternions); + +/** + @brief Floating-point normalization of quaternions. + @param[in] pInputQuaternions points to the input vector of quaternions + @param[out] pNormalizedQuaternions points to the output vector of normalized quaternions + @param[in] nbQuaternions number of quaternions in each vector + @return none + */ +void arm_quaternion_normalize_f32(const float32_t *inputQuaternions, + float32_t *pNormalizedQuaternions, + uint32_t nbQuaternions); + + +/** + @brief Floating-point product of two quaternions. + @param[in] qa First quaternion + @param[in] qb Second quaternion + @param[out] r Product of two quaternions + @return none + */ +void arm_quaternion_product_single_f32(const float32_t *qa, + const float32_t *qb, + float32_t *r); + +/** + @brief Floating-point elementwise product two quaternions. + @param[in] qa First array of quaternions + @param[in] qb Second array of quaternions + @param[out] r Elementwise product of quaternions + @param[in] nbQuaternions Number of quaternions in the array + @return none + */ +void arm_quaternion_product_f32(const float32_t *qa, + const float32_t *qb, + float32_t *r, + uint32_t nbQuaternions); + +/** + * @brief Conversion of quaternion to equivalent rotation matrix. + * @param[in] pInputQuaternions points to an array of normalized quaternions + * @param[out] pOutputRotations points to an array of 3x3 rotations (in row order) + * @param[in] nbQuaternions in the array + * @return none. + * + * Format of rotation matrix + * \par + * The quaternion a + ib + jc + kd is converted into rotation matrix: + * a^2 + b^2 - c^2 - d^2 2bc - 2ad 2bd + 2ac + * 2bc + 2ad a^2 - b^2 + c^2 - d^2 2cd - 2ab + * 2bd - 2ac 2cd + 2ab a^2 - b^2 - c^2 + d^2 + * + * Rotation matrix is saved in row order : R00 R01 R02 R10 R11 R12 R20 R21 R22 + */ +void arm_quaternion2rotation_f32(const float32_t *pInputQuaternions, + float32_t *pOutputRotations, + uint32_t nbQuaternions); + +/** + * @brief Conversion of a rotation matrix to equivalent quaternion. + * @param[in] pInputRotations points to an array 3x3 rotation matrix (in row order) + * @param[out] pOutputQuaternions points to an array of quaternions + * @param[in] nbQuaternions in the array + * @return none. +*/ +void arm_rotation2quaternion_f32(const float32_t *pInputRotations, + float32_t *pOutputQuaternions, + uint32_t nbQuaternions); + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _QUATERNION_MATH_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/statistics_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/statistics_functions.h new file mode 100644 index 0000000..805b45d --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/statistics_functions.h @@ -0,0 +1,1003 @@ +/****************************************************************************** + * @file statistics_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.1 + * @date 14 July 2022 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _STATISTICS_FUNCTIONS_H_ +#define _STATISTICS_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/basic_math_functions.h" +#include "dsp/fast_math_functions.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * @defgroup groupStats Statistics Functions + */ + +/** + * @brief Computation of the LogSumExp + * + * In probabilistic computations, the dynamic of the probability values can be very + * wide because they come from gaussian functions. + * To avoid underflow and overflow issues, the values are represented by their log. + * In this representation, multiplying the original exp values is easy : their logs are added. + * But adding the original exp values is requiring some special handling and it is the + * goal of the LogSumExp function. + * + * If the values are x1...xn, the function is computing: + * + * ln(exp(x1) + ... + exp(xn)) and the computation is done in such a way that + * rounding issues are minimised. + * + * The max xm of the values is extracted and the function is computing: + * xm + ln(exp(x1 - xm) + ... + exp(xn - xm)) + * + * @param[in] *in Pointer to an array of input values. + * @param[in] blockSize Number of samples in the input array. + * @return LogSumExp + * + */ + + +float32_t arm_logsumexp_f32(const float32_t *in, uint32_t blockSize); + +/** + * @brief Dot product with log arithmetic + * + * Vectors are containing the log of the samples + * + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[in] pTmpBuffer temporary buffer of length blockSize + * @return The log of the dot product . + * + */ + + +float32_t arm_logsumexp_dot_prod_f32(const float32_t * pSrcA, + const float32_t * pSrcB, + uint32_t blockSize, + float32_t *pTmpBuffer); + +/** + * @brief Entropy + * + * @param[in] pSrcA Array of input values. + * @param[in] blockSize Number of samples in the input array. + * @return Entropy -Sum(p ln p) + * + */ + + +float32_t arm_entropy_f32(const float32_t * pSrcA,uint32_t blockSize); + + +/** + * @brief Entropy + * + * @param[in] pSrcA Array of input values. + * @param[in] blockSize Number of samples in the input array. + * @return Entropy -Sum(p ln p) + * + */ + + +float64_t arm_entropy_f64(const float64_t * pSrcA, uint32_t blockSize); + + +/** + * @brief Kullback-Leibler + * + * @param[in] pSrcA Pointer to an array of input values for probability distribution A. + * @param[in] pSrcB Pointer to an array of input values for probability distribution B. + * @param[in] blockSize Number of samples in the input array. + * @return Kullback-Leibler Divergence D(A || B) + * + */ +float32_t arm_kullback_leibler_f32(const float32_t * pSrcA + ,const float32_t * pSrcB + ,uint32_t blockSize); + + +/** + * @brief Kullback-Leibler + * + * @param[in] pSrcA Pointer to an array of input values for probability distribution A. + * @param[in] pSrcB Pointer to an array of input values for probability distribution B. + * @param[in] blockSize Number of samples in the input array. + * @return Kullback-Leibler Divergence D(A || B) + * + */ +float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, + const float64_t * pSrcB, + uint32_t blockSize); + + + /** + * @brief Sum of the squares of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q31( + const q31_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q15( + const q15_t * pSrc, + uint32_t blockSize, + q63_t * pResult); + + + /** + * @brief Sum of the squares of the elements of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_q7( + const q7_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Mean value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult); + + + /** + * @brief Mean value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Mean value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Mean value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Mean value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult); + + + /** + * @brief Variance of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Variance of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult); + + + /** + * @brief Variance of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Variance of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Root Mean Square of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Standard deviation of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Standard deviation of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult); + + + /** + * @brief Standard deviation of the elements of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Standard deviation of the elements of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + + /** + * @brief Minimum value of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[in] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[in] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_absmin_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a Q7 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + */ + void arm_absmin_no_idx_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult); + + + /** + * @brief Minimum value of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[in] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + +/** + * @brief Minimum value of absolute values of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[in] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_absmin_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a Q15 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + */ + void arm_absmin_no_idx_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + + + /** + * @brief Minimum value of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_absmin_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a Q31 vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + */ + void arm_absmin_no_idx_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + + + /** + * @brief Minimum value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_absmin_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + */ + void arm_absmin_no_idx_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + + + /** + * @brief Minimum value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_absmin_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + */ + void arm_absmin_no_idx_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult); + + +/** + * @brief Maximum value of a Q7 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of absolute values of a Q7 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_absmax_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of absolute values of a Q7 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + */ + void arm_absmax_no_idx_q7( + const q7_t * pSrc, + uint32_t blockSize, + q7_t * pResult); + + +/** + * @brief Maximum value of a Q15 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of absolute values of a Q15 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_absmax_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult, + uint32_t * pIndex); + + /** + * @brief Maximum value of absolute values of a Q15 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + */ + void arm_absmax_no_idx_q15( + const q15_t * pSrc, + uint32_t blockSize, + q15_t * pResult); + +/** + * @brief Maximum value of a Q31 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of absolute values of a Q31 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_absmax_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult, + uint32_t * pIndex); + + /** + * @brief Maximum value of absolute values of a Q31 vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + */ + void arm_absmax_no_idx_q31( + const q31_t * pSrc, + uint32_t blockSize, + q31_t * pResult); + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of absolute values of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_absmax_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult, + uint32_t * pIndex); + + /** + * @brief Maximum value of absolute values of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + */ + void arm_absmax_no_idx_f32( + const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of absolute values of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_absmax_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of absolute values of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + */ + void arm_absmax_no_idx_f64( + const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult); + + /** + @brief Maximum value of a floating-point vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult maximum value returned here + @return none + */ + void arm_max_no_idx_f32( + const float32_t *pSrc, + uint32_t blockSize, + float32_t *pResult); + + /** + @brief Minimum value of a floating-point vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult minimum value returned here + @return none + */ + void arm_min_no_idx_f32( + const float32_t *pSrc, + uint32_t blockSize, + float32_t *pResult); + + /** + @brief Maximum value of a floating-point vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult maximum value returned here + @return none + */ + void arm_max_no_idx_f64( + const float64_t *pSrc, + uint32_t blockSize, + float64_t *pResult); + + /** + @brief Maximum value of a q31 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult maximum value returned here + @return none + */ + void arm_max_no_idx_q31( + const q31_t *pSrc, + uint32_t blockSize, + q31_t *pResult); + + /** + @brief Maximum value of a q15 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult maximum value returned here + @return none + */ + void arm_max_no_idx_q15( + const q15_t *pSrc, + uint32_t blockSize, + q15_t *pResult); + + /** + @brief Maximum value of a q7 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult maximum value returned here + @return none + */ + void arm_max_no_idx_q7( + const q7_t *pSrc, + uint32_t blockSize, + q7_t *pResult); + + /** + @brief Minimum value of a floating-point vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult minimum value returned here + @return none + */ + void arm_min_no_idx_f64( + const float64_t *pSrc, + uint32_t blockSize, + float64_t *pResult); + +/** + @brief Minimum value of a q31 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult minimum value returned here + @return none + */ + void arm_min_no_idx_q31( + const q31_t *pSrc, + uint32_t blockSize, + q31_t *pResult); + + /** + @brief Minimum value of a q15 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult minimum value returned here + @return none + */ + void arm_min_no_idx_q15( + const q15_t *pSrc, + uint32_t blockSize, + q15_t *pResult); + + /** + @brief Minimum value of a q7 vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult minimum value returned here + @return none + */ + void arm_min_no_idx_q7( + const q7_t *pSrc, + uint32_t blockSize, + q7_t *pResult); + +/** + @brief Mean square error between two Q7 vectors. + @param[in] pSrcA points to the first input vector + @param[in] pSrcB points to the second input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult mean square error + @return none +*/ + +void arm_mse_q7( + const q7_t * pSrcA, + const q7_t * pSrcB, + uint32_t blockSize, + q7_t * pResult); + +/** + @brief Mean square error between two Q15 vectors. + @param[in] pSrcA points to the first input vector + @param[in] pSrcB points to the second input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult mean square error + @return none +*/ + +void arm_mse_q15( + const q15_t * pSrcA, + const q15_t * pSrcB, + uint32_t blockSize, + q15_t * pResult); + +/** + @brief Mean square error between two Q31 vectors. + @param[in] pSrcA points to the first input vector + @param[in] pSrcB points to the second input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult mean square error + @return none +*/ + +void arm_mse_q31( + const q31_t * pSrcA, + const q31_t * pSrcB, + uint32_t blockSize, + q31_t * pResult); + +/** + @brief Mean square error between two single precision float vectors. + @param[in] pSrcA points to the first input vector + @param[in] pSrcB points to the second input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult mean square error + @return none +*/ + +void arm_mse_f32( + const float32_t * pSrcA, + const float32_t * pSrcB, + uint32_t blockSize, + float32_t * pResult); + +/** + @brief Mean square error between two double precision float vectors. + @param[in] pSrcA points to the first input vector + @param[in] pSrcB points to the second input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult mean square error + @return none +*/ + +void arm_mse_f64( + const float64_t * pSrcA, + const float64_t * pSrcB, + uint32_t blockSize, + float64_t * pResult); + + +/** + * @brief Accumulation value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + +void arm_accumulate_f32( +const float32_t * pSrc, + uint32_t blockSize, + float32_t * pResult); + +/** + * @brief Accumulation value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + +void arm_accumulate_f64( +const float64_t * pSrc, + uint32_t blockSize, + float64_t * pResult); + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _STATISTICS_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/statistics_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/statistics_functions_f16.h new file mode 100644 index 0000000..33b12c4 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/statistics_functions_f16.h @@ -0,0 +1,279 @@ +/****************************************************************************** + * @file statistics_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.1 + * @date 14 July 2022 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _STATISTICS_FUNCTIONS_F16_H_ +#define _STATISTICS_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/basic_math_functions_f16.h" +#include "dsp/fast_math_functions_f16.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + + /** + * @brief Sum of the squares of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_power_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult); + + /** + * @brief Mean value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_mean_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult); + + /** + * @brief Variance of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_var_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult); + + /** + * @brief Root Mean Square of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_rms_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult); + + /** + * @brief Standard deviation of the elements of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_std_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult); + + /** + * @brief Minimum value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_min_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + * @param[out] pIndex is the array index of the minimum value in the input buffer. + */ + void arm_absmin_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_max_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult, + uint32_t * pIndex); + +/** + * @brief Maximum value of absolute values of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + * @param[out] pIndex index of maximum value returned here + */ + void arm_absmax_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult, + uint32_t * pIndex); + + /** + * @brief Minimum value of absolute values of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output pointer + */ + void arm_absmin_no_idx_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult); + +/** + * @brief Maximum value of a floating-point vector. + * @param[in] pSrc points to the input buffer + * @param[in] blockSize length of the input vector + * @param[out] pResult maximum value returned here + */ + void arm_absmax_no_idx_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult); + + +/** + * @brief Entropy + * + * @param[in] pSrcA Array of input values. + * @param[in] blockSize Number of samples in the input array. + * @return Entropy -Sum(p ln p) + * + */ + + +float16_t arm_entropy_f16(const float16_t * pSrcA,uint32_t blockSize); + +float16_t arm_logsumexp_f16(const float16_t *in, uint32_t blockSize); + +/** + * @brief Dot product with log arithmetic + * + * Vectors are containing the log of the samples + * + * @param[in] pSrcA points to the first input vector + * @param[in] pSrcB points to the second input vector + * @param[in] blockSize number of samples in each vector + * @param[in] pTmpBuffer temporary buffer of length blockSize + * @return The log of the dot product . + * + */ + + +float16_t arm_logsumexp_dot_prod_f16(const float16_t * pSrcA, + const float16_t * pSrcB, + uint32_t blockSize, + float16_t *pTmpBuffer); + +/** + * @brief Kullback-Leibler + * + * @param[in] pSrcA Pointer to an array of input values for probability distribution A. + * @param[in] pSrcB Pointer to an array of input values for probability distribution B. + * @param[in] blockSize Number of samples in the input array. + * @return Kullback-Leibler Divergence D(A || B) + * + */ +float16_t arm_kullback_leibler_f16(const float16_t * pSrcA + ,const float16_t * pSrcB + ,uint32_t blockSize); + +/** + @brief Maximum value of a floating-point vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult maximum value returned here + @return none + */ + void arm_max_no_idx_f16( + const float16_t *pSrc, + uint32_t blockSize, + float16_t *pResult); + +/** + @brief Minimum value of a floating-point vector. + @param[in] pSrc points to the input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult minimum value returned here + @return none + */ + void arm_min_no_idx_f16( + const float16_t *pSrc, + uint32_t blockSize, + float16_t *pResult); + +/** + @brief Mean square error between two half precision float vectors. + @param[in] pSrcA points to the first input vector + @param[in] pSrcB points to the second input vector + @param[in] blockSize number of samples in input vector + @param[out] pResult mean square error + @return none +*/ + +void arm_mse_f16( + const float16_t * pSrcA, + const float16_t * pSrcB, + uint32_t blockSize, + float16_t * pResult); + + +/** + * @brief Sum value of a floating-point vector. + * @param[in] pSrc is input pointer + * @param[in] blockSize is the number of samples to process + * @param[out] pResult is output value. + */ + void arm_accumulate_f16( + const float16_t * pSrc, + uint32_t blockSize, + float16_t * pResult); + + +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _STATISTICS_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/support_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/support_functions.h new file mode 100644 index 0000000..5358d28 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/support_functions.h @@ -0,0 +1,540 @@ +/****************************************************************************** + * @file support_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.1 + * @date 18 August 2022 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _SUPPORT_FUNCTIONS_H_ +#define _SUPPORT_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @defgroup groupSupport Support Functions + */ + + +/** + * @brief Converts the elements of the 64 bit floating-point vector to floating-point vector. + * @param[in] pSrc points to the floating-point 64 input vector + * @param[out] pDst points to the floating-point output vector + * @param[in] blockSize length of the input vector + */ + void arm_f64_to_float( + const float64_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + +/** + * @brief Converts the elements of the 64 bit floating-point vector to Q31 vector. + * @param[in] pSrc points to the floating-point 64 input vector + * @param[out] pDst points to the Q31 output vector + * @param[in] blockSize length of the input vector + */ + void arm_f64_to_q31( + const float64_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + +/** + * @brief Converts the elements of the 64 bit floating-point vector to Q15 vector. + * @param[in] pSrc points to the floating-point 64 input vector + * @param[out] pDst points to the Q15 output vector + * @param[in] blockSize length of the input vector + */ + void arm_f64_to_q15( + const float64_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + +/** + * @brief Converts the elements of the 64 bit floating-point vector to Q7 vector. + * @param[in] pSrc points to the floating-point 64 input vector + * @param[out] pDst points to the Q7 output vector + * @param[in] blockSize length of the input vector + */ + void arm_f64_to_q7( + const float64_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + +/** + * @brief Converts the elements of the floating-point vector to 64 bit floating-point vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the 64 bit floating-point output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_f64( + const float32_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + +/** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q31 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q31( + const float32_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the floating-point vector to Q15 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q15 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q15( + const float32_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the floating-point vector to Q7 vector. + * @param[in] pSrc points to the floating-point input vector + * @param[out] pDst points to the Q7 output vector + * @param[in] blockSize length of the input vector + */ + void arm_float_to_q7( + const float32_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + +/** + * @brief Converts the elements of the Q31 vector to 64 bit floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q31_to_f64( +const q31_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the Q31 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_float( + const q31_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q15 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_q15( + const q31_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q31 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q31_to_q7( + const q31_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + +/** + * @brief Converts the elements of the Q15 vector to 64 bit floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q15_to_f64( +const q15_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the Q15 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_float( + const q15_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q31 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_q31( + const q15_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q15 vector to Q7 vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q15_to_q7( + const q15_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + +/** + * @brief Converts the elements of the Q7 vector to 64 bit floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ +void arm_q7_to_f64( +const q7_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Converts the elements of the Q7 vector to floating-point vector. + * @param[in] pSrc is input pointer + * @param[out] pDst is output pointer + * @param[in] blockSize is the number of samples to process + */ + void arm_q7_to_float( + const q7_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q7 vector to Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_q7_to_q31( + const q7_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Converts the elements of the Q7 vector to Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_q7_to_q15( + const q7_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + + + + /** + * @brief Struct for specifying sorting algorithm + */ + typedef enum + { + ARM_SORT_BITONIC = 0, + /**< Bitonic sort */ + ARM_SORT_BUBBLE = 1, + /**< Bubble sort */ + ARM_SORT_HEAP = 2, + /**< Heap sort */ + ARM_SORT_INSERTION = 3, + /**< Insertion sort */ + ARM_SORT_QUICK = 4, + /**< Quick sort */ + ARM_SORT_SELECTION = 5 + /**< Selection sort */ + } arm_sort_alg; + + /** + * @brief Struct for specifying sorting algorithm + */ + typedef enum + { + ARM_SORT_DESCENDING = 0, + /**< Descending order (9 to 0) */ + ARM_SORT_ASCENDING = 1 + /**< Ascending order (0 to 9) */ + } arm_sort_dir; + + /** + * @brief Instance structure for the sorting algorithms. + */ + typedef struct + { + arm_sort_alg alg; /**< Sorting algorithm selected */ + arm_sort_dir dir; /**< Sorting order (direction) */ + } arm_sort_instance_f32; + + /** + * @param[in] S points to an instance of the sorting structure. + * @param[in] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data. + * @param[in] blockSize number of samples to process. + */ + void arm_sort_f32( + const arm_sort_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + /** + * @param[in,out] S points to an instance of the sorting structure. + * @param[in] alg Selected algorithm. + * @param[in] dir Sorting order. + */ + void arm_sort_init_f32( + arm_sort_instance_f32 * S, + arm_sort_alg alg, + arm_sort_dir dir); + + /** + * @brief Instance structure for the sorting algorithms. + */ + typedef struct + { + arm_sort_dir dir; /**< Sorting order (direction) */ + float32_t * buffer; /**< Working buffer */ + } arm_merge_sort_instance_f32; + + /** + * @param[in] S points to an instance of the sorting structure. + * @param[in,out] pSrc points to the block of input data. + * @param[out] pDst points to the block of output data + * @param[in] blockSize number of samples to process. + */ + void arm_merge_sort_f32( + const arm_merge_sort_instance_f32 * S, + float32_t *pSrc, + float32_t *pDst, + uint32_t blockSize); + + /** + * @param[in,out] S points to an instance of the sorting structure. + * @param[in] dir Sorting order. + * @param[in] buffer Working buffer. + */ + void arm_merge_sort_init_f32( + arm_merge_sort_instance_f32 * S, + arm_sort_dir dir, + float32_t * buffer); + + + + /** + * @brief Copies the elements of a floating-point vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_f32( + const float32_t * pSrc, + float32_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Copies the elements of a floating-point vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_f64( + const float64_t * pSrc, + float64_t * pDst, + uint32_t blockSize); + + + + /** + * @brief Copies the elements of a Q7 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q7( + const q7_t * pSrc, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q15 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q15( + const q15_t * pSrc, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Copies the elements of a Q31 vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_copy_q31( + const q31_t * pSrc, + q31_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a floating-point vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_f32( + float32_t value, + float32_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a floating-point vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_f64( + float64_t value, + float64_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q7 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q7( + q7_t value, + q7_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q15 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q15( + q15_t value, + q15_t * pDst, + uint32_t blockSize); + + + /** + * @brief Fills a constant value into a Q31 vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ + void arm_fill_q31( + q31_t value, + q31_t * pDst, + uint32_t blockSize); + + + + + + + +/** + * @brief Weighted sum + * + * + * @param[in] *in Array of input values. + * @param[in] *weigths Weights + * @param[in] blockSize Number of samples in the input array. + * @return Weighted sum + * + */ +float32_t arm_weighted_sum_f32(const float32_t *in + , const float32_t *weigths + , uint32_t blockSize); + + +/** + * @brief Barycenter + * + * + * @param[in] in List of vectors + * @param[in] weights Weights of the vectors + * @param[out] out Barycenter + * @param[in] nbVectors Number of vectors + * @param[in] vecDim Dimension of space (vector dimension) + * @return None + * + */ +void arm_barycenter_f32(const float32_t *in + , const float32_t *weights + , float32_t *out + , uint32_t nbVectors + , uint32_t vecDim); + + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _SUPPORT_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/support_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/support_functions_f16.h new file mode 100644 index 0000000..bce2841 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/support_functions_f16.h @@ -0,0 +1,202 @@ +/****************************************************************************** + * @file support_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.1 + * @date 18 August 2022 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _SUPPORT_FUNCTIONS_F16_H_ +#define _SUPPORT_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + + /** + * @brief Copies the elements of a floating-point vector. + * @param[in] pSrc input pointer + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_copy_f16(const float16_t * pSrc, float16_t * pDst, uint32_t blockSize); + + /** + * @brief Fills a constant value into a floating-point vector. + * @param[in] value input value to be filled + * @param[out] pDst output pointer + * @param[in] blockSize number of samples to process + */ +void arm_fill_f16(float16_t value, float16_t * pDst, uint32_t blockSize); + +/** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] pSrc points to the f16 input vector + * @param[out] pDst points to the q15 output vector + * @param[in] blockSize length of the input vector + */ +void arm_f16_to_q15(const float16_t * pSrc, q15_t * pDst, uint32_t blockSize); + +/** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] pSrc points to the q15 input vector + * @param[out] pDst points to the f16 output vector + * @param[in] blockSize length of the input vector + */ +void arm_q15_to_f16(const q15_t * pSrc, float16_t * pDst, uint32_t blockSize); + +/** + * @brief Converts the elements of the 64 bit floating-point vector to 16 bit floating-point vector. + * @param[in] pSrc points to the f64 input vector + * @param[out] pDst points to the f16 output vector + * @param[in] blockSize length of the input vector + */ +void arm_f64_to_f16(const float64_t * pSrc, float16_t * pDst, uint32_t blockSize); + +/** + * @brief Converts the elements of the 16 bit floating-point vector to 64 bit floating-point vector. + * @param[in] pSrc points to the f16 input vector + * @param[out] pDst points to the f64 output vector + * @param[in] blockSize length of the input vector + */ +void arm_f16_to_f64(const float16_t * pSrc, float64_t * pDst, uint32_t blockSize); + +/** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] pSrc points to the f32 input vector + * @param[out] pDst points to the f16 output vector + * @param[in] blockSize length of the input vector + */ +void arm_float_to_f16(const float32_t * pSrc, float16_t * pDst, uint32_t blockSize); + +/** + * @brief Converts the elements of the floating-point vector to Q31 vector. + * @param[in] pSrc points to the f16 input vector + * @param[out] pDst points to the f32 output vector + * @param[in] blockSize length of the input vector + */ +void arm_f16_to_float(const float16_t * pSrc, float32_t * pDst, uint32_t blockSize); + +/** + * @brief Weighted sum + * + * + * @param[in] *in Array of input values. + * @param[in] *weigths Weights + * @param[in] blockSize Number of samples in the input array. + * @return Weighted sum + * + */ +float16_t arm_weighted_sum_f16(const float16_t *in + , const float16_t *weigths + , uint32_t blockSize); + +/** + * @brief Barycenter + * + * + * @param[in] in List of vectors + * @param[in] weights Weights of the vectors + * @param[out] out Barycenter + * @param[in] nbVectors Number of vectors + * @param[in] vecDim Dimension of space (vector dimension) + * @return None + * + */ +void arm_barycenter_f16(const float16_t *in + , const float16_t *weights + , float16_t *out + , uint32_t nbVectors + , uint32_t vecDim); + + +/** + @ingroup groupSupport + */ + +/** + * @defgroup typecast Typecasting + */ + +/** + @addtogroup typecast + @{ + */ + +/** + * @brief Interpret a f16 as an s16 value + * @param[in] x input value. + * @return return value. + * + * @par Description + * It is a typecast. No conversion of the float to int is done. + * The memcpy will be optimized out by the compiler. + * memcpy is used to prevent type punning issues. + * With gcc, -fno-builtins MUST not be used or the + * memcpy will not be optimized out. + */ +__STATIC_INLINE int16_t arm_typecast_s16_f16(float16_t x) +{ + int16_t res; + res=*(int16_t*)memcpy((char*)&res,(char*)&x,sizeof(float16_t)); + return(res); +} + +/** + * @brief Interpret an s16 as an f16 value + * @param[in] x input value. + * @return return value. + * + * @par Description + * It is a typecast. No conversion of the int to float is done. + * The memcpy will be optimized out by the compiler. + * memcpy is used to prevent type punning issues. + * With gcc, -fno-builtins MUST not be used or the + * memcpy will not be optimized out. + */ +__STATIC_INLINE float16_t arm_typecast_f16_s16(int16_t x) +{ + float16_t res; + res=*(float16_t*)memcpy((char*)&res,(char*)&x,sizeof(int16_t)); + return(res); +} + + +/** + @} end of typecast group + */ + + +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _SUPPORT_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/svm_defines.h b/Middlewares/ST/ARM/DSP/Include/dsp/svm_defines.h new file mode 100644 index 0000000..f93e953 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/svm_defines.h @@ -0,0 +1,46 @@ +/****************************************************************************** + * @file svm_defines.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _SVM_DEFINES_H_ +#define _SVM_DEFINES_H_ + +/** + * @brief Struct for specifying SVM Kernel + */ +typedef enum +{ + ARM_ML_KERNEL_LINEAR = 0, + /**< Linear kernel */ + ARM_ML_KERNEL_POLYNOMIAL = 1, + /**< Polynomial kernel */ + ARM_ML_KERNEL_RBF = 2, + /**< Radial Basis Function kernel */ + ARM_ML_KERNEL_SIGMOID = 3 + /**< Sigmoid kernel */ +} arm_ml_kernel_type; + +#endif diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/svm_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/svm_functions.h new file mode 100644 index 0000000..3acc621 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/svm_functions.h @@ -0,0 +1,299 @@ +/****************************************************************************** + * @file svm_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _SVM_FUNCTIONS_H_ +#define _SVM_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" +#include "dsp/svm_defines.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define STEP(x) (x) <= 0 ? 0 : 1 + +/** + * @defgroup groupSVM SVM Functions + * This set of functions is implementing SVM classification on 2 classes. + * The training must be done from scikit-learn. The parameters can be easily + * generated from the scikit-learn object. Some examples are given in + * DSP/Testing/PatternGeneration/SVM.py + * + * If more than 2 classes are needed, the functions in this folder + * will have to be used, as building blocks, to do multi-class classification. + * + * No multi-class classification is provided in this SVM folder. + * + */ + +/** + * @brief Integer exponentiation + * @param[in] x value + * @param[in] nb integer exponent >= 1 + * @return x^nb + * + */ +__STATIC_INLINE float32_t arm_exponent_f32(float32_t x, int32_t nb) +{ + float32_t r = x; + nb --; + while(nb > 0) + { + r = r * x; + nb--; + } + return(r); +} + + + + + +/** + * @brief Instance structure for linear SVM prediction function. + */ +typedef struct +{ + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float32_t intercept; /**< Intercept */ + const float32_t *dualCoefficients; /**< Dual coefficients */ + const float32_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ +} arm_svm_linear_instance_f32; + + +/** + * @brief Instance structure for polynomial SVM prediction function. + */ +typedef struct +{ + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float32_t intercept; /**< Intercept */ + const float32_t *dualCoefficients; /**< Dual coefficients */ + const float32_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + int32_t degree; /**< Polynomial degree */ + float32_t coef0; /**< Polynomial constant */ + float32_t gamma; /**< Gamma factor */ +} arm_svm_polynomial_instance_f32; + +/** + * @brief Instance structure for rbf SVM prediction function. + */ +typedef struct +{ + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float32_t intercept; /**< Intercept */ + const float32_t *dualCoefficients; /**< Dual coefficients */ + const float32_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + float32_t gamma; /**< Gamma factor */ +} arm_svm_rbf_instance_f32; + +/** + * @brief Instance structure for sigmoid SVM prediction function. + */ +typedef struct +{ + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float32_t intercept; /**< Intercept */ + const float32_t *dualCoefficients; /**< Dual coefficients */ + const float32_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + float32_t coef0; /**< Independent constant */ + float32_t gamma; /**< Gamma factor */ +} arm_svm_sigmoid_instance_f32; + +/** + * @brief SVM linear instance init function + * @param[in] S Parameters for SVM functions + * @param[in] nbOfSupportVectors Number of support vectors + * @param[in] vectorDimension Dimension of vector space + * @param[in] intercept Intercept + * @param[in] dualCoefficients Array of dual coefficients + * @param[in] supportVectors Array of support vectors + * @param[in] classes Array of 2 classes ID + * @return none. + * + */ + + +void arm_svm_linear_init_f32(arm_svm_linear_instance_f32 *S, + uint32_t nbOfSupportVectors, + uint32_t vectorDimension, + float32_t intercept, + const float32_t *dualCoefficients, + const float32_t *supportVectors, + const int32_t *classes); + +/** + * @brief SVM linear prediction + * @param[in] S Pointer to an instance of the linear SVM structure. + * @param[in] in Pointer to input vector + * @param[out] pResult Decision value + * @return none. + * + */ + +void arm_svm_linear_predict_f32(const arm_svm_linear_instance_f32 *S, + const float32_t * in, + int32_t * pResult); + + +/** + * @brief SVM polynomial instance init function + * @param[in] S points to an instance of the polynomial SVM structure. + * @param[in] nbOfSupportVectors Number of support vectors + * @param[in] vectorDimension Dimension of vector space + * @param[in] intercept Intercept + * @param[in] dualCoefficients Array of dual coefficients + * @param[in] supportVectors Array of support vectors + * @param[in] classes Array of 2 classes ID + * @param[in] degree Polynomial degree + * @param[in] coef0 coeff0 (scikit-learn terminology) + * @param[in] gamma gamma (scikit-learn terminology) + * @return none. + * + */ + + +void arm_svm_polynomial_init_f32(arm_svm_polynomial_instance_f32 *S, + uint32_t nbOfSupportVectors, + uint32_t vectorDimension, + float32_t intercept, + const float32_t *dualCoefficients, + const float32_t *supportVectors, + const int32_t *classes, + int32_t degree, + float32_t coef0, + float32_t gamma + ); + +/** + * @brief SVM polynomial prediction + * @param[in] S Pointer to an instance of the polynomial SVM structure. + * @param[in] in Pointer to input vector + * @param[out] pResult Decision value + * @return none. + * + */ +void arm_svm_polynomial_predict_f32(const arm_svm_polynomial_instance_f32 *S, + const float32_t * in, + int32_t * pResult); + + +/** + * @brief SVM radial basis function instance init function + * @param[in] S points to an instance of the polynomial SVM structure. + * @param[in] nbOfSupportVectors Number of support vectors + * @param[in] vectorDimension Dimension of vector space + * @param[in] intercept Intercept + * @param[in] dualCoefficients Array of dual coefficients + * @param[in] supportVectors Array of support vectors + * @param[in] classes Array of 2 classes ID + * @param[in] gamma gamma (scikit-learn terminology) + * @return none. + * + */ + +void arm_svm_rbf_init_f32(arm_svm_rbf_instance_f32 *S, + uint32_t nbOfSupportVectors, + uint32_t vectorDimension, + float32_t intercept, + const float32_t *dualCoefficients, + const float32_t *supportVectors, + const int32_t *classes, + float32_t gamma + ); + +/** + * @brief SVM rbf prediction + * @param[in] S Pointer to an instance of the rbf SVM structure. + * @param[in] in Pointer to input vector + * @param[out] pResult decision value + * @return none. + * + */ +void arm_svm_rbf_predict_f32(const arm_svm_rbf_instance_f32 *S, + const float32_t * in, + int32_t * pResult); + +/** + * @brief SVM sigmoid instance init function + * @param[in] S points to an instance of the rbf SVM structure. + * @param[in] nbOfSupportVectors Number of support vectors + * @param[in] vectorDimension Dimension of vector space + * @param[in] intercept Intercept + * @param[in] dualCoefficients Array of dual coefficients + * @param[in] supportVectors Array of support vectors + * @param[in] classes Array of 2 classes ID + * @param[in] coef0 coeff0 (scikit-learn terminology) + * @param[in] gamma gamma (scikit-learn terminology) + * @return none. + * + */ + +void arm_svm_sigmoid_init_f32(arm_svm_sigmoid_instance_f32 *S, + uint32_t nbOfSupportVectors, + uint32_t vectorDimension, + float32_t intercept, + const float32_t *dualCoefficients, + const float32_t *supportVectors, + const int32_t *classes, + float32_t coef0, + float32_t gamma + ); + +/** + * @brief SVM sigmoid prediction + * @param[in] S Pointer to an instance of the rbf SVM structure. + * @param[in] in Pointer to input vector + * @param[out] pResult Decision value + * @return none. + * + */ +void arm_svm_sigmoid_predict_f32(const arm_svm_sigmoid_instance_f32 *S, + const float32_t * in, + int32_t * pResult); + + + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _SVM_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/svm_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/svm_functions_f16.h new file mode 100644 index 0000000..7c9fbab --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/svm_functions_f16.h @@ -0,0 +1,281 @@ +/****************************************************************************** + * @file svm_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _SVM_FUNCTIONS_F16_H_ +#define _SVM_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" +#include "dsp/svm_defines.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +#if defined(ARM_FLOAT16_SUPPORTED) + +#define STEP(x) (x) <= 0 ? 0 : 1 + +/** + * @defgroup groupSVM SVM Functions + * This set of functions is implementing SVM classification on 2 classes. + * The training must be done from scikit-learn. The parameters can be easily + * generated from the scikit-learn object. Some examples are given in + * DSP/Testing/PatternGeneration/SVM.py + * + * If more than 2 classes are needed, the functions in this folder + * will have to be used, as building blocks, to do multi-class classification. + * + * No multi-class classification is provided in this SVM folder. + * + */ + + + +/** + * @brief Instance structure for linear SVM prediction function. + */ +typedef struct +{ + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float16_t intercept; /**< Intercept */ + const float16_t *dualCoefficients; /**< Dual coefficients */ + const float16_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ +} arm_svm_linear_instance_f16; + + +/** + * @brief Instance structure for polynomial SVM prediction function. + */ +typedef struct +{ + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float16_t intercept; /**< Intercept */ + const float16_t *dualCoefficients; /**< Dual coefficients */ + const float16_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + int32_t degree; /**< Polynomial degree */ + float16_t coef0; /**< Polynomial constant */ + float16_t gamma; /**< Gamma factor */ +} arm_svm_polynomial_instance_f16; + +/** + * @brief Instance structure for rbf SVM prediction function. + */ +typedef struct +{ + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float16_t intercept; /**< Intercept */ + const float16_t *dualCoefficients; /**< Dual coefficients */ + const float16_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + float16_t gamma; /**< Gamma factor */ +} arm_svm_rbf_instance_f16; + +/** + * @brief Instance structure for sigmoid SVM prediction function. + */ +typedef struct +{ + uint32_t nbOfSupportVectors; /**< Number of support vectors */ + uint32_t vectorDimension; /**< Dimension of vector space */ + float16_t intercept; /**< Intercept */ + const float16_t *dualCoefficients; /**< Dual coefficients */ + const float16_t *supportVectors; /**< Support vectors */ + const int32_t *classes; /**< The two SVM classes */ + float16_t coef0; /**< Independent constant */ + float16_t gamma; /**< Gamma factor */ +} arm_svm_sigmoid_instance_f16; + +/** + * @brief SVM linear instance init function + * @param[in] S Parameters for SVM functions + * @param[in] nbOfSupportVectors Number of support vectors + * @param[in] vectorDimension Dimension of vector space + * @param[in] intercept Intercept + * @param[in] dualCoefficients Array of dual coefficients + * @param[in] supportVectors Array of support vectors + * @param[in] classes Array of 2 classes ID + * @return none. + * + */ + + +void arm_svm_linear_init_f16(arm_svm_linear_instance_f16 *S, + uint32_t nbOfSupportVectors, + uint32_t vectorDimension, + float16_t intercept, + const float16_t *dualCoefficients, + const float16_t *supportVectors, + const int32_t *classes); + +/** + * @brief SVM linear prediction + * @param[in] S Pointer to an instance of the linear SVM structure. + * @param[in] in Pointer to input vector + * @param[out] pResult Decision value + * @return none. + * + */ + +void arm_svm_linear_predict_f16(const arm_svm_linear_instance_f16 *S, + const float16_t * in, + int32_t * pResult); + + +/** + * @brief SVM polynomial instance init function + * @param[in] S points to an instance of the polynomial SVM structure. + * @param[in] nbOfSupportVectors Number of support vectors + * @param[in] vectorDimension Dimension of vector space + * @param[in] intercept Intercept + * @param[in] dualCoefficients Array of dual coefficients + * @param[in] supportVectors Array of support vectors + * @param[in] classes Array of 2 classes ID + * @param[in] degree Polynomial degree + * @param[in] coef0 coeff0 (scikit-learn terminology) + * @param[in] gamma gamma (scikit-learn terminology) + * @return none. + * + */ + + +void arm_svm_polynomial_init_f16(arm_svm_polynomial_instance_f16 *S, + uint32_t nbOfSupportVectors, + uint32_t vectorDimension, + float16_t intercept, + const float16_t *dualCoefficients, + const float16_t *supportVectors, + const int32_t *classes, + int32_t degree, + float16_t coef0, + float16_t gamma + ); + +/** + * @brief SVM polynomial prediction + * @param[in] S Pointer to an instance of the polynomial SVM structure. + * @param[in] in Pointer to input vector + * @param[out] pResult Decision value + * @return none. + * + */ +void arm_svm_polynomial_predict_f16(const arm_svm_polynomial_instance_f16 *S, + const float16_t * in, + int32_t * pResult); + + +/** + * @brief SVM radial basis function instance init function + * @param[in] S points to an instance of the polynomial SVM structure. + * @param[in] nbOfSupportVectors Number of support vectors + * @param[in] vectorDimension Dimension of vector space + * @param[in] intercept Intercept + * @param[in] dualCoefficients Array of dual coefficients + * @param[in] supportVectors Array of support vectors + * @param[in] classes Array of 2 classes ID + * @param[in] gamma gamma (scikit-learn terminology) + * @return none. + * + */ + +void arm_svm_rbf_init_f16(arm_svm_rbf_instance_f16 *S, + uint32_t nbOfSupportVectors, + uint32_t vectorDimension, + float16_t intercept, + const float16_t *dualCoefficients, + const float16_t *supportVectors, + const int32_t *classes, + float16_t gamma + ); + +/** + * @brief SVM rbf prediction + * @param[in] S Pointer to an instance of the rbf SVM structure. + * @param[in] in Pointer to input vector + * @param[out] pResult decision value + * @return none. + * + */ +void arm_svm_rbf_predict_f16(const arm_svm_rbf_instance_f16 *S, + const float16_t * in, + int32_t * pResult); + +/** + * @brief SVM sigmoid instance init function + * @param[in] S points to an instance of the rbf SVM structure. + * @param[in] nbOfSupportVectors Number of support vectors + * @param[in] vectorDimension Dimension of vector space + * @param[in] intercept Intercept + * @param[in] dualCoefficients Array of dual coefficients + * @param[in] supportVectors Array of support vectors + * @param[in] classes Array of 2 classes ID + * @param[in] coef0 coeff0 (scikit-learn terminology) + * @param[in] gamma gamma (scikit-learn terminology) + * @return none. + * + */ + +void arm_svm_sigmoid_init_f16(arm_svm_sigmoid_instance_f16 *S, + uint32_t nbOfSupportVectors, + uint32_t vectorDimension, + float16_t intercept, + const float16_t *dualCoefficients, + const float16_t *supportVectors, + const int32_t *classes, + float16_t coef0, + float16_t gamma + ); + +/** + * @brief SVM sigmoid prediction + * @param[in] S Pointer to an instance of the rbf SVM structure. + * @param[in] in Pointer to input vector + * @param[out] pResult Decision value + * @return none. + * + */ +void arm_svm_sigmoid_predict_f16(const arm_svm_sigmoid_instance_f16 *S, + const float16_t * in, + int32_t * pResult); + + + +#endif /*defined(ARM_FLOAT16_SUPPORTED)*/ +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _SVM_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/transform_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/transform_functions.h new file mode 100644 index 0000000..6270e10 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/transform_functions.h @@ -0,0 +1,735 @@ +/****************************************************************************** + * @file transform_functions.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _TRANSFORM_FUNCTIONS_H_ +#define _TRANSFORM_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#include "dsp/basic_math_functions.h" +#include "dsp/complex_math_functions.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/** + * @defgroup groupTransforms Transform Functions + */ + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix2_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q15( + arm_cfft_radix2_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q15( + const arm_cfft_radix2_instance_q15 * S, + q15_t * pSrc); + + + /** + * @brief Instance structure for the Q15 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q15_t *pTwiddle; /**< points to the twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q15; + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q15( + arm_cfft_radix4_instance_q15 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_q15( + const arm_cfft_radix4_instance_q15 * S, + q15_t * pSrc); + + /** + * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix2_instance_q31; + +/* Deprecated */ + arm_status arm_cfft_radix2_init_q31( + arm_cfft_radix2_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_q31( + const arm_cfft_radix2_instance_q31 * S, + q31_t * pSrc); + + /** + * @brief Instance structure for the Q31 CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const q31_t *pTwiddle; /**< points to the twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + } arm_cfft_radix4_instance_q31; + +/* Deprecated */ + void arm_cfft_radix4_q31( + const arm_cfft_radix4_instance_q31 * S, + q31_t * pSrc); + +/* Deprecated */ + arm_status arm_cfft_radix4_init_q31( + arm_cfft_radix4_instance_q31 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix2_instance_f32; + + +/* Deprecated */ + arm_status arm_cfft_radix2_init_f32( + arm_cfft_radix2_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_f32( + const arm_cfft_radix2_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float32_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix4_instance_f32; + + + +/* Deprecated */ + arm_status arm_cfft_radix4_init_f32( + arm_cfft_radix4_instance_f32 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_f32( + const arm_cfft_radix4_instance_f32 * S, + float32_t * pSrc); + + /** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ +#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) + const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ + const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ + const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ + const q15_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ + const q15_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ + const q15_t *rearranged_twiddle_stride3; +#endif + } arm_cfft_instance_q15; + +arm_status arm_cfft_init_q15( + arm_cfft_instance_q15 * S, + uint16_t fftLen); + +void arm_cfft_q15( + const arm_cfft_instance_q15 * S, + q15_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the fixed-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ +#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) + const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ + const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ + const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ + const q31_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ + const q31_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ + const q31_t *rearranged_twiddle_stride3; +#endif + } arm_cfft_instance_q31; + +arm_status arm_cfft_init_q31( + arm_cfft_instance_q31 * S, + uint16_t fftLen); + +void arm_cfft_q31( + const arm_cfft_instance_q31 * S, + q31_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ +#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) + const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ + const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ + const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ + const float32_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ + const float32_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ + const float32_t *rearranged_twiddle_stride3; +#endif + } arm_cfft_instance_f32; + + + + arm_status arm_cfft_init_f32( + arm_cfft_instance_f32 * S, + uint16_t fftLen); + + void arm_cfft_f32( + const arm_cfft_instance_f32 * S, + float32_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + + /** + * @brief Instance structure for the Double Precision Floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const float64_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ + } arm_cfft_instance_f64; + + arm_status arm_cfft_init_f64( + arm_cfft_instance_f64 * S, + uint16_t fftLen); + + void arm_cfft_f64( + const arm_cfft_instance_f64 * S, + float64_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the Q15 RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + const q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ +#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) + arm_cfft_instance_q15 cfftInst; +#else + const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ +#endif + } arm_rfft_instance_q15; + + arm_status arm_rfft_init_q15( + arm_rfft_instance_q15 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q15( + const arm_rfft_instance_q15 * S, + q15_t * pSrc, + q15_t * pDst); + + /** + * @brief Instance structure for the Q31 RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + const q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ +#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) + arm_cfft_instance_q31 cfftInst; +#else + const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ +#endif + } arm_rfft_instance_q31; + + arm_status arm_rfft_init_q31( + arm_rfft_instance_q31 * S, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_q31( + const arm_rfft_instance_q31 * S, + q31_t * pSrc, + q31_t * pDst); + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ + typedef struct + { + uint32_t fftLenReal; /**< length of the real FFT. */ + uint16_t fftLenBy2; /**< length of the complex FFT. */ + uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ + uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ + uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + const float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ + const float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_rfft_instance_f32; + + arm_status arm_rfft_init_f32( + arm_rfft_instance_f32 * S, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint32_t fftLenReal, + uint32_t ifftFlagR, + uint32_t bitReverseFlag); + + void arm_rfft_f32( + const arm_rfft_instance_f32 * S, + float32_t * pSrc, + float32_t * pDst); + + /** + * @brief Instance structure for the Double Precision Floating-point RFFT/RIFFT function. + */ +typedef struct + { + arm_cfft_instance_f64 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + const float64_t * pTwiddleRFFT; /**< Twiddle factors real stage */ + } arm_rfft_fast_instance_f64 ; + +arm_status arm_rfft_fast_init_f64 ( + arm_rfft_fast_instance_f64 * S, + uint16_t fftLen); + + +void arm_rfft_fast_f64( + arm_rfft_fast_instance_f64 * S, + float64_t * p, float64_t * pOut, + uint8_t ifftFlag); + + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ +typedef struct + { + arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + const float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ + } arm_rfft_fast_instance_f32 ; + +arm_status arm_rfft_fast_init_f32 ( + arm_rfft_fast_instance_f32 * S, + uint16_t fftLen); + + + void arm_rfft_fast_f32( + const arm_rfft_fast_instance_f32 * S, + float32_t * p, float32_t * pOut, + uint8_t ifftFlag); + + /** + * @brief Instance structure for the floating-point DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + float32_t normalize; /**< normalizing factor. */ + const float32_t *pTwiddle; /**< points to the twiddle factor table. */ + const float32_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_f32; + + + /** + * @brief Initialization function for the floating-point DCT4/IDCT4. + * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. + */ + arm_status arm_dct4_init_f32( + arm_dct4_instance_f32 * S, + arm_rfft_instance_f32 * S_RFFT, + arm_cfft_radix4_instance_f32 * S_CFFT, + uint16_t N, + uint16_t Nby2, + float32_t normalize); + + + /** + * @brief Processing function for the floating-point DCT4/IDCT4. + * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_f32( + const arm_dct4_instance_f32 * S, + float32_t * pState, + float32_t * pInlineBuffer); + + + /** + * @brief Instance structure for the Q31 DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q31_t normalize; /**< normalizing factor. */ + const q31_t *pTwiddle; /**< points to the twiddle factor table. */ + const q31_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q31; + + + /** + * @brief Initialization function for the Q31 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure + * @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q31( + arm_dct4_instance_q31 * S, + arm_rfft_instance_q31 * S_RFFT, + arm_cfft_radix4_instance_q31 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q31_t normalize); + + + /** + * @brief Processing function for the Q31 DCT4/IDCT4. + * @param[in] S points to an instance of the Q31 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_q31( + const arm_dct4_instance_q31 * S, + q31_t * pState, + q31_t * pInlineBuffer); + + + /** + * @brief Instance structure for the Q15 DCT4/IDCT4 function. + */ + typedef struct + { + uint16_t N; /**< length of the DCT4. */ + uint16_t Nby2; /**< half of the length of the DCT4. */ + q15_t normalize; /**< normalizing factor. */ + const q15_t *pTwiddle; /**< points to the twiddle factor table. */ + const q15_t *pCosFactor; /**< points to the cosFactor table. */ + arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ + arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ + } arm_dct4_instance_q15; + + + /** + * @brief Initialization function for the Q15 DCT4/IDCT4. + * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. + * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. + * @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure. + * @param[in] N length of the DCT4. + * @param[in] Nby2 half of the length of the DCT4. + * @param[in] normalize normalizing factor. + * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. + */ + arm_status arm_dct4_init_q15( + arm_dct4_instance_q15 * S, + arm_rfft_instance_q15 * S_RFFT, + arm_cfft_radix4_instance_q15 * S_CFFT, + uint16_t N, + uint16_t Nby2, + q15_t normalize); + + + /** + * @brief Processing function for the Q15 DCT4/IDCT4. + * @param[in] S points to an instance of the Q15 DCT4 structure. + * @param[in] pState points to state buffer. + * @param[in,out] pInlineBuffer points to the in-place input and output buffer. + */ + void arm_dct4_q15( + const arm_dct4_instance_q15 * S, + q15_t * pState, + q15_t * pInlineBuffer); + + /** + * @brief Instance structure for the Floating-point MFCC function. + */ +typedef struct + { + const float32_t *dctCoefs; /**< Internal DCT coefficients */ + const float32_t *filterCoefs; /**< Internal Mel filter coefficients */ + const float32_t *windowCoefs; /**< Windowing coefficients */ + const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ + const uint32_t *filterLengths; /**< Internal Mel filter lengths */ + uint32_t fftLen; /**< FFT length */ + uint32_t nbMelFilters; /**< Number of Mel filters */ + uint32_t nbDctOutputs; /**< Number of DCT outputs */ +#if defined(ARM_MFCC_CFFT_BASED) + /* Implementation of the MFCC is using a CFFT */ + arm_cfft_instance_f32 cfft; /**< Internal CFFT instance */ +#else + /* Implementation of the MFCC is using a RFFT (default) */ + arm_rfft_fast_instance_f32 rfft; +#endif + } arm_mfcc_instance_f32 ; + +arm_status arm_mfcc_init_f32( + arm_mfcc_instance_f32 * S, + uint32_t fftLen, + uint32_t nbMelFilters, + uint32_t nbDctOutputs, + const float32_t *dctCoefs, + const uint32_t *filterPos, + const uint32_t *filterLengths, + const float32_t *filterCoefs, + const float32_t *windowCoefs + ); + + +/** + @brief MFCC F32 + @param[in] S points to the mfcc instance structure + @param[in] pSrc points to the input samples + @param[out] pDst points to the output MFCC values + @param[inout] pTmp points to a temporary buffer of complex + @return none + */ + void arm_mfcc_f32( + const arm_mfcc_instance_f32 * S, + float32_t *pSrc, + float32_t *pDst, + float32_t *pTmp + ); + +typedef struct + { + const q31_t *dctCoefs; /**< Internal DCT coefficients */ + const q31_t *filterCoefs; /**< Internal Mel filter coefficients */ + const q31_t *windowCoefs; /**< Windowing coefficients */ + const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ + const uint32_t *filterLengths; /**< Internal Mel filter lengths */ + uint32_t fftLen; /**< FFT length */ + uint32_t nbMelFilters; /**< Number of Mel filters */ + uint32_t nbDctOutputs; /**< Number of DCT outputs */ +#if defined(ARM_MFCC_CFFT_BASED) + /* Implementation of the MFCC is using a CFFT */ + arm_cfft_instance_q31 cfft; /**< Internal CFFT instance */ +#else + /* Implementation of the MFCC is using a RFFT (default) */ + arm_rfft_instance_q31 rfft; +#endif + } arm_mfcc_instance_q31 ; + +arm_status arm_mfcc_init_q31( + arm_mfcc_instance_q31 * S, + uint32_t fftLen, + uint32_t nbMelFilters, + uint32_t nbDctOutputs, + const q31_t *dctCoefs, + const uint32_t *filterPos, + const uint32_t *filterLengths, + const q31_t *filterCoefs, + const q31_t *windowCoefs + ); + + +/** + @brief MFCC Q31 + @param[in] S points to the mfcc instance structure + @param[in] pSrc points to the input samples + @param[out] pDst points to the output MFCC values + @param[inout] pTmp points to a temporary buffer of complex + @return none + */ + arm_status arm_mfcc_q31( + const arm_mfcc_instance_q31 * S, + q31_t *pSrc, + q31_t *pDst, + q31_t *pTmp + ); + +typedef struct + { + const q15_t *dctCoefs; /**< Internal DCT coefficients */ + const q15_t *filterCoefs; /**< Internal Mel filter coefficients */ + const q15_t *windowCoefs; /**< Windowing coefficients */ + const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ + const uint32_t *filterLengths; /**< Internal Mel filter lengths */ + uint32_t fftLen; /**< FFT length */ + uint32_t nbMelFilters; /**< Number of Mel filters */ + uint32_t nbDctOutputs; /**< Number of DCT outputs */ +#if defined(ARM_MFCC_CFFT_BASED) + /* Implementation of the MFCC is using a CFFT */ + arm_cfft_instance_q15 cfft; /**< Internal CFFT instance */ +#else + /* Implementation of the MFCC is using a RFFT (default) */ + arm_rfft_instance_q15 rfft; +#endif + } arm_mfcc_instance_q15 ; + +arm_status arm_mfcc_init_q15( + arm_mfcc_instance_q15 * S, + uint32_t fftLen, + uint32_t nbMelFilters, + uint32_t nbDctOutputs, + const q15_t *dctCoefs, + const uint32_t *filterPos, + const uint32_t *filterLengths, + const q15_t *filterCoefs, + const q15_t *windowCoefs + ); + + +/** + @brief MFCC Q15 + @param[in] S points to the mfcc instance structure + @param[in] pSrc points to the input samples + @param[out] pDst points to the output MFCC values in q8.7 format + @param[inout] pTmp points to a temporary buffer of complex + @return error status + */ + arm_status arm_mfcc_q15( + const arm_mfcc_instance_q15 * S, + q15_t *pSrc, + q15_t *pDst, + q31_t *pTmp + ); + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _TRANSFORM_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/transform_functions_f16.h b/Middlewares/ST/ARM/DSP/Include/dsp/transform_functions_f16.h new file mode 100644 index 0000000..4d8cc22 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/transform_functions_f16.h @@ -0,0 +1,208 @@ +/****************************************************************************** + * @file transform_functions_f16.h + * @brief Public header file for CMSIS DSP Library + * @version V1.10.0 + * @date 08 July 2021 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _TRANSFORM_FUNCTIONS_F16_H_ +#define _TRANSFORM_FUNCTIONS_F16_H_ + +#include "arm_math_types_f16.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + + +#if defined(ARM_FLOAT16_SUPPORTED) + + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float16_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix2_instance_f16; + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ + uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ + const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ + uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ + float16_t onebyfftLen; /**< value of 1/fftLen. */ + } arm_cfft_radix4_instance_f16; + + /** + * @brief Instance structure for the floating-point CFFT/CIFFT function. + */ + typedef struct + { + uint16_t fftLen; /**< length of the FFT. */ + const float16_t *pTwiddle; /**< points to the Twiddle factor table. */ + const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ + uint16_t bitRevLength; /**< bit reversal table length. */ +#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) + const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ + const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ + const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ + const float16_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ + const float16_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ + const float16_t *rearranged_twiddle_stride3; +#endif + } arm_cfft_instance_f16; + + + arm_status arm_cfft_init_f16( + arm_cfft_instance_f16 * S, + uint16_t fftLen); + + void arm_cfft_f16( + const arm_cfft_instance_f16 * S, + float16_t * p1, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + + /** + * @brief Instance structure for the floating-point RFFT/RIFFT function. + */ +typedef struct + { + arm_cfft_instance_f16 Sint; /**< Internal CFFT structure. */ + uint16_t fftLenRFFT; /**< length of the real sequence */ + const float16_t * pTwiddleRFFT; /**< Twiddle factors real stage */ + } arm_rfft_fast_instance_f16 ; + +arm_status arm_rfft_fast_init_f16 ( + arm_rfft_fast_instance_f16 * S, + uint16_t fftLen); + + + void arm_rfft_fast_f16( + const arm_rfft_fast_instance_f16 * S, + float16_t * p, float16_t * pOut, + uint8_t ifftFlag); + +/* Deprecated */ + arm_status arm_cfft_radix4_init_f16( + arm_cfft_radix4_instance_f16 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix4_f16( + const arm_cfft_radix4_instance_f16 * S, + float16_t * pSrc); + + +/* Deprecated */ + arm_status arm_cfft_radix2_init_f16( + arm_cfft_radix2_instance_f16 * S, + uint16_t fftLen, + uint8_t ifftFlag, + uint8_t bitReverseFlag); + +/* Deprecated */ + void arm_cfft_radix2_f16( + const arm_cfft_radix2_instance_f16 * S, + float16_t * pSrc); + + /** + * @brief Instance structure for the Floating-point MFCC function. + */ +typedef struct + { + const float16_t *dctCoefs; /**< Internal DCT coefficients */ + const float16_t *filterCoefs; /**< Internal Mel filter coefficients */ + const float16_t *windowCoefs; /**< Windowing coefficients */ + const uint32_t *filterPos; /**< Internal Mel filter positions in spectrum */ + const uint32_t *filterLengths; /**< Internal Mel filter lengths */ + uint32_t fftLen; /**< FFT length */ + uint32_t nbMelFilters; /**< Number of Mel filters */ + uint32_t nbDctOutputs; /**< Number of DCT outputs */ +#if defined(ARM_MFCC_CFFT_BASED) + /* Implementation of the MFCC is using a CFFT */ + arm_cfft_instance_f16 cfft; /**< Internal CFFT instance */ +#else + /* Implementation of the MFCC is using a RFFT (default) */ + arm_rfft_fast_instance_f16 rfft; +#endif + } arm_mfcc_instance_f16 ; + +arm_status arm_mfcc_init_f16( + arm_mfcc_instance_f16 * S, + uint32_t fftLen, + uint32_t nbMelFilters, + uint32_t nbDctOutputs, + const float16_t *dctCoefs, + const uint32_t *filterPos, + const uint32_t *filterLengths, + const float16_t *filterCoefs, + const float16_t *windowCoefs + ); + + +/** + @brief MFCC F16 + @param[in] S points to the mfcc instance structure + @param[in] pSrc points to the input samples + @param[out] pDst points to the output MFCC values + @param[inout] pTmp points to a temporary buffer of complex + @return none + */ + void arm_mfcc_f16( + const arm_mfcc_instance_f16 * S, + float16_t *pSrc, + float16_t *pDst, + float16_t *pTmp + ); + + +#endif /* defined(ARM_FLOAT16_SUPPORTED)*/ + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _TRANSFORM_FUNCTIONS_F16_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/utils.h b/Middlewares/ST/ARM/DSP/Include/dsp/utils.h new file mode 100644 index 0000000..10f9cf2 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/utils.h @@ -0,0 +1,257 @@ +/****************************************************************************** + * @file arm_math_utils.h + * @brief Public header file for CMSIS DSP Library + * @version V1.9.0 + * @date 20. July 2020 + ******************************************************************************/ +/* + * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ARM_MATH_UTILS_H_ + +#define _ARM_MATH_UTILS_H_ + +#include "arm_math_types.h" +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + /** + * @brief Macros required for reciprocal calculation in Normalized LMS + */ + +#define INDEX_MASK 0x0000003F + +#ifndef MIN + #define MIN(x,y) ((x) < (y) ? (x) : (y)) +#endif + +#ifndef MAX + #define MAX(x,y) ((x) > (y) ? (x) : (y)) +#endif + +#define SQ(x) ((x) * (x)) + +#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) + + + /** + * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. + It should not be used with negative values. + */ + __STATIC_FORCEINLINE uint32_t arm_recip_q31( + q31_t in, + q31_t * dst, + const q31_t * pRecipTable) + { + q31_t out; + uint32_t tempVal; + uint32_t index, i; + uint32_t signBits; + + if (in > 0) + { + signBits = ((uint32_t) (__CLZ( (uint32_t)in) - 1)); + } + else + { + signBits = ((uint32_t) (__CLZ((uint32_t)(-in)) - 1)); + } + + /* Convert input sample to 1.31 format */ + in = (in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 24); + index = (index & INDEX_MASK); + + /* 1.31 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0U; i < 2U; i++) + { + tempVal = (uint32_t) (((q63_t) in * out) >> 31); + tempVal = 0x7FFFFFFFu - tempVal; + /* 1.31 with exp 1 */ + /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ + out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1U); + } + + + /** + * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. + It should not be used with negative values. + */ + __STATIC_FORCEINLINE uint32_t arm_recip_q15( + q15_t in, + q15_t * dst, + const q15_t * pRecipTable) + { + q15_t out = 0; + int32_t tempVal = 0; + uint32_t index = 0, i = 0; + uint32_t signBits = 0; + + if (in > 0) + { + signBits = ((uint32_t)(__CLZ( (uint32_t)in) - 17)); + } + else + { + signBits = ((uint32_t)(__CLZ((uint32_t)(-in)) - 17)); + } + + /* Convert input sample to 1.15 format */ + in = (q15_t)(in << signBits); + + /* calculation of index for initial approximated Val */ + index = (uint32_t)(in >> 8); + index = (index & INDEX_MASK); + + /* 1.15 with exp 1 */ + out = pRecipTable[index]; + + /* calculation of reciprocal value */ + /* running approximation for two iterations */ + for (i = 0U; i < 2U; i++) + { + tempVal = (((q31_t) in * out) >> 15); + tempVal = 0x7FFF - tempVal; + /* 1.15 with exp 1 */ + out = (q15_t) (((q31_t) out * tempVal) >> 14); + /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ + } + + /* write output */ + *dst = out; + + /* return num of signbits of out = 1/in value */ + return (signBits + 1); + } + + +/** + * @brief 64-bit to 32-bit unsigned normalization + * @param[in] in is input unsigned long long value + * @param[out] normalized is the 32-bit normalized value + * @param[out] norm is norm scale + */ +__STATIC_INLINE void arm_norm_64_to_32u(uint64_t in, int32_t * normalized, int32_t *norm) +{ + int32_t n1; + int32_t hi = (int32_t) (in >> 32); + int32_t lo = (int32_t) ((in << 32) >> 32); + + n1 = __CLZ((uint32_t)hi) - 32; + if (!n1) + { + /* + * input fits in 32-bit + */ + n1 = __CLZ((uint32_t)lo); + if (!n1) + { + /* + * MSB set, need to scale down by 1 + */ + *norm = -1; + *normalized = (((uint32_t) lo) >> 1); + } else + { + if (n1 == 32) + { + /* + * input is zero + */ + *norm = 0; + *normalized = 0; + } else + { + /* + * 32-bit normalization + */ + *norm = n1 - 1; + *normalized = lo << *norm; + } + } + } else + { + /* + * input fits in 64-bit + */ + n1 = 1 - n1; + *norm = -n1; + /* + * 64 bit normalization + */ + *normalized = (int32_t)(((uint32_t)lo) >> n1) | (hi << (32 - n1)); + } +} + +__STATIC_INLINE int32_t arm_div_int64_to_int32(int64_t num, int32_t den) +{ + int32_t result; + uint64_t absNum; + int32_t normalized; + int32_t norm; + + /* + * if sum fits in 32bits + * avoid costly 64-bit division + */ + if (num == (int64_t)LONG_MIN) + { + absNum = LONG_MAX; + } + else + { + absNum = (uint64_t) (num > 0 ? num : -num); + } + arm_norm_64_to_32u(absNum, &normalized, &norm); + if (norm > 0) + /* + * 32-bit division + */ + result = (int32_t) num / den; + else + /* + * 64-bit division + */ + result = (int32_t) (num / den); + + return result; +} + + +#ifdef __cplusplus +} +#endif + +#endif /*ifndef _ARM_MATH_UTILS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Include/dsp/window_functions.h b/Middlewares/ST/ARM/DSP/Include/dsp/window_functions.h new file mode 100644 index 0000000..b948784 --- /dev/null +++ b/Middlewares/ST/ARM/DSP/Include/dsp/window_functions.h @@ -0,0 +1,812 @@ +/****************************************************************************** + * @file window_functions.h + * @brief Public header file for CMSIS DSP Library + * @version v1.15.0 + * @date 15 December 2022 + * Target Processor: Cortex-M and Cortex-A cores + ******************************************************************************/ +/* + * Copyright (c) 2010-2022 Arm Limited or its affiliates. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +#ifndef _WINDOW_FUNCTIONS_H_ +#define _WINDOW_FUNCTIONS_H_ + +#include "arm_math_types.h" +#include "arm_math_memory.h" + +#include "dsp/none.h" +#include "dsp/utils.h" + + +#ifdef __cplusplus +extern "C" +{ +#endif + +/** + * @defgroup groupWindow Window Functions + */ + + /** + * @brief Welch window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 21.3 dB | + * | Normalized equivalent noise bandwidth | 1.2 bins | + * | Flatness | -2.2248 dB | + * | Recommended overlap | 29.3 % | + * + */ + void arm_welch_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Welch window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 21.3 dB | + * | Normalized equivalent noise bandwidth | 1.2 bins | + * | Flatness | -2.2248 dB | + * | Recommended overlap | 29.3 % | + * + * + */ + void arm_welch_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Bartlett window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 26.5 dB | + * | Normalized equivalent noise bandwidth | 1.3333 bins | + * | Flatness | -1.8242 dB | + * | Recommended overlap | 50.0 % | + * + */ + void arm_bartlett_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Bartlett window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 26.5 dB | + * | Normalized equivalent noise bandwidth | 1.3333 bins | + * | Flatness | -1.8242 dB | + * | Recommended overlap | 50.0 % | + * + * + */ + void arm_bartlett_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hamming window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 42.7 dB | + * | Normalized equivalent noise bandwidth | 1.3628 bins | + * | Flatness | -1.7514 dB | + * | Recommended overlap | 50 % | + * + */ + void arm_hamming_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hamming window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 42.7 dB | + * | Normalized equivalent noise bandwidth | 1.3628 bins | + * | Flatness | -1.7514 dB | + * | Recommended overlap | 50 % | + * + * + */ + void arm_hamming_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hanning window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 31.5 dB | + * | Normalized equivalent noise bandwidth | 1.5 bins | + * | Flatness | -1.4236 dB | + * | Recommended overlap | 50 % | + * + */ + void arm_hanning_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hanning window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 31.5 dB | + * | Normalized equivalent noise bandwidth | 1.5 bins | + * | Flatness | -1.4236 dB | + * | Recommended overlap | 50 % | + * + * + */ + void arm_hanning_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Nuttall3 window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 46.7 dB | + * | Normalized equivalent noise bandwidth | 1.9444 bins | + * | Flatness | -0.863 dB | + * | Recommended overlap | 64.7 % | + * + */ + void arm_nuttall3_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Nuttall3 window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 46.7 dB | + * | Normalized equivalent noise bandwidth | 1.9444 bins | + * | Flatness | -0.863 dB | + * | Recommended overlap | 64.7 % | + * + * + */ + void arm_nuttall3_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Nuttall4 window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 60.9 dB | + * | Normalized equivalent noise bandwidth | 2.31 bins | + * | Flatness | -0.6184 dB | + * | Recommended overlap | 70.5 % | + * + */ + void arm_nuttall4_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Nuttall4 window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 60.9 dB | + * | Normalized equivalent noise bandwidth | 2.31 bins | + * | Flatness | -0.6184 dB | + * | Recommended overlap | 70.5 % | + * + * + */ + void arm_nuttall4_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Nuttall3a window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 64.2 dB | + * | Normalized equivalent noise bandwidth | 1.7721 bins | + * | Flatness | -1.0453 dB | + * | Recommended overlap | 61.2 % | + * + */ + void arm_nuttall3a_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Nuttall3a window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 64.2 dB | + * | Normalized equivalent noise bandwidth | 1.7721 bins | + * | Flatness | -1.0453 dB | + * | Recommended overlap | 61.2 % | + * + * + */ + void arm_nuttall3a_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Nuttall3b window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 71.5 dB | + * | Normalized equivalent noise bandwidth | 1.7037 bins | + * | Flatness | -1.1352 dB | + * | Recommended overlap | 59.8 % | + * + */ + void arm_nuttall3b_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Nuttall3b window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 71.5 dB | + * | Normalized equivalent noise bandwidth | 1.7037 bins | + * | Flatness | -1.1352 dB | + * | Recommended overlap | 59.8 % | + * + * + */ + void arm_nuttall3b_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Nuttall4a window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 82.6 dB | + * | Normalized equivalent noise bandwidth | 2.1253 bins | + * | Flatness | -0.7321 dB | + * | Recommended overlap | 68.0 % | + * + */ + void arm_nuttall4a_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Nuttall4a window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 82.6 dB | + * | Normalized equivalent noise bandwidth | 2.1253 bins | + * | Flatness | -0.7321 dB | + * | Recommended overlap | 68.0 % | + * + * + */ + void arm_nuttall4a_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief 92 db blackman harris window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 92.0 dB | + * | Normalized equivalent noise bandwidth | 2.0044 bins | + * | Flatness | -0.8256 dB | + * | Recommended overlap | 66.1 % | + * + */ + void arm_blackman_harris_92db_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief 92 db blackman harris window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 92.0 dB | + * | Normalized equivalent noise bandwidth | 2.0044 bins | + * | Flatness | -0.8256 dB | + * | Recommended overlap | 66.1 % | + * + * + */ + void arm_blackman_harris_92db_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Nuttall4b window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 93.3 dB | + * | Normalized equivalent noise bandwidth | 2.0212 bins | + * | Flatness | -0.8118 dB | + * | Recommended overlap | 66.3 % | + * + */ + void arm_nuttall4b_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Nuttall4b window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 93.3 dB | + * | Normalized equivalent noise bandwidth | 2.0212 bins | + * | Flatness | -0.8118 dB | + * | Recommended overlap | 66.3 % | + * + * + */ + void arm_nuttall4b_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Nuttall4c window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 98.1 dB | + * | Normalized equivalent noise bandwidth | 1.9761 bins | + * | Flatness | -0.8506 dB | + * | Recommended overlap | 65.6 % | + * + */ + void arm_nuttall4c_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Nuttall4c window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 98.1 dB | + * | Normalized equivalent noise bandwidth | 1.9761 bins | + * | Flatness | -0.8506 dB | + * | Recommended overlap | 65.6 % | + * + * + */ + void arm_nuttall4c_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hft90d window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 90.2 dB | + * | Normalized equivalent noise bandwidth | 3.8832 bins | + * | Flatness | -0.0039 dB | + * | Recommended overlap | 76.0 % | + * + */ + void arm_hft90d_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hft90d window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 90.2 dB | + * | Normalized equivalent noise bandwidth | 3.8832 bins | + * | Flatness | -0.0039 dB | + * | Recommended overlap | 76.0 % | + * + * + */ + void arm_hft90d_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hft95 window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 95.0 dB | + * | Normalized equivalent noise bandwidth | 3.8112 bins | + * | Flatness | 0.0044 dB | + * | Recommended overlap | 75.6 % | + * + */ + void arm_hft95_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hft95 window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 95.0 dB | + * | Normalized equivalent noise bandwidth | 3.8112 bins | + * | Flatness | 0.0044 dB | + * | Recommended overlap | 75.6 % | + * + * + */ + void arm_hft95_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hft116d window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 116.8 dB | + * | Normalized equivalent noise bandwidth | 4.2186 bins | + * | Flatness | -0.0028 dB | + * | Recommended overlap | 78.2 % | + * + */ + void arm_hft116d_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hft116d window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 116.8 dB | + * | Normalized equivalent noise bandwidth | 4.2186 bins | + * | Flatness | -0.0028 dB | + * | Recommended overlap | 78.2 % | + * + * + */ + void arm_hft116d_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hft144d window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 144.1 dB | + * | Normalized equivalent noise bandwidth | 4.5386 bins | + * | Flatness | 0.0021 dB | + * | Recommended overlap | 79.9 % | + * + */ + void arm_hft144d_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hft144d window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 144.1 dB | + * | Normalized equivalent noise bandwidth | 4.5386 bins | + * | Flatness | 0.0021 dB | + * | Recommended overlap | 79.9 % | + * + * + */ + void arm_hft144d_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hft169d window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 169.5 dB | + * | Normalized equivalent noise bandwidth | 4.8347 bins | + * | Flatness | 0.0017 dB | + * | Recommended overlap | 81.2 % | + * + */ + void arm_hft169d_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hft169d window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 169.5 dB | + * | Normalized equivalent noise bandwidth | 4.8347 bins | + * | Flatness | 0.0017 dB | + * | Recommended overlap | 81.2 % | + * + * + */ + void arm_hft169d_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hft196d window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 196.2 dB | + * | Normalized equivalent noise bandwidth | 5.1134 bins | + * | Flatness | 0.0013 dB | + * | Recommended overlap | 82.3 % | + * + */ + void arm_hft196d_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hft196d window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 196.2 dB | + * | Normalized equivalent noise bandwidth | 5.1134 bins | + * | Flatness | 0.0013 dB | + * | Recommended overlap | 82.3 % | + * + * + */ + void arm_hft196d_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hft223d window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 223.0 dB | + * | Normalized equivalent noise bandwidth | 5.3888 bins | + * | Flatness | 0.0011 dB | + * | Recommended overlap | 83.3 % | + * + */ + void arm_hft223d_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hft223d window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 223.0 dB | + * | Normalized equivalent noise bandwidth | 5.3888 bins | + * | Flatness | 0.0011 dB | + * | Recommended overlap | 83.3 % | + * + * + */ + void arm_hft223d_f32( + float32_t * pDst, + uint32_t blockSize); + /** + * @brief Hft248d window (double). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 248.4 dB | + * | Normalized equivalent noise bandwidth | 5.6512 bins | + * | Flatness | 0.0009 dB | + * | Recommended overlap | 84.1 % | + * + */ + void arm_hft248d_f64( + float64_t * pDst, + uint32_t blockSize); + + /** + * @brief Hft248d window (float). + * @param[out] pDst points to the output generated window + * @param[in] blockSize number of samples in the window + * + * @par Parameters of the window + * + * | Parameter | Value | + * | ------------------------------------: | -----------------: | + * | Peak sidelobe level | 248.4 dB | + * | Normalized equivalent noise bandwidth | 5.6512 bins | + * | Flatness | 0.0009 dB | + * | Recommended overlap | 84.1 % | + * + * + */ + void arm_hft248d_f32( + float32_t * pDst, + uint32_t blockSize); + + +#ifdef __cplusplus +} +#endif + +#endif /* ifndef _BASIC_MATH_FUNCTIONS_H_ */ diff --git a/Middlewares/ST/ARM/DSP/Lib/libCMSISDSP.a b/Middlewares/ST/ARM/DSP/Lib/libCMSISDSP.a new file mode 100644 index 0000000000000000000000000000000000000000..fcd9e01b1f34bb16ab08f5bb379e98f82d3d4c84 GIT binary patch literal 1145806 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 z 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
  • (4^m~$7g9;iM^awSTT)ieD^hCCGg3m% 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

    w;b^3kn=rS_4|I**CX#*+;h)*=x53*)z9V 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

    v+`0{$jFy!U>I|4j=1NNj<{wu)V57qa3 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 JHT~_Ee*!CJeAxg1 literal 0 HcmV?d00001 diff --git a/bsp/bsp_init.c b/bsp/bsp_init.c index d85f809..262ddda 100644 --- a/bsp/bsp_init.c +++ b/bsp/bsp_init.c @@ -12,7 +12,6 @@ void BSPInit() DWT_Init(168); BSPLogInit(); - // legacy support,待删除,将在实现了led/tempctrl/buzzer的module之后移动到app层进行XXXRegister() LEDInit(); IMUTempInit();