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