X-Git-Url: https://git.sesse.net/?p=c64tapwav;a=blobdiff_plain;f=interpolate.h;h=f9aeb110060a0501b1e79255fa0edbab2a156ecb;hp=2b4842a03add802be5b80475206ca0b117e15b7a;hb=866751f2909657ee7d62f936e3d2cb2ecb7806fb;hpb=52dc441eb7db99f2231478474f228a62d642eacf diff --git a/interpolate.h b/interpolate.h index 2b4842a..f9aeb11 100644 --- a/interpolate.h +++ b/interpolate.h @@ -7,6 +7,7 @@ #include #define LANCZOS_RADIUS 30 +#define LANCZOS_RESOLUTION 256 inline double sinc(double x) { @@ -25,6 +26,18 @@ inline double lanczos_weight(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(double x) +{ + int table_id = lrintf(fabs(x) * LANCZOS_RESOLUTION); + if (table_id >= LANCZOS_RADIUS * LANCZOS_RESOLUTION) { + return 0.0; + } + return lanczos_table[table_id]; +} + template inline double lanczos_interpolate(const std::vector &pcm, double i) { @@ -33,7 +46,7 @@ inline double lanczos_interpolate(const std::vector &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; } @@ -46,7 +59,7 @@ inline double lanczos_interpolate_right(const std::vector &pcm, double i) 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; }