Mercurial > hg > audiostuff
diff intercom/ilbc/filter.c @ 2:13be24d74cd2
import intercom-0.4.1
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 09:57:52 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/intercom/ilbc/filter.c Fri Jun 25 09:57:52 2010 +0200 @@ -0,0 +1,166 @@ + + /****************************************************************** + + iLBC Speech Coder ANSI-C Source Code + + filter.c + + Copyright (C) The Internet Society (2004). + All Rights Reserved. + + ******************************************************************/ + +#include "iLBC_define.h" + + /*----------------------------------------------------------------* + * all-pole filter + *---------------------------------------------------------------*/ + +void AllPoleFilter(float *InOut, /* (i/o) on entrance InOut[-orderCoef] to + InOut[-1] contain the state of the + filter (delayed samples). InOut[0] to + InOut[lengthInOut-1] contain the filter + input, on en exit InOut[-orderCoef] to + InOut[-1] is unchanged and InOut[0] to + InOut[lengthInOut-1] contain filtered + samples */ + float *Coef, /* (i) filter coefficients, Coef[0] is assumed + to be 1.0 */ + int lengthInOut, /* (i) number of input/output samples */ + int orderCoef /* (i) number of filter coefficients */ + ) +{ + int n, k; + + for (n = 0; n < lengthInOut; n++) { + for (k = 1; k <= orderCoef; k++) { + *InOut -= Coef[k] * InOut[-k]; + + + + + + } + InOut++; + } +} + + /*----------------------------------------------------------------* + * all-zero filter + *---------------------------------------------------------------*/ + +void AllZeroFilter(float *In, /* (i) In[0] to In[lengthInOut-1] contain + filter input samples */ + float *Coef, /* (i) filter coefficients (Coef[0] is assumed + to be 1.0) */ + int lengthInOut, /* (i) number of input/output samples */ + int orderCoef, /* (i) number of filter coefficients */ + float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1] + contain the filter state, on exit Out[0] + to Out[lengthInOut-1] contain filtered + samples */ + ) +{ + int n, k; + + for (n = 0; n < lengthInOut; n++) { + *Out = Coef[0] * In[0]; + for (k = 1; k <= orderCoef; k++) { + *Out += Coef[k] * In[-k]; + } + Out++; + In++; + } +} + + /*----------------------------------------------------------------* + * pole-zero filter + *---------------------------------------------------------------*/ + +void ZeroPoleFilter(float *In, /* (i) In[0] to In[lengthInOut-1] contain + filter input samples In[-orderCoef] to + In[-1] contain state of all-zero + section */ + float *ZeroCoef, /* (i) filter coefficients for all-zero + section (ZeroCoef[0] is assumed to + be 1.0) */ + float *PoleCoef, /* (i) filter coefficients for all-pole section + (ZeroCoef[0] is assumed to be 1.0) */ + int lengthInOut, /* (i) number of input/output samples */ + int orderCoef, /* (i) number of filter coefficients */ + float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1] + contain state of all-pole section. On + exit Out[0] to Out[lengthInOut-1] + contain filtered samples */ + ) +{ + AllZeroFilter(In, ZeroCoef, lengthInOut, orderCoef, Out); + AllPoleFilter(Out, PoleCoef, lengthInOut, orderCoef); +} + + /*----------------------------------------------------------------* + * downsample (LP filter and decimation) + *---------------------------------------------------------------*/ + +void DownSample(float *In, /* (i) input samples */ + float *Coef, /* (i) filter coefficients */ + int lengthIn, /* (i) number of input samples */ + float *state, /* (i) filter state */ + float *Out /* (o) downsampled output */ + ) +{ + float o; + float *Out_ptr = Out; + float *Coef_ptr, *In_ptr; + float *state_ptr; + int i, j, stop; + + /* LP filter and decimate at the same time */ + + for (i = DELAY_DS; i < lengthIn; i += FACTOR_DS) { + Coef_ptr = &Coef[0]; + In_ptr = &In[i]; + state_ptr = &state[FILTERORDER_DS - 2]; + + o = (float) 0.0; + + stop = (i < FILTERORDER_DS) ? i + 1 : FILTERORDER_DS; + + for (j = 0; j < stop; j++) { + o += *Coef_ptr++ * (*In_ptr--); + } + for (j = i + 1; j < FILTERORDER_DS; j++) { + o += *Coef_ptr++ * (*state_ptr--); + } + + + + + + + *Out_ptr++ = o; + } + + /* Get the last part (use zeros as input for the future) */ + + for (i = (lengthIn + FACTOR_DS); i < (lengthIn + DELAY_DS); + i += FACTOR_DS) { + + o = (float) 0.0; + + if (i < lengthIn) { + Coef_ptr = &Coef[0]; + In_ptr = &In[i]; + for (j = 0; j < FILTERORDER_DS; j++) { + o += *Coef_ptr++ * (*Out_ptr--); + } + } else { + Coef_ptr = &Coef[i - lengthIn]; + In_ptr = &In[lengthIn - 1]; + for (j = 0; j < FILTERORDER_DS - (i - lengthIn); j++) { + o += *Coef_ptr++ * (*In_ptr--); + } + } + *Out_ptr++ = o; + } +}