package org.mobicents.media.server.impl.dsp.audio.g729;
public class Filter {
/*-----------------------------------------------------------*
* convolve - convolve vectors x and h and put result in y *
*-----------------------------------------------------------*/
public static void convolve(
float x[], int xs, /* input : input vector x[0:l] */
float h[], int hs, /* input : impulse response or second input h[0:l] */
float y[], int ys, /* output: x convolved with h , y[0:l] */
int l /* input : dimension of all vectors */
)
{
float temp;
int i, n;
for (n = 0; n < l; n++)
{
temp = (float)0.0;
for (i = 0; i <= n; i++)
temp += x[xs+i]*h[hs+n-i];
y[ys+n] = temp;
}
return;
}
/*-----------------------------------------------------------*
* syn_filt - filter with synthesis filter 1/A(z) *
*-----------------------------------------------------------*/
public static void syn_filt(
float a[],int as, /* input : predictor coefficients a[0:m] */
float x[],int xs, /* input : excitation signal */
float y[],int ys, /* output: filtered output signal */
int l, /* input : vector dimension */
float mem[],int mems, /* in/out: filter memory */
int update /* input : 0 = no memory update, 1 = update */
)
{
int i,j;
/* This is usually done by memory allocation (l+m) */
float yy_b[] = new float[LD8KConstants.L_SUBFR+LD8KConstants.M];
double s;
int yy, py, pa;
/* Copy mem[] to yy[] */
yy = 0;//yy_b;
for (i = 0; i <LD8KConstants.M; i++) yy_b[yy++] = mem[mems++];
/* Filtering */
for (i = 0; i < l; i++)
{
py=yy;
pa=0;//a
s = x[xs++];
for (j = 0; j <LD8KConstants.M; j++) s -= (a[as+ ++pa]) * (double)(yy_b[--py]);
yy_b[yy++] = (float)s;
y[ys++] = (float)s;
}
/* Update memory if required */
if(update !=0 ) for (i = 0; i <LD8KConstants.M; i++) mem[--mems] =yy_b[--yy];
return;
}
/*-----------------------------------------------------------*
* residu - filter input vector with all-zero filter A(Z) *
*-----------------------------------------------------------*/
public static void residu( /* filter A(z) */
float []a,int as, /* input : prediction coefficients a[0:m+1], a[0]=1. */
float []x,int xs, /* input : input signal x[0:l-1], x[-1:m] are needed */
float []y,int ys, /* output: output signal y[0:l-1] NOTE: x[] and y[]
cannot point to same array */
int l /* input : dimension of x and y */
)
{
double s;
int i, j;
int ya = 0;
for (i = 0; i < l; i++)
{
s = x[xs+i];
for (j = 1; j <= LD8KConstants.M; j++) s += a[as+j]*(double)x[xs+i-j];
y[ys+ya++] = (float)s;
}
return;
}
}