shithub: dumb

Download patch

ref: a15a906131e89bc8b7fb43dc0c54f704f743d7df
parent: 3e3c7e15806ba01fc6a680def36ee0df4a3bc6da
author: Chris Moeller <kode54@gmail.com>
date: Sun Mar 23 16:58:27 EDT 2014

Changed sinc window to Nuttal 3 term, and added pre-fill of silence to account for half the window size minus one

--- a/dumb/src/helpers/resampler.c
+++ b/dumb/src/helpers/resampler.c
@@ -76,9 +76,12 @@
     for (i = 0; i < SINC_SAMPLES + 1; ++i, x += dx)
     {
         float y = x / SINC_WIDTH;
-#if 1
+#if 0
         // Blackman
         float window = 0.42659 - 0.49656 * cos(M_PI + M_PI * y) + 0.076849 * cos(2.0 * M_PI * y);
+#elif 1
+        // Nuttal 3 term
+        float window = 0.40897 + 0.5 * cos(M_PI * y) + 0.09103 * cos(2.0 * M_PI * y);
 #elif 0
         // C.R.Helmrich's 2 term window
         float window = 0.79445 * cos(0.5 * M_PI * y) + 0.20555 * cos(1.5 * M_PI * y);
@@ -118,8 +121,8 @@
     resampler * r = ( resampler * ) malloc( sizeof(resampler) );
     if ( !r ) return 0;
 
-    r->write_pos = 0;
-    r->write_filled = 0;
+    r->write_pos = SINC_WIDTH - 1;
+    r->write_filled = SINC_WIDTH - 1;
     r->read_pos = 0;
     r->read_filled = 0;
     r->phase = 0;
@@ -215,11 +218,13 @@
 void resampler_clear(void *_r)
 {
     resampler * r = ( resampler * ) _r;
-    r->write_pos = 0;
-    r->write_filled = 0;
+    r->write_pos = SINC_WIDTH - 1;
+    r->write_filled = SINC_WIDTH - 1;
     r->read_pos = 0;
     r->read_filled = 0;
     r->phase = 0;
+	memset(r->buffer_in, 0, (SINC_WIDTH - 1) * sizeof(r->buffer_in[0]));
+	memset(r->buffer_in + resampler_buffer_size, 0, (SINC_WIDTH - 1) * sizeof(r->buffer_in[0]));
 }
 
 void resampler_set_rate(void *_r, double new_factor)