Changed sinc window to Nuttal 3 term, and added silence pre-fill to account for the window delay
This commit is contained in:
parent
46815ba392
commit
9aae7b9c41
2 changed files with 21 additions and 11 deletions
|
@ -17,7 +17,7 @@
|
||||||
#define M_PI 3.14159265358979323846
|
#define M_PI 3.14159265358979323846
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "resampler.h"
|
#include "internal/resampler.h"
|
||||||
|
|
||||||
enum { RESAMPLER_SHIFT = 13 };
|
enum { RESAMPLER_SHIFT = 13 };
|
||||||
enum { RESAMPLER_RESOLUTION = 1 << RESAMPLER_SHIFT };
|
enum { RESAMPLER_RESOLUTION = 1 << RESAMPLER_SHIFT };
|
||||||
|
@ -76,9 +76,12 @@ void resampler_init(void)
|
||||||
for (i = 0; i < SINC_SAMPLES + 1; ++i, x += dx)
|
for (i = 0; i < SINC_SAMPLES + 1; ++i, x += dx)
|
||||||
{
|
{
|
||||||
float y = x / SINC_WIDTH;
|
float y = x / SINC_WIDTH;
|
||||||
#if 1
|
#if 0
|
||||||
// Blackman
|
// Blackman
|
||||||
float window = 0.42659 - 0.49656 * cos(M_PI + M_PI * y) + 0.076849 * cos(2.0 * M_PI * y);
|
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
|
#elif 0
|
||||||
// C.R.Helmrich's 2 term window
|
// 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);
|
float window = 0.79445 * cos(0.5 * M_PI * y) + 0.20555 * cos(1.5 * M_PI * y);
|
||||||
|
@ -118,8 +121,8 @@ void * resampler_create(void)
|
||||||
resampler * r = ( resampler * ) malloc( sizeof(resampler) );
|
resampler * r = ( resampler * ) malloc( sizeof(resampler) );
|
||||||
if ( !r ) return 0;
|
if ( !r ) return 0;
|
||||||
|
|
||||||
r->write_pos = 0;
|
r->write_pos = SINC_WIDTH - 1;
|
||||||
r->write_filled = 0;
|
r->write_filled = SINC_WIDTH - 1;
|
||||||
r->read_pos = 0;
|
r->read_pos = 0;
|
||||||
r->read_filled = 0;
|
r->read_filled = 0;
|
||||||
r->phase = 0;
|
r->phase = 0;
|
||||||
|
@ -215,11 +218,13 @@ int resampler_ready(void *_r)
|
||||||
void resampler_clear(void *_r)
|
void resampler_clear(void *_r)
|
||||||
{
|
{
|
||||||
resampler * r = ( resampler * ) _r;
|
resampler * r = ( resampler * ) _r;
|
||||||
r->write_pos = 0;
|
r->write_pos = SINC_WIDTH - 1;
|
||||||
r->write_filled = 0;
|
r->write_filled = SINC_WIDTH - 1;
|
||||||
r->read_pos = 0;
|
r->read_pos = 0;
|
||||||
r->read_filled = 0;
|
r->read_filled = 0;
|
||||||
r->phase = 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)
|
void resampler_set_rate(void *_r, double new_factor)
|
||||||
|
|
|
@ -76,9 +76,12 @@ void resampler_init(void)
|
||||||
for (i = 0; i < SINC_SAMPLES + 1; ++i, x += dx)
|
for (i = 0; i < SINC_SAMPLES + 1; ++i, x += dx)
|
||||||
{
|
{
|
||||||
float y = x / SINC_WIDTH;
|
float y = x / SINC_WIDTH;
|
||||||
#if 1
|
#if 0
|
||||||
// Blackman
|
// Blackman
|
||||||
float window = 0.42659 - 0.49656 * cos(M_PI + M_PI * y) + 0.076849 * cos(2.0 * M_PI * y);
|
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
|
#elif 0
|
||||||
// C.R.Helmrich's 2 term window
|
// 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);
|
float window = 0.79445 * cos(0.5 * M_PI * y) + 0.20555 * cos(1.5 * M_PI * y);
|
||||||
|
@ -118,8 +121,8 @@ void * resampler_create(void)
|
||||||
resampler * r = ( resampler * ) malloc( sizeof(resampler) );
|
resampler * r = ( resampler * ) malloc( sizeof(resampler) );
|
||||||
if ( !r ) return 0;
|
if ( !r ) return 0;
|
||||||
|
|
||||||
r->write_pos = 0;
|
r->write_pos = SINC_WIDTH - 1;
|
||||||
r->write_filled = 0;
|
r->write_filled = SINC_WIDTH - 1;
|
||||||
r->read_pos = 0;
|
r->read_pos = 0;
|
||||||
r->read_filled = 0;
|
r->read_filled = 0;
|
||||||
r->phase = 0;
|
r->phase = 0;
|
||||||
|
@ -215,11 +218,13 @@ int resampler_ready(void *_r)
|
||||||
void resampler_clear(void *_r)
|
void resampler_clear(void *_r)
|
||||||
{
|
{
|
||||||
resampler * r = ( resampler * ) _r;
|
resampler * r = ( resampler * ) _r;
|
||||||
r->write_pos = 0;
|
r->write_pos = SINC_WIDTH - 1;
|
||||||
r->write_filled = 0;
|
r->write_filled = SINC_WIDTH - 1;
|
||||||
r->read_pos = 0;
|
r->read_pos = 0;
|
||||||
r->read_filled = 0;
|
r->read_filled = 0;
|
||||||
r->phase = 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)
|
void resampler_set_rate(void *_r, double new_factor)
|
||||||
|
|
Loading…
Reference in a new issue