]> git.sesse.net Git - c64tapwav/blobdiff - interpolate.h
Factor TAP writing out into its own file.
[c64tapwav] / interpolate.h
index 2b4842a03add802be5b80475206ca0b117e15b7a..c71110b37d71950c9b02b47950ff8d7c1d93bcac 100644 (file)
@@ -7,6 +7,7 @@
 #include <vector>
 
 #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(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)
 {
@@ -33,7 +46,7 @@ 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;
 }
@@ -46,7 +59,7 @@ inline double lanczos_interpolate_right(const std::vector<T> &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;
 }