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