16cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi/* 26cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * Copyright (C) 2013 The Android Open Source Project 36cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * 46cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 56cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * you may not use this file except in compliance with the License. 66cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * You may obtain a copy of the License at 76cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * 86cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 96cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * 106cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 116cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 126cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * See the License for the specific language governing permissions and 146cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi * limitations under the License. 156cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi */ 166cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 176cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi#ifndef LE_FX_ENGINE_DSP_CORE_INTERPOLATOR_BASE_H_ 186cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi#define LE_FX_ENGINE_DSP_CORE_INTERPOLATOR_BASE_H_ 196cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 206cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi#include "common/core/types.h" 216cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 226cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivinamespace le_fx { 236cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 246cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivinamespace sigmod { 256cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 266cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// Interpolation base-class that provides the interface, while it is the derived 276cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// class that provides the specific interpolation algorithm. The following list 286cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// of interpolation algorithms are currently present: 296cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// 306cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// InterpolationSine<T>: weighted interpolation between y_data[n] and 316cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// y_data[n+1] using a sin(.) weighting factor from 326cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// 0 to pi/4. 336cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// InterpolationLinear<T>: linear interpolation 346cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// InterpolationSplines<T>: spline-based interpolation 356cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// 366cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// Example (using derived spline-based interpolation class): 376cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// InterpolatorSplines<float> interp(x_data, y_data, data_length); 386cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// for (int n = 0; n < data_length; n++) Y[n] = interp.Interpolate(X[n]); 396cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// 406cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivitemplate <typename T, class Algorithm> 416cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Triviclass InterpolatorBase { 426cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi public: 436cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi InterpolatorBase(); 446cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi ~InterpolatorBase(); 456cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 466cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Generic random-access interpolation with arbitrary spaced x-axis samples. 476cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Below X[0], the interpolator returns Y[0]. Above X[data_length-1], it 486cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // returns Y[data_length-1]. 496cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi T Interpolate(T x); 506cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 516cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi bool get_status() const { 526cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi return status_; 536cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi } 546cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 556cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Initializes internal buffers. 566cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // x_data: [(data_length)x1] x-axis coordinates (searching axis) 576cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // y_data: [(data_length)x1] y-axis coordinates (interpolation axis) 586cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // data_length: number of points 596cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // returns `true` if everything is ok, `false`, otherwise 606cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi bool Initialize(const T *x_data, const T *y_data, int data_length); 616cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 626cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Initializes internal buffers. 636cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // x_data: x-axis coordinates (searching axis) 646cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // y_data: y-axis coordinates (interpolating axis) 656cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // returns `true` if everything is ok, `false`, otherwise 666cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi bool Initialize(const vector<T> &x_data, const vector<T> &y_data); 676cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 686cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Initialization for regularly sampled sequences, where: 696cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // x_data[i] = x_start_offset + i * x_sampling_interval 706cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi bool Initialize(double x_start_offset, 716cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi double x_sampling_interval, 726cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi const vector<T> &y_data); 736cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 746cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Initialization for regularly sampled sequences, where: 756cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // x_data[i] = x_start_offset + i * x_sampling_interval 766cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi bool Initialize(double x_start_offset, 776cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi double x_sampling_interval, 786cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi const T *y_data, 796cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi int data_length); 806cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 816cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi protected: 826cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Is set to false if something goes wrong, and to true if everything is ok. 836cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi bool status_; 846cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 856cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // The start-index of the previously searched interval 866cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi int cached_index_; 876cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 886cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Data points 896cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi const T *x_data_; // Externally or internally owned, depending on own_x_data_ 906cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi const T *y_data_; // Externally owned (always) 916cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi int data_length_; 926cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Index of the last element `data_length_ - 1` kept here for optimization 936cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi int last_element_index_; 946cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi bool own_x_data_; 956cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // For regularly-samples sequences, keep only the boundaries and the intervals 966cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi T x_start_offset_; 976cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi float x_inverse_sampling_interval_; 986cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 996cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Algorithm state (internally owned) 1006cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi double *state_; 1016cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 1026cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi private: 1036cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi LE_FX_DISALLOW_COPY_AND_ASSIGN(InterpolatorBase); 1046cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi}; 1056cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 1066cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi} // namespace sigmod 1076cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 1086cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi} // namespace le_fx 1096cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 1106cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi#include "dsp/core/interpolator_base-inl.h" 1116cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 1126cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi#endif // LE_FX_ENGINE_DSP_CORE_INTERPOLATOR_BASE_H_ 113