19 #define Short_term_analysis_filtering Short_term_analysis_filteringx
28 static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp),
58 #define STEP( B_TIMES_TWO, MIC, INVA ) \
59 temp1 = GSM_ADD( *LARc++, MIC ) << 10; \
60 temp1 = GSM_SUB( temp1, B_TIMES_TWO ); \
61 temp1 = (word)GSM_MULT_R( INVA, temp1 ); \
62 *LARpp++ = GSM_ADD( temp1, temp1 );
64 STEP( 0, -32, 13107 );
65 STEP( 0, -32, 13107 );
66 STEP( 4096, -16, 13107 );
67 STEP( -5120, -16, 13107 );
69 STEP( 188, -8, 19223 );
70 STEP( -3584, -8, 17476 );
71 STEP( -682, -4, 31454 );
72 STEP( -2288, -4, 29708 );
95 static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp),
96 register word * LARpp_j_1,
97 register word * LARpp_j,
102 for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) {
103 *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
104 *LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1));
108 static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp),
109 register word * LARpp_j_1,
110 register word * LARpp_j,
111 register word * LARp)
114 for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
115 *LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 ));
119 static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp),
120 register word * LARpp_j_1,
121 register word * LARpp_j,
122 register word * LARp)
126 for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) {
127 *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 ));
128 *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 ));
133 static void Coefficients_40_159 P2((LARpp_j, LARp),
134 register word * LARpp_j,
135 register word * LARp)
139 for (i = 1; i <= 8; i++, LARp++, LARpp_j++)
145 static void LARp_to_rp P1((LARp),
146 register word * LARp)
156 for (i = 1; i <= 8; i++, LARp++) {
168 temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp);
169 *LARp = - ((temp < 11059) ? temp << 1
170 : ((temp < 20070) ? temp + 11059
171 : GSM_ADD( temp >> 2, 26112 )));
174 *LARp = (temp < 11059) ? temp << 1
175 : ((temp < 20070) ? temp + 11059
176 : GSM_ADD( temp >> 2, 26112 ));
183 #ifndef Short_term_analysis_filtering
190 static void Short_term_analysis_filtering P4((u0,rp0,k_n,s),
207 register word * u_top = u0 + 8;
208 register word * s_top = s + k_n;
211 register word *u, *rp ;
212 register longword di, u_out;
214 for (rp=rp0, u=u0; u<u_top;) {
215 register longword ui, rpi;
219 u_out = ui + (((rpi*di)+0x4000)>>15);
220 di = di + (((rpi*ui)+0x4000)>>15);
222 if ((u_out == (word)u_out) && (di == (word)di))
continue;
224 if (u_out>MAX_WORD) u_out=MAX_WORD;
225 else if (u_out<MIN_WORD) u_out=MIN_WORD;
226 if (di>MAX_WORD) di=MAX_WORD;
227 else if (di<MIN_WORD) di=MIN_WORD;
234 #if defined(USE_FLOAT_MUL) && defined(FAST)
236 static void Fast_Short_term_analysis_filtering P4((u,rp,k_n,s),
248 register float scalef = 3.0517578125e-5;
249 register float sav, di, temp;
251 for (i = 0; i < 8; ++i) {
253 rpf[i] = rp[i] * scalef;
257 for (i = 0; i < 8; ++i) {
258 register float rpfi = rpf[i];
259 register float ufi = uf[i];
262 temp = rpfi * di + ufi;
268 for (i = 0; i < 8; ++i) u[i] = uf[i];
281 static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
289 register word * v = S->v;
291 register longword sri;
296 register longword tmp1, tmp2;
303 tmp2 = (( tmp1 * tmp2 + 16384) >> 15) ;
306 if (sri != (word)sri) {
307 sri = (sri<0)? MIN_WORD:MAX_WORD;
312 tmp1 = (( tmp1 * sri + 16384) >> 15) ;
315 if (tmp1 != (word)tmp1) {
316 tmp1 = (tmp1<0)? MIN_WORD:MAX_WORD;
320 *sr++ = v[0] = (word)sri;
325 #if defined(FAST) && defined(USE_FLOAT_MUL)
327 static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr),
335 register word * v = S->v;
338 float va[9], rrpa[8];
339 register float scalef = 3.0517578125e-5, temp;
341 for (i = 0; i < 8; ++i) {
343 rrpa[i] = (float)rrp[i] * scalef;
346 register float sri = *wt++;
348 sri -= rrpa[i] * va[i];
349 if (sri < -32768.) sri = -32768.;
350 else if (sri > 32767.) sri = 32767.;
352 temp = va[i] + rrpa[i] * sri;
353 if (temp < -32768.) temp = -32768.;
354 else if (temp > 32767.) temp = 32767.;
359 for (i = 0; i < 9; ++i) v[i] = va[i];
364 void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s),
372 word * LARpp_j = S->LARpp[ S->j ];
373 word * LARpp_j_1 = S->LARpp[ S->j ^= 1 ];
378 #if defined(FAST) && defined(USE_FLOAT_MUL)
379 # define FILTER (* (S->fast \
380 ? Fast_Short_term_analysis_filtering \
381 : Short_term_analysis_filtering ))
384 # define FILTER Short_term_analysis_filtering
387 Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j );
389 Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
391 FILTER( S->u, LARp, 13, s);
393 Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
395 FILTER( S->u, LARp, 14, s + 13);
397 Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
399 FILTER( S->u, LARp, 13, s + 27);
401 Coefficients_40_159( LARpp_j, LARp);
403 FILTER( S->u, LARp, 120, s + 40);
407 void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s),
416 word * LARpp_j = S->LARpp[ S->j ];
417 word * LARpp_j_1 = S->LARpp[ S->j ^=1 ];
422 #if defined(FAST) && defined(USE_FLOAT_MUL)
424 # define FILTER (* (S->fast \
425 ? Fast_Short_term_synthesis_filtering \
426 : Short_term_synthesis_filtering ))
428 # define FILTER Short_term_synthesis_filtering
431 Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j );
433 Coefficients_0_12( LARpp_j_1, LARpp_j, LARp );
435 FILTER( S, LARp, 13, wt, s );
437 Coefficients_13_26( LARpp_j_1, LARpp_j, LARp);
439 FILTER( S, LARp, 14, wt + 13, s + 13 );
441 Coefficients_27_39( LARpp_j_1, LARpp_j, LARp);
443 FILTER( S, LARp, 13, wt + 27, s + 27 );
445 Coefficients_40_159( LARpp_j, LARp );
447 FILTER(S, LARp, 120, wt + 40, s + 40);