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_LINEAR_H_ 186cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi#define LE_FX_ENGINE_DSP_CORE_INTERPOLATOR_LINEAR_H_ 196cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 206cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi#include <math.h> 216cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi#include "dsp/core/interpolator_base.h" 226cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 236cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivinamespace le_fx { 246cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 256cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivinamespace sigmod { 266cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 276cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// Linear interpolation class. 286cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// 296cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// The main functionality of this class is provided by it's base-class, so 306cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// please refer to: InterpolatorBase 316cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// 326cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// Example: 336cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// InterpolatorLinear<float> interp(x_data, y_data, data_length); 346cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// for (int n = 0; n < data_length; n++) Y[n] = interp.Interpolate(X[n]); 356cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi// 366cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivitemplate <typename T> 376cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Triviclass InterpolatorLinear: public InterpolatorBase<T, InterpolatorLinear<T> > { 386cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi public: 396cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi InterpolatorLinear() { } 406cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi ~InterpolatorLinear() { } 416cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 426cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi protected: 436cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Provides the main implementation of the linear interpolation algorithm. 446cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Assumes that: X[cached_index_] < x < X[cached_index_ + 1] 456cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi T MethodSpecificInterpolation(T x); 466cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 476cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi // Pre-compute internal state_ parameters. 486cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi bool SetInternalState(); 496cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 506cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi private: 516cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi friend class InterpolatorBase<T, InterpolatorLinear<T> >; 526cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi typedef InterpolatorBase<T, InterpolatorLinear<T> > BaseClass; 536cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi using BaseClass::status_; 546cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi using BaseClass::cached_index_; 556cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi using BaseClass::x_data_; 566cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi using BaseClass::y_data_; 576cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi using BaseClass::data_length_; 586cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi using BaseClass::state_; 596cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 606cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi LE_FX_DISALLOW_COPY_AND_ASSIGN(InterpolatorLinear<T>); 616cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi}; 626cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 636cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivitemplate <typename T> 646cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Triviinline T InterpolatorLinear<T>::MethodSpecificInterpolation(T x) { 656cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi T dX = x_data_[cached_index_ + 1] - x_data_[cached_index_]; 666cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi T dY = y_data_[cached_index_ + 1] - y_data_[cached_index_]; 676cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi T dx = x - x_data_[cached_index_]; 686cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi return y_data_[cached_index_] + (dY * dx) / dX; 696cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi} 706cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 716cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivitemplate <typename T> 726cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivibool InterpolatorLinear<T>::SetInternalState() { 736cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi state_ = NULL; 746cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi return true; 756cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi} 766cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 776cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi} // namespace sigmod 786cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 796cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi} // namespace le_fx 806cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi 816cc3a9948b51193dfdcb0c3527d7f3d1ca38aa3cJean-Michel Trivi#endif // LE_FX_ENGINE_DSP_CORE_INTERPOLATOR_LINEAR_H_ 82