choose box filter width based on ratio of sampling rates

This commit is contained in:
Eric Wasylishen 2011-12-29 19:33:43 -07:00
parent 382b135cca
commit 2fae63eef2

View file

@ -116,32 +116,40 @@ static void ResampleSfx (sfx_t *sfx, int inrate, int inwidth, byte *data)
// box filter // box filter
// FIXME: doesn't handle the start or end of the sound properly // FIXME: doesn't handle the start or end of the sound properly
const int left = 2; // box_half_width is the number of samples on each side of a given sample
const int right = 2; // that are averaged together.
const int box_width = left + right + 1; // for the most common case, 11025Hz => 44100Hz, i.e. stepscale = 0.25,
int history[left]; // I determined that a box width of 5 (i.e. a box_half_width of 2) produces
memset(history, 0, sizeof(history)); // the best sounding results.
int box_sum = 0; const int box_half_width = CLAMP(0, (1 / (stepscale * 2)), 8);
for (i = 0; i < outcount; i++)
{ if (box_half_width > 0)
const int sample_at_i = getsample(sc->data, sc->width, i); {
const int box_width = (2 * box_half_width) + 1;
box_sum += sample_at_i; int history[box_half_width];
box_sum -= history[0]; memset(history, 0, sizeof(history));
int box_sum = 0;
const int newsample = box_sum / box_width; for (i = 0; i < outcount; i++)
{
const int write_loc = CLAMP(0, i - right, outcount - 1); const int sample_at_i = getsample(sc->data, sc->width, i);
// before writing the sample at write_loc, copy it to the end of the history buffer box_sum += sample_at_i;
int j; box_sum -= history[0];
for (j=0; j<(left-1); j++)
{ const int newsample = box_sum / box_width;
history[j] = history[j+1];
const int write_loc = CLAMP(0, i - box_half_width, outcount - 1);
// before writing the sample at write_loc, copy it to the end of the history buffer
int j;
for (j=0; j<(box_half_width-1); j++)
{
history[j] = history[j+1];
}
history[box_half_width-1] = getsample(sc->data, sc->width, write_loc);
putsample(sc->data, sc->width, write_loc, newsample);
} }
history[left-1] = getsample(sc->data, sc->width, write_loc);
putsample(sc->data, sc->width, write_loc, newsample);
} }
} }
else else