2 #define _INTERPOLATE_H 1
9 #define LANCZOS_RADIUS 30
10 #define LANCZOS_RESOLUTION 256
12 inline double sinc(double x)
15 return 1.0f - fabs(x);
21 inline double lanczos_weight(double x)
23 if (fabs(x) > LANCZOS_RADIUS) {
26 return sinc(M_PI * x) * sinc(M_PI * x / LANCZOS_RADIUS);
29 extern double lanczos_table[LANCZOS_RADIUS * LANCZOS_RESOLUTION];
30 void make_lanczos_weight_table();
32 inline double lanczos_weight_table(float x)
34 int table_id = lrintf(fabsf(x) * LANCZOS_RESOLUTION);
35 if (table_id >= LANCZOS_RADIUS * LANCZOS_RESOLUTION) {
38 return lanczos_table[table_id];
42 inline double lanczos_interpolate(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] * lanczos_weight_table(i - x);
55 inline double lanczos_interpolate_right(const std::vector<T> &pcm, double i)
57 int lower = std::max<int>(ceil(i - LANCZOS_RADIUS), 0);
58 int upper = std::min<int>(floor(i + LANCZOS_RADIUS), pcm.size() - 1);
61 for (int x = lower; x <= upper; ++x) {
62 sum += pcm[x].right * lanczos_weight_table(i - x);
68 inline double linear_interpolate(const std::vector<T> &pcm, double i)
71 if (ii < 0 || ii >= int(pcm.size() - 1)) {
76 return pcm[ii] + frac * (pcm[ii + 1] - pcm[ii]);
80 inline double linear_interpolate_right(const std::vector<T> &pcm, double i)
83 if (ii < 0 || ii >= int(pcm.size() - 1)) {
88 return pcm[ii].right + frac * (pcm[ii + 1].right - pcm[ii].right);
91 #endif // !defined(_INTERPOLATE_H)