2 #define _INTERPOLATE_H 1
9 #define LANCZOS_RADIUS 30
11 inline double sinc(double x)
14 return 1.0f - fabs(x);
20 inline double lanczos_weight(double x)
22 if (fabs(x) > LANCZOS_RADIUS) {
25 return sinc(M_PI * x) * sinc(M_PI * x / LANCZOS_RADIUS);
29 inline double lanczos_interpolate(const std::vector<T> &pcm, double i)
31 int lower = std::max<int>(ceil(i - LANCZOS_RADIUS), 0);
32 int upper = std::min<int>(floor(i + LANCZOS_RADIUS), pcm.size() - 1);
35 for (int x = lower; x <= upper; ++x) {
36 sum += pcm[x] * lanczos_weight(i - x);
42 inline double lanczos_interpolate_right(const std::vector<T> &pcm, double i)
44 int lower = std::max<int>(ceil(i - LANCZOS_RADIUS), 0);
45 int upper = std::min<int>(floor(i + LANCZOS_RADIUS), pcm.size() - 1);
48 for (int x = lower; x <= upper; ++x) {
49 sum += pcm[x].right * lanczos_weight(i - x);
55 inline double linear_interpolate(const std::vector<T> &pcm, double i)
58 if (ii < 0 || ii >= int(pcm.size() - 1)) {
63 return pcm[ii] + frac * (pcm[ii + 1] - pcm[ii]);
67 inline double linear_interpolate_right(const std::vector<T> &pcm, double i)
70 if (ii < 0 || ii >= int(pcm.size() - 1)) {
75 return pcm[ii].right + frac * (pcm[ii + 1].right - pcm[ii].right);
78 #endif // !defined(_INTERPOLATE_H)