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:
InterpolatorLinear()39 InterpolatorLinear() { }
~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>
MethodSpecificInterpolation(T x)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>
SetInternalState()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