#include <vector>
#define LANCZOS_RADIUS 30
+#define LANCZOS_RESOLUTION 256
inline double sinc(double x)
{
return sinc(M_PI * x) * sinc(M_PI * x / LANCZOS_RADIUS);
}
+extern double lanczos_table[LANCZOS_RADIUS * LANCZOS_RESOLUTION];
+void make_lanczos_weight_table();
+
+inline double lanczos_weight_table(float x)
+{
+ int table_id = lrintf(fabsf(x) * LANCZOS_RESOLUTION);
+ if (table_id >= LANCZOS_RADIUS * LANCZOS_RESOLUTION) {
+ return 0.0;
+ }
+ return lanczos_table[table_id];
+}
+
template<class T>
inline double lanczos_interpolate(const std::vector<T> &pcm, double i)
{
double sum = 0.0f;
for (int x = lower; x <= upper; ++x) {
- sum += pcm[x] * lanczos_weight(i - x);
+ sum += pcm[x] * lanczos_weight_table(i - x);
}
return sum;
}
double sum = 0.0f;
for (int x = lower; x <= upper; ++x) {
- sum += pcm[x].right * lanczos_weight(i - x);
+ sum += pcm[x].right * lanczos_weight_table(i - x);
}
return sum;
}