Line data Source code
1 1 : /* 2 : * Copyright (C) 2024 OWL Services LLC. All rights reserved. 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : /** 8 : * @file zephyr/dsp/utils.h 9 : * 10 : * @brief Extra functions and macros for DSP 11 : */ 12 : 13 : #ifndef INCLUDE_ZEPHYR_DSP_UTILS_H_ 14 : #define INCLUDE_ZEPHYR_DSP_UTILS_H_ 15 : 16 : #include <stdint.h> 17 : #include <zephyr/kernel.h> 18 : #include <zephyr/dsp/dsp.h> 19 : 20 : #ifdef __cplusplus 21 : extern "C" { 22 : #endif 23 : 24 : /** 25 : * @ingroup math_dsp 26 : * @defgroup math_dsp_utils_shifts Float/Fixed point shift conversion functions 27 : */ 28 : 29 : /** 30 : * @ingroup math_dsp_utils_shifts 31 : * @addtogroup math_dsp_basic_conv_to_float Fixed to Float point conversions 32 : * 33 : * Convert number Q7/Q15/Q31 to Float or Double representation with shift. 34 : * 35 : * There are separate functions for floating-point, Q7, Q15, and Q31 data types. 36 : * @{ 37 : */ 38 : 39 : /** 40 : * @brief Convert a Q7 fixed-point value to a floating-point (float32_t) value with a left shift. 41 : * 42 : * @param src The input Q7 fixed-point value. 43 : * @param m The number of bits to left shift the input value (0 to 7). 44 : * @return The converted floating-point (float32_t) value. 45 : */ 46 : #define Z_SHIFT_Q7_TO_F32(src, m) ((float32_t)(((src << m)) / (float32_t)(1U << 7))) 47 : 48 : /** 49 : * @brief Convert a Q15 fixed-point value to a floating-point (float32_t) value with a left shift. 50 : * 51 : * @param src The input Q15 fixed-point value. 52 : * @param m The number of bits to left shift the input value (0 to 15). 53 : * @return The converted floating-point (float32_t) value. 54 : */ 55 : #define Z_SHIFT_Q15_TO_F32(src, m) ((float32_t)((src << m) / (float32_t)(1U << 15))) 56 : 57 : /** 58 : * @brief Convert a Q31 fixed-point value to a floating-point (float32_t) value with a left shift. 59 : * 60 : * @param src The input Q31 fixed-point value. 61 : * @param m The number of bits to left shift the input value (0 to 31). 62 : * @return The converted floating-point (float32_t) value. 63 : */ 64 : #define Z_SHIFT_Q31_TO_F32(src, m) ((float32_t)(((int64_t)src) << m) / (float32_t)(1U << 31)) 65 : 66 : /** 67 : * @brief Convert a Q7 fixed-point value to a floating-point (float64_t) value with a left shift. 68 : * 69 : * @param src The input Q7 fixed-point value. 70 : * @param m The number of bits to left shift the input value (0 to 7). 71 : * @return The converted floating-point (float64_t) value. 72 : */ 73 : #define Z_SHIFT_Q7_TO_F64(src, m) (((float64_t)(src << m)) / (1U << 7)) 74 : 75 : /** 76 : * @brief Convert a Q15 fixed-point value to a floating-point (float64_t) value with a left shift. 77 : * 78 : * @param src The input Q15 fixed-point value. 79 : * @param m The number of bits to left shift the input value (0 to 15). 80 : * @return The converted floating-point (float64_t) value. 81 : */ 82 : #define Z_SHIFT_Q15_TO_F64(src, m) (((float64_t)(src << m)) / (1UL << 15)) 83 : 84 : /** 85 : * @brief Convert a Q31 fixed-point value to a floating-point (float64_t) value with a left shift. 86 : * 87 : * @param src The input Q31 fixed-point value. 88 : * @param m The number of bits to left shift the input value (0 to 31). 89 : * @return The converted floating-point (float64_t) value. 90 : */ 91 : #define Z_SHIFT_Q31_TO_F64(src, m) ((float64_t)(((int64_t)src) << m) / (1ULL << 31)) 92 : 93 : /** 94 : * @} 95 : */ 96 : 97 : /** 98 : * @ingroup math_dsp_utils_shifts 99 : * @addtogroup math_dsp_basic_conv_to_fixed Float to Fixed point conversions 100 : * 101 : * Convert number representation in Float or Double to Q31/Q15/Q7. 102 : * 103 : * There are separate functions for floating-point, Q7, Q15, and Q31 data types. 104 : * @{ 105 : */ 106 : 107 : /** 108 : * @brief Convert a floating-point (float32_t) value to a Q7 fixed-point value with a right shift. 109 : * 110 : * @param src The input floating-point (float32_t) value. 111 : * @param m The number of bits to right shift the input value (0 to 7). 112 : * @return The converted Q7 fixed-point value. 113 : */ 114 : #define Z_SHIFT_F32_TO_Q7(src, m) \ 115 : ((q7_t)Z_CLAMP((int32_t)(src * (1U << 7)) >> m, INT8_MIN, INT8_MAX)) 116 : 117 : /** 118 : * @brief Convert a floating-point (float32_t) value to a Q15 fixed-point value with a right shift. 119 : * 120 : * @param src The input floating-point (float32_t) value. 121 : * @param m The number of bits to right shift the input value (0 to 15). 122 : * @return The converted Q15 fixed-point value. 123 : */ 124 : #define Z_SHIFT_F32_TO_Q15(src, m) \ 125 : ((q15_t)Z_CLAMP((int32_t)(src * (1U << 15)) >> m, INT16_MIN, INT16_MAX)) 126 : 127 : /** 128 : * @brief Convert a floating-point (float32_t) value to a Q31 fixed-point value with a right shift. 129 : * 130 : * @param src The input floating-point (float32_t) value. 131 : * @param m The number of bits to right shift the input value (0 to 31). 132 : * @return The converted Q31 fixed-point value. 133 : */ 134 : #define Z_SHIFT_F32_TO_Q31(src, m) \ 135 : ((q31_t)Z_CLAMP((int64_t)(src * (1U << 31)) >> m, INT32_MIN, INT32_MAX)) 136 : 137 : /** 138 : * @brief Convert a floating-point (float64_t) value to a Q7 fixed-point value with a right shift. 139 : * 140 : * @param src The input floating-point (float64_t) value. 141 : * @param m The number of bits to right shift the input value (0 to 7). 142 : * @return The converted Q7 fixed-point value. 143 : */ 144 : #define Z_SHIFT_F64_TO_Q7(src, m) \ 145 : ((q7_t)Z_CLAMP((int32_t)(src * (1U << 7)) >> m, INT8_MIN, INT8_MAX)) 146 : 147 : /** 148 : * @brief Convert a floating-point (float64_t) value to a Q15 fixed-point value with a right shift. 149 : * 150 : * @param src The input floating-point (float64_t) value. 151 : * @param m The number of bits to right shift the input value (0 to 15). 152 : * @return The converted Q15 fixed-point value. 153 : */ 154 : #define Z_SHIFT_F64_TO_Q15(src, m) \ 155 : ((q15_t)Z_CLAMP((int32_t)(src * (1U << 15)) >> m, INT16_MIN, INT16_MAX)) 156 : 157 : /** 158 : * @brief Convert a floating-point (float64_t) value to a Q31 fixed-point value with a right shift. 159 : * 160 : * @param src The input floating-point (float64_t) value. 161 : * @param m The number of bits to right shift the input value (0 to 31). 162 : * @return The converted Q31 fixed-point value. 163 : */ 164 : #define Z_SHIFT_F64_TO_Q31(src, m) \ 165 : ((q31_t)Z_CLAMP((int64_t)(src * (1U << 31)) >> m, INT32_MIN, INT32_MAX)) 166 : 167 : /** 168 : * @} 169 : */ 170 : 171 : #ifdef __cplusplus 172 : } 173 : #endif 174 : 175 : #endif /* INCLUDE_ZEPHYR_DSP_UTILS_H_ */