ref: 7eb98bb0d8f983f573e61f43c1d6735181c7d008
parent: ebfcc611d346e73f15514d70814efc7c1eef41b1
author: Olav Sørensen <olav.sorensen@live.no>
date: Sun Sep 4 11:13:24 EDT 2022
Windowed-sinc interpolator changes
--- a/src/mixer/ft2_mix_macros.h
+++ b/src/mixer/ft2_mix_macros.h
@@ -168,6 +168,9 @@
**
*/
+#if SINC_TAPS==8
+
+#if SINC_FSHIFT>=0
#define WINDOWED_SINC_INTERPOLATION(s, f, scale) \
{ \
const float *t = v->fSincLUT + (((uint32_t)(f) >> SINC_FSHIFT) & SINC_FMASK); \
@@ -180,6 +183,72 @@
( s[3] * t[6]) + \
( s[4] * t[7])) * (1.0f / scale); \
}
+#else
+#define WINDOWED_SINC_INTERPOLATION(s, f, scale) \
+{ \
+ const float *t = v->fSincLUT + (((uint32_t)(f) << -SINC_FSHIFT) & SINC_FMASK); \
+ fSample = ((s[-3] * t[0]) + \
+ (s[-2] * t[1]) + \
+ (s[-1] * t[2]) + \
+ ( s[0] * t[3]) + \
+ ( s[1] * t[4]) + \
+ ( s[2] * t[5]) + \
+ ( s[3] * t[6]) + \
+ ( s[4] * t[7])) * (1.0f / scale); \
+}
+#endif
+
+#elif SINC_TAPS==16
+
+#if SINC_FSHIFT>=0
+#define WINDOWED_SINC_INTERPOLATION(s, f, scale) \
+{ \
+ const float *t = v->fSincLUT + (((uint32_t)(f) >> SINC_FSHIFT) & SINC_FMASK); \
+ fSample = ((s[-7] * t[0]) + \
+ (s[-6] * t[1]) + \
+ (s[-5] * t[2]) + \
+ (s[-4] * t[3]) + \
+ (s[-3] * t[4]) + \
+ (s[-2] * t[5]) + \
+ (s[-1] * t[6]) + \
+ ( s[0] * t[7]) + \
+ ( s[1] * t[8]) + \
+ ( s[2] * t[9]) + \
+ ( s[3] * t[10]) + \
+ ( s[4] * t[11]) + \
+ ( s[5] * t[12]) + \
+ ( s[6] * t[13]) + \
+ ( s[7] * t[14]) + \
+ ( s[8] * t[15])) * (1.0f / scale); \
+}
+#else
+#define WINDOWED_SINC_INTERPOLATION(s, f, scale) \
+{ \
+ const float *t = v->fSincLUT + (((uint32_t)(f) << -SINC_FSHIFT) & SINC_FMASK); \
+ fSample = ((s[-7] * t[0]) + \
+ (s[-6] * t[1]) + \
+ (s[-5] * t[2]) + \
+ (s[-4] * t[3]) + \
+ (s[-3] * t[4]) + \
+ (s[-2] * t[5]) + \
+ (s[-1] * t[6]) + \
+ ( s[0] * t[7]) + \
+ ( s[1] * t[8]) + \
+ ( s[2] * t[9]) + \
+ ( s[3] * t[10]) + \
+ ( s[4] * t[11]) + \
+ ( s[5] * t[12]) + \
+ ( s[6] * t[13]) + \
+ ( s[7] * t[14]) + \
+ ( s[8] * t[15])) * (1.0f / scale); \
+}
+#endif
+
+#else
+
+#error mixer/ft2_mix_macros.h: The SINC_TAPS definition is invalid! Valid values: 8 or 16
+
+#endif
#define RENDER_8BIT_SMP_SINTRP \
WINDOWED_SINC_INTERPOLATION(smpPtr, positionFrac, 128) \
--- a/src/mixer/ft2_windowed_sinc.c
+++ b/src/mixer/ft2_windowed_sinc.c
@@ -1,5 +1,5 @@
-/* Code taken from the OpenMPT project, which has a BSD
-** license which is compatible with this project.
+/* Code taken from the OpenMPT project, which has a BSD license which is
+** compatible with this project.
**
** The code has been slightly modified.
*/
@@ -10,10 +10,7 @@
#include <math.h>
#include "ft2_windowed_sinc.h"
-// globalized
-float *fKaiserSinc = NULL;
-float *fDownSample1 = NULL;
-float *fDownSample2 = NULL;
+float *fKaiserSinc = NULL, *fDownSample1 = NULL, *fDownSample2 = NULL; // globalized
static double Izero(double y) // Compute Bessel function Izero(y) using a series approximation
{
@@ -71,7 +68,7 @@
getSinc(fKaiserSinc, 9.6377, 0.97);
getSinc(fDownSample1, 8.5, 0.5);
- getSinc(fDownSample2, 2.7625, 0.425);
+ getSinc(fDownSample2, 7.3, 0.425);
return true;
}
--- a/src/mixer/ft2_windowed_sinc.h
+++ b/src/mixer/ft2_windowed_sinc.h
@@ -4,14 +4,17 @@
#include <stdbool.h>
#include "ft2_mix.h"
-// if you change this, also change SINC_PHASES_BITS (>8192 gives very little improvement)
-#define SINC_PHASES 8192
-#define SINC_PHASES_BITS 13 /* log2(SINC_PHASES) */
+// 8 or 16. 8 should only be used if the code is too slow for the target system.
+#define SINC_TAPS 16
-// don't change these!
+// log2(SINC_TAPS)
+#define SINC_TAPS_BITS 4
-#define SINC_TAPS 8
-#define SINC_TAPS_BITS 3
+#define SINC_PHASES 16384
+
+// log2(SINC_PHASES)
+#define SINC_PHASES_BITS 14
+
#define SINC_LUT_LEN (SINC_TAPS * SINC_PHASES)
#define SINC_FSHIFT (MIXER_FRAC_BITS-(SINC_PHASES_BITS+SINC_TAPS_BITS))
#define SINC_FMASK ((SINC_TAPS*SINC_PHASES)-SINC_TAPS)
@@ -23,9 +26,7 @@
// for LUT calculation
#define SINC_MID_TAP ((SINC_TAPS/2)*SINC_PHASES)
-extern float *fKaiserSinc;
-extern float *fDownSample1;
-extern float *fDownSample2;
+extern float *fKaiserSinc, *fDownSample1, *fDownSample2;
bool calcWindowedSincTables(void);
void freeWindowedSincTables(void);