Mercurial > hg > audiostuff
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 1:9cadc470e3da | 2:13be24d74cd2 |
|---|---|
| 1 | |
| 2 /****************************************************************** | |
| 3 | |
| 4 iLBC Speech Coder ANSI-C Source Code | |
| 5 | |
| 6 filter.c | |
| 7 | |
| 8 Copyright (C) The Internet Society (2004). | |
| 9 All Rights Reserved. | |
| 10 | |
| 11 ******************************************************************/ | |
| 12 | |
| 13 #include "iLBC_define.h" | |
| 14 | |
| 15 /*----------------------------------------------------------------* | |
| 16 * all-pole filter | |
| 17 *---------------------------------------------------------------*/ | |
| 18 | |
| 19 void AllPoleFilter(float *InOut, /* (i/o) on entrance InOut[-orderCoef] to | |
| 20 InOut[-1] contain the state of the | |
| 21 filter (delayed samples). InOut[0] to | |
| 22 InOut[lengthInOut-1] contain the filter | |
| 23 input, on en exit InOut[-orderCoef] to | |
| 24 InOut[-1] is unchanged and InOut[0] to | |
| 25 InOut[lengthInOut-1] contain filtered | |
| 26 samples */ | |
| 27 float *Coef, /* (i) filter coefficients, Coef[0] is assumed | |
| 28 to be 1.0 */ | |
| 29 int lengthInOut, /* (i) number of input/output samples */ | |
| 30 int orderCoef /* (i) number of filter coefficients */ | |
| 31 ) | |
| 32 { | |
| 33 int n, k; | |
| 34 | |
| 35 for (n = 0; n < lengthInOut; n++) { | |
| 36 for (k = 1; k <= orderCoef; k++) { | |
| 37 *InOut -= Coef[k] * InOut[-k]; | |
| 38 | |
| 39 | |
| 40 | |
| 41 | |
| 42 | |
| 43 } | |
| 44 InOut++; | |
| 45 } | |
| 46 } | |
| 47 | |
| 48 /*----------------------------------------------------------------* | |
| 49 * all-zero filter | |
| 50 *---------------------------------------------------------------*/ | |
| 51 | |
| 52 void AllZeroFilter(float *In, /* (i) In[0] to In[lengthInOut-1] contain | |
| 53 filter input samples */ | |
| 54 float *Coef, /* (i) filter coefficients (Coef[0] is assumed | |
| 55 to be 1.0) */ | |
| 56 int lengthInOut, /* (i) number of input/output samples */ | |
| 57 int orderCoef, /* (i) number of filter coefficients */ | |
| 58 float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1] | |
| 59 contain the filter state, on exit Out[0] | |
| 60 to Out[lengthInOut-1] contain filtered | |
| 61 samples */ | |
| 62 ) | |
| 63 { | |
| 64 int n, k; | |
| 65 | |
| 66 for (n = 0; n < lengthInOut; n++) { | |
| 67 *Out = Coef[0] * In[0]; | |
| 68 for (k = 1; k <= orderCoef; k++) { | |
| 69 *Out += Coef[k] * In[-k]; | |
| 70 } | |
| 71 Out++; | |
| 72 In++; | |
| 73 } | |
| 74 } | |
| 75 | |
| 76 /*----------------------------------------------------------------* | |
| 77 * pole-zero filter | |
| 78 *---------------------------------------------------------------*/ | |
| 79 | |
| 80 void ZeroPoleFilter(float *In, /* (i) In[0] to In[lengthInOut-1] contain | |
| 81 filter input samples In[-orderCoef] to | |
| 82 In[-1] contain state of all-zero | |
| 83 section */ | |
| 84 float *ZeroCoef, /* (i) filter coefficients for all-zero | |
| 85 section (ZeroCoef[0] is assumed to | |
| 86 be 1.0) */ | |
| 87 float *PoleCoef, /* (i) filter coefficients for all-pole section | |
| 88 (ZeroCoef[0] is assumed to be 1.0) */ | |
| 89 int lengthInOut, /* (i) number of input/output samples */ | |
| 90 int orderCoef, /* (i) number of filter coefficients */ | |
| 91 float *Out /* (i/o) on entrance Out[-orderCoef] to Out[-1] | |
| 92 contain state of all-pole section. On | |
| 93 exit Out[0] to Out[lengthInOut-1] | |
| 94 contain filtered samples */ | |
| 95 ) | |
| 96 { | |
| 97 AllZeroFilter(In, ZeroCoef, lengthInOut, orderCoef, Out); | |
| 98 AllPoleFilter(Out, PoleCoef, lengthInOut, orderCoef); | |
| 99 } | |
| 100 | |
| 101 /*----------------------------------------------------------------* | |
| 102 * downsample (LP filter and decimation) | |
| 103 *---------------------------------------------------------------*/ | |
| 104 | |
| 105 void DownSample(float *In, /* (i) input samples */ | |
| 106 float *Coef, /* (i) filter coefficients */ | |
| 107 int lengthIn, /* (i) number of input samples */ | |
| 108 float *state, /* (i) filter state */ | |
| 109 float *Out /* (o) downsampled output */ | |
| 110 ) | |
| 111 { | |
| 112 float o; | |
| 113 float *Out_ptr = Out; | |
| 114 float *Coef_ptr, *In_ptr; | |
| 115 float *state_ptr; | |
| 116 int i, j, stop; | |
| 117 | |
| 118 /* LP filter and decimate at the same time */ | |
| 119 | |
| 120 for (i = DELAY_DS; i < lengthIn; i += FACTOR_DS) { | |
| 121 Coef_ptr = &Coef[0]; | |
| 122 In_ptr = &In[i]; | |
| 123 state_ptr = &state[FILTERORDER_DS - 2]; | |
| 124 | |
| 125 o = (float) 0.0; | |
| 126 | |
| 127 stop = (i < FILTERORDER_DS) ? i + 1 : FILTERORDER_DS; | |
| 128 | |
| 129 for (j = 0; j < stop; j++) { | |
| 130 o += *Coef_ptr++ * (*In_ptr--); | |
| 131 } | |
| 132 for (j = i + 1; j < FILTERORDER_DS; j++) { | |
| 133 o += *Coef_ptr++ * (*state_ptr--); | |
| 134 } | |
| 135 | |
| 136 | |
| 137 | |
| 138 | |
| 139 | |
| 140 | |
| 141 *Out_ptr++ = o; | |
| 142 } | |
| 143 | |
| 144 /* Get the last part (use zeros as input for the future) */ | |
| 145 | |
| 146 for (i = (lengthIn + FACTOR_DS); i < (lengthIn + DELAY_DS); | |
| 147 i += FACTOR_DS) { | |
| 148 | |
| 149 o = (float) 0.0; | |
| 150 | |
| 151 if (i < lengthIn) { | |
| 152 Coef_ptr = &Coef[0]; | |
| 153 In_ptr = &In[i]; | |
| 154 for (j = 0; j < FILTERORDER_DS; j++) { | |
| 155 o += *Coef_ptr++ * (*Out_ptr--); | |
| 156 } | |
| 157 } else { | |
| 158 Coef_ptr = &Coef[i - lengthIn]; | |
| 159 In_ptr = &In[lengthIn - 1]; | |
| 160 for (j = 0; j < FILTERORDER_DS - (i - lengthIn); j++) { | |
| 161 o += *Coef_ptr++ * (*In_ptr--); | |
| 162 } | |
| 163 } | |
| 164 *Out_ptr++ = o; | |
| 165 } | |
| 166 } |
