1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef LE_FX_ENGINE_DSP_CORE_INTERPOLATOR_LINEAR_H_ 18 #define LE_FX_ENGINE_DSP_CORE_INTERPOLATOR_LINEAR_H_ 19 20 #include <math.h> 21 #include "dsp/core/interpolator_base.h" 22 23 namespace le_fx { 24 25 namespace sigmod { 26 27 // Linear interpolation class. 28 // 29 // The main functionality of this class is provided by it's base-class, so 30 // please refer to: InterpolatorBase 31 // 32 // Example: 33 // InterpolatorLinear<float> interp(x_data, y_data, data_length); 34 // for (int n = 0; n < data_length; n++) Y[n] = interp.Interpolate(X[n]); 35 // 36 template <typename T> 37 class InterpolatorLinear: public InterpolatorBase<T, InterpolatorLinear<T> > { 38 public: 39 InterpolatorLinear() { } 40 ~InterpolatorLinear() { } 41 42 protected: 43 // Provides the main implementation of the linear interpolation algorithm. 44 // Assumes that: X[cached_index_] < x < X[cached_index_ + 1] 45 T MethodSpecificInterpolation(T x); 46 47 // Pre-compute internal state_ parameters. 48 bool SetInternalState(); 49 50 private: 51 friend class InterpolatorBase<T, InterpolatorLinear<T> >; 52 typedef InterpolatorBase<T, InterpolatorLinear<T> > BaseClass; 53 using BaseClass::status_; 54 using BaseClass::cached_index_; 55 using BaseClass::x_data_; 56 using BaseClass::y_data_; 57 using BaseClass::data_length_; 58 using BaseClass::state_; 59 60 LE_FX_DISALLOW_COPY_AND_ASSIGN(InterpolatorLinear<T>); 61 }; 62 63 template <typename T> 64 inline T InterpolatorLinear<T>::MethodSpecificInterpolation(T x) { 65 T dX = x_data_[cached_index_ + 1] - x_data_[cached_index_]; 66 T dY = y_data_[cached_index_ + 1] - y_data_[cached_index_]; 67 T dx = x - x_data_[cached_index_]; 68 return y_data_[cached_index_] + (dY * dx) / dX; 69 } 70 71 template <typename T> 72 bool InterpolatorLinear<T>::SetInternalState() { 73 state_ = NULL; 74 return true; 75 } 76 77 } // namespace sigmod 78 79 } // namespace le_fx 80 81 #endif // LE_FX_ENGINE_DSP_CORE_INTERPOLATOR_LINEAR_H_ 82