180#define MAXLENGTH 0x400
183#define OUTBUFFSIZE (2*MAXLENGTH)
184#define INBUFFSIZE (4*MAXLENGTH)
185#define sqr(a) ((a)*(a))
188#define M_PI 3.14159265358979
195static int g_monoflag = 0;
197static int g_monoflag = -1;
203static double g_ampli = 0.8;
227static double sinc(
double x)
236static double interpol_func(
double t,
double fgk,
double fgg)
238 return (2*
fgk*sinc(M_PI*2*
fgk*t)*
exp(-M_PI*sqr(2*
fgg*t)));
245static float coefficient(
int i,
int q,
int firlen,
double fgk,
double fgg,
261static void transfer_int(
float *s,
float *d,
int n)
269static void zerofill(
float *s,
int n)
271 memset(s,0,n*(
sizeof(
float)));
280 float akku = 0, *endp;
284 while (
coep != endp) {
296 while (
coep != endp) {
309 while (
coep != endp) {
329 while (
coep != endp) {
348static int inbaseidx = 0, inoffset = 0, cycctr = 0, outidx = 0;
350static int filtering_on_buffers
357 inoffset = (cycctr *
down)/
up;
358 if ((inbaseidx + inoffset +
firlen) > insize) {
359 inbaseidx -= insize -
firlen + 1;
362 fir_mono(
inp + inoffset + inbaseidx,
380 inoffset = 2*((cycctr *
down)/
up);
381 if ((inbaseidx + inoffset + 2*
firlen) > insize) {
382 inbaseidx -= insize - 2*
firlen + 2;
391 fir_stereo(
inp + inoffset + inbaseidx,
408static void make_coe(
void)
412 for (i = 0; i < g_firlen; i++) {
413 for (
q = 0;
q < g_up;
q++) {
414 g_coep[
q * g_firlen + i] = coefficient(i,
q, g_firlen,
415 g_fgk, g_fgg, g_fsi, g_up, g_down, g_ampli);
425static WORD *inbuff = NULL;
428static WORD *outbuff = NULL;
432static int ioerr(
void)
438static int gcd(
int x,
int y)
442 if ((
x < 1) || (
y < 1))
445 for (a=
x,b=
y; b != 0; )
460 if (d == -1)
return -1;
464 if ((*
up > 1024) || (*
down > 1024))
470static int intimport(
float *
buff,
int n)
475 if ((inpos+n) >= inmax)
479 for (i=0;i < end; i++)
480 buff[i] = inbuff[inpos++];
485static int intexport(
float *
buff,
int n)
490 if ((outpos+n) >= outmax)
491 end = outmax - inpos;
494 for (i=0;i < end; i++)
495 outbuff[outpos++] = (
short)
buff[i];
500static int init_globs(WORD *
in,
int insize, WORD **
out,
int *
outsize,
512 g_firlen = (int)(162 * (
float)g_up/(
float)g_down);
516 g_fgg = (
float)g_up/(
float)g_down * 0.0116;
517 g_fgk = (
float)g_up/(
float)g_down * 0.461;
518 g_firlen = (int)(162 * (
float)g_down/(
float)g_up);
523 g_coep =
new float[g_firlen * g_up];
559 skirtlen = (g_firlen - 1) * (g_monoflag ? 1 : 2);
568 g_coep, g_firlen, g_up, g_down,
571 transfer_int(g_sin + insize, g_sin,
skirtlen);
577 }
while (insize > 0);
582 g_coep, g_firlen, g_up, g_down,
586 }
while (
outsize == OUTBUFFSIZE);
594 *
osize -= g_firlen/4;