fix filter glitchy output. add more quality levels

This commit is contained in:
Eric Wasylishen 2014-08-04 01:38:25 -06:00
parent cb238f7ed3
commit 78bc37751f
2 changed files with 23 additions and 24 deletions

View file

@ -213,10 +213,8 @@ static void S_UpdateFilter(filter_t *filter, int M, float f_c)
filter->f_c = f_c; filter->f_c = f_c;
filter->parity = 0; filter->parity = 0;
if ((M + 1) % 16 == 0) // M + 1 rounded up to the next multiple of 16
filter->kernelsize = (M + 1); filter->kernelsize = (M + 1) + 16 - ((M + 1) % 16);
else
filter->kernelsize = (M + 1) + 16 - ((M + 1) % 16);
filter->memory = calloc(filter->kernelsize, sizeof(float)); filter->memory = calloc(filter->kernelsize, sizeof(float));
filter->kernel = calloc(filter->kernelsize, sizeof(float)); filter->kernel = calloc(filter->kernelsize, sizeof(float));
@ -230,7 +228,7 @@ static void S_ApplyFilter(filter_t *filter, int *data, int stride, int count)
float *input; float *input;
const int kernelsize = filter->kernelsize; const int kernelsize = filter->kernelsize;
const float *kernel = filter->kernel; const float *kernel = filter->kernel;
int parity = 0; int parity;
input = malloc(sizeof(float) * (filter->kernelsize + count)); input = malloc(sizeof(float) * (filter->kernelsize + count));
@ -250,25 +248,22 @@ static void S_ApplyFilter(filter_t *filter, int *data, int stride, int count)
// apply the filter // apply the filter
parity = filter->parity;
for (i=0; i<count; i++) for (i=0; i<count; i++)
{ {
float val[4] = {0, 0, 0, 0}; float val = 0;
const float *inputptr = input + i;
parity = i % 4; for (j = 4 - parity; j < kernelsize; j+=4)
for (j = parity; j < kernelsize; j+=16)
{ {
val[0] += kernel[j] * inputptr[j]; val += kernel[j] * input[i+j];
val[1] += kernel[j + 4] * inputptr[j + 4];
val[2] += kernel[j + 8] * inputptr[j + 8];
val[3] += kernel[j + 12] * inputptr[j + 12];
} }
// 4.0 is to increase volume by 12 dB; this is to make up the // 4.0 is to increase volume by 12 dB; this is to make up the
// volume drop caused by the zero-filling this filter does. // volume drop caused by the zero-filling this filter does.
data[i * stride] = (val[0] + val[1] + val[2] + val[3]) data[i * stride] = val * (32768.0 * 256.0 * 4.0);
* (32768.0 * 256.0 * 4.0);
parity = (parity + 1) % 4;
} }
filter->parity = parity; filter->parity = parity;
@ -290,15 +285,19 @@ static void S_LowpassFilter(int *data, int stride, int count,
int M; int M;
float bw; float bw;
if (snd_filterquality.value == 0) switch ((int)snd_filterquality.value)
{ {
M = 126; case 1:
bw = 0.90; M = 126; bw = 0.900; break;
} case 2:
else M = 150; bw = 0.915; break;
{ case 3:
M = 222; M = 174; bw = 0.930; break;
bw = 0.96; case 4:
M = 198; bw = 0.945; break;
case 5:
default:
M = 222; bw = 0.960; break;
} }
float f_c = (bw * 11025 / 2.0) / 44100.0; float f_c = (bw * 11025 / 2.0) / 44100.0;