1 /****************************************************************************** 2 * @file interpolation_functions.h 3 * @brief Public header file for CMSIS DSP Library 4 * @version V1.9.0 5 * @date 23 April 2021 6 * Target Processor: Cortex-M and Cortex-A cores 7 ******************************************************************************/ 8 /* 9 * Copyright (c) 2010-2020 Arm Limited or its affiliates. All rights reserved. 10 * 11 * SPDX-License-Identifier: Apache-2.0 12 * 13 * Licensed under the Apache License, Version 2.0 (the License); you may 14 * not use this file except in compliance with the License. 15 * You may obtain a copy of the License at 16 * 17 * www.apache.org/licenses/LICENSE-2.0 18 * 19 * Unless required by applicable law or agreed to in writing, software 20 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 21 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 22 * See the License for the specific language governing permissions and 23 * limitations under the License. 24 */ 25 26 27 #ifndef _INTERPOLATION_FUNCTIONS_H_ 28 #define _INTERPOLATION_FUNCTIONS_H_ 29 30 #include "arm_math_types.h" 31 #include "arm_math_memory.h" 32 33 #include "dsp/none.h" 34 #include "dsp/utils.h" 35 36 #ifdef __cplusplus 37 extern "C" 38 { 39 #endif 40 41 42 /** 43 * @defgroup groupInterpolation Interpolation Functions 44 * These functions perform 1- and 2-dimensional interpolation of data. 45 * Linear interpolation is used for 1-dimensional data and 46 * bilinear interpolation is used for 2-dimensional data. 47 */ 48 49 50 /** 51 * @brief Instance structure for the floating-point Linear Interpolate function. 52 */ 53 typedef struct 54 { 55 uint32_t nValues; /**< nValues */ 56 float32_t x1; /**< x1 */ 57 float32_t xSpacing; /**< xSpacing */ 58 float32_t *pYData; /**< pointer to the table of Y values */ 59 } arm_linear_interp_instance_f32; 60 61 /** 62 * @brief Instance structure for the floating-point bilinear interpolation function. 63 */ 64 typedef struct 65 { 66 uint16_t numRows; /**< number of rows in the data table. */ 67 uint16_t numCols; /**< number of columns in the data table. */ 68 float32_t *pData; /**< points to the data table. */ 69 } arm_bilinear_interp_instance_f32; 70 71 /** 72 * @brief Instance structure for the Q31 bilinear interpolation function. 73 */ 74 typedef struct 75 { 76 uint16_t numRows; /**< number of rows in the data table. */ 77 uint16_t numCols; /**< number of columns in the data table. */ 78 q31_t *pData; /**< points to the data table. */ 79 } arm_bilinear_interp_instance_q31; 80 81 /** 82 * @brief Instance structure for the Q15 bilinear interpolation function. 83 */ 84 typedef struct 85 { 86 uint16_t numRows; /**< number of rows in the data table. */ 87 uint16_t numCols; /**< number of columns in the data table. */ 88 q15_t *pData; /**< points to the data table. */ 89 } arm_bilinear_interp_instance_q15; 90 91 /** 92 * @brief Instance structure for the Q15 bilinear interpolation function. 93 */ 94 typedef struct 95 { 96 uint16_t numRows; /**< number of rows in the data table. */ 97 uint16_t numCols; /**< number of columns in the data table. */ 98 q7_t *pData; /**< points to the data table. */ 99 } arm_bilinear_interp_instance_q7; 100 101 102 /** 103 * @brief Struct for specifying cubic spline type 104 */ 105 typedef enum 106 { 107 ARM_SPLINE_NATURAL = 0, /**< Natural spline */ 108 ARM_SPLINE_PARABOLIC_RUNOUT = 1 /**< Parabolic runout spline */ 109 } arm_spline_type; 110 111 /** 112 * @brief Instance structure for the floating-point cubic spline interpolation. 113 */ 114 typedef struct 115 { 116 arm_spline_type type; /**< Type (boundary conditions) */ 117 const float32_t * x; /**< x values */ 118 const float32_t * y; /**< y values */ 119 uint32_t n_x; /**< Number of known data points */ 120 float32_t * coeffs; /**< Coefficients buffer (b,c, and d) */ 121 } arm_spline_instance_f32; 122 123 124 125 126 /** 127 * @ingroup groupInterpolation 128 */ 129 130 /** 131 * @addtogroup SplineInterpolate 132 * @{ 133 */ 134 135 136 /** 137 * @brief Processing function for the floating-point cubic spline interpolation. 138 * @param[in] S points to an instance of the floating-point spline structure. 139 * @param[in] xq points to the x values ot the interpolated data points. 140 * @param[out] pDst points to the block of output data. 141 * @param[in] blockSize number of samples of output data. 142 */ 143 void arm_spline_f32( 144 arm_spline_instance_f32 * S, 145 const float32_t * xq, 146 float32_t * pDst, 147 uint32_t blockSize); 148 149 /** 150 * @brief Initialization function for the floating-point cubic spline interpolation. 151 * @param[in,out] S points to an instance of the floating-point spline structure. 152 * @param[in] type type of cubic spline interpolation (boundary conditions) 153 * @param[in] x points to the x values of the known data points. 154 * @param[in] y points to the y values of the known data points. 155 * @param[in] n number of known data points. 156 * @param[in] coeffs coefficients array for b, c, and d 157 * @param[in] tempBuffer buffer array for internal computations 158 */ 159 void arm_spline_init_f32( 160 arm_spline_instance_f32 * S, 161 arm_spline_type type, 162 const float32_t * x, 163 const float32_t * y, 164 uint32_t n, 165 float32_t * coeffs, 166 float32_t * tempBuffer); 167 168 169 /** 170 * @} end of SplineInterpolate group 171 */ 172 173 174 175 /** 176 * @addtogroup LinearInterpolate 177 * @{ 178 */ 179 180 /** 181 * @brief Process function for the floating-point Linear Interpolation Function. 182 * @param[in,out] S is an instance of the floating-point Linear Interpolation structure 183 * @param[in] x input sample to process 184 * @return y processed output sample. 185 * 186 */ 187 float32_t arm_linear_interp_f32( 188 arm_linear_interp_instance_f32 * S, 189 float32_t x); 190 191 /** 192 * 193 * @brief Process function for the Q31 Linear Interpolation Function. 194 * @param[in] pYData pointer to Q31 Linear Interpolation table 195 * @param[in] x input sample to process 196 * @param[in] nValues number of table values 197 * @return y processed output sample. 198 * 199 * \par 200 * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. 201 * This function can support maximum of table size 2^12. 202 * 203 */ 204 q31_t arm_linear_interp_q31( 205 q31_t * pYData, 206 q31_t x, 207 uint32_t nValues); 208 209 /** 210 * 211 * @brief Process function for the Q15 Linear Interpolation Function. 212 * @param[in] pYData pointer to Q15 Linear Interpolation table 213 * @param[in] x input sample to process 214 * @param[in] nValues number of table values 215 * @return y processed output sample. 216 * 217 * \par 218 * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. 219 * This function can support maximum of table size 2^12. 220 * 221 */ 222 q15_t arm_linear_interp_q15( 223 q15_t * pYData, 224 q31_t x, 225 uint32_t nValues); 226 227 /** 228 * 229 * @brief Process function for the Q7 Linear Interpolation Function. 230 * @param[in] pYData pointer to Q7 Linear Interpolation table 231 * @param[in] x input sample to process 232 * @param[in] nValues number of table values 233 * @return y processed output sample. 234 * 235 * \par 236 * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. 237 * This function can support maximum of table size 2^12. 238 */ 239 q7_t arm_linear_interp_q7( 240 q7_t * pYData, 241 q31_t x, 242 uint32_t nValues); 243 244 /** 245 * @} end of LinearInterpolate group 246 */ 247 248 249 250 251 /** 252 * @ingroup groupInterpolation 253 */ 254 255 256 /** 257 * @addtogroup BilinearInterpolate 258 * @{ 259 */ 260 261 /** 262 * @brief Floating-point bilinear interpolation. 263 * @param[in,out] S points to an instance of the interpolation structure. 264 * @param[in] X interpolation coordinate. 265 * @param[in] Y interpolation coordinate. 266 * @return out interpolated value. 267 */ 268 float32_t arm_bilinear_interp_f32( 269 const arm_bilinear_interp_instance_f32 * S, 270 float32_t X, 271 float32_t Y); 272 273 /** 274 * @brief Q31 bilinear interpolation. 275 * @param[in,out] S points to an instance of the interpolation structure. 276 * @param[in] X interpolation coordinate in 12.20 format. 277 * @param[in] Y interpolation coordinate in 12.20 format. 278 * @return out interpolated value. 279 */ 280 q31_t arm_bilinear_interp_q31( 281 arm_bilinear_interp_instance_q31 * S, 282 q31_t X, 283 q31_t Y); 284 285 286 /** 287 * @brief Q15 bilinear interpolation. 288 * @param[in,out] S points to an instance of the interpolation structure. 289 * @param[in] X interpolation coordinate in 12.20 format. 290 * @param[in] Y interpolation coordinate in 12.20 format. 291 * @return out interpolated value. 292 */ 293 q15_t arm_bilinear_interp_q15( 294 arm_bilinear_interp_instance_q15 * S, 295 q31_t X, 296 q31_t Y); 297 298 /** 299 * @brief Q7 bilinear interpolation. 300 * @param[in,out] S points to an instance of the interpolation structure. 301 * @param[in] X interpolation coordinate in 12.20 format. 302 * @param[in] Y interpolation coordinate in 12.20 format. 303 * @return out interpolated value. 304 */ 305 q7_t arm_bilinear_interp_q7( 306 arm_bilinear_interp_instance_q7 * S, 307 q31_t X, 308 q31_t Y); 309 /** 310 * @} end of BilinearInterpolate group 311 */ 312 313 314 315 #ifdef __cplusplus 316 } 317 #endif 318 319 #endif /* ifndef _INTERPOLATION_FUNCTIONS_H_ */ 320